From d32c458de76c9e0cc08c9ee1a7de23c3fca69298 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mathias=20Fr=C3=B6hlich?= Date: Sun, 9 Feb 2020 19:01:53 +0100 Subject: [PATCH] egl: Fix A2RGB10 platform_{device,surfaceless} PBuffer configs. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The __DRI_IMAGE_FORMAT_* part wants to be handled for the *101010 type formats as well. Factor out a common function for that task. That again makes the piglit egl_ext_device_base test work again for hardware drivers. v2: Factor out a common function for that task. v3: dri2_pbuffer_visuals -> dri2_pbuffer_visuals Reviewed-by: Emil Velikov Fixes: 9acb94b6236 "egl: Enable 10bpc EGLConfigs for platform_{device,surfaceless}" Signed-off-by: Mathias Fröhlich Part-of: --- src/egl/drivers/dri2/egl_dri2.c | 69 +++++++++++++++++++++ src/egl/drivers/dri2/egl_dri2.h | 4 ++ src/egl/drivers/dri2/platform_device.c | 11 ++-- src/egl/drivers/dri2/platform_surfaceless.c | 11 ++-- 4 files changed, 81 insertions(+), 14 deletions(-) diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 5e497b79bc4..e1e8faaa798 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -84,6 +84,48 @@ #define NUM_ATTRIBS 12 +static const struct dri2_pbuffer_visual { + unsigned int dri_image_format; + int rgba_shifts[4]; + unsigned int rgba_sizes[4]; +} dri2_pbuffer_visuals[] = { + { + __DRI_IMAGE_FORMAT_ABGR16161616F, + { 0, 16, 32, 48 }, + { 16, 16, 16, 16 } + }, + { + __DRI_IMAGE_FORMAT_XBGR16161616F, + { 0, 16, 32, -1 }, + { 16, 16, 16, 0 } + }, + { + __DRI_IMAGE_FORMAT_ARGB2101010, + { 20, 10, 0, 30 }, + { 10, 10, 10, 2 } + }, + { + __DRI_IMAGE_FORMAT_XRGB2101010, + { 20, 10, 0, -1 }, + { 10, 10, 10, 0 } + }, + { + __DRI_IMAGE_FORMAT_ARGB8888, + { 16, 8, 0, 24 }, + { 8, 8, 8, 8 } + }, + { + __DRI_IMAGE_FORMAT_XRGB8888, + { 16, 8, 0, -1 }, + { 8, 8, 8, 0 } + }, + { + __DRI_IMAGE_FORMAT_RGB565, + { 11, 5, 0, -1 }, + { 5, 6, 5, 0 } + }, +}; + static void dri_set_background_context(void *loaderPrivate) { @@ -333,6 +375,33 @@ dri2_get_render_type_float(const __DRIcoreExtension *core, *is_float = (render_type & __DRI_ATTRIB_FLOAT_BIT) ? true : false; } +unsigned int +dri2_image_format_for_pbuffer_config(struct dri2_egl_display *dri2_dpy, + const __DRIconfig *config) +{ + int shifts[4]; + unsigned int sizes[4]; + + dri2_get_shifts_and_sizes(dri2_dpy->core, config, shifts, sizes); + + for (unsigned i = 0; i < ARRAY_SIZE(dri2_pbuffer_visuals); ++i) { + const struct dri2_pbuffer_visual *visual = &dri2_pbuffer_visuals[i]; + + if (shifts[0] == visual->rgba_shifts[0] && + shifts[1] == visual->rgba_shifts[1] && + shifts[2] == visual->rgba_shifts[2] && + shifts[3] == visual->rgba_shifts[3] && + sizes[0] == visual->rgba_sizes[0] && + sizes[1] == visual->rgba_sizes[1] && + sizes[2] == visual->rgba_sizes[2] && + sizes[3] == visual->rgba_sizes[3]) { + return visual->dri_image_format; + } + } + + return __DRI_IMAGE_FORMAT_NONE; +} + struct dri2_egl_config * dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id, EGLint surface_type, const EGLint *attr_list, diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index 8272da886ee..96cf04d89e9 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -417,6 +417,10 @@ dri2_get_render_type_float(const __DRIcoreExtension *core, const __DRIconfig *config, bool *is_float); +unsigned int +dri2_image_format_for_pbuffer_config(struct dri2_egl_display *dri2_dpy, + const __DRIconfig *config); + struct dri2_egl_config * dri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id, EGLint surface_type, const EGLint *attr_list, diff --git a/src/egl/drivers/dri2/platform_device.c b/src/egl/drivers/dri2/platform_device.c index eb2a743b01d..873236cc23e 100644 --- a/src/egl/drivers/dri2/platform_device.c +++ b/src/egl/drivers/dri2/platform_device.c @@ -145,15 +145,12 @@ dri2_device_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type, goto cleanup_surface; } - if (!dri2_create_drawable(dri2_dpy, config, dri2_surf, dri2_surf)) + dri2_surf->visual = dri2_image_format_for_pbuffer_config(dri2_dpy, config); + if (dri2_surf->visual == __DRI_IMAGE_FORMAT_NONE) goto cleanup_surface; - if (conf->RedSize == 5) - dri2_surf->visual = __DRI_IMAGE_FORMAT_RGB565; - else if (conf->AlphaSize == 0) - dri2_surf->visual = __DRI_IMAGE_FORMAT_XRGB8888; - else - dri2_surf->visual = __DRI_IMAGE_FORMAT_ARGB8888; + if (!dri2_create_drawable(dri2_dpy, config, dri2_surf, dri2_surf)) + goto cleanup_surface; return &dri2_surf->base; diff --git a/src/egl/drivers/dri2/platform_surfaceless.c b/src/egl/drivers/dri2/platform_surfaceless.c index 19d28aa61ab..212b5c14343 100644 --- a/src/egl/drivers/dri2/platform_surfaceless.c +++ b/src/egl/drivers/dri2/platform_surfaceless.c @@ -139,15 +139,12 @@ dri2_surfaceless_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type, goto cleanup_surface; } - if (!dri2_create_drawable(dri2_dpy, config, dri2_surf, dri2_surf)) + dri2_surf->visual = dri2_image_format_for_pbuffer_config(dri2_dpy, config); + if (dri2_surf->visual == __DRI_IMAGE_FORMAT_NONE) goto cleanup_surface; - if (conf->RedSize == 5) - dri2_surf->visual = __DRI_IMAGE_FORMAT_RGB565; - else if (conf->AlphaSize == 0) - dri2_surf->visual = __DRI_IMAGE_FORMAT_XRGB8888; - else - dri2_surf->visual = __DRI_IMAGE_FORMAT_ARGB8888; + if (!dri2_create_drawable(dri2_dpy, config, dri2_surf, dri2_surf)) + goto cleanup_surface; return &dri2_surf->base; -- 2.30.2