From ec646f34d6762343e13e2551783c22737f8d0daf Mon Sep 17 00:00:00 2001 From: Leandro Ribeiro Date: Thu, 19 Sep 2024 11:19:05 -0300 Subject: [PATCH] gl-renderer: add support to query EGL configs with float-point formats Currently when we have a blend-to-output color transformation, we have a 16FP shadow buffer representing the blending space. Then we blit from that to the primary plane fb, which is a regular buffer (fixed-point, not 16bpc). The shadow buffer needs to be 16FP because the blending space is linear with relation to light. So it needs more bits for encoding. In the next patches we enable the option to offload the blend-to-output color transformation to KMS, so we'll need the primary plane fb to be of a 16FP format. In order to do that, we need to be able to find EGL configs with float-point formats. In this patch we enable that. Signed-off-by: Leandro Ribeiro --- libweston/renderer-gl/egl-glue.c | 18 ++++++++++++++ libweston/renderer-gl/gl-renderer-internal.h | 25 ++++++++++---------- shared/weston-egl-ext.h | 8 +++++++ 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/libweston/renderer-gl/egl-glue.c b/libweston/renderer-gl/egl-glue.c index 16d05078f..9d6ad14e9 100644 --- a/libweston/renderer-gl/egl-glue.c +++ b/libweston/renderer-gl/egl-glue.c @@ -75,6 +75,7 @@ static const struct gl_extension_table display_table[] = { 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_pixel_format_float", EXTENSION_EXT_PIXEL_FORMAT_FLOAT), 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), @@ -296,6 +297,7 @@ egl_config_pixel_format_matches(struct gl_renderer *gr, const int *argb[4] = { &pinfo->bits.a, &pinfo->bits.r, &pinfo->bits.g, &pinfo->bits.b }; + bool fixed_point = (pinfo->component_type == PIXEL_COMPONENT_TYPE_FIXED); unsigned i; EGLint value; @@ -315,6 +317,15 @@ egl_config_pixel_format_matches(struct gl_renderer *gr, return false; } + if (!eglGetConfigAttrib(gr->egl_display, config, + EGL_COLOR_COMPONENT_TYPE_EXT, &value)) + value = EGL_COLOR_COMPONENT_TYPE_FIXED_EXT; + + if (fixed_point && value != EGL_COLOR_COMPONENT_TYPE_FIXED_EXT) + return false; + if (!fixed_point && value != EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT) + return false; + return true; } @@ -446,6 +457,7 @@ gl_renderer_get_egl_config(struct gl_renderer *gr, EGL_GREEN_SIZE, 1, EGL_BLUE_SIZE, 1, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL_NONE, EGL_NONE, /* we may change this latter */ EGL_NONE }; @@ -456,6 +468,12 @@ gl_renderer_get_egl_config(struct gl_renderer *gr, formats, formats_count)) return gr->egl_config; + if (egl_display_has(gr, EXTENSION_EXT_PIXEL_FORMAT_FLOAT)) { + uint32_t index = ARRAY_LENGTH(config_attribs) - 3; + config_attribs[index] = EGL_COLOR_COMPONENT_TYPE_EXT; + config_attribs[++index] = EGL_DONT_CARE; + } + if (egl_choose_config(gr, config_attribs, formats, formats_count, &egl_config) < 0) { what = explain_egl_config_criteria(egl_surface_type, diff --git a/libweston/renderer-gl/gl-renderer-internal.h b/libweston/renderer-gl/gl-renderer-internal.h index 5e6434bfa..1978fe9cc 100644 --- a/libweston/renderer-gl/gl-renderer-internal.h +++ b/libweston/renderer-gl/gl-renderer-internal.h @@ -108,18 +108,19 @@ enum egl_display_extension_flag { 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_GET_ALL_PROC_ADDRESSES = 1ull << 7, - EXTENSION_KHR_IMAGE_BASE = 1ull << 8, - EXTENSION_KHR_NO_CONFIG_CONTEXT = 1ull << 9, - EXTENSION_KHR_PARTIAL_UPDATE = 1ull << 10, - EXTENSION_KHR_SURFACELESS_CONTEXT = 1ull << 11, - EXTENSION_KHR_SWAP_BUFFERS_WITH_DAMAGE = 1ull << 12, - EXTENSION_KHR_WAIT_SYNC = 1ull << 13, - EXTENSION_MESA_CONFIGLESS_CONTEXT = 1ull << 14, - EXTENSION_WL_BIND_WAYLAND_DISPLAY = 1ull << 15, + EXTENSION_EXT_PIXEL_FORMAT_FLOAT = 1ull << 4, + EXTENSION_EXT_SWAP_BUFFERS_WITH_DAMAGE = 1ull << 5, + EXTENSION_IMG_CONTEXT_PRIORITY = 1ull << 6, + EXTENSION_KHR_FENCE_SYNC = 1ull << 7, + EXTENSION_KHR_GET_ALL_PROC_ADDRESSES = 1ull << 8, + EXTENSION_KHR_IMAGE_BASE = 1ull << 9, + EXTENSION_KHR_NO_CONFIG_CONTEXT = 1ull << 10, + EXTENSION_KHR_PARTIAL_UPDATE = 1ull << 11, + EXTENSION_KHR_SURFACELESS_CONTEXT = 1ull << 12, + EXTENSION_KHR_SWAP_BUFFERS_WITH_DAMAGE = 1ull << 13, + EXTENSION_KHR_WAIT_SYNC = 1ull << 14, + EXTENSION_MESA_CONFIGLESS_CONTEXT = 1ull << 15, + EXTENSION_WL_BIND_WAYLAND_DISPLAY = 1ull << 16, }; /* Keep in sync with gl-renderer.c. */ diff --git a/shared/weston-egl-ext.h b/shared/weston-egl-ext.h index 9d04da03b..6635907a2 100644 --- a/shared/weston-egl-ext.h +++ b/shared/weston-egl-ext.h @@ -175,6 +175,14 @@ EGLAPI EGLBoolean EGLAPIENTRY eglQueryDisplayAttribEXT (EGLDisplay dpy, EGLint a #define EGL_DRM_RENDER_NODE_FILE_EXT 0x3377 #endif /* EGL_EXT_device_drm_render_node */ +/* Define tokens from EGL_EXT_pixel_format_float */ +#ifndef EGL_EXT_pixel_format_float +#define EGL_EXT_pixel_format_float 1 +#define EGL_COLOR_COMPONENT_TYPE_EXT 0x3339 +#define EGL_COLOR_COMPONENT_TYPE_FIXED_EXT 0x333A +#define EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT 0x333B +#endif /* EGL_EXT_pixel_format_float */ + #ifndef EGL_EXT_swap_buffers_with_damage #define EGL_EXT_swap_buffers_with_damage 1 typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);