gl-renderer: Check for GL_OES_EGL_image support

This commit ensures GL_OES_EGL_image is available before setting up
dma-buf renderer functions because it's not implied by the presence of
the EGL_EXT_image_dma_buf_import extension.

Signed-off-by: Loïc Molinari <loic.molinari@collabora.com>
This commit is contained in:
Loïc Molinari 2024-09-30 17:10:27 +02:00 committed by Daniel Stone
parent aaf968bf58
commit 0026986cce
2 changed files with 22 additions and 14 deletions

View file

@ -114,10 +114,11 @@ enum gl_extension_flag {
EXTENSION_EXT_TEXTURE_TYPE_2_10_10_10_REV = 1ull << 9,
EXTENSION_EXT_UNPACK_SUBIMAGE = 1ull << 10,
EXTENSION_NV_PIXEL_BUFFER_OBJECT = 1ull << 11,
EXTENSION_OES_EGL_IMAGE_EXTERNAL = 1ull << 12,
EXTENSION_OES_MAPBUFFER = 1ull << 13,
EXTENSION_OES_RGB8_RGBA8 = 1ull << 14,
EXTENSION_OES_TEXTURE_FLOAT_LINEAR = 1ull << 15,
EXTENSION_OES_EGL_IMAGE = 1ull << 12,
EXTENSION_OES_EGL_IMAGE_EXTERNAL = 1ull << 13,
EXTENSION_OES_MAPBUFFER = 1ull << 14,
EXTENSION_OES_RGB8_RGBA8 = 1ull << 15,
EXTENSION_OES_TEXTURE_FLOAT_LINEAR = 1ull << 16,
};
enum gl_feature_flag {

View file

@ -275,6 +275,7 @@ static const struct gl_extension_table extension_table[] = {
EXT("GL_EXT_texture_type_2_10_10_10_REV", EXTENSION_EXT_TEXTURE_TYPE_2_10_10_10_REV),
EXT("GL_EXT_unpack_subimage", EXTENSION_EXT_UNPACK_SUBIMAGE),
EXT("GL_NV_pixel_buffer_object", EXTENSION_NV_PIXEL_BUFFER_OBJECT),
EXT("GL_OES_EGL_image", EXTENSION_OES_EGL_IMAGE),
EXT("GL_OES_EGL_image_external", EXTENSION_OES_EGL_IMAGE_EXTERNAL),
EXT("GL_OES_mapbuffer", EXTENSION_OES_MAPBUFFER),
EXT("GL_OES_rgb8_rgba8", EXTENSION_OES_RGB8_RGBA8),
@ -4617,6 +4618,9 @@ gl_renderer_display_create(struct weston_compositor *ec,
}
}
if (gl_renderer_setup(ec) < 0)
goto fail_terminate;
ec->capabilities |= WESTON_CAP_ROTATION_ANY;
ec->capabilities |= WESTON_CAP_CAPTURE_YFLIP;
ec->capabilities |= WESTON_CAP_VIEW_CLIP_MASK;
@ -4626,7 +4630,10 @@ gl_renderer_display_create(struct weston_compositor *ec,
if (gr->allocator)
gr->base.dmabuf_alloc = gl_renderer_dmabuf_alloc;
if (egl_display_has(gr, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT)) {
/* No need to check for GL_OES_EGL_image_external because this is gated
* by EGL_EXT_image_dma_buf_import_modifiers which depends on it. */
if (egl_display_has(gr, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT) &&
gl_extensions_has(gr, EXTENSION_OES_EGL_IMAGE)) {
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;
@ -4650,9 +4657,6 @@ gl_renderer_display_create(struct weston_compositor *ec,
wl_signal_init(&gr->destroy_signal);
if (gl_renderer_setup(ec) < 0)
goto fail_with_error;
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_XBGR8888);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_ABGR8888);
wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_RGBX8888);
@ -4824,12 +4828,6 @@ gl_renderer_setup(struct weston_compositor *ec)
gr->gl_version = get_gl_version();
log_gl_info(gr);
gr->image_target_texture_2d =
(void *) eglGetProcAddress("glEGLImageTargetTexture2DOES");
gr->image_target_renderbuffer_storage =
(void *)eglGetProcAddress("glEGLImageTargetRenderbufferStorageOES");
extensions = (const char *) glGetString(GL_EXTENSIONS);
if (!extensions) {
weston_log("Retrieving GL extension string failed.\n");
@ -4838,6 +4836,15 @@ gl_renderer_setup(struct weston_compositor *ec)
gl_extensions_add(extension_table, extensions, &gr->gl_extensions);
if (gl_extensions_has(gr, EXTENSION_OES_EGL_IMAGE)) {
gr->image_target_texture_2d =
(void *) eglGetProcAddress("glEGLImageTargetTexture2DOES");
gr->image_target_renderbuffer_storage =
(void *) eglGetProcAddress("glEGLImageTargetRenderbufferStorageOES");
assert(gr->image_target_texture_2d);
assert(gr->image_target_renderbuffer_storage);
}
if (!gl_extensions_has(gr, EXTENSION_EXT_TEXTURE_FORMAT_BGRA8888)) {
weston_log("GL_EXT_texture_format_BGRA8888 not available\n");
return -1;