[Mesa-dev] [PATCH 7/8] egl/wayland: Implement EGL_EXT_buffer_age

Ander Conselvan de Oliveira conselvan2 at gmail.com
Thu Dec 20 08:59:09 PST 2012


The age of the buffers is not reset on dri2_release_buffers() or 
anywhere else, so after a resize the buffer age is not zero. I think we 
should set age to zero on get_back_bo() when the new buffer is 
allocated. Same thing for the gbm backend, although there this would be 
only for clarity, since we don't destroy the third buffer and gbm does 
not support surface resizing.

Cheers,
Ander

On 12/14/2012 03:05 AM, Kristian Høgsberg wrote:
> ---
>   src/egl/drivers/dri2/platform_wayland.c |   21 +++++++++++++++++++++
>   1 file changed, 21 insertions(+)
>
> diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
> index 3c6bdd9..6f8f3b0 100644
> --- a/src/egl/drivers/dri2/platform_wayland.c
> +++ b/src/egl/drivers/dri2/platform_wayland.c
> @@ -449,6 +449,10 @@ dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw)
>                                &wl_buffer_listener, dri2_surf);
>      }
>
> +   for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++)
> +      if (dri2_surf->color_buffers[i].dri_buffer)
> +         dri2_surf->color_buffers[i].age++;
> +
>      dri2_surf->back->locked = 1;
>      dri2_surf->current = dri2_surf->back;
>      dri2_surf->current->age = 1;
> @@ -481,6 +485,21 @@ dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw)
>      return EGL_TRUE;
>   }
>
> +static EGLint
> +dri2_query_buffer_age(_EGLDriver *drv,
> +                      _EGLDisplay *disp, _EGLSurface *surface)
> +{
> +   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surface);
> +   __DRIbuffer buffer;
> +
> +   if (get_back_bo(dri2_surf, &buffer) < 0) {
> +      _eglError(EGL_BAD_ALLOC, "dri2_query_buffer_age");
> +      return 0;
> +   }
> +
> +   return dri2_surf->back->age;
> +}
> +
>   static int
>   dri2_wayland_authenticate(_EGLDisplay *disp, uint32_t id)
>   {
> @@ -618,6 +637,7 @@ dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp)
>      drv->API.DestroySurface = dri2_destroy_surface;
>      drv->API.SwapBuffers = dri2_swap_buffers;
>      drv->API.Terminate = dri2_terminate;
> +   drv->API.QueryBufferAge = dri2_query_buffer_age;
>
>      dri2_dpy = calloc(1, sizeof *dri2_dpy);
>      if (!dri2_dpy)
> @@ -682,6 +702,7 @@ dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp)
>      }
>
>      disp->Extensions.WL_bind_wayland_display = EGL_TRUE;
> +   disp->Extensions.EXT_buffer_age = EGL_TRUE;
>      dri2_dpy->authenticate = dri2_wayland_authenticate;
>
>      /* we're supporting EGL 1.4 */
>



More information about the mesa-dev mailing list