Display custom glObjectLabel for shaders, programs and pipeline

This commit is contained in:
baldurk
2016-04-27 23:18:56 +02:00
parent 05f1b2344c
commit 3d69ece39a
5 changed files with 107 additions and 4 deletions
+15 -1
View File
@@ -72,8 +72,22 @@ struct GLPipelineState
struct ShaderStage
{
ShaderStage() : Shader(), ShaderDetails(NULL) {}
ShaderStage()
: Shader()
, customShaderName(false), customProgramName(false)
, customPipelineName(false), ShaderDetails(NULL) {}
ResourceId Shader;
rdctype::str ShaderName;
bool32 customShaderName;
rdctype::str ProgramName;
bool32 customProgramName;
bool32 PipelineActive;
rdctype::str PipelineName;
bool32 customPipelineName;
ShaderReflection *ShaderDetails;
ShaderBindpointMapping BindpointMapping;
+13 -2
View File
@@ -506,6 +506,17 @@ template<>
void Serialiser::Serialise(const char *name, GLPipelineState::ShaderStage &el)
{
Serialise("", el.Shader);
Serialise("", el.ShaderName);
Serialise("", el.customShaderName);
Serialise("", el.ProgramName);
Serialise("", el.customProgramName);
Serialise("", el.PipelineActive);
Serialise("", el.PipelineName);
Serialise("", el.customPipelineName);
Serialise("", el.stage);
Serialise("", el.BindpointMapping);
Serialise("", el.Subroutines);
@@ -513,7 +524,7 @@ void Serialiser::Serialise(const char *name, GLPipelineState::ShaderStage &el)
if(m_Mode == READING)
el.ShaderDetails = NULL;
SIZE_CHECK(GLPipelineState::ShaderStage, 104);
SIZE_CHECK(GLPipelineState::ShaderStage, 176);
}
template<>
@@ -693,7 +704,7 @@ void Serialiser::Serialise(const char *name, GLPipelineState &el)
Serialise("", el.m_Hints);
SIZE_CHECK(GLPipelineState, 1520);
SIZE_CHECK(GLPipelineState, 1952);
}
#pragma endregion OpenGL pipeline state
+42
View File
@@ -1070,9 +1070,20 @@ void GLReplay::SavePipelineState()
{
ResourceId id = rm->GetID(ProgramPipeRes(ctx, curProg));
auto &pipeDetails = m_pDriver->m_Pipelines[id];
string pipelineName;
{
char name[128] = {0};
gl.glGetObjectLabel(eGL_PROGRAM_PIPELINE, curProg, 127, NULL, name);
pipelineName = name;
}
for(size_t i=0; i < ARRAY_COUNT(pipeDetails.stageShaders); i++)
{
stages[i]->PipelineActive = true;
stages[i]->PipelineName = pipelineName;
stages[i]->customPipelineName = (pipelineName != "");
if(pipeDetails.stageShaders[i] != ResourceId())
{
curProg = rm->GetCurrentResource(pipeDetails.stagePrograms[i]).name;
@@ -1080,6 +1091,20 @@ void GLReplay::SavePipelineState()
refls[i] = GetShader(pipeDetails.stageShaders[i], "");
GetBindpointMapping(gl.GetHookset(), curProg, (int)i, refls[i], stages[i]->BindpointMapping);
mappings[i] = &stages[i]->BindpointMapping;
{
char name[128] = {0};
gl.glGetObjectLabel(eGL_PROGRAM, curProg, 127, NULL, name);
stages[i]->ProgramName = name;
stages[i]->customProgramName = (name[0] != 0);
}
{
char name[128] = {0};
gl.glGetObjectLabel(eGL_SHADER, rm->GetCurrentResource(pipeDetails.stageShaders[i]).name, 127, NULL, name);
stages[i]->ShaderName = name;
stages[i]->customShaderName = (name[0] != 0);
}
}
else
{
@@ -1092,14 +1117,31 @@ void GLReplay::SavePipelineState()
{
auto &progDetails = m_pDriver->m_Programs[rm->GetID(ProgramRes(ctx, curProg))];
string programName;
{
char name[128] = {0};
gl.glGetObjectLabel(eGL_PROGRAM, curProg, 127, NULL, name);
programName = name;
}
for(size_t i=0; i < ARRAY_COUNT(progDetails.stageShaders); i++)
{
if(progDetails.stageShaders[i] != ResourceId())
{
stages[i]->ProgramName = programName;
stages[i]->customProgramName = (programName != "");
stages[i]->Shader = rm->GetOriginalID(progDetails.stageShaders[i]);
refls[i] = GetShader(progDetails.stageShaders[i], "");
GetBindpointMapping(gl.GetHookset(), curProg, (int)i, refls[i], stages[i]->BindpointMapping);
mappings[i] = &stages[i]->BindpointMapping;
{
char name[128] = {0};
gl.glGetObjectLabel(eGL_SHADER, rm->GetCurrentResource(progDetails.stageShaders[i]).name, 127, NULL, name);
stages[i]->ShaderName = name;
stages[i]->customShaderName = (name[0] != 0);
}
}
}
}
+14
View File
@@ -97,6 +97,20 @@ namespace renderdoc
}
public ResourceId Shader;
[CustomMarshalAs(CustomUnmanagedType.UTF8TemplatedString)]
public string ShaderName;
public bool customShaderName;
[CustomMarshalAs(CustomUnmanagedType.UTF8TemplatedString)]
public string ProgramName;
public bool customProgramName;
public bool PipelineActive;
[CustomMarshalAs(CustomUnmanagedType.UTF8TemplatedString)]
public string PipelineName;
public bool customPipelineName;
private IntPtr _ptr_ShaderDetails;
[CustomMarshalAs(CustomUnmanagedType.Skip)]
public ShaderReflection ShaderDetails;
@@ -282,9 +282,31 @@ namespace renderdocui.Windows.PipelineState
var mapping = stage.BindpointMapping;
if (stage.Shader == ResourceId.Null)
{
shader.Text = "Unbound";
}
else
shader.Text = stage.stage.Str(APIPipelineStateType.OpenGL) + " Shader " + stage.Shader.ToString();
{
string shaderName = stage.stage.Str(APIPipelineStateType.OpenGL) + " Shader";
if (!stage.customShaderName && !stage.customProgramName && !stage.customPipelineName)
{
shader.Text = shaderName + stage.Shader.ToString();
}
else
{
if (stage.customShaderName)
shaderName = stage.ShaderName;
if (stage.customProgramName)
shaderName = stage.ProgramName + " - " + shaderName;
if (stage.customPipelineName && stage.PipelineActive)
shaderName = stage.PipelineName + " - " + shaderName;
shader.Text = shaderName;
}
}
// disabled since entry function is always main, and filenames have no names, so this is useless.
/*