From: Rob Clark Date: Wed, 26 Oct 2016 20:52:52 +0000 (-0400) Subject: mesa: drop current draw/read buffer when ctx is released X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a5e733c6b52e93de3000647d075f5ca2f55fcb71;p=mesa.git mesa: drop current draw/read buffer when ctx is released This fixes a problem seen with gallium drivers vs android wallpaper. Basically, what happens is: EGLSurface tmpSurface = mEgl.eglCreatePbufferSurface(mEglDisplay, mEglConfig, attribs); mEgl.eglMakeCurrent(mEglDisplay, tmpSurface, tmpSurface, mEglContext); int[] maxSize = new int[1]; Rect frame = surfaceHolder.getSurfaceFrame(); glGetIntegerv(GL_MAX_TEXTURE_SIZE, maxSize, 0); mEgl.eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); mEgl.eglDestroySurface(mEglDisplay, tmpSurface); ... check maxSize vs frame size and bail if needed ... mEglSurface = mEgl.eglCreateWindowSurface(mEglDisplay, mEglConfig, surfaceHolder, null); ... error checking ... mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext); When the window-surface is created, it ends up with the same ptr address as the recently freed tmpSurface pbuffer surface. Which after many levels of indirection, results in st_framebuffer_validate() ending up with the same/old framebuffer object, and in the end never calling the DRIimageLoaderExtension::getBuffers(). Then in droid_swap_buffers(), the dri2_surf is still the old pbuffer surface (with dri2_surf->buffer being NULL, obviously, so when wallpaper app calls eglSwapBuffers() nothing gets enqueued to the compositor). Resulting in a black/blank background layer. Note that at the EGL layer, when the context is unbound, EGL drops it's references to the draw and read buffer as well. Signed-off-by: Rob Clark Tested-by: Robert Foss Acked-by: Tapani Pälli --- diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index c62575c08ab..80bee16d453 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -1651,6 +1651,10 @@ _mesa_make_current( struct gl_context *newCtx, if (!newCtx) { _glapi_set_dispatch(NULL); /* none current */ + if (curCtx) { + _mesa_reference_framebuffer(&curCtx->WinSysDrawBuffer, NULL); + _mesa_reference_framebuffer(&curCtx->WinSysReadBuffer, NULL); + } } else { _glapi_set_dispatch(newCtx->CurrentDispatch);