mesa: Avoid leaking surface in st_renderbuffer_delete
authorBartosz Tomczyk <bartosz.tomczyk86@gmail.com>
Sat, 29 Apr 2017 14:37:45 +0000 (16:37 +0200)
committerEmil Velikov <emil.l.velikov@gmail.com>
Tue, 30 May 2017 13:48:32 +0000 (14:48 +0100)
v2: add comment in code

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=100741
Fixes: a5e733c6b52 mesa: drop current draw/read buffer when ctx is released
Reviewed-by: Rob Clark <robdclark@gmail.com> (v1)
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
src/mesa/main/context.c

index 3570f94f5a5de61f59173112237598a50a10675c..9aa6fb64b2402f66485f010699443a2dc7223669 100644 (file)
@@ -1664,17 +1664,23 @@ _mesa_make_current( struct gl_context *newCtx,
       _mesa_flush(curCtx);
 
    /* We used to call _glapi_check_multithread() here.  Now do it in drivers */
-   _glapi_set_context((void *) newCtx);
-   assert(_mesa_get_current_context() == newCtx);
 
    if (!newCtx) {
       _glapi_set_dispatch(NULL);  /* none current */
+      /* We need old ctx to correctly release Draw/ReadBuffer
+       * and avoid a surface leak in st_renderbuffer_delete.
+       * Therefore, first drop buffers then set new ctx to NULL.
+       */
       if (curCtx) {
          _mesa_reference_framebuffer(&curCtx->WinSysDrawBuffer, NULL);
          _mesa_reference_framebuffer(&curCtx->WinSysReadBuffer, NULL);
       }
+      _glapi_set_context(NULL);
+      assert(_mesa_get_current_context() == NULL);
    }
    else {
+      _glapi_set_context((void *) newCtx);
+      assert(_mesa_get_current_context() == newCtx);
       _glapi_set_dispatch(newCtx->CurrentClientDispatch);
 
       if (drawBuffer && readBuffer) {