Mesa (master): drisw: Cache the depth of the X drawable
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Jan 23 23:21:03 UTC 2020
Module: Mesa
Branch: master
Commit: 2fc11e8a05f59bbffed284c86108fedbac315081
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2fc11e8a05f59bbffed284c86108fedbac315081
Author: Adam Jackson <ajax at redhat.com>
Date: Mon Jan 6 11:06:30 2020 -0500
drisw: Cache the depth of the X drawable
This is not always ->rgbBits, because there are cases where that could
be 32 but we're (legally) bound to a depth-24 pixmap. The important
thing to have match here is the actual server-side notion of depth. You
can look this up (at modest expense) from the xlib visual info if the
fbconfig has a visual. But it might not, so if not, fetch it (at
slightly greater expense) from XGetGeometry. Do this at GLX drawable
creation so you don't have to do it on the SwapBuffers path.
Apparently this fixes glx/glx-swap-singlebuffer, which is unintentional
but quite pleasant.
Fixes: mesa/mesa#2291
Fixes: 90d58286 ("drisw: Fix and simplify drawable setup")
Reviewed-by: Eric Anholt <eric at anholt.net>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3305>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3305>
---
.gitlab-ci/piglit/quick_gl.txt | 5 ++---
src/glx/drisw_glx.c | 34 +++++++++++++++++++++++++++++++---
src/glx/drisw_priv.h | 1 +
3 files changed, 34 insertions(+), 6 deletions(-)
diff --git a/.gitlab-ci/piglit/quick_gl.txt b/.gitlab-ci/piglit/quick_gl.txt
index 51c2cbd68fe..586ec3c046d 100644
--- a/.gitlab-ci/piglit/quick_gl.txt
+++ b/.gitlab-ci/piglit/quick_gl.txt
@@ -22,7 +22,6 @@ glx/glx-swap-event_event: skip
glx/glx-swap-event_interval: skip
glx/glx-swap-exchange: skip
glx/glx-swap-pixmap-bad: fail
-glx/glx-swap-singlebuffer: fail
glx/glx-visuals-depth: fail
glx/glx-visuals-depth -pixmap: fail
glx/glx-visuals-stencil: fail
@@ -2206,8 +2205,8 @@ wgl/wgl-sanity: skip
summary:
name: results
---- --------
- pass: 19319
- fail: 235
+ pass: 19320
+ fail: 234
crash: 2
skip: 1948
timeout: 0
diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c
index 3bf15322ff8..069f64d5216 100644
--- a/src/glx/drisw_glx.c
+++ b/src/glx/drisw_glx.c
@@ -64,7 +64,7 @@ XCreateDrawable(struct drisw_drawable * pdp, int shmid, Display * dpy)
pdp->shminfo.shmid = shmid;
pdp->ximage = XShmCreateImage(dpy,
NULL,
- pdp->config->rgbBits,
+ pdp->xDepth,
ZPixmap, /* format */
NULL, /* data */
&pdp->shminfo, /* shminfo */
@@ -94,7 +94,7 @@ XCreateDrawable(struct drisw_drawable * pdp, int shmid, Display * dpy)
pdp->shminfo.shmid = -1;
pdp->ximage = XCreateImage(dpy,
NULL,
- pdp->config->rgbBits,
+ pdp->xDepth,
ZPixmap, 0, /* format, offset */
NULL, /* data */
0, 0, /* width, height */
@@ -647,6 +647,7 @@ driswCreateDrawable(struct glx_screen *base, XID xDrawable,
__GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) modes;
struct drisw_screen *psc = (struct drisw_screen *) base;
const __DRIswrastExtension *swrast = psc->swrast;
+ Display *dpy = psc->base.dpy;
pdp = calloc(1, sizeof(*pdp));
if (!pdp)
@@ -656,7 +657,34 @@ driswCreateDrawable(struct glx_screen *base, XID xDrawable,
pdp->base.drawable = drawable;
pdp->base.psc = &psc->base;
pdp->config = modes;
- pdp->gc = XCreateGC(psc->base.dpy, xDrawable, 0, NULL);
+ pdp->gc = XCreateGC(dpy, xDrawable, 0, NULL);
+ pdp->xDepth = 0;
+
+ /* Use the visual depth, if this fbconfig corresponds to a visual */
+ if (pdp->config->visualID != 0) {
+ int matches = 0;
+ XVisualInfo *visinfo, template;
+
+ template.visualid = pdp->config->visualID;
+ template.screen = pdp->config->screen;
+ visinfo = XGetVisualInfo(dpy, VisualIDMask | VisualScreenMask,
+ &template, &matches);
+
+ if (visinfo && matches) {
+ pdp->xDepth = visinfo->depth;
+ XFree(visinfo);
+ }
+ }
+
+ /* Otherwise, or if XGetVisualInfo failed, ask the server */
+ if (pdp->xDepth == 0) {
+ Window root;
+ int x, y;
+ unsigned uw, uh, bw, depth;
+
+ XGetGeometry(dpy, xDrawable, &root, &x, &y, &uw, &uh, &bw, &depth);
+ pdp->xDepth = depth;
+ }
/* Create a new drawable */
pdp->driDrawable =
diff --git a/src/glx/drisw_priv.h b/src/glx/drisw_priv.h
index bfcf5946c57..663decee4c3 100644
--- a/src/glx/drisw_priv.h
+++ b/src/glx/drisw_priv.h
@@ -66,6 +66,7 @@ struct drisw_drawable
struct glx_config *config;
XImage *ximage;
XShmSegmentInfo shminfo;
+ int xDepth;
};
_X_HIDDEN int
More information about the mesa-commit
mailing list