On Wed, Feb 19, 2014 at 5:49 PM, Adel Gadllah <adel.gadl...@gmail.com> wrote: > Hi, > > The attached patch adds support for the GLX_EXT_buffer_age extension, which > is mostly used by compositors for efficient sub screen updates. > > The extension should not be reported as supported when running DRI2 but it > seems to show up when I try to disable it with LIBGL_DRI3_DISABLE ... not > sure why suggestions welcome. > > > P.S: Please CC me when replying as I am not subscribed to the list. > > > From: Adel Gadllah <adel.gadl...@gmail.com> > Date: Sun, 16 Feb 2014 13:40:42 +0100 > Subject: [PATCH] dri3: Add GLX_EXT_buffer_age support > > --- > include/GL/glx.h | 5 +++++ > include/GL/glxext.h | 5 +++++ > src/glx/dri2_glx.c | 1 + > src/glx/dri3_glx.c | 17 +++++++++++++++++ > src/glx/dri3_priv.h | 2 ++ > src/glx/glx_pbuffer.c | 7 +++++++ > src/glx/glxclient.h | 1 + > src/glx/glxextensions.c | 1 + > src/glx/glxextensions.h | 1 + > src/mesa/drivers/x11/glxapi.c | 3 +++ > 10 files changed, 43 insertions(+) > > diff --git a/include/GL/glx.h b/include/GL/glx.h > index 234abc0..b8b4d75 100644 > --- a/include/GL/glx.h > +++ b/include/GL/glx.h > @@ -161,6 +161,11 @@ extern "C" { > #define GLX_SAMPLES 0x186a1 /*100001*/ > > > +/* > + * GLX_EXT_buffer_age > + */ > +#define GLX_BACK_BUFFER_AGE_EXT 0x20F4 > + > > typedef struct __GLXcontextRec *GLXContext; > typedef XID GLXPixmap; > diff --git a/include/GL/glxext.h b/include/GL/glxext.h > index 8c642f3..36e92dc 100644 > --- a/include/GL/glxext.h > +++ b/include/GL/glxext.h > @@ -383,6 +383,11 @@ void glXReleaseTexImageEXT (Display *dpy, GLXDrawable > drawable, int buffer); > #define GLX_FLIP_COMPLETE_INTEL 0x8182 > #endif /* GLX_INTEL_swap_event */ > > +#ifndef GLX_EXT_buffer_age > +#define GLX_EXT_buffer_age 1 > +#define GLX_BACK_BUFFER_AGE_EXT 0x20F4 > +#endif /* GLX_EXT_buffer_age */ > + > #ifndef GLX_MESA_agp_offset > #define GLX_MESA_agp_offset 1 > typedef unsigned int ( *PFNGLXGETAGPOFFSETMESAPROC) (const void *pointer); > diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c > index 67fe9c1..007f449 100644 > --- a/src/glx/dri2_glx.c > +++ b/src/glx/dri2_glx.c > @@ -1288,6 +1288,7 @@ dri2CreateScreen(int screen, struct glx_display * > priv) > psp->waitForSBC = NULL; > psp->setSwapInterval = NULL; > psp->getSwapInterval = NULL; > + psp->queryBufferAge = NULL; > > if (pdp->driMinor >= 2) { > psp->getDrawableMSC = dri2DrawableGetMSC; > diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c > index 70ec057..07120e1 100644 > --- a/src/glx/dri3_glx.c > +++ b/src/glx/dri3_glx.c > @@ -1345,6 +1345,8 @@ dri3_swap_buffers(__GLXDRIdrawable *pdraw, int64_t > target_msc, int64_t divisor, > target_msc = priv->msc + priv->swap_interval * (priv->send_sbc - > priv->recv_sbc); > > priv->buffers[buf_id]->busy = 1; > + priv->buffers[buf_id]->last_swap = priv->swap_count; > + > xcb_present_pixmap(c, > priv->base.xDrawable, > priv->buffers[buf_id]->pixmap, > @@ -1379,11 +1381,23 @@ dri3_swap_buffers(__GLXDRIdrawable *pdraw, int64_t > target_msc, int64_t divisor, > xcb_flush(c); > if (priv->stamp) > ++(*priv->stamp); > + > + priv->swap_count++; > } > > return ret; > } > > +static int > +dri3_query_buffer_age(__GLXDRIdrawable *pdraw) > +{ > + struct dri3_drawable *priv = (struct dri3_drawable *) pdraw; > + int buf_id = DRI3_BACK_ID(priv->cur_back); > + if (!priv->buffers[buf_id]->last_swap) > + return 0; > + return priv->swap_count - priv->buffers[buf_id]->last_swap; > +} > + > /** dri3_open > * > * Wrapper around xcb_dri3_open > @@ -1742,6 +1756,9 @@ dri3_create_screen(int screen, struct glx_display * > priv) > psp->copySubBuffer = dri3_copy_sub_buffer; > __glXEnableDirectExtension(&psc->base, "GLX_MESA_copy_sub_buffer"); > > + psp->queryBufferAge = dri3_query_buffer_age; > + __glXEnableDirectExtension(&psc->base, "GLX_EXT_buffer_age"); > + > free(driverName); > free(deviceName); > > diff --git a/src/glx/dri3_priv.h b/src/glx/dri3_priv.h > index 1d124f8..d00440a 100644 > --- a/src/glx/dri3_priv.h > +++ b/src/glx/dri3_priv.h > @@ -97,6 +97,7 @@ struct dri3_buffer { > uint32_t cpp; > uint32_t flags; > uint32_t width, height; > + uint32_t last_swap; > > enum dri3_buffer_type buffer_type; > }; > @@ -184,6 +185,7 @@ struct dri3_drawable { > struct dri3_buffer *buffers[DRI3_NUM_BUFFERS]; > int cur_back; > int num_back; > + uint32_t swap_count; > > uint32_t *stamp; > > diff --git a/src/glx/glx_pbuffer.c b/src/glx/glx_pbuffer.c > index 411d6e5..a87a0a4 100644 > --- a/src/glx/glx_pbuffer.c > +++ b/src/glx/glx_pbuffer.c > @@ -365,6 +365,13 @@ GetDrawableAttribute(Display * dpy, GLXDrawable > drawable, > #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) > { > __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable); > + struct glx_screen *psc = pdraw->psc; > + > + if (attribute == GLX_BACK_BUFFER_AGE_EXT && pdraw != NULL && > + psc->driScreen->queryBufferAge != NULL) { > + > + *value = psc->driScreen->queryBufferAge (pdraw); > + } > > if (pdraw != NULL && !pdraw->textureTarget) > pdraw->textureTarget = > diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h > index a7118af..9333bdf 100644 > --- a/src/glx/glxclient.h > +++ b/src/glx/glxclient.h > @@ -125,6 +125,7 @@ struct __GLXDRIscreenRec { > int64_t *msc, int64_t *sbc); > int (*setSwapInterval)(__GLXDRIdrawable *pdraw, int interval); > int (*getSwapInterval)(__GLXDRIdrawable *pdraw); > + int (*queryBufferAge)(__GLXDRIdrawable *pdraw); > }; > > struct __GLXDRIdrawableRec > diff --git a/src/glx/glxextensions.c b/src/glx/glxextensions.c > index f186c13..78c4a8d 100644 > --- a/src/glx/glxextensions.c > +++ b/src/glx/glxextensions.c > @@ -103,6 +103,7 @@ static const struct extension_info > known_glx_extensions[] = { > { GLX(SGIX_visual_select_group), VER(0,0), Y, Y, N, N }, > { GLX(EXT_texture_from_pixmap), VER(0,0), Y, N, N, N }, > { GLX(INTEL_swap_event), VER(0,0), Y, N, N, N }, > + { GLX(EXT_buffer_age), VER(1,4), Y, N, Y, Y }, > { NULL } > }; > > diff --git a/src/glx/glxextensions.h b/src/glx/glxextensions.h > index 8436a94..37e4ccc 100644 > --- a/src/glx/glxextensions.h > +++ b/src/glx/glxextensions.h > @@ -66,6 +66,7 @@ enum > SGIX_visual_select_group_bit, > EXT_texture_from_pixmap_bit, > INTEL_swap_event_bit, > + EXT_buffer_age_bit, > }; > > /* From the GLX perspective, the ARB and EXT extensions are identical. Use > a > diff --git a/src/mesa/drivers/x11/glxapi.c b/src/mesa/drivers/x11/glxapi.c > index dfa8946..af3d208 100644 > --- a/src/mesa/drivers/x11/glxapi.c > +++ b/src/mesa/drivers/x11/glxapi.c > @@ -1181,6 +1181,9 @@ _glxapi_get_extensions(void) > #ifdef GLX_INTEL_swap_event > "GLX_INTEL_swap_event", > #endif > +#ifdef GLX_INTEL_buffer_age > + "GLX_INTEL_buffer_age", > +#endif
EXT_buffer_age, not INTEL_buffer_age, right? > NULL > }; > return extensions; > -- > 1.8.5.3 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev