[client] egl: improved streaming texture syncronization

This commit is contained in:
Geoffrey McRae 2019-08-30 12:09:05 +10:00
parent e93bd7a3bf
commit 6d2c464436
3 changed files with 20 additions and 15 deletions

View File

@ -1 +1 @@
fetch-4-gf7d2295dab+1 fetch-4-ge93bd7a3bf+1

View File

@ -19,6 +19,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA
#include "texture.h" #include "texture.h"
#include "common/debug.h" #include "common/debug.h"
#include "common/locking.h"
#include "debug.h" #include "debug.h"
#include "utils.h" #include "utils.h"
@ -48,7 +49,7 @@ struct EGL_Texture
GLuint pbo[2]; GLuint pbo[2];
int pboRIndex; int pboRIndex;
int pboWIndex; int pboWIndex;
int pboCount; volatile int pboCount;
size_t pboBufferSize; size_t pboBufferSize;
void * pboMap[2]; void * pboMap[2];
GLsync pboSync[2]; GLsync pboSync[2];
@ -259,7 +260,7 @@ bool egl_texture_update(EGL_Texture * texture, const uint8_t * buffer)
if (++texture->pboWIndex == 2) if (++texture->pboWIndex == 2)
texture->pboWIndex = 0; texture->pboWIndex = 0;
++texture->pboCount; INTERLOCKED_INC(&texture->pboCount);
} }
else else
{ {
@ -303,7 +304,7 @@ enum EGL_TexStatus egl_texture_process(EGL_Texture * texture)
/* wait for the buffer to be ready */ /* wait for the buffer to be ready */
pos = texture->pboRIndex; 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_ALREADY_SIGNALED:
case GL_CONDITION_SATISFIED: case GL_CONDITION_SATISFIED:
@ -337,7 +338,7 @@ enum EGL_TexStatus egl_texture_process(EGL_Texture * texture)
/* advance the read index */ /* advance the read index */
if (++texture->pboRIndex == 2) if (++texture->pboRIndex == 2)
texture->pboRIndex = 0; texture->pboRIndex = 0;
--texture->pboCount; INTERLOCKED_DEC(&texture->pboCount);
texture->ready = true; texture->ready = true;

View File

@ -21,7 +21,11 @@ Place, Suite 330, Boston, MA 02111-1307 USA
#if defined(__GCC__) || defined(__GNUC__) #if defined(__GCC__) || defined(__GNUC__)
#define INTERLOCKED_AND8 __sync_fetch_and_and #define INTERLOCKED_AND8 __sync_fetch_and_and
#define INTERLOCKED_OR8 __sync_fetch_and_or #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 #else
#define INTERLOCKED_OR8 InterlockedOr8 #define INTERLOCKED_OR8 InterlockedOr8
#define INTERLOCKED_AND8 InterlockedAnd8 #define INTERLOCKED_AND8 InterlockedAnd8
#define INTERLOCKED_INC InterlockedIncrement
#define INTERLOCKED_DEC InterlockedDecrement
#endif #endif