[Mesa-dev] [PATCH 12/13] mesa: Use atomics for shared VAO reference counts.

Mathias.Froehlich at gmx.net Mathias.Froehlich at gmx.net
Thu Feb 15 19:55:24 UTC 2018


From: Mathias Fröhlich <mathias.froehlich at web.de>

VAOs will be used in the next change as immutable object
across multiple contexts. Only reference counting may write
concurrently on the VAO. So, make the reference count
thread safe for those and only those VAO objects.

Signed-off-by: Mathias Fröhlich <Mathias.Froehlich at web.de>
---
 src/mesa/main/arrayobj.c | 35 ++++++++++++++++++++++++++++++-----
 src/mesa/main/arrayobj.h |  9 +++++++++
 src/mesa/main/mtypes.h   |  7 +++++++
 3 files changed, 46 insertions(+), 5 deletions(-)

diff --git a/src/mesa/main/arrayobj.c b/src/mesa/main/arrayobj.c
index cf9c5d7ecc..063856d984 100644
--- a/src/mesa/main/arrayobj.c
+++ b/src/mesa/main/arrayobj.c
@@ -53,6 +53,7 @@
 #include "varray.h"
 #include "main/dispatch.h"
 #include "util/bitscan.h"
+#include "util/u_atomic.h"
 
 
 const GLubyte
@@ -331,10 +332,16 @@ _mesa_reference_vao_(struct gl_context *ctx,
       /* Unreference the old array object */
       struct gl_vertex_array_object *oldObj = *ptr;
 
-      assert(oldObj->RefCount > 0);
-      oldObj->RefCount--;
+      bool deleteFlag;
+      if (oldObj->SharedAndImmutable) {
+         deleteFlag = p_atomic_dec_zero(&oldObj->RefCount);
+      } else {
+         assert(oldObj->RefCount > 0);
+         oldObj->RefCount--;
+         deleteFlag = (oldObj->RefCount == 0);
+      }
 
-      if (oldObj->RefCount == 0)
+      if (deleteFlag)
          _mesa_delete_vao(ctx, oldObj);
 
       *ptr = NULL;
@@ -343,9 +350,13 @@ _mesa_reference_vao_(struct gl_context *ctx,
 
    if (vao) {
       /* reference new array object */
-      assert(vao->RefCount > 0);
+      if (vao->SharedAndImmutable) {
+         p_atomic_inc(&vao->RefCount);
+      } else {
+         assert(vao->RefCount > 0);
+         vao->RefCount++;
+      }
 
-      vao->RefCount++;
       *ptr = vao;
    }
 }
@@ -407,6 +418,7 @@ _mesa_initialize_vao(struct gl_context *ctx,
    vao->Name = name;
 
    vao->RefCount = 1;
+   vao->SharedAndImmutable = GL_FALSE;
 
    /* Init the individual arrays */
    for (i = 0; i < ARRAY_SIZE(vao->VertexAttrib); i++) {
@@ -452,6 +464,9 @@ _mesa_update_vao_derived_arrays(struct gl_context *ctx,
 {
    GLbitfield arrays = vao->NewArrays;
 
+   /* Make sure we do not run into problems with shared objects */
+   assert(!vao->SharedAndImmutable || vao->NewArrays == 0);
+
    while (arrays) {
       const int attrib = u_bit_scan(&arrays);
       struct gl_vertex_array *array = &vao->_VertexArray[attrib];
@@ -465,6 +480,16 @@ _mesa_update_vao_derived_arrays(struct gl_context *ctx,
 }
 
 
+void
+_mesa_set_vao_immutable(struct gl_context *ctx,
+                        struct gl_vertex_array_object *vao)
+{
+   _mesa_update_vao_derived_arrays(ctx, vao);
+   vao->NewArrays = 0;
+   vao->SharedAndImmutable = GL_TRUE;
+}
+
+
 bool
 _mesa_all_varyings_in_vbos(const struct gl_vertex_array_object *vao)
 {
diff --git a/src/mesa/main/arrayobj.h b/src/mesa/main/arrayobj.h
index 5de74505bb..8da5c9ffe0 100644
--- a/src/mesa/main/arrayobj.h
+++ b/src/mesa/main/arrayobj.h
@@ -81,6 +81,15 @@ extern void
 _mesa_update_vao_derived_arrays(struct gl_context *ctx,
                                 struct gl_vertex_array_object *vao);
 
+
+/**
+ * Mark the vao as shared and immutable, do remaining updates.
+ */
+extern void
+_mesa_set_vao_immutable(struct gl_context *ctx,
+                        struct gl_vertex_array_object *vao);
+
+
 /* Returns true if all varying arrays reside in vbos */
 extern bool
 _mesa_all_varyings_in_vbos(const struct gl_vertex_array_object *vao);
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index b6fdb69283..93ad5a9057 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -1607,6 +1607,13 @@ struct gl_vertex_array_object
     */
    GLboolean EverBound;
 
+   /**
+    * Marked to true if the object is shared between contexts and immutable.
+    * Then reference counting is done using atomics and thread safe.
+    * Is used for dlist VAOs.
+    */
+   GLboolean SharedAndImmutable;
+
    /**
     * Derived vertex attribute arrays
     *
-- 
2.14.3



More information about the mesa-dev mailing list