From f4e3087177d09b10b2f3c737fbe3e2a2aaee8f00 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 21 Mar 2024 18:01:58 +0000 Subject: [PATCH] Update common pipeline state viewer code to not use bindpoint mapping --- .../D3D11PipelineStateViewer.cpp | 3 +- .../D3D12PipelineStateViewer.cpp | 3 +- .../PipelineState/GLPipelineStateViewer.cpp | 3 +- .../PipelineState/PipelineStateViewer.cpp | 106 ++++++------------ .../PipelineState/PipelineStateViewer.h | 4 +- .../VulkanPipelineStateViewer.cpp | 3 +- 6 files changed, 42 insertions(+), 80 deletions(-) diff --git a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp index a46d41cb8..fef253cdb 100644 --- a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp @@ -1633,8 +1633,7 @@ void D3D11PipelineStateViewer::setState() b->setEnabled(stage->reflection != NULL); - m_Common.SetupShaderEditButton(b, ResourceId(), stage->resourceId, stage->bindpointMapping, - stage->reflection); + m_Common.SetupShaderEditButton(b, ResourceId(), stage->resourceId, stage->reflection); } ui->iaBytecodeViewButton->setEnabled(true); diff --git a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp index 530f08c4b..7b16bd0ed 100644 --- a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp @@ -2042,8 +2042,7 @@ void D3D12PipelineStateViewer::setState() b->setEnabled(stage->reflection && state.pipelineResourceId != ResourceId()); - m_Common.SetupShaderEditButton(b, state.pipelineResourceId, stage->resourceId, - stage->bindpointMapping, stage->reflection); + m_Common.SetupShaderEditButton(b, state.pipelineResourceId, stage->resourceId, stage->reflection); } bool streamoutSet = false; diff --git a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp index b65882f60..9cc9a0d72 100644 --- a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp @@ -1650,8 +1650,7 @@ void GLPipelineStateViewer::setState() b->setEnabled(stage->reflection != NULL); - m_Common.SetupShaderEditButton(b, ResourceId(), stage->shaderResourceId, - stage->bindpointMapping, stage->reflection); + m_Common.SetupShaderEditButton(b, ResourceId(), stage->shaderResourceId, stage->reflection); } vs = ui->xfbBuffers->verticalScrollBar()->value(); diff --git a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp index 895779c8a..b5cab6fea 100644 --- a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp @@ -818,8 +818,7 @@ void PipelineStateViewer::SetStencilTreeItemValue(RDTreeWidgetItem *item, int co .arg(value, 8, 2, QLatin1Char('0'))); } -QString PipelineStateViewer::GenerateHLSLStub(const ShaderBindpointMapping &bindpointMapping, - const ShaderReflection *shaderDetails, +QString PipelineStateViewer::GenerateHLSLStub(const ShaderReflection *shaderDetails, const QString &entryFunc) { QString hlsl = lit("// HLSL function stub generated\n\n"); @@ -830,40 +829,22 @@ QString PipelineStateViewer::GenerateHLSLStub(const ShaderBindpointMapping &bind lit("Texture2DMSArray"), lit("Texture3D"), lit("TextureCube"), lit("TextureCubeArray"), }; - // use bindpoint mapping - for(const ShaderSampler &samp : shaderDetails->samplers) { - uint32_t reg = ~0U; - - if(samp.bindPoint < bindpointMapping.samplers.count()) - reg = bindpointMapping.samplers[samp.bindPoint].bind; - else - hlsl += lit("//"); - hlsl += lit("SamplerState %1 : register(s%2); // can't disambiguate\n" "//SamplerComparisonState %1 : register(s%2); // can't disambiguate\n") .arg(samp.name) - .arg(reg); + .arg(samp.fixedBindNumber); } for(int i = 0; i < 2; i++) { - const rdcarray &binds = - (i == 0 ? bindpointMapping.readOnlyResources : bindpointMapping.readWriteResources); const rdcarray &resources = (i == 0 ? shaderDetails->readOnlyResources : shaderDetails->readWriteResources); for(const ShaderResource &res : resources) { char regChar = 't'; - uint32_t reg = ~0U; - - if(res.bindPoint < binds.count()) - reg = binds[res.bindPoint].bind; - else - hlsl += lit("//"); - if(i == 1) { hlsl += lit("RW"); @@ -877,7 +858,7 @@ QString PipelineStateViewer::GenerateHLSLStub(const ShaderBindpointMapping &bind .arg(res.variableType.name) .arg(res.name) .arg(QLatin1Char(regChar)) - .arg(reg); + .arg(res.fixedBindNumber); } else { @@ -888,7 +869,7 @@ QString PipelineStateViewer::GenerateHLSLStub(const ShaderBindpointMapping &bind .arg(res.variableType.name) .arg(res.name) .arg(QLatin1Char(regChar)) - .arg(reg); + .arg(res.fixedBindNumber); } } } @@ -902,22 +883,12 @@ QString PipelineStateViewer::GenerateHLSLStub(const ShaderBindpointMapping &bind { if(!cbuf.name.isEmpty() && !cbuf.variables.isEmpty()) { - uint32_t reg = ~0U; - - if(cbuf.bindPoint < bindpointMapping.constantBlocks.count()) - reg = bindpointMapping.constantBlocks[cbuf.bindPoint].bind; - else - hlsl += lit("/*\n"); - QString cbufName = cbuf.name; if(cbufName == lit("$Globals")) cbufName = lit("_Globals"); - cbuffers += lit("cbuffer %1 : register(b%2) {\n").arg(cbufName).arg(reg); + cbuffers += lit("cbuffer %1 : register(b%2) {\n").arg(cbufName).arg(cbuf.fixedBindNumber); MakeShaderVariablesHLSL(true, cbuf.variables, cbuffers, hlsl); cbuffers += lit("};\n\n"); - - if(reg == ~0U) - hlsl += lit("*/\n"); } cbufIdx++; } @@ -1059,7 +1030,6 @@ IShaderViewer *PipelineStateViewer::EditDecompiledSource(const ShaderProcessingT void PipelineStateViewer::SetupShaderEditButton(QToolButton *button, ResourceId pipelineId, ResourceId shaderId, - const ShaderBindpointMapping &bindpointMapping, const ShaderReflection *shaderDetails) { if(!shaderDetails || !button->isEnabled() || button->popupMode() != QToolButton::MenuButtonPopup) @@ -1122,47 +1092,45 @@ void PipelineStateViewer::SetupShaderEditButton(QToolButton *button, ResourceId QAction *action = new QAction(label, menu); action->setIcon(Icons::page_white_edit()); - QObject::connect( - action, &QAction::triggered, [this, pipelineId, shaderId, bindpointMapping, shaderDetails]() { - QString entry; - QString src; + QObject::connect(action, &QAction::triggered, [this, pipelineId, shaderId, shaderDetails]() { + QString entry; + QString src; - if(shaderDetails->encoding == ShaderEncoding::SPIRV || - shaderDetails->encoding == ShaderEncoding::OpenGLSPIRV) - { - m_Ctx.Replay().AsyncInvoke( - [this, pipelineId, shaderId, shaderDetails](IReplayController *r) { - rdcstr disasm = r->DisassembleShader(pipelineId, shaderDetails, ""); + if(shaderDetails->encoding == ShaderEncoding::SPIRV || + shaderDetails->encoding == ShaderEncoding::OpenGLSPIRV) + { + m_Ctx.Replay().AsyncInvoke([this, pipelineId, shaderId, shaderDetails](IReplayController *r) { + rdcstr disasm = r->DisassembleShader(pipelineId, shaderDetails, ""); - QString editeddisasm = - tr("#### PSEUDOCODE SPIR-V DISASSEMBLY ###\n") + - tr("#### Use a SPIR-V decompiler to get compileable source ###\n\n"); + QString editeddisasm = + tr("#### PSEUDOCODE SPIR-V DISASSEMBLY ###\n") + + tr("#### Use a SPIR-V decompiler to get compileable source ###\n\n"); - editeddisasm += disasm; - - GUIInvoke::call(this, [this, shaderId, shaderDetails, editeddisasm]() { - rdcstrpairs files; - files.push_back(rdcpair("pseudocode", editeddisasm)); - - EditShader(shaderId, shaderDetails->stage, shaderDetails->entryPoint, - shaderDetails->debugInfo.compileFlags, KnownShaderTool::Unknown, - ShaderEncoding::Unknown, files); - }); - }); - } - else if(shaderDetails->encoding == ShaderEncoding::DXBC || - shaderDetails->encoding == ShaderEncoding::DXIL) - { - entry = lit("EditedShader%1S").arg(ToQStr(shaderDetails->stage, GraphicsAPI::D3D11)[0]); + editeddisasm += disasm; + GUIInvoke::call(this, [this, shaderId, shaderDetails, editeddisasm]() { rdcstrpairs files; - files.push_back(rdcpair( - "decompiled_stub.hlsl", GenerateHLSLStub(bindpointMapping, shaderDetails, entry))); + files.push_back(rdcpair("pseudocode", editeddisasm)); - EditShader(shaderId, shaderDetails->stage, entry, shaderDetails->debugInfo.compileFlags, - KnownShaderTool::Unknown, ShaderEncoding::HLSL, files); - } + EditShader(shaderId, shaderDetails->stage, shaderDetails->entryPoint, + shaderDetails->debugInfo.compileFlags, KnownShaderTool::Unknown, + ShaderEncoding::Unknown, files); + }); }); + } + else if(shaderDetails->encoding == ShaderEncoding::DXBC || + shaderDetails->encoding == ShaderEncoding::DXIL) + { + entry = lit("EditedShader%1S").arg(ToQStr(shaderDetails->stage, GraphicsAPI::D3D11)[0]); + + rdcstrpairs files; + files.push_back(rdcpair("decompiled_stub.hlsl", + GenerateHLSLStub(shaderDetails, entry))); + + EditShader(shaderId, shaderDetails->stage, entry, shaderDetails->debugInfo.compileFlags, + KnownShaderTool::Unknown, ShaderEncoding::HLSL, files); + } + }); menu->addAction(action); } diff --git a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.h b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.h index 276437058..9cdd78516 100644 --- a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.h +++ b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.h @@ -102,7 +102,6 @@ public: void SetStencilTreeItemValue(RDTreeWidgetItem *item, int column, uint8_t value); void SetupShaderEditButton(QToolButton *button, ResourceId pipelineId, ResourceId shaderId, - const ShaderBindpointMapping &bindpointMapping, const ShaderReflection *shaderDetails); void SetupResourceView(RDTreeWidget *view); @@ -145,8 +144,7 @@ private: void ShowResourceContextMenu(RDTreeWidget *widget, const QPoint &pos, ResourceId id, const rdcarray &usage); - QString GenerateHLSLStub(const ShaderBindpointMapping &bindpointMapping, - const ShaderReflection *shaderDetails, const QString &entryFunc); + QString GenerateHLSLStub(const ShaderReflection *shaderDetails, const QString &entryFunc); IShaderViewer *EditShader(ResourceId id, ShaderStage shaderType, const rdcstr &entry, ShaderCompileFlags compileFlags, KnownShaderTool knownTool, ShaderEncoding shaderEncoding, const rdcstrpairs &files); diff --git a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp index 53b42add2..05779c840 100644 --- a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp @@ -2643,8 +2643,7 @@ void VulkanPipelineStateViewer::setState() b->setEnabled(stage->reflection && pipe != ResourceId()); - m_Common.SetupShaderEditButton(b, pipe, stage->resourceId, stage->bindpointMapping, - stage->reflection); + m_Common.SetupShaderEditButton(b, pipe, stage->resourceId, stage->reflection); } QToolButton *messageButtons[] = {