diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 9d11820bf..b22d7e212 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -188,6 +188,7 @@ enum GLChunkType UNIFORM_MATRIX, UNIFORM_VECTOR, DISPATCH_COMPUTE, + MEMORY_BARRIER, DRAWARRAYS, DRAWARRAYS_INSTANCED, DRAWARRAYS_INSTANCEDBASEINSTANCE, diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 1d97e2881..bf0bfe1e2 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -141,6 +141,7 @@ const char *GLChunkNames[] = "glUniformMatrix*", "glUniformVector*", "glDispatchCompute", + "glMemoryBarrier", "glDrawArrays", "glDrawArraysInstanced", "glDrawArraysInstancedBaseInstance", @@ -1708,6 +1709,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case DISPATCH_COMPUTE: Serialise_glDispatchCompute(0, 0, 0); break; + case MEMORY_BARRIER: + Serialise_glMemoryBarrier(0); + break; case DRAWARRAYS: Serialise_glDrawArrays(eGL_NONE, 0, 0); break; diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 4895fc965..06f1c9ca6 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -521,6 +521,7 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(GLboolean, glUnmapBuffer(GLenum target)); IMPLEMENT_FUNCTION_SERIALISED(void, glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)); + IMPLEMENT_FUNCTION_SERIALISED(void, glMemoryBarrier(GLbitfield barriers)); IMPLEMENT_FUNCTION_SERIALISED(void, glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)); IMPLEMENT_FUNCTION_SERIALISED(void, glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)); IMPLEMENT_FUNCTION_SERIALISED(void, glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index 9da727e94..a5fb0f6f0 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -232,6 +232,7 @@ struct GLHookSet PFNGLPATCHPARAMETERIPROC glPatchParameteri; PFNGLPATCHPARAMETERFVPROC glPatchParameterfv; PFNGLDISPATCHCOMPUTEPROC glDispatchCompute; + PFNGLMEMORYBARRIERPROC glMemoryBarrier; PFNGLCLEARBUFFERFVPROC glClearBufferfv; PFNGLCLEARBUFFERIVPROC glClearBufferiv; PFNGLCLEARBUFFERUIVPROC glClearBufferuiv; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index 8356b83cc..55c8bfd99 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -246,6 +246,7 @@ HookExtension(PFNGLPATCHPARAMETERIPROC, glPatchParameteri); \ HookExtension(PFNGLPATCHPARAMETERFVPROC, glPatchParameterfv); \ HookExtension(PFNGLDISPATCHCOMPUTEPROC, glDispatchCompute); \ + HookExtension(PFNGLMEMORYBARRIERPROC, glMemoryBarrier); \ HookExtension(PFNGLCLEARBUFFERFVPROC, glClearBufferfv); \ HookExtension(PFNGLCLEARBUFFERIVPROC, glClearBufferiv); \ HookExtension(PFNGLCLEARBUFFERUIVPROC, glClearBufferuiv); \ @@ -598,6 +599,7 @@ HookWrapper2(void, glPatchParameteri, GLenum, pname, GLint, value); \ HookWrapper2(void, glPatchParameterfv, GLenum, pname, const GLfloat *, values); \ HookWrapper3(void, glDispatchCompute, GLuint, num_groups_x, GLuint, num_groups_y, GLuint, num_groups_z); \ + HookWrapper1(void, glMemoryBarrier, GLbitfield, barriers); \ HookWrapper3(void, glClearBufferfv, GLenum, buffer, GLint, drawbuffer, const GLfloat *, value); \ HookWrapper3(void, glClearBufferiv, GLenum, buffer, GLint, drawbuffer, const GLint *, value); \ HookWrapper3(void, glClearBufferuiv, GLenum, buffer, GLint, drawbuffer, const GLuint *, value); \ diff --git a/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp index 9dc2ef633..6fa345ef1 100644 --- a/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp @@ -74,6 +74,31 @@ void WrappedOpenGL::glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, } } +bool WrappedOpenGL::Serialise_glMemoryBarrier(GLbitfield barriers) +{ + SERIALISE_ELEMENT(uint32_t, Barriers, barriers); + + if(m_State <= EXECUTING) + { + m_Real.glMemoryBarrier(Barriers); + } + + return true; +} + +void WrappedOpenGL::glMemoryBarrier(GLbitfield barriers) +{ + m_Real.glMemoryBarrier(barriers); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(MEMORY_BARRIER); + Serialise_glMemoryBarrier(barriers); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + bool WrappedOpenGL::Serialise_glDrawArrays(GLenum mode, GLint first, GLsizei count) { SERIALISE_ELEMENT(GLenum, Mode, mode);