From 0026986ccef702c7a103fcb6038f3819edd815ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Molinari?= Date: Mon, 30 Sep 2024 17:10:27 +0200 Subject: [PATCH] gl-renderer: Check for GL_OES_EGL_image support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- libweston/renderer-gl/gl-renderer-internal.h | 9 ++++--- libweston/renderer-gl/gl-renderer.c | 27 ++++++++++++-------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/libweston/renderer-gl/gl-renderer-internal.h b/libweston/renderer-gl/gl-renderer-internal.h index bd054b594..924a48690 100644 --- a/libweston/renderer-gl/gl-renderer-internal.h +++ b/libweston/renderer-gl/gl-renderer-internal.h @@ -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 { diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c index ebaa130d3..413afcf03 100644 --- a/libweston/renderer-gl/gl-renderer.c +++ b/libweston/renderer-gl/gl-renderer.c @@ -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;