diff options
author | José Fonseca <[email protected]> | 2015-01-19 23:07:17 +0000 |
---|---|---|
committer | Emil Velikov <[email protected]> | 2015-02-02 00:12:04 +0000 |
commit | b51d36969071d1baba09a65640312155634962cd (patch) | |
tree | 6b31a2e89ce6db69f8dbedca6402b13a795c928f | |
parent | eab8dc28ed4c03fcebb8ed61f80db35adecd217a (diff) |
egl: Pass the correct X visual depth to xcb_put_image().
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" <[email protected]>
(cherry picked from commit 11a955aef42730ab009490f03c03c54ed07db666)
-rw-r--r-- | src/egl/drivers/dri2/platform_x11.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c index f8c4b707a29..9a7935798b1 100644 --- a/src/egl/drivers/dri2/platform_x11.c +++ b/src/egl/drivers/dri2/platform_x11.c @@ -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; |