egl_dri2: Fix one context, multiple surfaces.
authorChia-I Wu <olv@lunarg.com>
Wed, 24 Nov 2010 05:42:06 +0000 (13:42 +0800)
committerChia-I Wu <olv@lunarg.com>
Wed, 24 Nov 2010 06:06:30 +0000 (14:06 +0800)
When a context was made current to another surface, the old code did
this

  dri2_dpy->core->bindContext(cctx, ddraw, rdraw);
  dri2_dpy->core->unbindContext(old_cctx);

and there will be no current context due to the second line.

unbindContext should be called only when bindContext is not.  This fixes
a regression since d19afc57.  Thanks to Neil Roberts for noticing the
issue and creating a test case.

src/egl/drivers/dri2/egl_dri2.c

index a83f32b0d1b7d9533b39c8959f7c1d1b07871f40..6f40ab951f97ca7c4290367c4e6a31cd95e6e7d2 100644 (file)
@@ -1648,7 +1648,11 @@ dri2_make_current(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf,
       dri2_destroy_surface(drv, disp, old_dsurf);
       dri2_destroy_surface(drv, disp, old_rsurf);
       if (old_ctx) {
-        dri2_dpy->core->unbindContext(dri2_egl_context(old_ctx)->dri_context);
+         /* 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? */
          _eglPutContext(old_ctx);
       }