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))