gl-renderer: Store EGL display extensions as flags

The egl_display_extensions bitfield is added to store the display
extensions supported by the EGL implementation.

Signed-off-by: Loïc Molinari <loic.molinari@collabora.com>
This commit is contained in:
Loïc Molinari 2024-10-10 12:55:50 +02:00 committed by Daniel Stone
parent 12b9c65011
commit 54dfa0743e
2 changed files with 60 additions and 13 deletions

View file

@ -69,6 +69,25 @@ static const struct gl_extension_table device_table[] = {
{ NULL, 0, 0 }
};
/* Keep in sync with gl-renderer-internal.h. */
static const struct gl_extension_table display_table[] = {
EXT("EGL_ANDROID_native_fence_sync", EXTENSION_ANDROID_NATIVE_FENCE_SYNC),
EXT("EGL_EXT_buffer_age", EXTENSION_EXT_BUFFER_AGE),
EXT("EGL_EXT_image_dma_buf_import", EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT),
EXT("EGL_EXT_image_dma_buf_import_modifiers", EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT_MODIFIERS),
EXT("EGL_EXT_swap_buffers_with_damage", EXTENSION_EXT_SWAP_BUFFERS_WITH_DAMAGE),
EXT("EGL_IMG_context_priority", EXTENSION_IMG_CONTEXT_PRIORITY),
EXT("EGL_KHR_fence_sync", EXTENSION_KHR_FENCE_SYNC),
EXT("EGL_KHR_no_config_context", EXTENSION_KHR_NO_CONFIG_CONTEXT),
EXT("EGL_KHR_partial_update", EXTENSION_KHR_PARTIAL_UPDATE),
EXT("EGL_KHR_surfaceless_context", EXTENSION_KHR_SURFACELESS_CONTEXT),
EXT("EGL_KHR_swap_buffers_with_damage", EXTENSION_KHR_SWAP_BUFFERS_WITH_DAMAGE),
EXT("EGL_KHR_wait_sync", EXTENSION_KHR_WAIT_SYNC),
EXT("EGL_MESA_configless_context", EXTENSION_MESA_CONFIGLESS_CONTEXT),
EXT("EGL_WL_bind_wayland_display", EXTENSION_WL_BIND_WAYLAND_DISPLAY),
{ NULL, 0, 0 }
};
static const char *
egl_error_string(EGLint code)
{
@ -665,10 +684,13 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec)
return -1;
}
if (weston_check_egl_extension(extensions, "EGL_IMG_context_priority"))
gl_extensions_add(display_table, extensions,
&gr->egl_display_extensions);
if (egl_display_has(gr, EXTENSION_IMG_CONTEXT_PRIORITY))
gr->has_context_priority = true;
if (weston_check_egl_extension(extensions, "EGL_WL_bind_wayland_display"))
if (egl_display_has(gr, EXTENSION_WL_BIND_WAYLAND_DISPLAY))
gr->has_bind_display = true;
if (gr->has_bind_display) {
assert(gr->bind_display);
@ -679,10 +701,10 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec)
gr->has_bind_display = false;
}
if (weston_check_egl_extension(extensions, "EGL_EXT_buffer_age"))
if (egl_display_has(gr, EXTENSION_EXT_BUFFER_AGE))
gr->has_egl_buffer_age = true;
if (weston_check_egl_extension(extensions, "EGL_KHR_partial_update")) {
if (egl_display_has(gr, EXTENSION_KHR_PARTIAL_UPDATE)) {
assert(gr->set_damage_region);
gr->has_egl_partial_update = true;
}
@ -698,18 +720,17 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec)
}
}
if (weston_check_egl_extension(extensions, "EGL_KHR_no_config_context") ||
weston_check_egl_extension(extensions, "EGL_MESA_configless_context"))
if (egl_display_has(gr, EXTENSION_KHR_NO_CONFIG_CONTEXT) ||
egl_display_has(gr, EXTENSION_MESA_CONFIGLESS_CONTEXT))
gr->has_configless_context = true;
if (weston_check_egl_extension(extensions, "EGL_KHR_surfaceless_context"))
if (egl_display_has(gr, EXTENSION_KHR_SURFACELESS_CONTEXT))
gr->has_surfaceless_context = true;
if (weston_check_egl_extension(extensions, "EGL_EXT_image_dma_buf_import"))
if (egl_display_has(gr, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT))
gr->has_dmabuf_import = true;
if (weston_check_egl_extension(extensions,
"EGL_EXT_image_dma_buf_import_modifiers")) {
if (egl_display_has(gr, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT_MODIFIERS)) {
gr->query_dmabuf_formats =
(void *) eglGetProcAddress("eglQueryDmaBufFormatsEXT");
gr->query_dmabuf_modifiers =
@ -719,8 +740,8 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec)
gr->has_dmabuf_import_modifiers = true;
}
if (weston_check_egl_extension(extensions, "EGL_KHR_fence_sync") &&
weston_check_egl_extension(extensions, "EGL_ANDROID_native_fence_sync")) {
if (egl_display_has(gr, EXTENSION_KHR_FENCE_SYNC) &&
egl_display_has(gr, EXTENSION_ANDROID_NATIVE_FENCE_SYNC)) {
gr->create_sync =
(void *) eglGetProcAddress("eglCreateSyncKHR");
gr->destroy_sync =
@ -737,7 +758,7 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec)
"EGL_ANDROID_native_fence_sync extension\n");
}
if (weston_check_egl_extension(extensions, "EGL_KHR_wait_sync")) {
if (egl_display_has(gr, EXTENSION_KHR_WAIT_SYNC)) {
gr->wait_sync = (void *) eglGetProcAddress("eglWaitSyncKHR");
assert(gr->wait_sync);
gr->has_wait_sync = true;

View file

@ -75,6 +75,24 @@ enum egl_device_extension_flag {
EXTENSION_EXT_DEVICE_DRM_RENDER_NODE = 1ull << 1,
};
/* Keep in sync with egl-glue.c. */
enum egl_display_extension_flag {
EXTENSION_ANDROID_NATIVE_FENCE_SYNC = 1ull << 0,
EXTENSION_EXT_BUFFER_AGE = 1ull << 1,
EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT = 1ull << 2,
EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT_MODIFIERS = 1ull << 3,
EXTENSION_EXT_SWAP_BUFFERS_WITH_DAMAGE = 1ull << 4,
EXTENSION_IMG_CONTEXT_PRIORITY = 1ull << 5,
EXTENSION_KHR_FENCE_SYNC = 1ull << 6,
EXTENSION_KHR_NO_CONFIG_CONTEXT = 1ull << 7,
EXTENSION_KHR_PARTIAL_UPDATE = 1ull << 8,
EXTENSION_KHR_SURFACELESS_CONTEXT = 1ull << 9,
EXTENSION_KHR_SWAP_BUFFERS_WITH_DAMAGE = 1ull << 10,
EXTENSION_KHR_WAIT_SYNC = 1ull << 11,
EXTENSION_MESA_CONFIGLESS_CONTEXT = 1ull << 12,
EXTENSION_WL_BIND_WAYLAND_DISPLAY = 1ull << 13,
};
/* Keep the following in sync with vertex.glsl. */
enum gl_shader_texcoord_input {
SHADER_TEXCOORD_INPUT_ATTRIB = 0,
@ -247,6 +265,7 @@ struct gl_renderer {
uint64_t egl_client_extensions;
uint64_t egl_device_extensions;
uint64_t egl_display_extensions;
PFNGLEGLIMAGETARGETTEXTURE2DOESPROC image_target_texture_2d;
PFNGLTEXIMAGE3DOESPROC tex_image_3d;
@ -374,6 +393,13 @@ egl_device_has(struct gl_renderer *gr,
return (bool) (gr->egl_device_extensions & ((uint64_t) flag));
}
static inline bool
egl_display_has(struct gl_renderer *gr,
enum egl_display_extension_flag flag)
{
return (bool) (gr->egl_display_extensions & ((uint64_t) flag));
}
static inline struct gl_renderer *
get_renderer(struct weston_compositor *ec)
{