X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fglx%2Fdri2_glx.c;h=80e4da30bebe6e2b7e8783fc28e32cca47efe1bb;hb=636d01bd61cac83e13c3c64874e7e34e828ca93a;hp=ab7915c02ee502c8869a1f37fb1b03a5c820c0f6;hpb=bfc889517ad0d490cce1817eecac146d66bcd923;p=mesa.git diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index ab7915c02ee..80e4da30beb 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -143,6 +143,8 @@ dri2_bind_context(struct glx_context *context, struct glx_context *old, pdraw = (struct dri2_drawable *) driFetchDrawable(context, draw); pread = (struct dri2_drawable *) driFetchDrawable(context, read); + driReleaseDrawables(&pcp->base); + if (pdraw == NULL || pread == NULL) return GLXBadDrawable; @@ -170,9 +172,6 @@ dri2_unbind_context(struct glx_context *context, struct glx_context *new) struct dri2_screen *psc = (struct dri2_screen *) pcp->base.psc; (*psc->core->unbindContext) (pcp->driContext); - - if (context == new) - driReleaseDrawables(&pcp->base); } static struct glx_context * @@ -457,6 +456,12 @@ static void dri2FlushFrontBuffer(__DRIdrawable *driDrawable, void *loaderPrivate) { struct dri2_drawable *pdraw = loaderPrivate; + if (!pdraw) + return; + + if (!pdraw->base.psc) + return; + struct glx_display *priv = __glXInitialize(pdraw->base.psc->dpy); struct dri2_display *pdp = (struct dri2_display *)priv->dri2Display; struct glx_context *gc = __glXGetCurrentContext(); @@ -535,8 +540,13 @@ dri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, CARD64 ret = 0; #ifdef __DRI2_FLUSH - if (psc->f) - (*psc->f->flush)(priv->driDrawable); + if (psc->f) { + struct glx_context *gc = __glXGetCurrentContext(); + + if (gc) { + (*psc->f->flush)(priv->driDrawable); + } + } #endif /* Old servers don't send invalidate events */ @@ -670,11 +680,16 @@ dri2InvalidateBuffers(Display *dpy, XID drawable) { __GLXDRIdrawable *pdraw = dri2GetGlxDrawableFromXDrawableId(dpy, drawable); - struct dri2_screen *psc = (struct dri2_screen *) pdraw->psc; + struct dri2_screen *psc; struct dri2_drawable *pdp = (struct dri2_drawable *) pdraw; + if (!pdraw) + return; + + psc = (struct dri2_screen *) pdraw->psc; + #if __DRI2_FLUSH_VERSION >= 3 - if (pdraw && psc->f) + if (pdraw && psc->f && psc->f->base.version >= 3 && psc->f->invalidate) psc->f->invalidate(pdp->driDrawable); #endif } @@ -697,7 +712,8 @@ dri2_bind_tex_image(Display * dpy, psc = (struct dri2_screen *) base->psc; #if __DRI2_FLUSH_VERSION >= 3 - if (!pdp->invalidateAvailable && psc->f) + if (!pdp->invalidateAvailable && psc->f && + psc->f->base.version >= 3 && psc->f->invalidate) psc->f->invalidate(pdraw->driDrawable); #endif @@ -751,6 +767,7 @@ static const struct glx_context_vtable dri2_context_vtable = { DRI_glXUseXFont, dri2_bind_tex_image, dri2_release_tex_image, + NULL, /* get_proc_address */ }; static void @@ -804,6 +821,8 @@ dri2CreateScreen(int screen, struct glx_display * priv) return NULL; memset(psc, 0, sizeof *psc); + psc->fd = -1; + if (!glx_screen_init(&psc->base, screen, priv)) { Xfree(psc); return NULL; @@ -921,7 +940,7 @@ dri2CreateScreen(int screen, struct glx_display * priv) return &psc->base; handle_error: - if (psc->fd) + if (psc->fd >= 0) close(psc->fd); if (psc->driver) dlclose(psc->driver); @@ -938,6 +957,9 @@ handle_error: static void dri2DestroyDisplay(__GLXDRIdisplay * dpy) { + struct dri2_display *pdp = (struct dri2_display *) dpy; + + __glxHashDestroy(pdp->dri2Hash); Xfree(dpy); }