[Mesa-dev] [PATCH 3/8] egl/gbm: Implement EGL_EXT_buffer_age

Kristian Høgsberg krh at bitplanet.net
Wed Dec 19 11:34:52 PST 2012


On Sat, Dec 15, 2012 at 2:44 AM, Kristian Høgsberg <hoegsberg at gmail.com> wrote:
> On Fri, Dec 14, 2012 at 04:54:32PM -0800, Eric Anholt wrote:
>> Kristian Høgsberg <krh at 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.

Does the explanation above make sense?

Kristian


More information about the mesa-dev mailing list