mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-22 14:36:35 +00:00
Add utility functions globally for mapping shader enums <-> idx
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -114,8 +114,6 @@ class WrappedOpenGL
|
||||
GLResourceRecord *m_ReadFramebufferRecord;
|
||||
GLint m_TextureUnit;
|
||||
|
||||
size_t BufferIdx(GLenum buf);
|
||||
|
||||
// internals
|
||||
Serialiser *m_pSerialiser;
|
||||
LogState m_State;
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user