Add utility functions globally for mapping shader enums <-> idx

This commit is contained in:
baldurk
2014-08-18 11:18:39 +01:00
parent 561b7a0e58
commit 61eba9a460
6 changed files with 137 additions and 75 deletions
+101
View File
@@ -43,6 +43,107 @@ namespace TrackedResource
}
};
size_t BufferIdx(GLenum buf)
{
switch(buf)
{
case eGL_ARRAY_BUFFER: return 0;
case eGL_ATOMIC_COUNTER_BUFFER: return 1;
case eGL_COPY_READ_BUFFER: return 2;
case eGL_COPY_WRITE_BUFFER: return 3;
case eGL_DRAW_INDIRECT_BUFFER: return 4;
case eGL_DISPATCH_INDIRECT_BUFFER: return 5;
case eGL_ELEMENT_ARRAY_BUFFER: return 6;
case eGL_PIXEL_PACK_BUFFER: return 7;
case eGL_PIXEL_UNPACK_BUFFER: return 8;
case eGL_QUERY_BUFFER: return 9;
case eGL_SHADER_STORAGE_BUFFER: return 10;
case eGL_TEXTURE_BUFFER: return 11;
case eGL_TRANSFORM_FEEDBACK_BUFFER: return 12;
case eGL_UNIFORM_BUFFER: return 13;
default:
RDCERR("Unexpected enum as buffer target: %hs", ToStr::Get(buf).c_str());
}
return 0;
}
GLenum BufferEnum(size_t idx)
{
GLenum enums[] = {
eGL_ARRAY_BUFFER,
eGL_ATOMIC_COUNTER_BUFFER,
eGL_COPY_READ_BUFFER,
eGL_COPY_WRITE_BUFFER,
eGL_DRAW_INDIRECT_BUFFER,
eGL_DISPATCH_INDIRECT_BUFFER,
eGL_ELEMENT_ARRAY_BUFFER,
eGL_PIXEL_PACK_BUFFER,
eGL_PIXEL_UNPACK_BUFFER,
eGL_QUERY_BUFFER,
eGL_SHADER_STORAGE_BUFFER,
eGL_TEXTURE_BUFFER,
eGL_TRANSFORM_FEEDBACK_BUFFER,
eGL_UNIFORM_BUFFER,
};
if(idx < ARRAY_COUNT(enums))
return enums[idx];
return eGL_NONE;
}
size_t ShaderIdx(GLenum buf)
{
switch(buf)
{
case eGL_VERTEX_SHADER: return 0;
case eGL_TESS_CONTROL_SHADER: return 1;
case eGL_TESS_EVALUATION_SHADER: return 2;
case eGL_GEOMETRY_SHADER: return 3;
case eGL_FRAGMENT_SHADER: return 4;
case eGL_COMPUTE_SHADER: return 5;
default:
RDCERR("Unexpected enum as shader enum: %hs", ToStr::Get(buf).c_str());
}
return 0;
}
GLenum ShaderBit(size_t idx)
{
GLenum enums[] = {
eGL_VERTEX_SHADER_BIT,
eGL_TESS_CONTROL_SHADER_BIT,
eGL_TESS_EVALUATION_SHADER_BIT,
eGL_GEOMETRY_SHADER_BIT,
eGL_FRAGMENT_SHADER_BIT,
eGL_COMPUTE_SHADER_BIT,
};
if(idx < ARRAY_COUNT(enums))
return enums[idx];
return eGL_NONE;
}
GLenum ShaderEnum(size_t idx)
{
GLenum enums[] = {
eGL_VERTEX_SHADER,
eGL_TESS_CONTROL_SHADER,
eGL_TESS_EVALUATION_SHADER,
eGL_GEOMETRY_SHADER,
eGL_FRAGMENT_SHADER,
eGL_COMPUTE_SHADER,
};
if(idx < ARRAY_COUNT(enums))
return enums[idx];
return eGL_NONE;
}
ResourceFormat MakeResourceFormat(WrappedOpenGL &gl, GLenum target, GLenum fmt)
{
ResourceFormat ret;
+7
View File
@@ -71,6 +71,13 @@ struct GLWindowingData
class WrappedOpenGL;
size_t BufferIdx(GLenum buf);
GLenum BufferEnum(size_t idx);
size_t ShaderIdx(GLenum buf);
GLenum ShaderBit(size_t idx);
GLenum ShaderEnum(size_t idx);
ResourceFormat MakeResourceFormat(WrappedOpenGL &gl, GLenum target, GLenum fmt);
GLenum MakeGLFormat(WrappedOpenGL &gl, GLenum target, ResourceFormat fmt);
-2
View File
@@ -114,8 +114,6 @@ class WrappedOpenGL
GLResourceRecord *m_ReadFramebufferRecord;
GLint m_TextureUnit;
size_t BufferIdx(GLenum buf);
// internals
Serialiser *m_pSerialiser;
LogState m_State;
+24 -17
View File
@@ -910,20 +910,7 @@ void GLReplay::SavePipelineState()
};
ShaderReflection *refls[6] = { NULL };
ShaderBindpointMapping *mappings[6] = { NULL };
struct
{
GLenum bit;
GLenum type;
} shaders[] = {
{ eGL_VERTEX_SHADER_BIT, eGL_VERTEX_SHADER },
{ eGL_TESS_CONTROL_SHADER_BIT, eGL_TESS_CONTROL_SHADER },
{ eGL_TESS_EVALUATION_SHADER_BIT, eGL_TESS_EVALUATION_SHADER },
{ eGL_GEOMETRY_SHADER_BIT, eGL_GEOMETRY_SHADER },
{ eGL_FRAGMENT_SHADER_BIT, eGL_FRAGMENT_SHADER },
{ eGL_COMPUTE_SHADER_BIT, eGL_COMPUTE_SHADER },
};
if(curProg == 0)
{
gl.glGetIntegerv(eGL_PROGRAM_PIPELINE_BINDING, (GLint*)&curProg);
@@ -1307,9 +1294,6 @@ void GLReplay::FillCBufferVariables(ResourceId shader, uint32_t cbufSlot, vector
MakeCurrentReplayContext(&m_ReplayCtx);
GLuint curProg = 0;
gl.glGetIntegerv(eGL_CURRENT_PROGRAM, (GLint*)&curProg);
auto &shaderDetails = m_pDriver->m_Shaders[shader];
if((int32_t)cbufSlot >= shaderDetails.reflection.ConstantBlocks.count)
@@ -1317,6 +1301,29 @@ void GLReplay::FillCBufferVariables(ResourceId shader, uint32_t cbufSlot, vector
RDCERR("Requesting invalid constant block");
return;
}
GLuint curProg = 0;
gl.glGetIntegerv(eGL_CURRENT_PROGRAM, (GLint*)&curProg);
if(curProg == 0)
{
gl.glGetIntegerv(eGL_PROGRAM_PIPELINE_BINDING, (GLint*)&curProg);
if(curProg == 0)
{
RDCERR("No program or pipeline bound");
return;
}
else
{
ResourceId id = m_pDriver->GetResourceManager()->GetID(ProgramPipeRes(m_ReplayCtx.ctx, curProg));
auto &pipeDetails = m_pDriver->m_Pipelines[id];
size_t s = ShaderIdx(shaderDetails.type);
curProg = m_pDriver->GetResourceManager()->GetCurrentResource(pipeDetails.stagePrograms[s]).name;
}
}
auto cblock = shaderDetails.reflection.ConstantBlocks.elems[cbufSlot];
@@ -81,31 +81,6 @@ void WrappedOpenGL::glGenBuffers(GLsizei n, GLuint *buffers)
}
}
size_t WrappedOpenGL::BufferIdx(GLenum buf)
{
switch(buf)
{
case eGL_ARRAY_BUFFER: return 0;
case eGL_ATOMIC_COUNTER_BUFFER: return 1;
case eGL_COPY_READ_BUFFER: return 2;
case eGL_COPY_WRITE_BUFFER: return 3;
case eGL_DRAW_INDIRECT_BUFFER: return 4;
case eGL_DISPATCH_INDIRECT_BUFFER: return 5;
case eGL_ELEMENT_ARRAY_BUFFER: return 6;
case eGL_PIXEL_PACK_BUFFER: return 7;
case eGL_PIXEL_UNPACK_BUFFER: return 8;
case eGL_QUERY_BUFFER: return 9;
case eGL_SHADER_STORAGE_BUFFER: return 10;
case eGL_TEXTURE_BUFFER: return 11;
case eGL_TRANSFORM_FEEDBACK_BUFFER: return 12;
case eGL_UNIFORM_BUFFER: return 13;
default:
RDCERR("Unexpected enum as buffer target: %hs", ToStr::Get(buf).c_str());
}
return 0;
}
bool WrappedOpenGL::Serialise_glBindBuffer(GLenum target, GLuint buffer)
{
SERIALISE_ELEMENT(GLenum, Target, target);
@@ -441,24 +441,11 @@ bool WrappedOpenGL::Serialise_glLinkProgram(GLuint program)
progDetails.linked = true;
struct
{
GLenum bit;
GLenum type;
} shaders[] = {
{ eGL_VERTEX_SHADER_BIT, eGL_VERTEX_SHADER },
{ eGL_TESS_CONTROL_SHADER_BIT, eGL_TESS_CONTROL_SHADER },
{ eGL_TESS_EVALUATION_SHADER_BIT, eGL_TESS_EVALUATION_SHADER },
{ eGL_GEOMETRY_SHADER_BIT, eGL_GEOMETRY_SHADER },
{ eGL_FRAGMENT_SHADER_BIT, eGL_FRAGMENT_SHADER },
{ eGL_COMPUTE_SHADER_BIT, eGL_COMPUTE_SHADER },
};
for(size_t s=0; s < ARRAY_COUNT(shaders); s++)
for(size_t s=0; s < 6; s++)
{
for(size_t sh=0; sh < progDetails.shaders.size(); sh++)
{
if(m_Shaders[ progDetails.shaders[sh] ].type == shaders[s].type)
if(m_Shaders[ progDetails.shaders[sh] ].type == ShaderEnum(s))
progDetails.stageShaders[s] = progDetails.shaders[sh];
}
}
@@ -643,26 +630,13 @@ bool WrappedOpenGL::Serialise_glUseProgramStages(GLuint pipeline, GLbitfield sta
pipeDetails.programs.push_back(PipelineData::ProgramUse(liveProgId, Stages));
struct
for(size_t s=0; s < 6; s++)
{
GLenum bit;
GLenum type;
} shaders[] = {
{ eGL_VERTEX_SHADER_BIT, eGL_VERTEX_SHADER },
{ eGL_TESS_CONTROL_SHADER_BIT, eGL_TESS_CONTROL_SHADER },
{ eGL_TESS_EVALUATION_SHADER_BIT, eGL_TESS_EVALUATION_SHADER },
{ eGL_GEOMETRY_SHADER_BIT, eGL_GEOMETRY_SHADER },
{ eGL_FRAGMENT_SHADER_BIT, eGL_FRAGMENT_SHADER },
{ eGL_COMPUTE_SHADER_BIT, eGL_COMPUTE_SHADER },
};
for(size_t s=0; s < ARRAY_COUNT(shaders); s++)
{
if(Stages & shaders[s].bit)
if(Stages & ShaderBit(s))
{
for(size_t sh=0; sh < progDetails.shaders.size(); sh++)
{
if(m_Shaders[ progDetails.shaders[sh] ].type == shaders[s].type)
if(m_Shaders[ progDetails.shaders[sh] ].type == ShaderEnum(s))
{
pipeDetails.stagePrograms[s] = liveProgId;
pipeDetails.stageShaders[s] = progDetails.shaders[sh];