From 99d543379eec67e4bf2b8f916c109e99308a0eaa Mon Sep 17 00:00:00 2001 From: Alexander Orzechowski Date: Sat, 14 Sep 2024 18:03:04 -0400 Subject: [PATCH] wlr_raster: Implement explicit sync for multigpu blits --- types/wlr_raster.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/types/wlr_raster.c b/types/wlr_raster.c index 5c073dc27..651fd2f1f 100644 --- a/types/wlr_raster.c +++ b/types/wlr_raster.c @@ -241,7 +241,18 @@ static struct wlr_buffer *raster_try_blit(struct wlr_raster *raster, return NULL; } - struct wlr_render_pass *pass = wlr_renderer_begin_buffer_pass(src, buffer, NULL); + struct wlr_drm_syncobj_timeline *timeline; + int drm_fd = wlr_renderer_get_drm_fd(src); + if (src->features.timeline && drm_fd >= 0) { + timeline = wlr_drm_syncobj_timeline_create(drm_fd); + } + + const struct wlr_buffer_pass_options pass_options = { + .signal_timeline = timeline, + .signal_point = 1, + }; + + struct wlr_render_pass *pass = wlr_renderer_begin_buffer_pass(src, buffer, &pass_options); if (!pass) { wlr_log(WLR_ERROR, "Failed to create a render pass"); wlr_buffer_drop(buffer); @@ -251,8 +262,12 @@ static struct wlr_buffer *raster_try_blit(struct wlr_raster *raster, wlr_render_pass_add_texture(pass, &(struct wlr_render_texture_options) { .texture = source->texture, .blend_mode = WLR_RENDER_BLEND_MODE_NONE, + .wait_timeline = timeline, + .wait_point = 1, }); + wlr_drm_syncobj_timeline_unref(timeline); + if (!wlr_render_pass_submit(pass)) { wlr_log(WLR_ERROR, "Failed to renedr to a multigpu blit buffer"); wlr_buffer_drop(buffer);