glx: merge drawable release to the same function

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14926>
This commit is contained in:
Qiang Yu 2022-02-07 15:00:03 +08:00 committed by Marge Bot
parent bf09c08e31
commit 4a420c50f2
1 changed files with 23 additions and 22 deletions

View File

@ -419,36 +419,37 @@ driFetchDrawable(struct glx_context *gc, GLXDrawable glxDrawable)
return pdraw;
}
static void
releaseDrawable(const struct glx_display *priv, GLXDrawable drawable)
{
__GLXDRIdrawable *pdraw;
if (__glxHashLookup(priv->drawHash, drawable, (void *) &pdraw) == 0) {
/* Only native window and pbuffer have same GLX and X11 drawable ID. */
if (pdraw->drawable == pdraw->xDrawable) {
pdraw->refcount --;
/* If pbuffer's refcount reaches 0, it must be imported from other
* display. Because pbuffer created from this display will always
* hold the last refcount until destroy the GLXPbuffer object.
*/
if (pdraw->refcount == 0) {
pdraw->destroyDrawable(pdraw);
__glxHashDelete(priv->drawHash, drawable);
}
}
}
}
_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);
}
}
}
releaseDrawable(priv, gc->currentDrawable);
releaseDrawable(priv, gc->currentReadable);
gc->currentDrawable = None;
gc->currentReadable = None;