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
NULL
};
return extensions;
--
1.8.5.3
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev