[Mesa-dev] [PATCH][RFC] dri3: Add support for the GLX_EXT_buffer_age extension

Adel Gadllah adel.gadllah at gmail.com
Wed Feb 19 14:49:07 PST 2014


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.gadllah at 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



More information about the mesa-dev mailing list