summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/egl/drivers/dri2/platform_x11.c47
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 5d6efea61417..c8c676d2f001 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;