mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2025-12-20 02:20:13 +01:00
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:
parent
3cad1c7716
commit
ec646f34d6
3 changed files with 39 additions and 12 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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. */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue