diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index badd07bf8..7b5dd45ac 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -99,6 +99,7 @@ enum GLChunkType COMPILESHADER, SHADERSOURCE, ATTACHSHADER, + DETACHSHADER, USEPROGRAM, PROGRAMPARAMETER, PROGRAMUNIFORM_VECTOR, diff --git a/renderdoc/driver/gl/gl_device_driver.cpp b/renderdoc/driver/gl/gl_device_driver.cpp index 501692ec6..12a03c8b9 100644 --- a/renderdoc/driver/gl/gl_device_driver.cpp +++ b/renderdoc/driver/gl/gl_device_driver.cpp @@ -1347,6 +1347,43 @@ void WrappedOpenGL::glAttachShader(GLuint program, GLuint shader) } } +bool WrappedOpenGL::Serialise_glDetachShader(GLuint program, GLuint shader) +{ + SERIALISE_ELEMENT(ResourceId, progid, GetResourceManager()->GetID(ProgramRes(program))); + SERIALISE_ELEMENT(ResourceId, shadid, GetResourceManager()->GetID(ShaderRes(shader))); + + if(m_State == READING) + { + ResourceId liveProgId = GetResourceManager()->GetLiveID(progid); + ResourceId liveShadId = GetResourceManager()->GetLiveID(shadid); + + if(!m_Programs[liveProgId].linked) + m_Programs[liveProgId].shaders.push_back(liveShadId); + + m_Real.glDetachShader(GetResourceManager()->GetLiveResource(progid).name, + GetResourceManager()->GetLiveResource(shadid).name); + } + + return true; +} + +void WrappedOpenGL::glDetachShader(GLuint program, GLuint shader) +{ + m_Real.glDetachShader(program, shader); + + if(m_State >= WRITING) + { + GLResourceRecord *progRecord = GetResourceManager()->GetResourceRecord(ProgramRes(program)); + RDCASSERT(progRecord); + { + SCOPED_SERIALISE_CONTEXT(DETACHSHADER); + Serialise_glDetachShader(program, shader); + + progRecord->AddChunk(scope.Get()); + } + } +} + #pragma endregion #pragma region Programs @@ -1472,6 +1509,10 @@ bool WrappedOpenGL::Serialise_glLinkProgram(GLuint program) if(m_State == READING) { + ResourceId progid = GetResourceManager()->GetLiveID(id); + + m_Programs[progid].linked = true; + m_Real.glLinkProgram(GetResourceManager()->GetLiveResource(id).name); } @@ -1602,6 +1643,9 @@ void WrappedOpenGL::glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuin GLResourceRecord *record = GetResourceManager()->GetResourceRecord(ProgramPipeRes(pipeline)); RDCASSERT(record); record->AddChunk(scope.Get()); + + GLResourceRecord *progrecord = GetResourceManager()->GetResourceRecord(ProgramRes(program)); + record->AddParent(progrecord); } else { diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 826d36732..32c5fa942 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -56,6 +56,7 @@ const char *GLChunkNames[] = "glCompileShader", "glShaderSource", "glAttachShader", + "glDetachShader", "glUseProgram", "glProgramParameter", "glProgramUniformVector*", @@ -1061,6 +1062,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case ATTACHSHADER: Serialise_glAttachShader(0, 0); break; + case DETACHSHADER: + Serialise_glDetachShader(0, 0); + break; case USEPROGRAM: Serialise_glUseProgram(0); break; diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 66644c1bf..c32cd6374 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -182,10 +182,11 @@ class WrappedOpenGL struct ProgramData { - ProgramData() : colOutProg(0) {} + ProgramData() : colOutProg(0), linked(false) {} vector shaders; GLuint colOutProg; + bool linked; }; map m_Shaders; @@ -386,6 +387,7 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glGetShaderiv(GLuint shader, GLenum pname, GLint *params)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)); IMPLEMENT_FUNCTION_SERIALISED(void, glAttachShader(GLuint program, GLuint shader)); + IMPLEMENT_FUNCTION_SERIALISED(void, glDetachShader(GLuint program, GLuint shader)); IMPLEMENT_FUNCTION_SERIALISED(void, glReleaseShaderCompiler()); IMPLEMENT_FUNCTION_SERIALISED(void, glDeleteProgram(GLuint program)); IMPLEMENT_FUNCTION_SERIALISED(void, glLinkProgram(GLuint program)); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index 995348b12..528324394 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -134,6 +134,7 @@ struct GLHookSet PFNGLCREATEPROGRAMPROC glCreateProgram; PFNGLDELETEPROGRAMPROC glDeleteProgram; PFNGLATTACHSHADERPROC glAttachShader; + PFNGLDETACHSHADERPROC glDetachShader; PFNGLRELEASESHADERCOMPILERPROC glReleaseShaderCompiler; PFNGLLINKPROGRAMPROC glLinkProgram; PFNGLPROGRAMPARAMETERIPROC glProgramParameteri; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index 2e539421e..ceaaa7b0f 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -145,6 +145,7 @@ HookExtension(PFNGLCREATEPROGRAMPROC, glCreateProgram); \ HookExtension(PFNGLDELETEPROGRAMPROC, glDeleteProgram); \ HookExtension(PFNGLATTACHSHADERPROC, glAttachShader); \ + HookExtension(PFNGLDETACHSHADERPROC, glDetachShader); \ HookExtension(PFNGLRELEASESHADERCOMPILERPROC, glReleaseShaderCompiler); \ HookExtension(PFNGLLINKPROGRAMPROC, glLinkProgram); \ HookExtension(PFNGLPROGRAMPARAMETERIPROC, glProgramParameteri); \ @@ -427,6 +428,7 @@ HookWrapper0(GLuint, glCreateProgram); \ HookWrapper1(void, glDeleteProgram, GLuint, program); \ HookWrapper2(void, glAttachShader, GLuint, program, GLuint, shader); \ + HookWrapper2(void, glDetachShader, GLuint, program, GLuint, shader); \ HookWrapper0(void, glReleaseShaderCompiler); \ HookWrapper1(void, glLinkProgram, GLuint, program); \ HookWrapper3(void, glProgramParameteri, GLuint, program, GLenum, pname, GLint, value); \