drisw: Fix and simplify drawable setup
authorAdam Jackson <ajax@redhat.com>
Thu, 26 Sep 2019 19:43:46 +0000 (15:43 -0400)
committerAdam Jackson <ajax@redhat.com>
Fri, 27 Sep 2019 15:18:15 +0000 (11:18 -0400)
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 <eric@anholt.net>
src/glx/drisw_glx.c
src/glx/drisw_priv.h

index b3e00f9a4e010b47cca0e6b8a762efba830006ee..45a61e654c772d72e6b614a3bb5c245d4c0c0d31 100644 (file)
 #include <X11/extensions/shmproto.h>
 #include <assert.h>
 
-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 =
index 816d1d87cc9095bd6dcdfc52169cffe394257715..bfcf5946c570bf6b296b8209f191d54140fb2111 100644 (file)
@@ -62,9 +62,8 @@ struct drisw_drawable
    __GLXDRIdrawable base;
 
    GC gc;
-
    __DRIdrawable *driDrawable;
-   XVisualInfo *visinfo;
+   struct glx_config *config;
    XImage *ximage;
    XShmSegmentInfo shminfo;
 };