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

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


---
 src/mesa/main/mtypes.h |  1 -
 src/mesa/main/texobj.c | 19 ++++---------------
 2 files changed, 4 insertions(+), 16 deletions(-)

diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 5a1be17a92..a1eabc8bf1 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -995,7 +995,6 @@ struct gl_sampler_object
  */
 struct gl_texture_object
 {
-   mtx_t Mutex;      /**< for thread safety */
    GLint RefCount;             /**< reference count */
    GLuint Name;                /**< the user-visible texture object ID */
    GLchar *Label;               /**< GL_KHR_debug */
diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c
index ad644ca1ca..4afa7d8fb2 100644
--- a/src/mesa/main/texobj.c
+++ b/src/mesa/main/texobj.c
@@ -43,6 +43,7 @@
 #include "texstate.h"
 #include "mtypes.h"
 #include "program/prog_instruction.h"
+#include "util/u_atomic.h"
 
 
 
@@ -270,7 +271,6 @@ _mesa_initialize_texture_object( struct gl_context *ctx,
 
    memset(obj, 0, sizeof(*obj));
    /* init the non-zero fields */
-   mtx_init(&obj->Mutex, mtx_plain);
    obj->RefCount = 1;
    obj->Name = name;
    obj->Target = target;
@@ -399,9 +399,6 @@ _mesa_delete_texture_object(struct gl_context *ctx,
 
    _mesa_reference_buffer_object(ctx, &texObj->BufferObject, NULL);
 
-   /* destroy the mutex -- it may have allocated memory (eg on bsd) */
-   mtx_destroy(&texObj->Mutex);
-
    free(texObj->Label);
 
    /* free this object */
@@ -534,20 +531,14 @@ _mesa_reference_texobj_(struct gl_texture_object **ptr,
 
    if (*ptr) {
       /* Unreference the old texture */
-      GLboolean deleteFlag = GL_FALSE;
       struct gl_texture_object *oldTex = *ptr;
 
       assert(valid_texture_object(oldTex));
       (void) valid_texture_object; /* silence warning in release builds */
 
-      mtx_lock(&oldTex->Mutex);
       assert(oldTex->RefCount > 0);
-      oldTex->RefCount--;
-
-      deleteFlag = (oldTex->RefCount == 0);
-      mtx_unlock(&oldTex->Mutex);
 
-      if (deleteFlag) {
+      if (p_atomic_dec_zero(&oldTex->RefCount)) {
          /* Passing in the context drastically changes the driver code for
           * framebuffer deletion.
           */
@@ -565,18 +556,16 @@ _mesa_reference_texobj_(struct gl_texture_object **ptr,
    if (tex) {
       /* reference new texture */
       assert(valid_texture_object(tex));
-      mtx_lock(&tex->Mutex);
-      if (tex->RefCount == 0) {
+      if (p_atomic_read(&tex->RefCount) == 0) {
          /* this texture's being deleted (look just above) */
          /* Not sure this can every really happen.  Warn if it does. */
          _mesa_problem(NULL, "referencing deleted texture object");
          *ptr = NULL;
       }
       else {
-         tex->RefCount++;
+         p_atomic_inc(&tex->RefCount);
          *ptr = tex;
       }
-      mtx_unlock(&tex->Mutex);
    }
 }
 
-- 
2.12.2



More information about the mesa-dev mailing list