From af98776224d191de98fce34b4636d0c764950270 Mon Sep 17 00:00:00 2001 From: Daniel van Vugt Date: Fri, 29 Sep 2023 18:38:26 +0800 Subject: [PATCH] onscreen/native: Finish primary GPU rendering before copying to secondary As mentioned in the OES_EGL_image_external spec, there is no implicit sync between the EGLImage producer and consumer. And in this code path we don't have meta_drm_buffer_gbm_new_lock_front on the primary GPU to do it for us either. So synchronization has to be done manually or else the secondary GPU is likely to get an unfinished image. This problem has only been observed when the secondary GPU is using the Nvidia proprietary driver. Part-of: --- src/backends/native/meta-onscreen-native.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c index 49892139a..e6e93e6d4 100644 --- a/src/backends/native/meta-onscreen-native.c +++ b/src/backends/native/meta-onscreen-native.c @@ -840,6 +840,9 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen, COGL_TRACE_BEGIN_SCOPED (CopySharedFramebufferSecondaryGpu, "copy_shared_framebuffer_gpu()"); + if (renderer_gpu_data->secondary.needs_explicit_sync) + cogl_framebuffer_finish (COGL_FRAMEBUFFER (onscreen)); + render_device = renderer_gpu_data->render_device; egl_display = meta_render_device_get_egl_display (render_device);