diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 50a127aec..fc75f8ae4 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -237,6 +237,8 @@ enum GLChunkType DISPATCH_COMPUTE, DISPATCH_COMPUTE_INDIRECT, MEMORY_BARRIER, + MEMORY_BARRIER_BY_REGION, + TEXTURE_BARRIER, DRAWARRAYS, DRAWARRAYS_INDIRECT, DRAWARRAYS_INSTANCED, diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 5e68b28ea..d936ab36b 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -182,6 +182,8 @@ const char *GLChunkNames[] = "glDispatchCompute", "glDispatchComputeIndirect", "glMemoryBarrier", + "glMemoryBarrierByRegion", + "glTextureBarrier", "glDrawArrays", "glDrawArraysIndirect", "glDrawArraysInstanced", @@ -1973,6 +1975,12 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case MEMORY_BARRIER: Serialise_glMemoryBarrier(0); break; + case MEMORY_BARRIER_BY_REGION: + Serialise_glMemoryBarrierByRegion(0); + break; + case TEXTURE_BARRIER: + Serialise_glTextureBarrier(); + 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 fe66241a1..b29b98f5d 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -545,6 +545,8 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)); IMPLEMENT_FUNCTION_SERIALISED(void, glDispatchComputeIndirect(GLintptr indirect)); IMPLEMENT_FUNCTION_SERIALISED(void, glMemoryBarrier(GLbitfield barriers)); + IMPLEMENT_FUNCTION_SERIALISED(void, glMemoryBarrierByRegion(GLbitfield barriers)); + IMPLEMENT_FUNCTION_SERIALISED(void, glTextureBarrier()); 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 e6c793876..17177c04e 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -451,6 +451,8 @@ struct GLHookSet PFNGLDISPATCHCOMPUTEPROC glDispatchCompute; PFNGLDISPATCHCOMPUTEINDIRECTPROC glDispatchComputeIndirect; PFNGLMEMORYBARRIERPROC glMemoryBarrier; + PFNGLMEMORYBARRIERBYREGIONPROC glMemoryBarrierByRegion; + PFNGLTEXTUREBARRIERPROC glTextureBarrier; PFNGLCLEARDEPTHFPROC glClearDepthf; PFNGLCLEARBUFFERFVPROC glClearBufferfv; PFNGLCLEARBUFFERIVPROC glClearBufferiv; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index 5ba785da6..43bd1abe8 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -483,6 +483,8 @@ HookExtension(PFNGLDISPATCHCOMPUTEPROC, glDispatchCompute); \ HookExtension(PFNGLDISPATCHCOMPUTEINDIRECTPROC, glDispatchComputeIndirect); \ HookExtension(PFNGLMEMORYBARRIERPROC, glMemoryBarrier); \ + HookExtension(PFNGLMEMORYBARRIERBYREGIONPROC, glMemoryBarrierByRegion); \ + HookExtension(PFNGLTEXTUREBARRIERPROC, glTextureBarrier); \ HookExtension(PFNGLCLEARDEPTHFPROC, glClearDepthf); \ HookExtension(PFNGLCLEARBUFFERFVPROC, glClearBufferfv); \ HookExtension(PFNGLCLEARBUFFERIVPROC, glClearBufferiv); \ @@ -1156,6 +1158,8 @@ HookWrapper3(void, glDispatchCompute, GLuint, num_groups_x, GLuint, num_groups_y, GLuint, num_groups_z); \ HookWrapper1(void, glDispatchComputeIndirect, GLintptr, indirect); \ HookWrapper1(void, glMemoryBarrier, GLbitfield, barriers); \ + HookWrapper1(void, glMemoryBarrierByRegion, GLbitfield, barriers); \ + HookWrapper0(void, glTextureBarrier); \ HookWrapper1(void, glClearDepthf, GLfloat, d); \ HookWrapper3(void, glClearBufferfv, GLenum, buffer, GLint, drawbuffer, const GLfloat *, value); \ HookWrapper3(void, glClearBufferiv, GLenum, buffer, GLint, drawbuffer, const GLint *, value); \ diff --git a/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp index 5a7e1facf..6d5592c31 100644 --- a/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp @@ -147,6 +147,54 @@ void WrappedOpenGL::glMemoryBarrier(GLbitfield barriers) } } +bool WrappedOpenGL::Serialise_glMemoryBarrierByRegion(GLbitfield barriers) +{ + SERIALISE_ELEMENT(uint32_t, Barriers, barriers); + + if(m_State <= EXECUTING) + { + m_Real.glMemoryBarrierByRegion(Barriers); + } + + return true; +} + +void WrappedOpenGL::glMemoryBarrierByRegion(GLbitfield barriers) +{ + m_Real.glMemoryBarrierByRegion(barriers); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(MEMORY_BARRIER_BY_REGION); + Serialise_glMemoryBarrierByRegion(barriers); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + +bool WrappedOpenGL::Serialise_glTextureBarrier() +{ + if(m_State <= EXECUTING) + { + m_Real.glTextureBarrier(); + } + + return true; +} + +void WrappedOpenGL::glTextureBarrier() +{ + m_Real.glTextureBarrier(); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(TEXTURE_BARRIER); + Serialise_glTextureBarrier(); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + bool WrappedOpenGL::Serialise_glDrawArrays(GLenum mode, GLint first, GLsizei count) { SERIALISE_ELEMENT(GLenum, Mode, mode);