summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Fröhlich <Mathias.Froehlich@gmx.net>2020-02-09 19:01:53 +0100
committerEric Engestrom <eric@engestrom.ch>2020-03-06 22:59:12 +0100
commitc15d94c6358d78a2e8a8ae18a0f33a6402bfea73 (patch)
tree4805a68b9346ae867f6d5b622c19fe554e40e5c1
parentec33a35f2422c8fa6e513f38c05f6ba254483cd6 (diff)
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.json2
-rw-r--r--src/egl/drivers/dri2/egl_dri2.c69
-rw-r--r--src/egl/drivers/dri2/egl_dri2.h4
-rw-r--r--src/egl/drivers/dri2/platform_device.c11
-rw-r--r--src/egl/drivers/dri2/platform_surfaceless.c11
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;