From 748aeee584bb9345619ca42ab268d2dbea0621ce Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 16 Apr 2026 11:38:58 +0100 Subject: [PATCH] Fix inconsistencies in exports D3D12 html state. Closes #3823 --- .../D3D12PipelineStateViewer.cpp | 71 ++++++++++++++++--- renderdoc/api/replay/d3d12_pipestate.h | 11 --- renderdoc/replay/renderdoc_serialise.inl | 7 +- 3 files changed, 64 insertions(+), 25 deletions(-) diff --git a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp index 908ab743c..a84678ce5 100644 --- a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp @@ -3139,6 +3139,28 @@ void D3D12PipelineStateViewer::exportHTML(QXmlStreamWriter &xml, const D3D12Pipe QVariantList row = exportViewHTML(used.descriptor, false, shaderInput, QString()); + QString regname; + if(shaderInput) + { + if(!spacesUsed) + regname = QFormatStr("%1").arg(shaderInput->fixedBindNumber); + else + regname = QFormatStr("space%1, %2") + .arg(shaderInput->fixedBindSetOrSpace) + .arg(shaderInput->fixedBindNumber); + + if(!shaderInput->name.empty()) + regname += lit(": ") + shaderInput->name; + + if(shaderInput->bindArraySize > 1) + regname += QFormatStr("[%1]").arg(used.access.arrayElement); + } + else if(used.access.index == DescriptorAccess::NoShaderBinding) + { + regname = m_Locations[{used.access.descriptorStore, used.access.byteOffset}].logicalBindName; + } + row.push_front(regname); + rowsRO.push_back(row); } @@ -3154,6 +3176,28 @@ void D3D12PipelineStateViewer::exportHTML(QXmlStreamWriter &xml, const D3D12Pipe QVariantList row = exportViewHTML(used.descriptor, true, shaderInput, QString()); + QString regname; + if(shaderInput) + { + if(!spacesUsed) + regname = QFormatStr("%1").arg(shaderInput->fixedBindNumber); + else + regname = QFormatStr("space%1, %2") + .arg(shaderInput->fixedBindSetOrSpace) + .arg(shaderInput->fixedBindNumber); + + if(!shaderInput->name.empty()) + regname += lit(": ") + shaderInput->name; + + if(shaderInput->bindArraySize > 1) + regname += QFormatStr("[%1]").arg(used.access.arrayElement); + } + else if(used.access.index == DescriptorAccess::NoShaderBinding) + { + regname = m_Locations[{used.access.descriptorStore, used.access.byteOffset}].logicalBindName; + } + row.push_front(regname); + rowsRW.push_back(row); } @@ -3263,9 +3307,20 @@ void D3D12PipelineStateViewer::exportHTML(QXmlStreamWriter &xml, const D3D12Pipe xml.writeStartElement(lit("p")); xml.writeEndElement(); + m_Common.exportHTMLTable( + xml, {tr("Base Shading Rate"), tr("Shading Rate Combiners"), tr("Shading Rate Image")}, + {QFormatStr("%1x%2").arg(rs.state.baseShadingRate.first).arg(rs.state.baseShadingRate.second), + QFormatStr("%1, %2") + .arg(ToQStr(rs.state.shadingRateCombiners.first, GraphicsAPI::D3D12)) + .arg(ToQStr(rs.state.shadingRateCombiners.second, GraphicsAPI::D3D12)), + m_Ctx.GetResourceName(rs.state.shadingRateImage)}); + + xml.writeStartElement(lit("p")); + xml.writeEndElement(); + m_Common.exportHTMLTable( xml, - {tr("Line Rasteriztion"), tr("Forced Sample Count"), tr("Conservative Raster"), + {tr("Line Rasterization"), tr("Forced Sample Count"), tr("Conservative Raster"), tr("Sample Mask")}, {ToQStr(rs.state.lineRasterMode), rs.state.forcedSampleCount, rs.state.conservativeRasterization != ConservativeRaster::Disabled ? tr("Yes") : tr("No"), @@ -3334,12 +3389,10 @@ void D3D12PipelineStateViewer::exportHTML(QXmlStreamWriter &xml, const D3D12Pipe .arg(om.blendState.blendFactor[2], 0, 'f', 2) .arg(om.blendState.blendFactor[3], 0, 'f', 2); - m_Common.exportHTMLTable(xml, - {tr("Independent Blend Enable"), tr("Alpha to Coverage"), - tr("Blend Factor"), tr("Multisampling Rate")}, - {om.blendState.independentBlend ? tr("Yes") : tr("No"), - om.blendState.alphaToCoverage ? tr("Yes") : tr("No"), blendFactor, - tr("%1x %2 qual").arg(om.multiSampleCount).arg(om.multiSampleQuality)}); + m_Common.exportHTMLTable( + xml, {tr("Independent Blend Enable"), tr("Alpha to Coverage"), tr("Blend Factor")}, + {om.blendState.independentBlend ? tr("Yes") : tr("No"), + om.blendState.alphaToCoverage ? tr("Yes") : tr("No"), blendFactor}); xml.writeStartElement(lit("h3")); xml.writeCharacters(tr("Target Blends")); @@ -3476,7 +3529,7 @@ void D3D12PipelineStateViewer::exportHTML(QXmlStreamWriter &xml, const D3D12Pipe m_Common.exportHTMLTable(xml, { tr("Slot"), - tr("Name"), + tr("Resource"), tr("View Type"), tr("Resource Type"), tr("Width"), @@ -3508,7 +3561,7 @@ void D3D12PipelineStateViewer::exportHTML(QXmlStreamWriter &xml, const D3D12Pipe m_Common.exportHTMLTable(xml, { - tr("Name"), + tr("Resource"), tr("View Type"), tr("Resource Type"), tr("Width"), diff --git a/renderdoc/api/replay/d3d12_pipestate.h b/renderdoc/api/replay/d3d12_pipestate.h index 61976cfa1..550934ddd 100644 --- a/renderdoc/api/replay/d3d12_pipestate.h +++ b/renderdoc/api/replay/d3d12_pipestate.h @@ -627,17 +627,6 @@ struct OM :type: bool )"); bool stencilReadOnly = false; - - DOCUMENT(R"(The sample count used for rendering. - -:type: int -)"); - uint32_t multiSampleCount = 1; - DOCUMENT(R"(The MSAA quality level used for rendering. - -:type: int -)"); - uint32_t multiSampleQuality = 0; }; DOCUMENT("Describes the current state that a sub-resource is in."); diff --git a/renderdoc/replay/renderdoc_serialise.inl b/renderdoc/replay/renderdoc_serialise.inl index 65cae17e6..e62d328cd 100644 --- a/renderdoc/replay/renderdoc_serialise.inl +++ b/renderdoc/replay/renderdoc_serialise.inl @@ -1574,10 +1574,7 @@ void DoSerialise(SerialiserType &ser, D3D12Pipe::OM &el) SERIALISE_MEMBER(depthReadOnly); SERIALISE_MEMBER(stencilReadOnly); - SERIALISE_MEMBER(multiSampleCount); - SERIALISE_MEMBER(multiSampleQuality); - - SIZE_CHECK(240); + SIZE_CHECK(232); } template @@ -1682,7 +1679,7 @@ void DoSerialise(SerialiserType &ser, D3D12Pipe::State &el) SERIALISE_MEMBER(resourceStates); - SIZE_CHECK(800); + SIZE_CHECK(792); } #pragma endregion D3D12 pipeline state