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

Brian Paul brianp at vmware.com
Thu Feb 22 22:31:47 UTC 2018


On 02/21/2018 10:45 PM, Mathias.Froehlich at gmx.net wrote:
> 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 bdecd422a9..9965cf8447 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;

We could actually use bool/true/false for this field.  It doesn't 
correspond to any public GL state.

-Brian

> +
>      /**
>       * Derived vertex attribute arrays
>       *
> 



More information about the mesa-dev mailing list