mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-22 06:26:30 +00:00
Implement glDetachShader (might not behave correctly, need to test)
This commit is contained in:
@@ -99,6 +99,7 @@ enum GLChunkType
|
||||
COMPILESHADER,
|
||||
SHADERSOURCE,
|
||||
ATTACHSHADER,
|
||||
DETACHSHADER,
|
||||
USEPROGRAM,
|
||||
PROGRAMPARAMETER,
|
||||
PROGRAMUNIFORM_VECTOR,
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -182,10 +182,11 @@ class WrappedOpenGL
|
||||
|
||||
struct ProgramData
|
||||
{
|
||||
ProgramData() : colOutProg(0) {}
|
||||
ProgramData() : colOutProg(0), linked(false) {}
|
||||
vector<ResourceId> shaders;
|
||||
|
||||
GLuint colOutProg;
|
||||
bool linked;
|
||||
};
|
||||
|
||||
map<ResourceId, ShaderData> 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));
|
||||
|
||||
@@ -134,6 +134,7 @@ struct GLHookSet
|
||||
PFNGLCREATEPROGRAMPROC glCreateProgram;
|
||||
PFNGLDELETEPROGRAMPROC glDeleteProgram;
|
||||
PFNGLATTACHSHADERPROC glAttachShader;
|
||||
PFNGLDETACHSHADERPROC glDetachShader;
|
||||
PFNGLRELEASESHADERCOMPILERPROC glReleaseShaderCompiler;
|
||||
PFNGLLINKPROGRAMPROC glLinkProgram;
|
||||
PFNGLPROGRAMPARAMETERIPROC glProgramParameteri;
|
||||
|
||||
@@ -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); \
|
||||
|
||||
Reference in New Issue
Block a user