diff options
-rw-r--r-- | src/mesa/main/arrayobj.c | 35 | ||||
-rw-r--r-- | src/mesa/main/arrayobj.h | 9 | ||||
-rw-r--r-- | 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 cf9c5d7ecc7..2526404fda3 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 = 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 = 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 5de74505bb8..8da5c9ffe01 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 bdecd422a9a..15f39cbacc3 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1608,6 +1608,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. + */ + bool SharedAndImmutable; + + /** * Derived vertex attribute arrays * * This is a legacy data structure created from gl_array_attributes and |