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 */


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to