diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 2c116ebfe..ea09662ec 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -138,6 +138,7 @@ enum GLChunkType BINDATTRIB_LOCATION, BINDFRAGDATA_LOCATION, UNIFORM_BLOCKBIND, + STORAGE_BLOCKBIND, PROGRAMUNIFORM_VECTOR, PROGRAMUNIFORM_MATRIX, LINKPROGRAM, diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index e1c1186bf..9ab64c0ba 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -91,6 +91,7 @@ const char *GLChunkNames[] = "glBindAttribLocation", "glBindFragDataLocation", "glUniformBlockBinding", + "glShaderStorageBlockBinding", "glProgramUniformMatrix*", "glProgramUniformVector*", "glLinkProgram", @@ -1680,6 +1681,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case UNIFORM_BLOCKBIND: Serialise_glUniformBlockBinding(0, 0, 0); break; + case STORAGE_BLOCKBIND: + Serialise_glShaderStorageBlockBinding(0, 0, 0); + break; case PROGRAMUNIFORM_VECTOR: Serialise_glProgramUniformVector(0, eGL_NONE, 0, 0, UNIFORM_UNKNOWN); break; diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 09ca27c5a..6c02c823f 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -495,6 +495,7 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glLinkProgram(GLuint program)); IMPLEMENT_FUNCTION_SERIALISED(void, glProgramParameteri(GLuint program, GLenum pname, GLint value)); IMPLEMENT_FUNCTION_SERIALISED(void, glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)); + IMPLEMENT_FUNCTION_SERIALISED(void, glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding)); IMPLEMENT_FUNCTION_SERIALISED(void, glBindAttribLocation(GLuint program, GLuint index, const GLchar *name)); IMPLEMENT_FUNCTION_SERIALISED(void, glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name)); IMPLEMENT_FUNCTION_SERIALISED(void, glUseProgram(GLuint program)); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index 3db69f6d0..246580d18 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -447,6 +447,7 @@ struct GLHookSet PFNGLVIEWPORTINDEXEDFVPROC glViewportIndexedfv; PFNGLVIEWPORTARRAYVPROC glViewportArrayv; PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding; + PFNGLSHADERSTORAGEBLOCKBINDINGPROC glShaderStorageBlockBinding; PFNGLUNIFORM1FPROC glUniform1f; PFNGLUNIFORM1IPROC glUniform1i; PFNGLUNIFORM1UIPROC glUniform1ui; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index c279b55a0..588cc3fc5 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -466,6 +466,7 @@ HookExtension(PFNGLVIEWPORTINDEXEDFVPROC, glViewportIndexedfv); \ HookExtension(PFNGLVIEWPORTARRAYVPROC, glViewportArrayv); \ HookExtension(PFNGLUNIFORMBLOCKBINDINGPROC, glUniformBlockBinding); \ + HookExtension(PFNGLSHADERSTORAGEBLOCKBINDINGPROC, glShaderStorageBlockBinding); \ HookExtension(PFNGLUNIFORM1FPROC, glUniform1f); \ HookExtension(PFNGLUNIFORM1IPROC, glUniform1i); \ HookExtension(PFNGLUNIFORM1UIPROC, glUniform1ui); \ @@ -1101,6 +1102,7 @@ HookWrapper2(void, glViewportIndexedfv, GLuint, index, const GLfloat *, v); \ HookWrapper3(void, glViewportArrayv, GLuint, first, GLsizei, count, const GLfloat *, v); \ HookWrapper3(void, glUniformBlockBinding, GLuint, program, GLuint, uniformBlockIndex, GLuint, uniformBlockBinding); \ + HookWrapper3(void, glShaderStorageBlockBinding, GLuint, program, GLuint, storageBlockIndex, GLuint, storageBlockBinding); \ HookWrapper2(void, glUniform1f, GLint, location, GLfloat, v0); \ HookWrapper2(void, glUniform1i, GLint, location, GLint, v0); \ HookWrapper2(void, glUniform1ui, GLint, location, GLuint, v0); \ diff --git a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp index 98a5d673e..f5273c1af 100644 --- a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp @@ -506,6 +506,37 @@ void WrappedOpenGL::glUniformBlockBinding(GLuint program, GLuint uniformBlockInd } } +bool WrappedOpenGL::Serialise_glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding) +{ + SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(ProgramRes(GetCtx(), program))); + SERIALISE_ELEMENT(uint32_t, index, storageBlockIndex); + SERIALISE_ELEMENT(uint32_t, binding, storageBlockBinding); + + if(m_State == READING) + { + m_Real.glShaderStorageBlockBinding(GetResourceManager()->GetLiveResource(id).name, index, binding); + } + + return true; +} + +void WrappedOpenGL::glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding) +{ + m_Real.glShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding); + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetResourceManager()->GetResourceRecord(ProgramRes(GetCtx(), program)); + RDCASSERT(record); + { + SCOPED_SERIALISE_CONTEXT(STORAGE_BLOCKBIND); + Serialise_glShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding); + + record->AddChunk(scope.Get()); + } + } +} + bool WrappedOpenGL::Serialise_glBindAttribLocation(GLuint program, GLuint index, const GLchar *name_) { SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(ProgramRes(GetCtx(), program)));