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 <eric@anholt.net>
This commit is contained in:
parent
3c0eb762e2
commit
90d58286cc
|
@ -31,27 +31,6 @@
|
|||
#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 =
|
||||
|
|
|
@ -62,9 +62,8 @@ struct drisw_drawable
|
|||
__GLXDRIdrawable base;
|
||||
|
||||
GC gc;
|
||||
|
||||
__DRIdrawable *driDrawable;
|
||||
XVisualInfo *visinfo;
|
||||
struct glx_config *config;
|
||||
XImage *ximage;
|
||||
XShmSegmentInfo shminfo;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue