diff options
author | Eric Anholt <[email protected]> | 2018-08-25 14:16:59 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2019-03-22 15:22:40 -0700 |
commit | dacb11a585face5ca179c34cfc588a71a425c1e0 (patch) | |
tree | 0906fdaafe5558269263cfb2b7714899c119520c /src/egl/drivers | |
parent | e5830e11322bc20cbae7cad9e0654376d41f2c19 (diff) |
egl: Add a 565 pbuffer-only EGL config under X11.
The CTS requires a 565-no-depth-no-stencil (meaning d/s not-required, not
not-present) config for ES 3.0, but at depth 24 of X11 we wouldn't do so.
We can satisfy that bad requirement using a pbuffer-only visual with
whatever other buffers the driver happens to have given us.
I've tried to raise this as an absurd requirement with Khronos and made no
progress.
v2: Make sure it's single sample, no depth, no stencil. Comment typo fix
Reviewed-by: Adam Jackson <[email protected]>
Diffstat (limited to 'src/egl/drivers')
-rw-r--r-- | src/egl/drivers/dri2/platform_x11.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c index 5d6efea6141..c8c676d2f00 100644 --- a/src/egl/drivers/dri2/platform_x11.c +++ b/src/egl/drivers/dri2/platform_x11.c @@ -766,6 +766,18 @@ dri2_x11_authenticate(_EGLDisplay *disp, uint32_t id) return dri2_x11_do_authenticate(dri2_dpy, id); } +static bool +dri2_x11_config_match_attrib(struct dri2_egl_display *dri2_dpy, + const __DRIconfig *config, + unsigned int attrib, + unsigned int value) +{ + uint32_t config_val; + if (!dri2_dpy->core->getConfigAttrib(config, attrib, &config_val)) + return false; + return config_val == value; +} + static EGLBoolean dri2_x11_add_configs_for_visuals(struct dri2_egl_display *dri2_dpy, _EGLDisplay *disp, bool supports_preserved) @@ -844,6 +856,41 @@ dri2_x11_add_configs_for_visuals(struct dri2_egl_display *dri2_dpy, xcb_depth_next(&d); } + /* Add a 565-no-depth-no-stencil pbuffer-only config. If X11 is depth 24, + * we wouldn't have 565 available, which the CTS demands. + */ + for (int j = 0; dri2_dpy->driver_configs[j]; j++) { + const __DRIconfig *config = dri2_dpy->driver_configs[j]; + const EGLint config_attrs[] = { + EGL_NATIVE_VISUAL_ID, 0, + EGL_NATIVE_VISUAL_TYPE, EGL_NONE, + EGL_NONE + }; + EGLint surface_type = EGL_PBUFFER_BIT; + unsigned int rgba_masks[4] = { + 0x1f << 11, + 0x3f << 5, + 0x1f << 0, + 0, + }; + + /* Check that we've found single-sample, no depth, no stencil. */ + if (!dri2_x11_config_match_attrib(dri2_dpy, config, + __DRI_ATTRIB_DEPTH_SIZE, 0) || + !dri2_x11_config_match_attrib(dri2_dpy, config, + __DRI_ATTRIB_STENCIL_SIZE, 0) || + !dri2_x11_config_match_attrib(dri2_dpy, config, + __DRI_ATTRIB_SAMPLES, 0)) { + continue; + } + + if (dri2_add_config(disp, config, config_count + 1, surface_type, + config_attrs, rgba_masks)) { + config_count++; + break; + } + } + if (!config_count) { _eglLog(_EGL_WARNING, "DRI2: failed to create any config"); return EGL_FALSE; |