Implement glDetachShader (might not behave correctly, need to test)

This commit is contained in:
Baldur Karlsson
2014-06-18 11:10:28 +01:00
parent bc3a1d8e0a
commit 317c79e2f5
6 changed files with 55 additions and 1 deletions
+1
View File
@@ -99,6 +99,7 @@ enum GLChunkType
COMPILESHADER,
SHADERSOURCE,
ATTACHSHADER,
DETACHSHADER,
USEPROGRAM,
PROGRAMPARAMETER,
PROGRAMUNIFORM_VECTOR,
+44
View File
@@ -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
{
+4
View File
@@ -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;
+3 -1
View File
@@ -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));
+1
View File
@@ -134,6 +134,7 @@ struct GLHookSet
PFNGLCREATEPROGRAMPROC glCreateProgram;
PFNGLDELETEPROGRAMPROC glDeleteProgram;
PFNGLATTACHSHADERPROC glAttachShader;
PFNGLDETACHSHADERPROC glDetachShader;
PFNGLRELEASESHADERCOMPILERPROC glReleaseShaderCompiler;
PFNGLLINKPROGRAMPROC glLinkProgram;
PFNGLPROGRAMPARAMETERIPROC glProgramParameteri;
+2
View File
@@ -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); \