diff options
author | Mathias Fröhlich <Mathias.Froehlich@gmx.net> | 2020-02-09 19:01:53 +0100 |
---|---|---|
committer | Eric Engestrom <eric@engestrom.ch> | 2020-03-06 22:59:12 +0100 |
commit | c15d94c6358d78a2e8a8ae18a0f33a6402bfea73 (patch) | |
tree | 4805a68b9346ae867f6d5b622c19fe554e40e5c1 | |
parent | ec33a35f2422c8fa6e513f38c05f6ba254483cd6 (diff) | |
download | mesa-c15d94c6358d78a2e8a8ae18a0f33a6402bfea73.tar.gz |
egl: Fix A2RGB10 platform_{device,surfaceless} PBuffer configs.
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 <emil.velikov@collabora.com>
Fixes: 9acb94b6236 "egl: Enable 10bpc EGLConfigs for platform_{device,surfaceless}"
Signed-off-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3790>
(cherry picked from commit d32c458de76c9e0cc08c9ee1a7de23c3fca69298)
-rw-r--r-- | .pick_status.json | 2 | ||||
-rw-r--r-- | src/egl/drivers/dri2/egl_dri2.c | 69 | ||||
-rw-r--r-- | src/egl/drivers/dri2/egl_dri2.h | 4 | ||||
-rw-r--r-- | src/egl/drivers/dri2/platform_device.c | 11 | ||||
-rw-r--r-- | src/egl/drivers/dri2/platform_surfaceless.c | 11 |
5 files changed, 82 insertions, 15 deletions
diff --git a/.pick_status.json b/.pick_status.json index fcc1847fc94..3b70c71d58e 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -3631,7 +3631,7 @@ "description": "egl: Fix A2RGB10 platform_{device,surfaceless} PBuffer configs.", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "9acb94b6236f8a76a5558cf1cb60bac976067851" }, diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 36828847e75..4c0e53ed57e 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; |