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 */
{
__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
}
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
return NULL;
memset(psc, 0, sizeof *psc);
+ psc->fd = -1;
+
if (!glx_screen_init(&psc->base, screen, priv)) {
Xfree(psc);
return NULL;
return &psc->base;
handle_error:
- if (psc->fd)
+ if (psc->fd >= 0)
close(psc->fd);
if (psc->driver)
dlclose(psc->driver);
static void
dri2DestroyDisplay(__GLXDRIdisplay * dpy)
{
+ struct dri2_display *pdp = (struct dri2_display *) dpy;
+
+ __glxHashDestroy(pdp->dri2Hash);
Xfree(dpy);
}