egl: Pass the correct X visual depth to xcb_put_image().
authorJosé Fonseca <jfonseca@vmware.com>
Mon, 19 Jan 2015 23:07:17 +0000 (23:07 +0000)
committerJose Fonseca <jfonseca@vmware.com>
Sat, 31 Jan 2015 09:14:36 +0000 (09:14 +0000)
The dri2_x11_add_configs_for_visuals() function happily matches a 32
bits EGLconfig with a 24 bits X visual.  However it was passing 32bits
depth to xcb_put_image(), making X server unhappy:

  https://github.com/apitrace/apitrace/issues/313#issuecomment-70571911

Cc: "10.4" <mesa-stable@lists.freedesktop.org>
src/egl/drivers/dri2/platform_x11.c

index dd88e900e8dd6ad91cee29e3550e11fe29642595..cbcf6a78861d5d13201b15b404762826eb8ddb89 100644 (file)
@@ -49,8 +49,7 @@ dri2_x11_swap_interval(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf,
 
 static void
 swrastCreateDrawable(struct dri2_egl_display * dri2_dpy,
-                     struct dri2_egl_surface * dri2_surf,
-                     int depth)
+                     struct dri2_egl_surface * dri2_surf)
 {
    uint32_t           mask;
    const uint32_t     function = GXcopy;
@@ -66,8 +65,7 @@ swrastCreateDrawable(struct dri2_egl_display * dri2_dpy,
    valgc[0] = function;
    valgc[1] = False;
    xcb_create_gc(dri2_dpy->conn, dri2_surf->swapgc, dri2_surf->drawable, mask, valgc);
-   dri2_surf->depth = depth;
-   switch (depth) {
+   switch (dri2_surf->depth) {
       case 32:
       case 24:
          dri2_surf->bytes_per_pixel = 4;
@@ -82,7 +80,7 @@ swrastCreateDrawable(struct dri2_egl_display * dri2_dpy,
          dri2_surf->bytes_per_pixel = 0;
          break;
       default:
-         _eglLog(_EGL_WARNING, "unsupported depth %d", depth);
+         _eglLog(_EGL_WARNING, "unsupported depth %d", dri2_surf->depth);
    }
 }
 
@@ -257,12 +255,6 @@ dri2_x11_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
       _eglError(EGL_BAD_ALLOC, "dri2->createNewDrawable");
       goto cleanup_pixmap;
    }
-   
-   if (dri2_dpy->dri2) {
-      xcb_dri2_create_drawable (dri2_dpy->conn, dri2_surf->drawable);
-   } else {
-      swrastCreateDrawable(dri2_dpy, dri2_surf, _eglGetConfigKey(conf, EGL_BUFFER_SIZE));
-   }
 
    if (type != EGL_PBUFFER_BIT) {
       cookie = xcb_get_geometry (dri2_dpy->conn, dri2_surf->drawable);
@@ -275,9 +267,19 @@ dri2_x11_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
 
       dri2_surf->base.Width = reply->width;
       dri2_surf->base.Height = reply->height;
+      dri2_surf->depth = reply->depth;
       free(reply);
    }
 
+   if (dri2_dpy->dri2) {
+      xcb_dri2_create_drawable (dri2_dpy->conn, dri2_surf->drawable);
+   } else {
+      if (type == EGL_PBUFFER_BIT) {
+         dri2_surf->depth = _eglGetConfigKey(conf, EGL_BUFFER_SIZE);
+      }
+      swrastCreateDrawable(dri2_dpy, dri2_surf);
+   }
+
    /* we always copy the back buffer to front */
    dri2_surf->base.PostSubBufferSupportedNV = EGL_TRUE;