From 6d2c46443683c1dfe68601c80a35faf43020ff8c Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Fri, 30 Aug 2019 12:09:05 +1000 Subject: [PATCH] [client] egl: improved streaming texture syncronization --- VERSION | 2 +- client/renderers/EGL/texture.c | 23 ++++++++++++----------- common/include/common/locking.h | 10 +++++++--- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/VERSION b/VERSION index 639a64e6..22dd0453 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -fetch-4-gf7d2295dab+1 \ No newline at end of file +fetch-4-ge93bd7a3bf+1 \ No newline at end of file diff --git a/client/renderers/EGL/texture.c b/client/renderers/EGL/texture.c index 177cbc6d..1c735663 100644 --- a/client/renderers/EGL/texture.c +++ b/client/renderers/EGL/texture.c @@ -19,6 +19,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA #include "texture.h" #include "common/debug.h" +#include "common/locking.h" #include "debug.h" #include "utils.h" @@ -44,14 +45,14 @@ struct EGL_Texture GLenum format; GLenum dataType; - bool hasPBO; - GLuint pbo[2]; - int pboRIndex; - int pboWIndex; - int pboCount; - size_t pboBufferSize; - void * pboMap[2]; - GLsync pboSync[2]; + bool hasPBO; + GLuint pbo[2]; + int pboRIndex; + int pboWIndex; + volatile int pboCount; + size_t pboBufferSize; + void * pboMap[2]; + GLsync pboSync[2]; }; bool egl_texture_init(EGL_Texture ** texture) @@ -259,7 +260,7 @@ bool egl_texture_update(EGL_Texture * texture, const uint8_t * buffer) if (++texture->pboWIndex == 2) texture->pboWIndex = 0; - ++texture->pboCount; + INTERLOCKED_INC(&texture->pboCount); } else { @@ -303,7 +304,7 @@ enum EGL_TexStatus egl_texture_process(EGL_Texture * texture) /* wait for the buffer to be ready */ pos = texture->pboRIndex; - switch(glClientWaitSync(texture->pboSync[pos], GL_SYNC_FLUSH_COMMANDS_BIT, 0)) + switch(glClientWaitSync(texture->pboSync[pos], 0, 0)) { case GL_ALREADY_SIGNALED: case GL_CONDITION_SATISFIED: @@ -337,7 +338,7 @@ enum EGL_TexStatus egl_texture_process(EGL_Texture * texture) /* advance the read index */ if (++texture->pboRIndex == 2) texture->pboRIndex = 0; - --texture->pboCount; + INTERLOCKED_DEC(&texture->pboCount); texture->ready = true; diff --git a/common/include/common/locking.h b/common/include/common/locking.h index 969e91a1..ff8f022d 100644 --- a/common/include/common/locking.h +++ b/common/include/common/locking.h @@ -19,9 +19,13 @@ Place, Suite 330, Boston, MA 02111-1307 USA #pragma once #if defined(__GCC__) || defined(__GNUC__) -#define INTERLOCKED_AND8 __sync_fetch_and_and -#define INTERLOCKED_OR8 __sync_fetch_and_or +#define INTERLOCKED_AND8 __sync_fetch_and_and +#define INTERLOCKED_OR8 __sync_fetch_and_or +#define INTERLOCKED_INC(x) __sync_fetch_and_add((x), 1) +#define INTERLOCKED_DEC(x) __sync_fetch_and_sub((x), 1) #else -#define INTERLOCKED_OR8 InterlockedOr8 +#define INTERLOCKED_OR8 InterlockedOr8 #define INTERLOCKED_AND8 InterlockedAnd8 +#define INTERLOCKED_INC InterlockedIncrement +#define INTERLOCKED_DEC InterlockedDecrement #endif \ No newline at end of file