[Mesa-dev] [PATCH 05/13] mesa: Replace buffer object locks with atomic inc/dec.

Ian Romanick idr at freedesktop.org
Fri Aug 7 09:41:26 PDT 2015


So... the buffer object isn't locked during a call to glBufferData?
Since that allocates the backing storage for the BO, it doesn't seem
like anything good could happen...

On 08/06/2015 05:10 PM, Matt Turner wrote:
> ---
>  src/mesa/main/bufferobj.c | 17 +++--------------
>  src/mesa/main/mtypes.h    |  1 -
>  2 files changed, 3 insertions(+), 15 deletions(-)
> 
> diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
> index cc035ff..78af229 100644
> --- a/src/mesa/main/bufferobj.c
> +++ b/src/mesa/main/bufferobj.c
> @@ -47,6 +47,7 @@
>  #include "texstore.h"
>  #include "transformfeedback.h"
>  #include "dispatch.h"
> +#include "util/u_atomic.h"
>  
>  
>  /* Debug flags */
> @@ -424,7 +425,6 @@ _mesa_delete_buffer_object(struct gl_context *ctx,
>     bufObj->RefCount = -1000;
>     bufObj->Name = ~0;
>  
> -   mtx_destroy(&bufObj->Mutex);
>     free(bufObj->Label);
>     free(bufObj);
>  }
> @@ -443,16 +443,9 @@ _mesa_reference_buffer_object_(struct gl_context *ctx,
>  {
>     if (*ptr) {
>        /* Unreference the old buffer */
> -      GLboolean deleteFlag = GL_FALSE;
>        struct gl_buffer_object *oldObj = *ptr;
>  
> -      mtx_lock(&oldObj->Mutex);
> -      assert(oldObj->RefCount > 0);
> -      oldObj->RefCount--;
> -      deleteFlag = (oldObj->RefCount == 0);
> -      mtx_unlock(&oldObj->Mutex);
> -
> -      if (deleteFlag) {
> +      if (p_atomic_dec_zero(&oldObj->RefCount)) {
>  	 assert(ctx->Driver.DeleteBuffer);
>           ctx->Driver.DeleteBuffer(ctx, oldObj);
>        }
> @@ -463,7 +456,6 @@ _mesa_reference_buffer_object_(struct gl_context *ctx,
>  
>     if (bufObj) {
>        /* reference new buffer */
> -      mtx_lock(&bufObj->Mutex);
>        if (bufObj->RefCount == 0) {
>           /* this buffer's being deleted (look just above) */
>           /* Not sure this can every really happen.  Warn if it does. */
> @@ -471,10 +463,9 @@ _mesa_reference_buffer_object_(struct gl_context *ctx,
>           *ptr = NULL;
>        }
>        else {
> -         bufObj->RefCount++;
> +         p_atomic_inc(&bufObj->RefCount);
>           *ptr = bufObj;
>        }
> -      mtx_unlock(&bufObj->Mutex);
>     }
>  }
>  
> @@ -488,7 +479,6 @@ _mesa_initialize_buffer_object(struct gl_context *ctx,
>                                 GLuint name)
>  {
>     memset(obj, 0, sizeof(struct gl_buffer_object));
> -   mtx_init(&obj->Mutex, mtx_plain);
>     obj->RefCount = 1;
>     obj->Name = name;
>     obj->Usage = GL_STATIC_DRAW_ARB;
> @@ -806,7 +796,6 @@ _mesa_init_buffer_objects( struct gl_context *ctx )
>     GLuint i;
>  
>     memset(&DummyBufferObject, 0, sizeof(DummyBufferObject));
> -   mtx_init(&DummyBufferObject.Mutex, mtx_plain);
>     DummyBufferObject.RefCount = 1000*1000*1000; /* never delete */
>  
>     _mesa_reference_buffer_object(ctx, &ctx->Array.ArrayBufferObj,
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 19f65ee..2adfae2 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -1477,7 +1477,6 @@ typedef enum {
>   */
>  struct gl_buffer_object
>  {
> -   mtx_t Mutex;
>     GLint RefCount;
>     GLuint Name;
>     GLchar *Label;       /**< GL_KHR_debug */
> 



More information about the mesa-dev mailing list