From 90d58286cc76c9f6652a8f8342fe568d2fc0bb15 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Thu, 26 Sep 2019 15:43:46 -0400 Subject: [PATCH] drisw: Fix and simplify drawable setup We don't want to require a visual for the drawable, because there exist fbconfigs that don't correspond to any visual (say a 565 pixmap|pbuffer config on a depth-24 display). Fortunately, we don't need one either. Passing the visual to XCreateImage serves only to fill in the XImage's {red,green,blue}_mask fields, which libX11 itself never uses, they exist only for the client's convenience, and we don't care. And we already have the drawable depth in glx_config::rgbBits. So replace the XVisualInfo field in the drawable private with a pointer to the glx_config. Having done that driswCreateGCs becomes trivial, so inline it into its caller. Gitlab: https://gitlab.freedesktop.org/mesa/mesa/issues/1194 Reviewed-by: Eric Anholt --- src/glx/drisw_glx.c | 40 ++++++---------------------------------- src/glx/drisw_priv.h | 3 +-- 2 files changed, 7 insertions(+), 36 deletions(-) diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c index b3e00f9a4e0..45a61e654c7 100644 --- a/src/glx/drisw_glx.c +++ b/src/glx/drisw_glx.c @@ -31,27 +31,6 @@ #include #include -static Bool -driswCreateGCs(struct drisw_drawable * pdp, - Display * dpy, XID drawable, int visualid) -{ - long visMask; - XVisualInfo visTemp; - int num_visuals; - - pdp->gc = XCreateGC(dpy, drawable, 0, NULL); - - /* visual */ - visTemp.visualid = visualid; - visMask = VisualIDMask; - pdp->visinfo = XGetVisualInfo(dpy, visMask, &visTemp, &num_visuals); - - if (!pdp->visinfo || num_visuals == 0) - return False; - - return True; -} - static int xshm_error = 0; static int xshm_opcode = -1; @@ -82,8 +61,8 @@ XCreateDrawable(struct drisw_drawable * pdp, int shmid, Display * dpy) if (!xshm_error && shmid >= 0) { pdp->shminfo.shmid = shmid; pdp->ximage = XShmCreateImage(dpy, - pdp->visinfo->visual, - pdp->visinfo->depth, + NULL, + pdp->config->rgbBits, ZPixmap, /* format */ NULL, /* data */ &pdp->shminfo, /* shminfo */ @@ -112,8 +91,8 @@ XCreateDrawable(struct drisw_drawable * pdp, int shmid, Display * dpy) if (pdp->ximage == NULL) { pdp->shminfo.shmid = -1; pdp->ximage = XCreateImage(dpy, - pdp->visinfo->visual, - pdp->visinfo->depth, + NULL, + pdp->config->rgbBits, ZPixmap, 0, /* format, offset */ NULL, /* data */ 0, 0, /* width, height */ @@ -140,8 +119,6 @@ XDestroyDrawable(struct drisw_drawable * pdp, Display * dpy, XID drawable) if (pdp->shminfo.shmid > 0) XShmDetach(dpy, &pdp->shminfo); - free(pdp->visinfo); - XFreeGC(dpy, pdp->gc); } @@ -667,7 +644,6 @@ driswCreateDrawable(struct glx_screen *base, XID xDrawable, struct drisw_drawable *pdp; __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) modes; struct drisw_screen *psc = (struct drisw_screen *) base; - Bool ret; const __DRIswrastExtension *swrast = psc->swrast; pdp = calloc(1, sizeof(*pdp)); @@ -677,12 +653,8 @@ driswCreateDrawable(struct glx_screen *base, XID xDrawable, pdp->base.xDrawable = xDrawable; pdp->base.drawable = drawable; pdp->base.psc = &psc->base; - - ret = driswCreateGCs(pdp, psc->base.dpy, xDrawable, modes->visualID); - if (!ret) { - free(pdp); - return NULL; - } + pdp->config = modes; + pdp->gc = XCreateGC(psc->base.dpy, xDrawable, 0, NULL); /* Create a new drawable */ pdp->driDrawable = diff --git a/src/glx/drisw_priv.h b/src/glx/drisw_priv.h index 816d1d87cc9..bfcf5946c57 100644 --- a/src/glx/drisw_priv.h +++ b/src/glx/drisw_priv.h @@ -62,9 +62,8 @@ struct drisw_drawable __GLXDRIdrawable base; GC gc; - __DRIdrawable *driDrawable; - XVisualInfo *visinfo; + struct glx_config *config; XImage *ximage; XShmSegmentInfo shminfo; }; -- 2.30.2