--- src/glx/dri2_glx.c | 1 + src/glx/dri3_glx.c | 18 ++++++++++++++++++ src/glx/dri3_priv.h | 2 ++ src/glx/glx_pbuffer.c | 8 ++++++++ src/glx/glxclient.h | 1 + src/glx/glxextensions.c | 1 + src/glx/glxextensions.h | 1 + 7 files changed, 32 insertions(+)
diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index 67fe9c1..146802a 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->getBufferAge = NULL; if (pdp->driMinor >= 2) { psp->getDrawableMSC = dri2DrawableGetMSC; diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c index 70ec057..697d448 100644 --- a/src/glx/dri3_glx.c +++ b/src/glx/dri3_glx.c @@ -1345,6 +1345,7 @@ 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 +1380,25 @@ 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_get_buffer_age(__GLXDRIdrawable *pdraw) +{ + struct dri3_drawable *priv = (struct dri3_drawable *) pdraw; + const struct dri3_buffer *const back = dri3_back_buffer(priv); + + if (back->last_swap != 0) + return priv->swap_count - back->last_swap; + else + return 0; +} + /** dri3_open * * Wrapper around xcb_dri3_open @@ -1742,6 +1757,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->getBufferAge = dri3_get_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 978730c..afb4206 100644 --- a/src/glx/glx_pbuffer.c +++ b/src/glx/glx_pbuffer.c @@ -373,6 +373,14 @@ GetDrawableAttribute(Display * dpy, GLXDrawable drawable, if (!pdraw->textureFormat) pdraw->textureFormat = determineTextureFormat((const int *) data, num_attributes); + + if (attribute == GLX_BACK_BUFFER_AGE_EXT) { + struct glx_screen *psc = pdraw->psc; + + if (psc->driScreen->getBufferAge != NULL) + *value = psc->driScreen->getBufferAge(pdraw); + } + } #endif diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h index a7118af..74c19c4 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 (*getBufferAge)(__GLXDRIdrawable *pdraw); }; struct __GLXDRIdrawableRec diff --git a/src/glx/glxextensions.c b/src/glx/glxextensions.c index f186c13..ac1b4a7 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(0,0), 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 -- 1.8.5.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev