gl-renderer: Remove EGL extension booleans

Now that the EGL extensions are stored in the egl_*_extensions
bitfields, there's no need to use booleans anymore.

Signed-off-by: Loïc Molinari <loic.molinari@collabora.com>
This commit is contained in:
Loïc Molinari 2024-10-10 14:02:12 +02:00 committed by Daniel Stone
parent 54dfa0743e
commit c56c104f7a
3 changed files with 56 additions and 89 deletions

View file

@ -490,7 +490,7 @@ gl_renderer_set_egl_device(struct gl_renderer *gr)
EGLAttrib attrib;
const char *extensions;
assert(gr->has_device_query);
assert(egl_client_has(gr, EXTENSION_EXT_DEVICE_QUERY));
if (!gr->query_display_attrib(gr->egl_display, EGL_DEVICE_EXT, &attrib)) {
weston_log("failed to get EGL device\n");
@ -533,7 +533,7 @@ gl_renderer_setup_egl_display(struct gl_renderer *gr,
{
gr->egl_display = NULL;
if (gr->has_platform_base)
if (egl_client_has(gr, EXTENSION_EXT_PLATFORM_BASE))
gr->egl_display = gr->get_platform_display(gr->platform,
native_display,
NULL);
@ -555,7 +555,7 @@ gl_renderer_setup_egl_display(struct gl_renderer *gr,
goto fail;
}
if (gr->has_device_query)
if (egl_client_has(gr, EXTENSION_EXT_DEVICE_QUERY))
gl_renderer_set_egl_device(gr);
return 0;
@ -591,7 +591,6 @@ gl_renderer_setup_egl_client_extensions(struct gl_renderer *gr)
(void *) eglGetProcAddress("eglQueryDisplayAttribEXT");
gr->query_device_string =
(void *) eglGetProcAddress("eglQueryDeviceStringEXT");
gr->has_device_query = true;
}
if (egl_client_has(gr, EXTENSION_EXT_PLATFORM_BASE)) {
@ -599,7 +598,6 @@ gl_renderer_setup_egl_client_extensions(struct gl_renderer *gr)
(void *) eglGetProcAddress("eglGetPlatformDisplayEXT");
gr->create_platform_window =
(void *) eglGetProcAddress("eglCreatePlatformWindowSurfaceEXT");
gr->has_platform_base = true;
} else if (gr->platform != EGL_PLATFORM_SURFACELESS_MESA) {
weston_log("warning: EGL_EXT_platform_base not supported.\n");
return 0;
@ -649,20 +647,21 @@ int
gl_renderer_setup_egl_extensions(struct weston_compositor *ec)
{
static const struct {
char *extension, *entrypoint;
enum egl_display_extension_flag extension;
char *entrypoint;
} swap_damage_ext_to_entrypoint[] = {
{
.extension = "EGL_EXT_swap_buffers_with_damage",
.extension = EXTENSION_EXT_SWAP_BUFFERS_WITH_DAMAGE,
.entrypoint = "eglSwapBuffersWithDamageEXT",
},
{
.extension = "EGL_KHR_swap_buffers_with_damage",
.extension = EXTENSION_KHR_SWAP_BUFFERS_WITH_DAMAGE,
.entrypoint = "eglSwapBuffersWithDamageKHR",
},
};
struct gl_renderer *gr = get_renderer(ec);
bool has_bind_display = false;
const char *extensions;
EGLBoolean ret;
unsigned i;
gr->create_image = (void *) eglGetProcAddress("eglCreateImageKHR");
@ -687,30 +686,19 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec)
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 (egl_display_has(gr, EXTENSION_WL_BIND_WAYLAND_DISPLAY))
gr->has_bind_display = true;
if (gr->has_bind_display) {
if (egl_display_has(gr, EXTENSION_WL_BIND_WAYLAND_DISPLAY)) {
assert(gr->bind_display);
assert(gr->unbind_display);
assert(gr->query_buffer);
ret = gr->bind_display(gr->egl_display, ec->wl_display);
if (!ret)
gr->has_bind_display = false;
has_bind_display = gr->bind_display(gr->egl_display,
ec->wl_display);
}
if (egl_display_has(gr, EXTENSION_EXT_BUFFER_AGE))
gr->has_egl_buffer_age = true;
if (egl_display_has(gr, EXTENSION_KHR_PARTIAL_UPDATE)) {
if (egl_display_has(gr, EXTENSION_KHR_PARTIAL_UPDATE))
assert(gr->set_damage_region);
gr->has_egl_partial_update = true;
}
for (i = 0; i < ARRAY_LENGTH(swap_damage_ext_to_entrypoint); i++) {
if (weston_check_egl_extension(extensions,
if (egl_display_has(gr,
swap_damage_ext_to_entrypoint[i].extension)) {
gr->swap_buffers_with_damage =
(void *) eglGetProcAddress(
@ -720,16 +708,6 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec)
}
}
if (egl_display_has(gr, EXTENSION_KHR_NO_CONFIG_CONTEXT) ||
egl_display_has(gr, EXTENSION_MESA_CONFIGLESS_CONTEXT))
gr->has_configless_context = true;
if (egl_display_has(gr, EXTENSION_KHR_SURFACELESS_CONTEXT))
gr->has_surfaceless_context = true;
if (egl_display_has(gr, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT))
gr->has_dmabuf_import = true;
if (egl_display_has(gr, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT_MODIFIERS)) {
gr->query_dmabuf_formats =
(void *) eglGetProcAddress("eglQueryDmaBufFormatsEXT");
@ -737,7 +715,6 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec)
(void *) eglGetProcAddress("eglQueryDmaBufModifiersEXT");
assert(gr->query_dmabuf_formats);
assert(gr->query_dmabuf_modifiers);
gr->has_dmabuf_import_modifiers = true;
}
if (egl_display_has(gr, EXTENSION_KHR_FENCE_SYNC) &&
@ -751,7 +728,6 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec)
assert(gr->create_sync);
assert(gr->destroy_sync);
assert(gr->dup_native_fence_fd);
gr->has_native_fence_sync = true;
} else {
weston_log("warning: Disabling render GPU timeline and explicit "
"synchronization due to missing "
@ -761,31 +737,31 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec)
if (egl_display_has(gr, EXTENSION_KHR_WAIT_SYNC)) {
gr->wait_sync = (void *) eglGetProcAddress("eglWaitSyncKHR");
assert(gr->wait_sync);
gr->has_wait_sync = true;
} else {
weston_log("warning: Disabling explicit synchronization due"
weston_log("warning: Disabling explicit synchronization due "
"to missing EGL_KHR_wait_sync extension\n");
}
weston_log("EGL features:\n");
weston_log_continue(STAMP_SPACE "EGL Wayland extension: %s\n",
yesno(gr->has_bind_display));
yesno(has_bind_display));
weston_log_continue(STAMP_SPACE "context priority: %s\n",
yesno(gr->has_context_priority));
yesno(egl_display_has(gr, EXTENSION_IMG_CONTEXT_PRIORITY)));
weston_log_continue(STAMP_SPACE "buffer age: %s\n",
yesno(gr->has_egl_buffer_age));
yesno(egl_display_has(gr, EXTENSION_EXT_BUFFER_AGE)));
weston_log_continue(STAMP_SPACE "partial update: %s\n",
yesno(gr->has_egl_partial_update));
yesno(egl_display_has(gr, EXTENSION_KHR_PARTIAL_UPDATE)));
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(gr->has_configless_context));
yesno(egl_display_has(gr, EXTENSION_KHR_NO_CONFIG_CONTEXT) ||
egl_display_has(gr, EXTENSION_MESA_CONFIGLESS_CONTEXT)));
weston_log_continue(STAMP_SPACE "surfaceless context: %s\n",
yesno(gr->has_surfaceless_context));
yesno(egl_display_has(gr, EXTENSION_KHR_SURFACELESS_CONTEXT)));
weston_log_continue(STAMP_SPACE "dmabuf support: %s\n",
gr->has_dmabuf_import ?
(gr->has_dmabuf_import_modifiers ? "modifiers" : "legacy") :
"no");
!egl_display_has(gr, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT) ? "no" :
!egl_display_has(gr, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT_MODIFIERS) ? "legacy" :
"modifiers");
return 0;
}

View file

@ -276,26 +276,15 @@ struct gl_renderer {
PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display;
PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC create_platform_window;
bool has_platform_base;
PFNEGLBINDWAYLANDDISPLAYWL bind_display;
PFNEGLUNBINDWAYLANDDISPLAYWL unbind_display;
PFNEGLQUERYWAYLANDBUFFERWL query_buffer;
bool has_bind_display;
bool has_context_priority;
bool has_egl_image_external;
bool has_egl_buffer_age;
bool has_egl_partial_update;
PFNEGLSETDAMAGEREGIONKHRPROC set_damage_region;
bool has_configless_context;
bool has_surfaceless_context;
bool has_dmabuf_import;
struct wl_list dmabuf_images;
struct wl_list dmabuf_formats;
@ -318,20 +307,16 @@ struct gl_renderer {
struct wl_signal destroy_signal;
bool has_dmabuf_import_modifiers;
PFNEGLQUERYDMABUFFORMATSEXTPROC query_dmabuf_formats;
PFNEGLQUERYDMABUFMODIFIERSEXTPROC query_dmabuf_modifiers;
bool has_device_query;
PFNEGLQUERYDISPLAYATTRIBEXTPROC query_display_attrib;
PFNEGLQUERYDEVICESTRINGEXTPROC query_device_string;
bool has_native_fence_sync;
PFNEGLCREATESYNCKHRPROC create_sync;
PFNEGLDESTROYSYNCKHRPROC destroy_sync;
PFNEGLDUPNATIVEFENCEFDANDROIDPROC dup_native_fence_fd;
bool has_wait_sync;
PFNEGLWAITSYNCKHRPROC wait_sync;
bool has_disjoint_timer_query;

View file

@ -484,7 +484,7 @@ static void
timeline_begin_render_query(struct gl_renderer *gr, GLuint query)
{
if (weston_log_scope_is_enabled(gr->compositor->timeline) &&
gr->has_native_fence_sync &&
egl_display_has(gr, EXTENSION_ANDROID_NATIVE_FENCE_SYNC) &&
gr->has_disjoint_timer_query)
gr->begin_query(GL_TIME_ELAPSED_EXT, query);
}
@ -493,7 +493,7 @@ static void
timeline_end_render_query(struct gl_renderer *gr)
{
if (weston_log_scope_is_enabled(gr->compositor->timeline) &&
gr->has_native_fence_sync &&
egl_display_has(gr, EXTENSION_ANDROID_NATIVE_FENCE_SYNC) &&
gr->has_disjoint_timer_query)
gr->end_query(GL_TIME_ELAPSED_EXT);
}
@ -550,7 +550,7 @@ create_render_sync(struct gl_renderer *gr)
{
static const EGLint attribs[] = { EGL_NONE };
if (!gr->has_native_fence_sync)
if (!egl_display_has(gr, EXTENSION_ANDROID_NATIVE_FENCE_SYNC))
return EGL_NO_SYNC_KHR;
return gr->create_sync(gr->egl_display, EGL_SYNC_NATIVE_FENCE_ANDROID,
@ -569,7 +569,7 @@ timeline_submit_render_sync(struct gl_renderer *gr,
struct timeline_render_point *trp;
if (!weston_log_scope_is_enabled(gr->compositor->timeline) ||
!gr->has_native_fence_sync ||
!egl_display_has(gr, EXTENSION_ANDROID_NATIVE_FENCE_SYNC) ||
!gr->has_disjoint_timer_query ||
sync == EGL_NO_SYNC_KHR)
return;
@ -1158,7 +1158,7 @@ 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(gr->has_native_fence_sync);
assert(egl_display_has(gr, EXTENSION_ANDROID_NATIVE_FENCE_SYNC));
/* We should only get a fence for non-SHM buffers, since surface
* commit would have failed otherwise. */
assert(buffer->type != WESTON_BUFFER_SHM);
@ -2079,7 +2079,8 @@ output_get_buffer_age(struct weston_output *output)
EGLint buffer_age = 0;
EGLBoolean ret;
if ((gr->has_egl_buffer_age || gr->has_egl_partial_update) &&
if ((egl_display_has(gr, EXTENSION_EXT_BUFFER_AGE) ||
egl_display_has(gr, EXTENSION_KHR_PARTIAL_UPDATE)) &&
go->egl_surface != EGL_NO_SURFACE) {
ret = eglQuerySurface(gr->egl_display, go->egl_surface,
EGL_BUFFER_AGE_EXT, &buffer_age);
@ -2123,7 +2124,8 @@ output_get_dummy_renderbuffer(struct weston_output *output)
}
/* otherwise decide whether to refurbish and return the oldest, */
max_buffers = (gr->has_egl_buffer_age || gr->has_egl_partial_update) ?
max_buffers = (egl_display_has(gr, EXTENSION_EXT_BUFFER_AGE) ||
egl_display_has(gr, EXTENSION_KHR_PARTIAL_UPDATE)) ?
BUFFER_DAMAGE_COUNT : 1;
if ((buffer_age == 0 || buffer_age - 1 > BUFFER_DAMAGE_COUNT) &&
count >= max_buffers) {
@ -2395,7 +2397,7 @@ gl_renderer_repaint_output(struct weston_output *output,
pixman_region32_fini(&undamaged);
}
if (gr->has_egl_partial_update &&
if (egl_display_has(gr, EXTENSION_KHR_PARTIAL_UPDATE) &&
go->egl_surface != EGL_NO_SURFACE &&
!gr->debug_clear) {
int n_egl_rects;
@ -2443,7 +2445,9 @@ gl_renderer_repaint_output(struct weston_output *output,
if (go->egl_surface != EGL_NO_SURFACE) {
EGLBoolean ret;
if (gr->swap_buffers_with_damage && !gr->debug_clear) {
if ((egl_display_has(gr, EXTENSION_EXT_SWAP_BUFFERS_WITH_DAMAGE) ||
egl_display_has(gr, EXTENSION_KHR_SWAP_BUFFERS_WITH_DAMAGE)) &&
!gr->debug_clear) {
int n_egl_rects;
EGLint *egl_rects;
@ -3015,7 +3019,7 @@ import_simple_dmabuf(struct gl_renderer *gr,
attribs[atti++] = EGL_TRUE;
if (attributes->modifier != DRM_FORMAT_MOD_INVALID) {
if (!gr->has_dmabuf_import_modifiers)
if (!egl_display_has(gr, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT_MODIFIERS))
return NULL;
has_modifier = true;
} else {
@ -3067,7 +3071,7 @@ import_simple_dmabuf(struct gl_renderer *gr,
}
}
if (gr->has_dmabuf_import_modifiers) {
if (egl_display_has(gr, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT_MODIFIERS)) {
if (attributes->n_planes > 3) {
attribs[atti++] = EGL_DMA_BUF_PLANE3_FD_EXT;
attribs[atti++] = attributes->fd[3];
@ -3327,9 +3331,9 @@ gl_renderer_query_dmabuf_formats(struct weston_compositor *wc,
bool fallback = false;
EGLint num;
assert(gr->has_dmabuf_import);
assert(egl_display_has(gr, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT));
if (!gr->has_dmabuf_import_modifiers ||
if (!egl_display_has(gr, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT_MODIFIERS) ||
!gr->query_dmabuf_formats(gr->egl_display, 0, NULL, &num)) {
num = gr->has_gl_texture_rg ? ARRAY_LENGTH(fallback_formats) : 2;
fallback = true;
@ -3364,9 +3368,9 @@ gl_renderer_query_dmabuf_modifiers_full(struct gl_renderer *gr, int format,
{
int num;
assert(gr->has_dmabuf_import);
assert(egl_display_has(gr, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT));
if (!gr->has_dmabuf_import_modifiers ||
if (!egl_display_has(gr, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT_MODIFIERS) ||
!gr->query_dmabuf_modifiers(gr->egl_display, format, 0, NULL,
NULL, &num) ||
num == 0) {
@ -3418,11 +3422,11 @@ gl_renderer_import_dmabuf(struct weston_compositor *ec,
struct gl_renderer *gr = get_renderer(ec);
struct gl_buffer_state *gb;
assert(gr->has_dmabuf_import);
assert(egl_display_has(gr, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT));
/* return if EGL doesn't support import modifiers */
if (dmabuf->attributes.modifier != DRM_FORMAT_MOD_INVALID)
if (!gr->has_dmabuf_import_modifiers)
if (!egl_display_has(gr, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT_MODIFIERS))
return false;
/* reject all flags we do not recognize or handle */
@ -4436,7 +4440,7 @@ gl_renderer_destroy(struct weston_compositor *ec)
wl_signal_emit(&gr->destroy_signal, gr);
if (gr->has_bind_display)
if (egl_display_has(gr, EXTENSION_WL_BIND_WAYLAND_DISPLAY))
gr->unbind_display(gr->egl_display, ec->wl_display);
wl_list_for_each_safe(gl_task, tmp, &gr->pending_capture_list, link)
@ -4563,13 +4567,14 @@ gl_renderer_display_create(struct weston_compositor *ec,
if (gl_renderer_setup_egl_extensions(ec) < 0)
goto fail_with_error;
if (!gr->has_surfaceless_context)
if (!egl_display_has(gr, EXTENSION_KHR_SURFACELESS_CONTEXT))
goto fail_terminate;
if (!gr->has_configless_context) {
if (!egl_display_has(gr, EXTENSION_KHR_NO_CONFIG_CONTEXT) &&
!egl_display_has(gr, EXTENSION_MESA_CONFIGLESS_CONTEXT)) {
EGLint egl_surface_type = options->egl_surface_type;
if (!gr->has_surfaceless_context)
if (!egl_display_has(gr, EXTENSION_KHR_SURFACELESS_CONTEXT))
egl_surface_type |= EGL_PBUFFER_BIT;
gr->egl_config =
@ -4586,13 +4591,14 @@ 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 (gr->has_native_fence_sync && gr->has_wait_sync)
if (egl_display_has(gr, EXTENSION_ANDROID_NATIVE_FENCE_SYNC) &&
egl_display_has(gr, EXTENSION_KHR_WAIT_SYNC))
ec->capabilities |= WESTON_CAP_EXPLICIT_SYNC;
if (gr->allocator)
gr->base.dmabuf_alloc = gl_renderer_dmabuf_alloc;
if (gr->has_dmabuf_import) {
if (egl_display_has(gr, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT)) {
gr->base.import_dmabuf = gl_renderer_import_dmabuf;
gr->base.get_supported_formats = gl_renderer_get_supported_formats;
gr->base.create_renderbuffer_dmabuf = gl_renderer_create_renderbuffer_dmabuf;
@ -4741,7 +4747,7 @@ gl_renderer_setup(struct weston_compositor *ec)
* first. If the driver doesn't permit us to create a high priority
* context, it will fallback to the default priority (MEDIUM).
*/
if (gr->has_context_priority) {
if (egl_display_has(gr, EXTENSION_IMG_CONTEXT_PRIORITY)) {
context_attribs[nattr++] = EGL_CONTEXT_PRIORITY_LEVEL_IMG;
context_attribs[nattr++] = EGL_CONTEXT_PRIORITY_HIGH_IMG;
}
@ -4767,7 +4773,7 @@ gl_renderer_setup(struct weston_compositor *ec)
}
}
if (gr->has_context_priority) {
if (egl_display_has(gr, EXTENSION_IMG_CONTEXT_PRIORITY)) {
EGLint value = EGL_CONTEXT_PRIORITY_MEDIUM_IMG;
eglQueryContext(gr->egl_display, gr->egl_context,
@ -4916,7 +4922,7 @@ gl_renderer_setup(struct weston_compositor *ec)
"the GL_EXT_disjoint_timer_query "
"extension\n");
}
} else if (gr->has_native_fence_sync) {
} else if (egl_display_has(gr, EXTENSION_ANDROID_NATIVE_FENCE_SYNC)) {
weston_log("warning: Disabling render GPU timeline due to "
"missing GL_EXT_disjoint_timer_query extension\n");
}