_X_HIDDEN void driReleaseDrawables(struct glx_context *gc) { const struct glx_display *priv = gc->psc->display; __GLXDRIdrawable *pdraw; if (priv == NULL) return; if (__glxHashLookup(priv->drawHash, gc->currentDrawable, (void *) &pdraw) == 0) { if (pdraw->drawable == pdraw->xDrawable) { pdraw->refcount --; if (pdraw->refcount == 0) { (*pdraw->destroyDrawable)(pdraw); __glxHashDelete(priv->drawHash, gc->currentDrawable); } } } if (__glxHashLookup(priv->drawHash, gc->currentReadable, (void *) &pdraw) == 0) { if (pdraw->drawable == pdraw->xDrawable) { pdraw->refcount --; if (pdraw->refcount == 0) { (*pdraw->destroyDrawable)(pdraw); __glxHashDelete(priv->drawHash, gc->currentReadable); } } } gc->currentDrawable = None; gc->currentReadable = None; }
static __GLXDRIdrawable * FetchDRIDrawable(Display * dpy, GLXDrawable glxDrawable, GLXContext gc) { __GLXdisplayPrivate *const priv = __glXInitialize(dpy); __GLXDRIdrawable *pdraw; __GLXscreenConfigs *psc; if (priv == NULL) return NULL; psc = &priv->screenConfigs[gc->screen]; if (psc->drawHash == NULL) return NULL; if (__glxHashLookup(psc->drawHash, glxDrawable, (void *) &pdraw) == 0) return pdraw; pdraw = psc->driScreen->createDrawable(psc, glxDrawable, glxDrawable, gc->mode); if (__glxHashInsert(psc->drawHash, glxDrawable, pdraw)) { (*pdraw->destroyDrawable) (pdraw); return NULL; } return pdraw; }
_X_HIDDEN __GLXDRIdrawable * driFetchDrawable(struct glx_context *gc, GLXDrawable glxDrawable) { struct glx_display *const priv = __glXInitialize(gc->psc->dpy); __GLXDRIdrawable *pdraw; struct glx_screen *psc; if (priv == NULL) return NULL; psc = priv->screens[gc->screen]; if (priv->drawHash == NULL) return NULL; if (__glxHashLookup(priv->drawHash, glxDrawable, (void *) &pdraw) == 0) { pdraw->refcount ++; return pdraw; } pdraw = psc->driScreen->createDrawable(psc, glxDrawable, glxDrawable, gc->config); if (pdraw == NULL) { ErrorMessageF("failed to create drawable\n"); return NULL; } if (__glxHashInsert(priv->drawHash, glxDrawable, pdraw)) { (*pdraw->destroyDrawable) (pdraw); return NULL; } pdraw->refcount = 1; return pdraw; }