On Fri, Dec 14, 2012 at 04:54:32PM -0800, Eric Anholt wrote: > Kristian Høgsberg <k...@bitplanet.net> writes: > > > --- > > src/egl/drivers/dri2/egl_dri2.h | 1 + > > src/egl/drivers/dri2/platform_drm.c | 23 +++++++++++++++++++++++ > > 2 files changed, 24 insertions(+) > > > > diff --git a/src/egl/drivers/dri2/egl_dri2.h > > b/src/egl/drivers/dri2/egl_dri2.h > > index be359d3..fa2a9f3 100644 > > --- a/src/egl/drivers/dri2/egl_dri2.h > > +++ b/src/egl/drivers/dri2/egl_dri2.h > > @@ -189,6 +189,7 @@ struct dri2_egl_surface > > struct { > > struct gbm_bo *bo; > > int locked; > > + int age; > > } color_buffers[3], *back, *current; > > #ifndef HAVE_WAYLAND_PLATFORM > > __DRIbuffer *dri_buffers[__DRI_BUFFER_COUNT]; > > diff --git a/src/egl/drivers/dri2/platform_drm.c > > b/src/egl/drivers/dri2/platform_drm.c > > index 3e04a6c..1923033 100644 > > --- a/src/egl/drivers/dri2/platform_drm.c > > +++ b/src/egl/drivers/dri2/platform_drm.c > > @@ -324,11 +324,16 @@ dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, > > _EGLSurface *draw) > > { > > struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); > > struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw); > > + int i; > > > > if (dri2_surf->base.Type == EGL_WINDOW_BIT) { > > if (dri2_surf->current) > > _eglError(EGL_BAD_SURFACE, "dri2_swap_buffers"); > > + for (i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) > > + if (dri2_surf->color_buffers[i].bo) > > + dri2_surf->color_buffers[i].age++; > > dri2_surf->current = dri2_surf->back; > > + dri2_surf->current->age = 1; > > dri2_surf->back = NULL; > > OK, if I'm following this right, the ages of my buffers with this code are:
You're missing the if (dri2_surf->color_buffers[i].bo) condition on incrementing age. We start out with bo = NULL for color_buffer[0..2] and allocate the bos on demand... > entering my first swap > buffers[0] = 0 <- front > buffers[1] = 0 <- back > > after first swap: > buffers[0] = 1 <- back > buffers[1] = 1 <- front and so here back age will be 0 because we pick a new color_buffer from the pool that doesn't yet have a bo and whose age was never incremented. > after second swap: > buffers[0] = 1 <- front > buffers[1] = 2 <- back > > But reading the spec, I think it's supposed to be: > > entering my first swap > buffers[0] = 0 <- front > buffers[1] = 0 <- back > > after first swap: > buffers[0] = 0 <- back > buffers[1] = 1 <- front > > after second swap: > buffers[0] = 1 <- front > buffers[1] = 2 <- back > > Note how after the first swap, my backbuffer should have an age of 0, for > "unknown junk". Yup, and that's what this patch gets. Kristian _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev