[Mesa-dev] [RFC] mesa: drop current draw/read buffer when ctx is released

Tapani Pälli tapani.palli at intel.com
Thu Oct 27 06:59:01 UTC 2016


On 10/27/2016 12:16 AM, Rob Clark wrote:
> So, not quite sure if this is the *correct* solution, but it is at least
> *a* solution to a problem with android wallpaper vs mesa that I've been
> debugging.  Basically, what happens is:

Could you tell more how to trigger this, is this with some particular 
live wallpaper and has this been working before (regression)? For me at 
least these default wallpapers have been working ok.

>     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).
>
> Maybe instead, eglDestroySurface() should clear any references the ctx
> has to the surface.  Not sure how that would work.  Did I mention there
> are many levels of indirection?
> ---
>   src/mesa/main/context.c | 4 ++++
>   1 file changed, 4 insertions(+)
>
> diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
> index 5e52065..83b8cc1 100644
> --- a/src/mesa/main/context.c
> +++ b/src/mesa/main/context.c
> @@ -1646,6 +1646,10 @@ ALOGE("%s:%d, drawBuffer=%p, readBuffer=%p", __func__, __LINE__, drawBuffer, rea
>   
>      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);




More information about the mesa-dev mailing list