From 94ca770c2acf94effab817ffa2499d00517311c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Molinari?= Date: Thu, 10 Oct 2024 17:52:59 +0200 Subject: [PATCH] gl-renderer: Add explicit sync feature flag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This feature flag is for explicit sync support. We replace the explicit sync warning by logging supported fence syncs along with the report EGL features report. Signed-off-by: Loïc Molinari --- libweston/renderer-gl/egl-glue.c | 15 ++++++++++++--- libweston/renderer-gl/gl-renderer-internal.h | 4 ++++ libweston/renderer-gl/gl-renderer.c | 6 +++--- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/libweston/renderer-gl/egl-glue.c b/libweston/renderer-gl/egl-glue.c index d40e61e33..cdc88110c 100644 --- a/libweston/renderer-gl/egl-glue.c +++ b/libweston/renderer-gl/egl-glue.c @@ -710,9 +710,6 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec) if (egl_display_has(gr, EXTENSION_KHR_WAIT_SYNC)) GET_PROC_ADDRESS(gr->wait_sync, "eglWaitSyncKHR"); - else - weston_log("warning: Disabling explicit synchronization due " - "to missing EGL_KHR_wait_sync extension\n"); /* No config context feature. */ if (egl_display_has(gr, EXTENSION_KHR_NO_CONFIG_CONTEXT) || @@ -724,6 +721,11 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec) egl_display_has(gr, EXTENSION_EXT_SWAP_BUFFERS_WITH_DAMAGE)) gr->features |= FEATURE_SWAP_BUFFERS_WITH_DAMAGE; + /* Explicit sync feature. */ + if (egl_display_has(gr, EXTENSION_ANDROID_NATIVE_FENCE_SYNC) && + egl_display_has(gr, EXTENSION_KHR_WAIT_SYNC)) + gr->features |= FEATURE_EXPLICIT_SYNC; + weston_log("EGL features:\n"); weston_log_continue(STAMP_SPACE "EGL Wayland extension: %s\n", yesno(has_bind_display)); @@ -743,6 +745,13 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec) !egl_display_has(gr, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT) ? "no" : !egl_display_has(gr, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT_MODIFIERS) ? "legacy" : "modifiers"); + weston_log_continue(STAMP_SPACE "fence sync: %s\n", + !egl_display_has(gr, EXTENSION_KHR_FENCE_SYNC) ? "no" : + !egl_display_has(gr, EXTENSION_ANDROID_NATIVE_FENCE_SYNC) && + !egl_display_has(gr, EXTENSION_KHR_WAIT_SYNC) ? "yes" : + !egl_display_has(gr, EXTENSION_ANDROID_NATIVE_FENCE_SYNC) ? "yes (wait)" : + !egl_display_has(gr, EXTENSION_KHR_WAIT_SYNC) ? "yes (native)" : + "yes (native, wait)"); return 0; } diff --git a/libweston/renderer-gl/gl-renderer-internal.h b/libweston/renderer-gl/gl-renderer-internal.h index 21aaf7527..859c31e73 100644 --- a/libweston/renderer-gl/gl-renderer-internal.h +++ b/libweston/renderer-gl/gl-renderer-internal.h @@ -106,6 +106,10 @@ enum gl_feature_flag { /* GL renderer can pass a list of damage rectangles at buffer swap in * order to reduce recomposition costs. */ FEATURE_SWAP_BUFFERS_WITH_DAMAGE = 1ull << 1, + + /* GL renderer can create native sync objects and wait on them. This + * enables support for the Linux explicit sync Wayland protocol. */ + FEATURE_EXPLICIT_SYNC = 1ull << 2, }; /* Keep the following in sync with vertex.glsl. */ diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c index 9fba37a2c..024b77650 100644 --- a/libweston/renderer-gl/gl-renderer.c +++ b/libweston/renderer-gl/gl-renderer.c @@ -1158,7 +1158,8 @@ ensure_surface_buffer_is_ready(struct gl_renderer *gr, /* We should only get a fence if we support EGLSyncKHR, since * we don't advertise the explicit sync protocol otherwise. */ - assert(egl_display_has(gr, EXTENSION_ANDROID_NATIVE_FENCE_SYNC)); + assert(gl_features_has(gr, FEATURE_EXPLICIT_SYNC)); + /* We should only get a fence for non-SHM buffers, since surface * commit would have failed otherwise. */ assert(buffer->type != WESTON_BUFFER_SHM); @@ -4589,8 +4590,7 @@ gl_renderer_display_create(struct weston_compositor *ec, ec->capabilities |= WESTON_CAP_ROTATION_ANY; ec->capabilities |= WESTON_CAP_CAPTURE_YFLIP; ec->capabilities |= WESTON_CAP_VIEW_CLIP_MASK; - if (egl_display_has(gr, EXTENSION_ANDROID_NATIVE_FENCE_SYNC) && - egl_display_has(gr, EXTENSION_KHR_WAIT_SYNC)) + if (gl_features_has(gr, FEATURE_EXPLICIT_SYNC)) ec->capabilities |= WESTON_CAP_EXPLICIT_SYNC; if (gr->allocator)