egl: Make the 565 pbuffer-only config single buffered.
authorKenneth Graunke <kenneth@whitecape.org>
Sat, 23 Mar 2019 01:00:55 +0000 (18:00 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 22 Jul 2019 23:58:09 +0000 (16:58 -0700)
In commit dacb11a585face5ca179c34cfc588a71a425c1e0, Eric found the first
matching 565 pbuffer config, and stopped.  Our double-buffered configs
come first in the list, so we added that, making a pbuffer-only config
that claimed to be double buffered.  This doesn't make sense, since
pixmaps/pbuffers are fundamentally not double buffered.

When using that config, every call to eglCreatePbufferSurface would fail
with EGL_BAD_MATCH.  The call chain looks like this:

   - eglCreatePbufferSurface
   - dri3_create_pbuffer_surface
   - dri3_create_surface
   - dri2_get_dri_config

which eventually does:

   const bool double_buffer = surface_type == EGL_WINDOW_BIT;

and then fails to find a matching config, because it ends up looking
for a single-buffered config - and there aren't any.

To fix this, make the 565 pbuffer config single-buffered.  This fixes
at least 51 dEQP-EGL.* tests.

Fixes: dacb11a585f ("egl: Add a 565 pbuffer-only EGL config under X11.")
Reviewed-by: Eric Engestrom <eric.engestrom@intel.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/egl/drivers/dri2/platform_x11.c

index 0d62f83..33bd027 100644 (file)
@@ -862,13 +862,17 @@ dri2_x11_add_configs_for_visuals(struct dri2_egl_display *dri2_dpy,
          0,
       };
 
-      /* Check that we've found single-sample, no depth, no stencil. */
+      /* Check that we've found single-sample, no depth, no stencil,
+       * and single-buffered.
+       */
       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)) {
+                                        __DRI_ATTRIB_SAMPLES, 0) ||
+          !dri2_x11_config_match_attrib(dri2_dpy, config,
+                                        __DRI_ATTRIB_DOUBLE_BUFFER, 0)) {
          continue;
       }