diff options
author | Fredrik Höglund <fredrik@kde.org> | 2015-05-03 14:31:32 +0200 |
---|---|---|
committer | Grigori Goronzy <greg@chown.ath.cx> | 2015-10-24 22:21:31 +0200 |
commit | 1f043506026981e0ade18ba74ab03654ed34e12c (patch) | |
tree | d1704b5b47343094c89370d851534f6a2b8c3a9e | |
parent | b34865806e09a6551067523b688ffb1edcfcf122 (diff) |
mesa: Use atomic refcounting for framebuffersfaster
-rw-r--r-- | src/mesa/main/framebuffer.c | 21 |
1 files changed, 7 insertions, 14 deletions
diff --git a/src/mesa/main/framebuffer.c b/src/mesa/main/framebuffer.c index d18166d528..555572ee30 100644 --- a/src/mesa/main/framebuffer.c +++ b/src/mesa/main/framebuffer.c @@ -44,6 +44,7 @@ #include "renderbuffer.h" #include "texobj.h" #include "glformats.h" +#include "util/u_atomic.h" @@ -132,7 +133,7 @@ _mesa_initialize_window_framebuffer(struct gl_framebuffer *fb, mtx_init(&fb->Mutex, mtx_plain); - fb->RefCount = 1; + p_atomic_set(&fb->RefCount, 1); /* save the visual */ fb->Visual = *visual; @@ -176,7 +177,7 @@ _mesa_initialize_user_framebuffer(struct gl_framebuffer *fb, GLuint name) memset(fb, 0, sizeof(struct gl_framebuffer)); fb->Name = name; - fb->RefCount = 1; + p_atomic_set(&fb->RefCount, 1); fb->_NumColorDrawBuffers = 1; fb->ColorDrawBuffer[0] = GL_COLOR_ATTACHMENT0_EXT; fb->_ColorDrawBufferIndexes[0] = BUFFER_COLOR0; @@ -212,7 +213,7 @@ _mesa_free_framebuffer_data(struct gl_framebuffer *fb) GLuint i; assert(fb); - assert(fb->RefCount == 0); + assert(p_atomic_read(&fb->RefCount) == 0); mtx_destroy(&fb->Mutex); @@ -242,16 +243,10 @@ _mesa_reference_framebuffer_(struct gl_framebuffer **ptr, { if (*ptr) { /* unreference old renderbuffer */ - GLboolean deleteFlag = GL_FALSE; struct gl_framebuffer *oldFb = *ptr; - mtx_lock(&oldFb->Mutex); - assert(oldFb->RefCount > 0); - oldFb->RefCount--; - deleteFlag = (oldFb->RefCount == 0); - mtx_unlock(&oldFb->Mutex); - - if (deleteFlag) + assert(p_atomic_read(&oldFb->RefCount) > 0); + if (p_atomic_dec_zero(&oldFb->RefCount)) oldFb->Delete(oldFb); *ptr = NULL; @@ -259,9 +254,7 @@ _mesa_reference_framebuffer_(struct gl_framebuffer **ptr, assert(!*ptr); if (fb) { - mtx_lock(&fb->Mutex); - fb->RefCount++; - mtx_unlock(&fb->Mutex); + p_atomic_inc(&fb->RefCount); *ptr = fb; } } |