[Mesa-dev] [PATCH] dri2: add vblank_mode support

Jesse Barnes jbarnes at virtuousgeek.org
Tue Apr 20 11:35:11 PDT 2010


This patch adds vblank_mode support to DRI2, for direct rendered
clients only.  It does this by adding some DRI options parsing at DRI2
screen creation time, and some checking for the current vblank mode to
dri2_glx.c.

Fixes fdo bug #27656.

-- 
Jesse Barnes, Intel Open Source Technology Center

diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
index 3a53ce9..c7ed259 100644
--- a/src/glx/dri2_glx.c
+++ b/src/glx/dri2_glx.c
@@ -48,6 +48,7 @@
 #include "dri2.h"
 #include "dri_common.h"
 #include "../../mesa/drivers/dri/common/dri_util.h"
+#include "../../mesa/drivers/dri/common/xmlpool/options.h"
 
 #undef DRI2_MINOR
 #define DRI2_MINOR 1
@@ -187,7 +188,18 @@ dri2CreateDrawable(__GLXscreenConfigs * psc,
    pdraw->base.drawable = drawable;
    pdraw->base.psc = psc;
    pdraw->bufferCount = 0;
-   pdraw->swap_interval = 1;
+
+   switch (psc->__driScreen->dri2.vblankMode) {
+   case DRI_CONF_VBLANK_NEVER:
+   case DRI_CONF_VBLANK_DEF_INTERVAL_0:
+      pdraw->swap_interval = 0;
+      break;
+   case DRI_CONF_VBLANK_DEF_INTERVAL_1:
+   case DRI_CONF_VBLANK_ALWAYS_SYNC:
+   default:
+      pdraw->swap_interval = 1;
+      break;
+   }
 
    DRI2CreateDrawable(psc->dpy, xDrawable);
 
@@ -474,8 +486,20 @@ dri2GetBuffersWithFormat(__DRIdrawable * driDrawable,
 static void
 dri2SetSwapInterval(__GLXDRIdrawable *pdraw, int interval)
 {
+   __GLXscreenConfigs *psc = pdraw->psc;
    __GLXDRIdrawablePrivate *priv =  (__GLXDRIdrawablePrivate *) pdraw;
 
+   switch (psc->__driScreen->dri2.vblankMode) {
+   case DRI_CONF_VBLANK_NEVER:
+      return;
+   case DRI_CONF_VBLANK_ALWAYS_SYNC:
+      if (interval <= 0)
+	 return;
+      break;
+   default:
+      break;
+   }
+
    DRI2SwapInterval(priv->base.psc->dpy, pdraw->xDrawable, interval);
    priv->swap_interval = interval;
 }
diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c
index f1bbd38..9fa6675 100644
--- a/src/mesa/drivers/dri/common/dri_util.c
+++ b/src/mesa/drivers/dri/common/dri_util.c
@@ -31,6 +31,17 @@
 #include "dri_util.h"
 #include "drm_sarea.h"
 #include "utils.h"
+#include "vblank.h"
+#include "xmlpool.h"
+
+PUBLIC const char __dri2ConfigOptions[] =
+   DRI_CONF_BEGIN
+      DRI_CONF_SECTION_PERFORMANCE
+         DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_1)
+      DRI_CONF_SECTION_END
+   DRI_CONF_END;
+
+static const uint __dri2NConfigOptions = 1;
 
 #ifndef GLX_OML_sync_control
 typedef GLboolean ( * PFNGLXGETMSCRATEOMLPROC) (__DRIdrawable *drawable, int32_t *numerator, int32_t *denominator);
@@ -739,6 +750,7 @@ dri2CreateNewScreen(int scrn, int fd,
     static const __DRIextension *emptyExtensionList[] = { NULL };
     __DRIscreen *psp;
     drmVersionPtr version;
+    driOptionCache cache, options;
 
     if (driDriverAPI.InitScreen2 == NULL)
         return NULL;
@@ -771,6 +783,10 @@ dri2CreateNewScreen(int scrn, int fd,
 
     psp->DriverAPI = driDriverAPI;
 
+    driParseOptionInfo(&options, __dri2ConfigOptions, __dri2NConfigOptions);
+    driParseConfigFiles(&cache, &options, psp->myNum, "dri2");
+    psp->dri2.vblankMode = driQueryOptioni(&cache, "vblank_mode");
+
     return psp;
 }
 
diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h
index 038a816..f92f026 100644
--- a/src/mesa/drivers/dri/common/dri_util.h
+++ b/src/mesa/drivers/dri/common/dri_util.h
@@ -51,6 +51,7 @@
 #include <drm.h>
 #include <drm_sarea.h>
 #include <xf86drm.h>
+#include "xmlconfig.h"
 #include "main/glheader.h"
 #include "GL/internal/glcore.h"
 #include "GL/internal/dri_interface.h"
@@ -523,6 +524,7 @@ struct __DRIscreenRec {
 	int enabled;
 	__DRIdri2LoaderExtension *loader;
 	__DRIimageLookupExtension *image;
+	GLuint vblankMode;
     } dri2;
 
     /* The lock actually in use, old sarea or DRI2 */



More information about the mesa-dev mailing list