X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fglx%2Fdrisw_glx.c;h=b3e00f9a4e010b47cca0e6b8a762efba830006ee;hb=3c0eb762e27f9028a8f59e2fa31603292e02d9ef;hp=c63b097a71abe8cd9f85758967fe9a038fe10411;hpb=acfd88204e886e671da97b895fd2d1ee39b61256;p=mesa.git diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c index c63b097a71a..b3e00f9a4e0 100644 --- a/src/glx/drisw_glx.c +++ b/src/glx/drisw_glx.c @@ -32,23 +32,14 @@ #include static Bool -XCreateGCs(struct drisw_drawable * pdp, - Display * dpy, XID drawable, int visualid) +driswCreateGCs(struct drisw_drawable * pdp, + Display * dpy, XID drawable, int visualid) { - XGCValues gcvalues; long visMask; XVisualInfo visTemp; int num_visuals; - /* create GC's */ pdp->gc = XCreateGC(dpy, drawable, 0, NULL); - pdp->swapgc = XCreateGC(dpy, drawable, 0, NULL); - - gcvalues.function = GXcopy; - gcvalues.graphics_exposures = False; - XChangeGC(dpy, pdp->gc, GCFunction, &gcvalues); - XChangeGC(dpy, pdp->swapgc, GCFunction, &gcvalues); - XChangeGC(dpy, pdp->swapgc, GCGraphicsExposures, &gcvalues); /* visual */ visTemp.visualid = visualid; @@ -73,11 +64,10 @@ handle_xerror(Display *dpy, XErrorEvent *event) (void) dpy; assert(xshm_opcode != -1); - if (event->request_code != xshm_opcode || - event->minor_code != X_ShmAttach) + if (event->request_code != xshm_opcode) return 0; - xshm_error = 1; + xshm_error = event->error_code; return 0; } @@ -153,7 +143,6 @@ XDestroyDrawable(struct drisw_drawable * pdp, Display * dpy, XID drawable) free(pdp->visinfo); XFreeGC(dpy, pdp->gc); - XFreeGC(dpy, pdp->swapgc); } /** @@ -213,24 +202,13 @@ swrastXPutImage(__DRIdrawable * draw, int op, Display *dpy = pdraw->psc->dpy; Drawable drawable; XImage *ximage; - GC gc; + GC gc = pdp->gc; if (!pdp->ximage || shmid != pdp->shminfo.shmid) { if (!XCreateDrawable(pdp, shmid, dpy)) return; } - switch (op) { - case __DRI_SWRAST_IMAGE_OP_DRAW: - gc = pdp->gc; - break; - case __DRI_SWRAST_IMAGE_OP_SWAP: - gc = pdp->swapgc; - break; - default: - return; - } - drawable = pdraw->xDrawable; ximage = pdp->ximage; ximage->bytes_per_line = stride ? stride : bytes_per_line(w * ximage->bits_per_pixel, 32); @@ -700,7 +678,7 @@ driswCreateDrawable(struct glx_screen *base, XID xDrawable, pdp->base.drawable = drawable; pdp->base.psc = &psc->base; - ret = XCreateGCs(pdp, psc->base.dpy, xDrawable, modes->visualID); + ret = driswCreateGCs(pdp, psc->base.dpy, xDrawable, modes->visualID); if (!ret) { free(pdp); return NULL; @@ -826,9 +804,27 @@ driswBindExtensions(struct drisw_screen *psc, const __DRIextension **extensions) static int check_xshm(Display *dpy) { + int (*old_handler)(Display *, XErrorEvent *); + int ignore; + XShmSegmentInfo info = { 0, }; + + if (!XQueryExtension(dpy, "MIT-SHM", &xshm_opcode, &ignore, &ignore)) + return False; - return XQueryExtension(dpy, "MIT-SHM", &xshm_opcode, &ignore, &ignore); + old_handler = XSetErrorHandler(handle_xerror); + XShmDetach(dpy, &info); + XSync(dpy, False); + (void) XSetErrorHandler(old_handler); + + /* BadRequest means we're a remote client. If we were local we'd + * expect BadValue since 'info' has an invalid segment name. + */ + if (xshm_error == BadRequest) + return False; + + xshm_error = 0; + return True; } static struct glx_screen *