[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