mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 19:58:09 +02:00
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@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> (cherry picked from commit2fc11e8a05) Conflicts: .gitlab-ci/piglit/quick_gl.txt This testing doesn't exist in the 19.3 branch, so I've deleted the file. Dylan
This commit is contained in:
parent
aea41a56bd
commit
5feb926e05
3 changed files with 33 additions and 4 deletions
|
|
@ -211,7 +211,7 @@
|
|||
"description": "drisw: Cache the depth of the X drawable",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"master_sha": null,
|
||||
"because_sha": "90d58286cc76c9f6652a8f8342fe568d2fc0bb15"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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 =
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@ struct drisw_drawable
|
|||
struct glx_config *config;
|
||||
XImage *ximage;
|
||||
XShmSegmentInfo shminfo;
|
||||
int xDepth;
|
||||
};
|
||||
|
||||
_X_HIDDEN int
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue