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 <leandro.ribeiro@collabora.com>
This commit is contained in:
Leandro Ribeiro 2024-09-19 11:19:05 -03:00
parent 3cad1c7716
commit ec646f34d6
3 changed files with 39 additions and 12 deletions

View file

@ -75,6 +75,7 @@ static const struct gl_extension_table display_table[] = {
EXT("EGL_EXT_buffer_age", EXTENSION_EXT_BUFFER_AGE), 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", EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT),
EXT("EGL_EXT_image_dma_buf_import_modifiers", EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT_MODIFIERS), 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_EXT_swap_buffers_with_damage", EXTENSION_EXT_SWAP_BUFFERS_WITH_DAMAGE),
EXT("EGL_IMG_context_priority", EXTENSION_IMG_CONTEXT_PRIORITY), EXT("EGL_IMG_context_priority", EXTENSION_IMG_CONTEXT_PRIORITY),
EXT("EGL_KHR_fence_sync", EXTENSION_KHR_FENCE_SYNC), 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] = { const int *argb[4] = {
&pinfo->bits.a, &pinfo->bits.r, &pinfo->bits.g, &pinfo->bits.b &pinfo->bits.a, &pinfo->bits.r, &pinfo->bits.g, &pinfo->bits.b
}; };
bool fixed_point = (pinfo->component_type == PIXEL_COMPONENT_TYPE_FIXED);
unsigned i; unsigned i;
EGLint value; EGLint value;
@ -315,6 +317,15 @@ egl_config_pixel_format_matches(struct gl_renderer *gr,
return false; 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; return true;
} }
@ -446,6 +457,7 @@ gl_renderer_get_egl_config(struct gl_renderer *gr,
EGL_GREEN_SIZE, 1, EGL_GREEN_SIZE, 1,
EGL_BLUE_SIZE, 1, EGL_BLUE_SIZE, 1,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_NONE, EGL_NONE, /* we may change this latter */
EGL_NONE EGL_NONE
}; };
@ -456,6 +468,12 @@ gl_renderer_get_egl_config(struct gl_renderer *gr,
formats, formats_count)) formats, formats_count))
return gr->egl_config; 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, if (egl_choose_config(gr, config_attribs, formats, formats_count,
&egl_config) < 0) { &egl_config) < 0) {
what = explain_egl_config_criteria(egl_surface_type, what = explain_egl_config_criteria(egl_surface_type,

View file

@ -108,18 +108,19 @@ enum egl_display_extension_flag {
EXTENSION_EXT_BUFFER_AGE = 1ull << 1, EXTENSION_EXT_BUFFER_AGE = 1ull << 1,
EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT = 1ull << 2, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT = 1ull << 2,
EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT_MODIFIERS = 1ull << 3, EXTENSION_EXT_IMAGE_DMA_BUF_IMPORT_MODIFIERS = 1ull << 3,
EXTENSION_EXT_SWAP_BUFFERS_WITH_DAMAGE = 1ull << 4, EXTENSION_EXT_PIXEL_FORMAT_FLOAT = 1ull << 4,
EXTENSION_IMG_CONTEXT_PRIORITY = 1ull << 5, EXTENSION_EXT_SWAP_BUFFERS_WITH_DAMAGE = 1ull << 5,
EXTENSION_KHR_FENCE_SYNC = 1ull << 6, EXTENSION_IMG_CONTEXT_PRIORITY = 1ull << 6,
EXTENSION_KHR_GET_ALL_PROC_ADDRESSES = 1ull << 7, EXTENSION_KHR_FENCE_SYNC = 1ull << 7,
EXTENSION_KHR_IMAGE_BASE = 1ull << 8, EXTENSION_KHR_GET_ALL_PROC_ADDRESSES = 1ull << 8,
EXTENSION_KHR_NO_CONFIG_CONTEXT = 1ull << 9, EXTENSION_KHR_IMAGE_BASE = 1ull << 9,
EXTENSION_KHR_PARTIAL_UPDATE = 1ull << 10, EXTENSION_KHR_NO_CONFIG_CONTEXT = 1ull << 10,
EXTENSION_KHR_SURFACELESS_CONTEXT = 1ull << 11, EXTENSION_KHR_PARTIAL_UPDATE = 1ull << 11,
EXTENSION_KHR_SWAP_BUFFERS_WITH_DAMAGE = 1ull << 12, EXTENSION_KHR_SURFACELESS_CONTEXT = 1ull << 12,
EXTENSION_KHR_WAIT_SYNC = 1ull << 13, EXTENSION_KHR_SWAP_BUFFERS_WITH_DAMAGE = 1ull << 13,
EXTENSION_MESA_CONFIGLESS_CONTEXT = 1ull << 14, EXTENSION_KHR_WAIT_SYNC = 1ull << 14,
EXTENSION_WL_BIND_WAYLAND_DISPLAY = 1ull << 15, EXTENSION_MESA_CONFIGLESS_CONTEXT = 1ull << 15,
EXTENSION_WL_BIND_WAYLAND_DISPLAY = 1ull << 16,
}; };
/* Keep in sync with gl-renderer.c. */ /* Keep in sync with gl-renderer.c. */

View file

@ -175,6 +175,14 @@ EGLAPI EGLBoolean EGLAPIENTRY eglQueryDisplayAttribEXT (EGLDisplay dpy, EGLint a
#define EGL_DRM_RENDER_NODE_FILE_EXT 0x3377 #define EGL_DRM_RENDER_NODE_FILE_EXT 0x3377
#endif /* EGL_EXT_device_drm_render_node */ #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 #ifndef EGL_EXT_swap_buffers_with_damage
#define EGL_EXT_swap_buffers_with_damage 1 #define EGL_EXT_swap_buffers_with_damage 1
typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects); typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);