summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFredrik Höglund <fredrik@kde.org>2015-05-03 14:31:32 +0200
committerGrigori Goronzy <greg@chown.ath.cx>2015-10-24 22:21:31 +0200
commit1f043506026981e0ade18ba74ab03654ed34e12c (patch)
treed1704b5b47343094c89370d851534f6a2b8c3a9e
parentb34865806e09a6551067523b688ffb1edcfcf122 (diff)
mesa: Use atomic refcounting for framebuffersfaster
-rw-r--r--src/mesa/main/framebuffer.c21
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;
}
}