Mesa (master): egl/dri2: dri2_make_current: Release previous context' s display

Michel Dänzer daenzer at kemper.freedesktop.org
Tue Aug 16 08:31:55 UTC 2016


Module: Mesa
Branch: master
Commit: 78e3cea4197802253401766fc44362786898e024
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=78e3cea4197802253401766fc44362786898e024

Author: Nicolas Boichat <drinkcat at chromium.org>
Date:   Thu Aug 11 16:43:32 2016 +0800

egl/dri2: dri2_make_current: Release previous context's display

eglMakeCurrent can also be used to change the active display. In that
case, we need to decrement ref_count of the previous display (possibly
destroying it), and increment it on the next display.

Also, old_dsurf/old_rsurf cannot be non-NULL if old_ctx is NULL, so
we only need to test if old_ctx is non-NULL.

v2: Save the old display before destroying the context.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97214
Fixes: 9ee683f877 (egl/dri2: Add reference count for dri2_egl_display)
Cc: "12.0" <mesa-stable at lists.freedesktop.org>
Reported-by: Alexandr Zelinsky <mexahotabop at w1l.ru>
Tested-by: Alexandr Zelinsky <mexahotabop at w1l.ru>
Reviewed-and-Tested-by: Michel Dänzer <michel.daenzer at amd.com>
Signed-off-by: Nicolas Boichat <drinkcat at chromium.org>

---

 src/egl/drivers/dri2/egl_dri2.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 3205a36..3e3d1c8 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -1280,13 +1280,14 @@ dri2_make_current(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf,
          drv->API.DestroySurface(drv, disp, old_dsurf);
       if (old_rsurf)
          drv->API.DestroySurface(drv, disp, old_rsurf);
-      if (old_ctx)
-         drv->API.DestroyContext(drv, disp, old_ctx);
 
       if (!unbind)
          dri2_dpy->ref_count++;
-      if (old_dsurf || old_rsurf || old_ctx)
-         dri2_display_release(disp);
+      if (old_ctx) {
+         EGLDisplay old_disp = _eglGetDisplayHandle(old_ctx->Resource.Display);
+         drv->API.DestroyContext(drv, disp, old_ctx);
+         dri2_display_release(old_disp);
+      }
 
       return EGL_TRUE;
    } else {




More information about the mesa-commit mailing list