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);