pdp->shminfo.shmid = shmid;
pdp->ximage = XShmCreateImage(dpy,
NULL,
- pdp->config->rgbBits,
+ pdp->xDepth,
ZPixmap, /* format */
NULL, /* data */
&pdp->shminfo, /* shminfo */
pdp->shminfo.shmid = -1;
pdp->ximage = XCreateImage(dpy,
NULL,
- pdp->config->rgbBits,
+ pdp->xDepth,
ZPixmap, 0, /* format, offset */
NULL, /* data */
0, 0, /* width, height */
__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)
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 =