summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Franzke <[email protected]>2011-02-09 21:19:45 +0100
committerKristian Høgsberg <[email protected]>2011-02-10 23:07:01 -0500
commit4e8f95f64d004aa1278609c5bbac9a53c0c6e4c9 (patch)
treee9c1bc3763bb4a17cfcbbc4dba9b8417927ff40d
parent87dde5b1cd596c4008695ff2db9469f88c09f925 (diff)
egl_dri2: Always unbind old contexts
This fixes __DRIdrawable refcounting. Binding a context increases their refcount, so we need to decrease it.
-rw-r--r--src/egl/drivers/dri2/egl_dri2.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 2c4deaf7c06..e0d2db9661f 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -597,19 +597,20 @@ dri2_make_current(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf,
rdraw = (dri2_rsurf) ? dri2_rsurf->dri_drawable : NULL;
cctx = (dri2_ctx) ? dri2_ctx->dri_context : NULL;
+ if (old_ctx) {
+ __DRIcontext *old_cctx = dri2_egl_context(old_ctx)->dri_context;
+ dri2_dpy->core->unbindContext(old_cctx);
+ }
+
if ((cctx == NULL && ddraw == NULL && rdraw == NULL) ||
dri2_dpy->core->bindContext(cctx, ddraw, rdraw)) {
- drv->API.DestroySurface(drv, disp, old_dsurf);
- drv->API.DestroySurface(drv, disp, old_rsurf);
- if (old_ctx) {
- /* unbind the old context only when there is no new context bound */
- if (!ctx) {
- __DRIcontext *old_cctx = dri2_egl_context(old_ctx)->dri_context;
- dri2_dpy->core->unbindContext(old_cctx);
- }
- /* no destroy? */
+ if (old_dsurf)
+ drv->API.DestroySurface(drv, disp, old_dsurf);
+ if (old_rsurf)
+ drv->API.DestroySurface(drv, disp, old_rsurf);
+ /* no destroy? */
+ if (old_ctx)
_eglPutContext(old_ctx);
- }
return EGL_TRUE;
} else {