Mesa (staging/20.0): egl: Fix A2RGB10 platform_{device,surfaceless} PBuffer configs.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Feb 28 22:44:47 UTC 2020
Module: Mesa
Branch: staging/20.0
Commit: 9f45639452981300914ecc0fa42f593517c3bae2
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9f45639452981300914ecc0fa42f593517c3bae2
Author: Mathias Fröhlich <Mathias.Froehlich at gmx.net>
Date: Sun Feb 9 19:01:53 2020 +0100
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 at collabora.com>
Fixes: 9acb94b6236 "egl: Enable 10bpc EGLConfigs for platform_{device,surfaceless}"
Signed-off-by: Mathias Fröhlich <Mathias.Froehlich at web.de>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3790>
(cherry picked from commit d32c458de76c9e0cc08c9ee1a7de23c3fca69298)
---
.pick_status.json | 2 +-
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 ++---
5 files changed, 82 insertions(+), 15 deletions(-)
diff --git a/.pick_status.json b/.pick_status.json
index 10665ba49c6..22403659ffb 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -1417,7 +1417,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;
More information about the mesa-commit
mailing list