diff options
Diffstat (limited to 'src/glx')
-rw-r--r-- | src/glx/drisw_glx.c | 34 | ||||
-rw-r--r-- | src/glx/drisw_priv.h | 1 |
2 files changed, 32 insertions, 3 deletions
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 |