[Mesa-dev] [PATCH 4/9] dri: Add a flush control extension

Adam Jackson ajax at redhat.com
Thu Nov 2 19:01:43 UTC 2017


From: Neil Roberts <neil at linux.intel.com>

This advertises that the driver can accept a new context attribute
__DRI_CTX_ATTRIB_RELEASE_BEHAVIOR.

Reviewed-by: Adam Jackson <ajax at redhat.com>
Signed-off-by: Neil Roberts <neil at linux.intel.com>
---
 include/GL/internal/dri_interface.h    | 25 +++++++++++++++++++++++++
 src/mesa/drivers/dri/common/dri_util.c | 14 ++++++++++++++
 src/mesa/drivers/dri/common/dri_util.h |  9 +++++++--
 3 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
index 98402eae05..b47947380c 100644
--- a/include/GL/internal/dri_interface.h
+++ b/include/GL/internal/dri_interface.h
@@ -1106,6 +1106,16 @@ struct __DRIdri2LoaderExtensionRec {
 #define __DRI_CTX_PRIORITY_MEDIUM		1
 #define __DRI_CTX_PRIORITY_HIGH			2
 
+/**
+ * \name Context release behaviors.
+ */
+/*@{*/
+#define __DRI_CTX_ATTRIB_RELEASE_BEHAVIOR	5
+
+#define __DRI_CTX_RELEASE_BEHAVIOR_NONE         0
+#define __DRI_CTX_RELEASE_BEHAVIOR_FLUSH        1
+/*@}*/
+
 /**
  * \name Reasons that __DRIdri2Extension::createContextAttribs might fail
  */
@@ -1715,6 +1725,21 @@ typedef struct __DRInoErrorExtensionRec {
    __DRIextension base;
 } __DRInoErrorExtension;
 
+/*
+ * Flush control driver extension.
+ *
+ * Existence of this extension means the driver can accept the
+ * \c __DRI_CTX_ATTRIB_RELEASE_BEHAVIOR attribute in
+ * \c __DRIdri2ExtensionRec::createContextAttribs.
+ */
+#define __DRI2_FLUSH_CONTROL "DRI_FlushControl"
+#define __DRI2_FLUSH_CONTROL_VERSION 1
+
+typedef struct __DRI2flushControlExtensionRec __DRI2flushControlExtension;
+struct __DRI2flushControlExtensionRec {
+   __DRIextension base;
+};
+
 /**
  * DRI config options extension.
  *
diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c
index dc5260ca5b..d504751c39 100644
--- a/src/mesa/drivers/dri/common/dri_util.c
+++ b/src/mesa/drivers/dri/common/dri_util.c
@@ -361,6 +361,16 @@ driCreateContextAttribs(__DRIscreen *screen, int api,
             ctx_config.attribute_mask |= __DRIVER_CONTEXT_ATTRIB_PRIORITY;
 	    ctx_config.priority = attribs[i * 2 + 1];
 	    break;
+        case __DRI_CTX_ATTRIB_RELEASE_BEHAVIOR:
+            if (attribs[i * 2 + 1] != __DRI_CTX_RELEASE_BEHAVIOR_FLUSH) {
+                ctx_config.attribute_mask |=
+                    __DRIVER_CONTEXT_ATTRIB_RELEASE_BEHAVIOR;
+                ctx_config.release_behavior = attribs[i * 2 + 1];
+            } else {
+                ctx_config.attribute_mask &=
+                    ~__DRIVER_CONTEXT_ATTRIB_RELEASE_BEHAVIOR;
+            }
+            break;
 	default:
 	    /* We can't create a context that satisfies the requirements of an
 	     * attribute that we don't understand.  Return failure.
@@ -833,6 +843,10 @@ const __DRI2configQueryExtension dri2ConfigQueryExtension = {
    .configQueryf        = dri2ConfigQueryf,
 };
 
+const __DRI2flushControlExtension dri2FlushControlExtension = {
+   .base = { __DRI2_FLUSH_CONTROL, 1 }
+};
+
 void
 dri2InvalidateDrawable(__DRIdrawable *drawable)
 {
diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h
index 3d9ec9d072..1881e3d0a7 100644
--- a/src/mesa/drivers/dri/common/dri_util.h
+++ b/src/mesa/drivers/dri/common/dri_util.h
@@ -67,6 +67,7 @@ extern const __DRIswrastExtension driSWRastExtension;
 extern const __DRIdri2Extension driDRI2Extension;
 extern const __DRI2configQueryExtension dri2ConfigQueryExtension;
 extern const __DRIcopySubBufferExtension driCopySubBufferExtension;
+extern const __DRI2flushControlExtension dri2FlushControlExtension;
 
 /**
  * Description of the attributes used to create a config.
@@ -93,10 +94,14 @@ struct __DriverContextConfig {
 
     /* Only valid if __DRIVER_CONTEXT_PRIORITY is set */
     unsigned priority;
+
+    /* Only valid if __DRIVER_CONTEXT_ATTRIB_RELEASE_BEHAVIOR is set */
+    int release_behavior;
 };
 
-#define __DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY  (1 << 0)
-#define __DRIVER_CONTEXT_ATTRIB_PRIORITY        (1 << 1)
+#define __DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY   (1 << 0)
+#define __DRIVER_CONTEXT_ATTRIB_PRIORITY         (1 << 1)
+#define __DRIVER_CONTEXT_ATTRIB_RELEASE_BEHAVIOR (1 << 2)
 
 /**
  * Driver callback functions.
-- 
2.14.3



More information about the mesa-dev mailing list