From 4a4a9b94d6f0dd74725daa78dea314b72e710063 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Molinari?= Date: Thu, 10 Oct 2024 16:01:44 +0200 Subject: [PATCH] gl-renderer: Add no config context feature flag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit introduces feature flags. While an extension flag only ensures the availability of an extension at run-time, a feature flag ensures the availability of a minimal OpenGL ES version and/or extensions in order to easily check for the availability of a specific feature at run-time. This first feature ensures the availability of either the EGL_KHR_no_config_context or EGL_MESA_configless_context extensions. Signed-off-by: Loïc Molinari --- libweston/renderer-gl/egl-glue.c | 8 ++++++-- libweston/renderer-gl/gl-renderer-internal.h | 14 ++++++++++++++ libweston/renderer-gl/gl-renderer.c | 3 +-- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/libweston/renderer-gl/egl-glue.c b/libweston/renderer-gl/egl-glue.c index f9a6fa50c..14993b122 100644 --- a/libweston/renderer-gl/egl-glue.c +++ b/libweston/renderer-gl/egl-glue.c @@ -720,6 +720,11 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec) 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) || + egl_display_has(gr, EXTENSION_MESA_CONFIGLESS_CONTEXT)) + gr->features |= FEATURE_NO_CONFIG_CONTEXT; + weston_log("EGL features:\n"); weston_log_continue(STAMP_SPACE "EGL Wayland extension: %s\n", yesno(has_bind_display)); @@ -732,8 +737,7 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec) weston_log_continue(STAMP_SPACE "swap buffers with damage: %s\n", yesno(gr->swap_buffers_with_damage)); weston_log_continue(STAMP_SPACE "configless context: %s\n", - yesno(egl_display_has(gr, EXTENSION_KHR_NO_CONFIG_CONTEXT) || - egl_display_has(gr, EXTENSION_MESA_CONFIGLESS_CONTEXT))); + yesno(gl_features_has(gr, FEATURE_NO_CONFIG_CONTEXT))); weston_log_continue(STAMP_SPACE "surfaceless context: %s\n", yesno(egl_display_has(gr, EXTENSION_KHR_SURFACELESS_CONTEXT))); weston_log_continue(STAMP_SPACE "dmabuf support: %s\n", diff --git a/libweston/renderer-gl/gl-renderer-internal.h b/libweston/renderer-gl/gl-renderer-internal.h index 4a9fc7eb0..2a8dd811d 100644 --- a/libweston/renderer-gl/gl-renderer-internal.h +++ b/libweston/renderer-gl/gl-renderer-internal.h @@ -98,6 +98,11 @@ enum egl_display_extension_flag { EXTENSION_WL_BIND_WAYLAND_DISPLAY = 1ull << 13, }; +enum gl_feature_flag { + /* GL renderer can create contexts without specifying an EGLConfig. */ + FEATURE_NO_CONFIG_CONTEXT = 1ull << 0, +}; + /* Keep the following in sync with vertex.glsl. */ enum gl_shader_texcoord_input { SHADER_TEXCOORD_INPUT_ATTRIB = 0, @@ -310,6 +315,8 @@ struct gl_renderer { /* EGL_KHR_wait_sync */ PFNEGLWAITSYNCKHRPROC wait_sync; + uint64_t features; + PFNGLEGLIMAGETARGETTEXTURE2DOESPROC image_target_texture_2d; PFNGLTEXIMAGE3DOESPROC tex_image_3d; PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC image_target_renderbuffer_storage; @@ -404,6 +411,13 @@ egl_display_has(struct gl_renderer *gr, return (bool) (gr->egl_display_extensions & ((uint64_t) flag)); } +static inline bool +gl_features_has(struct gl_renderer *gr, + enum gl_feature_flag flag) +{ + return (bool) (gr->features & ((uint64_t) flag)); +} + static inline struct gl_renderer * get_renderer(struct weston_compositor *ec) { diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c index 9bef2ee52..868fad467 100644 --- a/libweston/renderer-gl/gl-renderer.c +++ b/libweston/renderer-gl/gl-renderer.c @@ -4570,8 +4570,7 @@ gl_renderer_display_create(struct weston_compositor *ec, if (!egl_display_has(gr, EXTENSION_KHR_SURFACELESS_CONTEXT)) goto fail_terminate; - if (!egl_display_has(gr, EXTENSION_KHR_NO_CONFIG_CONTEXT) && - !egl_display_has(gr, EXTENSION_MESA_CONFIGLESS_CONTEXT)) { + if (!gl_features_has(gr, FEATURE_NO_CONFIG_CONTEXT)) { EGLint egl_surface_type = options->egl_surface_type; if (!egl_display_has(gr, EXTENSION_KHR_SURFACELESS_CONTEXT))