diff --git a/renderdoc/api/replay/gl_pipestate.h b/renderdoc/api/replay/gl_pipestate.h index 6f47a7adc..b18cba15f 100644 --- a/renderdoc/api/replay/gl_pipestate.h +++ b/renderdoc/api/replay/gl_pipestate.h @@ -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; diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index 9c87abb1f..0072a5b85 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -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 diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index e8be00a92..34d2059e2 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -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); + } } } } diff --git a/renderdocui/Interop/GLPipelineState.cs b/renderdocui/Interop/GLPipelineState.cs index 9120cf2f4..d3174fe1e 100644 --- a/renderdocui/Interop/GLPipelineState.cs +++ b/renderdocui/Interop/GLPipelineState.cs @@ -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; diff --git a/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs b/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs index d4b0b1e7a..e07c4f751 100644 --- a/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs +++ b/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs @@ -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. /*