[Mesa-dev] [PATCH 2/5] mesa/pipelineobj: use atomics for reference counting

Bartosz Tomczyk bartosz.tomczyk86 at gmail.com
Mon Apr 10 20:08:53 UTC 2017


---
 src/mesa/main/mtypes.h      |  2 --
 src/mesa/main/pipelineobj.c | 16 ++++------------
 src/mesa/main/shaderapi.c   |  2 --
 3 files changed, 4 insertions(+), 16 deletions(-)

diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 5de464cc1b..8b1577dd3f 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2998,8 +2998,6 @@ struct gl_pipeline_object
 
    GLint RefCount;
 
-   mtx_t Mutex;
-
    GLchar *Label;   /**< GL_KHR_debug */
 
    /**
diff --git a/src/mesa/main/pipelineobj.c b/src/mesa/main/pipelineobj.c
index c1dd8d75c7..38fa9dcdbf 100644
--- a/src/mesa/main/pipelineobj.c
+++ b/src/mesa/main/pipelineobj.c
@@ -48,6 +48,7 @@
 #include "program/program.h"
 #include "program/prog_parameter.h"
 #include "util/ralloc.h"
+#include "util/u_atomic.h"
 
 /**
  * Delete a pipeline object.
@@ -66,7 +67,6 @@ _mesa_delete_pipeline_object(struct gl_context *ctx,
    }
 
    _mesa_reference_shader_program(ctx, &obj->ActiveProgram, NULL);
-   mtx_destroy(&obj->Mutex);
    free(obj->Label);
    ralloc_free(obj);
 }
@@ -80,7 +80,6 @@ _mesa_new_pipeline_object(struct gl_context *ctx, GLuint name)
    struct gl_pipeline_object *obj = rzalloc(NULL, struct gl_pipeline_object);
    if (obj) {
       obj->Name = name;
-      mtx_init(&obj->Mutex, mtx_plain);
       obj->RefCount = 1;
       obj->Flags = _mesa_get_shader_flags();
       obj->InfoLog = NULL;
@@ -186,16 +185,11 @@ _mesa_reference_pipeline_object_(struct gl_context *ctx,
 
    if (*ptr) {
       /* Unreference the old pipeline object */
-      GLboolean deleteFlag = GL_FALSE;
       struct gl_pipeline_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)) {
          _mesa_delete_pipeline_object(ctx, oldObj);
       }
 
@@ -205,18 +199,16 @@ _mesa_reference_pipeline_object_(struct gl_context *ctx,
 
    if (obj) {
       /* reference new pipeline object */
-      mtx_lock(&obj->Mutex);
-      if (obj->RefCount == 0) {
+      if (p_atomic_read(&obj->RefCount) == 0) {
          /* this pipeline's being deleted (look just above) */
          /* Not sure this can ever really happen.  Warn if it does. */
          _mesa_problem(NULL, "referencing deleted pipeline object");
          *ptr = NULL;
       }
       else {
-         obj->RefCount++;
+         p_atomic_inc(&obj->RefCount);
          *ptr = obj;
       }
-      mtx_unlock(&obj->Mutex);
    }
 }
 
diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
index 187475f127..0815ce36ff 100644
--- a/src/mesa/main/shaderapi.c
+++ b/src/mesa/main/shaderapi.c
@@ -138,7 +138,6 @@ _mesa_init_shader_state(struct gl_context *ctx)
 
    /* Extended for ARB_separate_shader_objects */
    ctx->Shader.RefCount = 1;
-   mtx_init(&ctx->Shader.Mutex, mtx_plain);
 
    ctx->TessCtrlProgram.patch_vertices = 3;
    for (i = 0; i < 4; ++i)
@@ -164,7 +163,6 @@ _mesa_free_shader_state(struct gl_context *ctx)
    _mesa_reference_pipeline_object(ctx, &ctx->_Shader, NULL);
 
    assert(ctx->Shader.RefCount == 1);
-   mtx_destroy(&ctx->Shader.Mutex);
 }
 
 
-- 
2.12.2



More information about the mesa-dev mailing list