Clarify root signature index in D3D12 pipeline view

* Internally we split ranges, but for display we should use the original root
  signature index.
This commit is contained in:
baldurk
2021-10-04 18:39:33 +01:00
parent c24dd2e7aa
commit c070dfd847
4 changed files with 45 additions and 43 deletions
@@ -59,23 +59,23 @@ struct D3D12CBufTag
D3D12CBufTag()
{
idx = ~0U;
space = reg = rootElement = arrayIdx = 0;
space = reg = rootElementsIdx = arrayIdx = 0;
}
D3D12CBufTag(uint32_t s, uint32_t r, uint32_t el)
{
idx = ~0U;
space = s;
reg = r;
rootElement = el;
rootElementsIdx = el;
arrayIdx = 0;
}
D3D12CBufTag(uint32_t i)
{
idx = i;
space = reg = rootElement = arrayIdx = 0;
space = reg = rootElementsIdx = arrayIdx = 0;
}
uint32_t idx, space, reg, rootElement, arrayIdx;
uint32_t idx, space, reg, rootElementsIdx, arrayIdx;
};
Q_DECLARE_METATYPE(D3D12CBufTag);
@@ -90,14 +90,14 @@ struct D3D12ViewTag
OMDepth,
};
D3D12ViewTag() : type(SRV), space(0), rootElement(0), immediate(false) {}
D3D12ViewTag() : type(SRV), space(0), rootSignatureIndex(0), immediate(false) {}
D3D12ViewTag(ResType t, int s, int el, bool imm, const D3D12Pipe::View &rs)
: type(t), space(s), rootElement(el), immediate(imm), res(rs)
: type(t), space(s), rootSignatureIndex(el), immediate(imm), res(rs)
{
}
ResType type;
int space, rootElement;
int space, rootSignatureIndex;
bool immediate;
D3D12Pipe::View res;
};
@@ -552,10 +552,10 @@ ResourceId D3D12PipelineStateViewer::GetResource(RDTreeWidgetItem *item)
if(cb.idx == ~0U)
{
if(cb.rootElement < m_Ctx.CurD3D12PipelineState()->rootElements.size())
if(cb.rootElementsIdx < m_Ctx.CurD3D12PipelineState()->rootElements.size())
{
const D3D12Pipe::RootSignatureRange &range =
m_Ctx.CurD3D12PipelineState()->rootElements[cb.rootElement];
m_Ctx.CurD3D12PipelineState()->rootElements[cb.rootElementsIdx];
if(cb.reg < range.constantBuffers.size())
{
@@ -846,8 +846,9 @@ void D3D12PipelineStateViewer::addResourceRow(const D3D12ViewTag &view, const Bi
}
else
{
QString rootel = view.immediate ? tr("#%1 Direct").arg(view.rootElement)
: tr("#%1 Table[%2]").arg(view.rootElement).arg(r.tableIndex);
QString rootel = view.immediate
? tr("#%1 Direct").arg(view.rootSignatureIndex)
: tr("#%1 Table[%2]").arg(view.rootSignatureIndex).arg(r.tableIndex);
node = new RDTreeWidgetItem(
{rootel, view.space, regname, r.resourceId, typeName, w, h, d, a, format, QString()});
@@ -1081,7 +1082,7 @@ void D3D12PipelineStateViewer::setShaderState(
bool omittingEmpty = false;
tag.space = rootElements[i].registerSpace;
tag.rootElement = (int)i;
tag.rootSignatureIndex = rootElements[i].rootSignatureIndex;
tag.immediate = rootElements[i].immediate;
switch(rootElements[i].type)
@@ -1252,8 +1253,8 @@ void D3D12PipelineStateViewer::setShaderState(
QString rootel =
rootElements[i].immediate
? tr("#%1 Static").arg(rootElements[i].rootElement)
: tr("#%1 Table[%2]").arg(rootElements[i].rootElement).arg(s.tableIndex);
? tr("#%1 Static").arg(rootElements[i].rootSignatureIndex)
: tr("#%1 Table[%2]").arg(rootElements[i].rootSignatureIndex).arg(s.tableIndex);
bool filledSlot = s.filter.minify != FilterMode::NoFilter;
bool usedSlot = (bind && bind->used);
@@ -1370,21 +1371,21 @@ void D3D12PipelineStateViewer::setShaderState(
}
if(!cbuftag.isValid())
cbuftag = QVariant::fromValue(
D3D12CBufTag(rootElements[i].registerSpace, b.bind, rootElements[i].rootElement));
cbuftag =
QVariant::fromValue(D3D12CBufTag(rootElements[i].registerSpace, b.bind, (uint32_t)i));
QString rootel;
if(rootElements[i].immediate)
{
if(!b.rootValues.empty())
rootel = tr("#%1 Consts").arg(rootElements[i].rootElement);
rootel = tr("#%1 Consts").arg(rootElements[i].rootSignatureIndex);
else
rootel = tr("#%1 Direct").arg(rootElements[i].rootElement);
rootel = tr("#%1 Direct").arg(rootElements[i].rootSignatureIndex);
}
else
{
rootel = tr("#%1 Table[%2]").arg(rootElements[i].rootElement).arg(b.tableIndex);
rootel = tr("#%1 Table[%2]").arg(rootElements[i].rootSignatureIndex).arg(b.tableIndex);
}
bool filledSlot = (b.resourceId != ResourceId());
@@ -2260,7 +2261,7 @@ void D3D12PipelineStateViewer::cbuffer_itemActivated(RDTreeWidgetItem *item, int
{
// unused cbuffer, open regular buffer viewer
const D3D12Pipe::ConstantBuffer &buf =
m_Ctx.CurD3D12PipelineState()->rootElements[cb.rootElement].constantBuffers[cb.reg];
m_Ctx.CurD3D12PipelineState()->rootElements[cb.rootElementsIdx].constantBuffers[cb.reg];
if(buf.resourceId != ResourceId())
{
@@ -2753,8 +2754,8 @@ void D3D12PipelineStateViewer::exportHTML(QXmlStreamWriter &xml, const D3D12Pipe
}
QString rootel = els[i].immediate
? tr("#%1 Direct").arg(els[i].rootElement)
: tr("#%1 Table[%2]").arg(els[i].rootElement).arg(v.tableIndex);
? tr("#%1 Direct").arg(els[i].rootSignatureIndex)
: tr("#%1 Table[%2]").arg(els[i].rootSignatureIndex).arg(v.tableIndex);
QVariantList row = exportViewHTML(v, false, shaderInput, QString());
@@ -2797,8 +2798,8 @@ void D3D12PipelineStateViewer::exportHTML(QXmlStreamWriter &xml, const D3D12Pipe
}
QString rootel = els[i].immediate
? tr("#%1 Direct").arg(els[i].rootElement)
: tr("#%1 Table[%2]").arg(els[i].rootElement).arg(v.tableIndex);
? tr("#%1 Direct").arg(els[i].rootSignatureIndex)
: tr("#%1 Table[%2]").arg(els[i].rootSignatureIndex).arg(v.tableIndex);
QVariantList row = exportViewHTML(v, true, shaderInput, QString());
@@ -2841,8 +2842,8 @@ void D3D12PipelineStateViewer::exportHTML(QXmlStreamWriter &xml, const D3D12Pipe
}
QString rootel = els[i].immediate
? tr("#%1 Static").arg(els[i].rootElement)
: tr("#%1 Table[%2]").arg(els[i].rootElement).arg(s.tableIndex);
? tr("#%1 Static").arg(els[i].rootSignatureIndex)
: tr("#%1 Table[%2]").arg(els[i].rootSignatureIndex).arg(s.tableIndex);
{
QString regname = QString::number(s.bind);
@@ -2946,13 +2947,13 @@ void D3D12PipelineStateViewer::exportHTML(QXmlStreamWriter &xml, const D3D12Pipe
if(els[i].immediate)
{
if(!b.rootValues.empty())
rootel = tr("#%1 Consts").arg(els[i].rootElement);
rootel = tr("#%1 Consts").arg(els[i].rootSignatureIndex);
else
rootel = tr("#%1 Direct").arg(els[i].rootElement);
rootel = tr("#%1 Direct").arg(els[i].rootSignatureIndex);
}
else
{
rootel = tr("#%1 Table[%2]").arg(els[i].rootElement).arg(b.tableIndex);
rootel = tr("#%1 Table[%2]").arg(els[i].rootSignatureIndex).arg(b.tableIndex);
}
{
+8 -7
View File
@@ -472,17 +472,18 @@ struct RootSignatureRange
bool operator==(const RootSignatureRange &o) const
{
return immediate == o.immediate && rootElement == o.rootElement && visibility == o.visibility &&
registerSpace == o.registerSpace && dynamicallyUsedCount == o.dynamicallyUsedCount &&
firstUsedIndex == o.firstUsedIndex && lastUsedIndex == o.lastUsedIndex &&
constantBuffers == o.constantBuffers && samplers == o.samplers && views == o.views;
return immediate == o.immediate && rootSignatureIndex == o.rootSignatureIndex &&
visibility == o.visibility && registerSpace == o.registerSpace &&
dynamicallyUsedCount == o.dynamicallyUsedCount && firstUsedIndex == o.firstUsedIndex &&
lastUsedIndex == o.lastUsedIndex && constantBuffers == o.constantBuffers &&
samplers == o.samplers && views == o.views;
}
bool operator<(const RootSignatureRange &o) const
{
if(!(immediate == o.immediate))
return immediate < o.immediate;
if(!(rootElement == o.rootElement))
return rootElement < o.rootElement;
if(!(rootSignatureIndex == o.rootSignatureIndex))
return rootSignatureIndex < o.rootSignatureIndex;
if(!(visibility == o.visibility))
return visibility < o.visibility;
if(!(registerSpace == o.registerSpace))
@@ -505,7 +506,7 @@ struct RootSignatureRange
DOCUMENT("``True`` if this root element is a root constant (i.e. not in a table).");
bool immediate = false;
DOCUMENT("The index in the original root signature that this descriptor came from.");
uint32_t rootElement = ~0U;
uint32_t rootSignatureIndex = ~0U;
DOCUMENT("The :class:`BindType` contained by this element.");
BindType type = BindType::Unknown;
DOCUMENT("The :class:`ShaderStageMask` of this element.");
+6 -6
View File
@@ -979,7 +979,7 @@ void D3D12Replay::FillRootElements(uint32_t eventId, const D3D12RenderState::Roo
rootElements.resize_for_index(ridx);
D3D12Pipe::RootSignatureRange &element = rootElements[ridx++];
element.immediate = true;
element.rootElement = (uint32_t)rootEl;
element.rootSignatureIndex = (uint32_t)rootEl;
element.type = BindType::ConstantBuffer;
element.registerSpace = p.Constants.RegisterSpace;
element.visibility = ToShaderStageMask(p.ShaderVisibility);
@@ -1010,7 +1010,7 @@ void D3D12Replay::FillRootElements(uint32_t eventId, const D3D12RenderState::Roo
rootElements.resize_for_index(ridx);
D3D12Pipe::RootSignatureRange &element = rootElements[ridx++];
element.immediate = true;
element.rootElement = (uint32_t)rootEl;
element.rootSignatureIndex = (uint32_t)rootEl;
element.type = BindType::ConstantBuffer;
element.registerSpace = p.Descriptor.RegisterSpace;
element.visibility = ToShaderStageMask(p.ShaderVisibility);
@@ -1043,7 +1043,7 @@ void D3D12Replay::FillRootElements(uint32_t eventId, const D3D12RenderState::Roo
rootElements.resize_for_index(ridx);
D3D12Pipe::RootSignatureRange &element = rootElements[ridx++];
element.immediate = true;
element.rootElement = (uint32_t)rootEl;
element.rootSignatureIndex = (uint32_t)rootEl;
element.type = BindType::ReadOnlyResource;
element.registerSpace = p.Descriptor.RegisterSpace;
element.visibility = ToShaderStageMask(p.ShaderVisibility);
@@ -1083,7 +1083,7 @@ void D3D12Replay::FillRootElements(uint32_t eventId, const D3D12RenderState::Roo
rootElements.resize_for_index(ridx);
D3D12Pipe::RootSignatureRange &element = rootElements[ridx++];
element.immediate = true;
element.rootElement = (uint32_t)rootEl;
element.rootSignatureIndex = (uint32_t)rootEl;
element.type = BindType::ReadWriteResource;
element.registerSpace = p.Descriptor.RegisterSpace;
element.visibility = ToShaderStageMask(p.ShaderVisibility);
@@ -1145,7 +1145,7 @@ void D3D12Replay::FillRootElements(uint32_t eventId, const D3D12RenderState::Roo
D3D12Pipe::RootSignatureRange &element = rootElements[ridx++];
element.immediate = false;
element.rootElement = (uint32_t)rootEl;
element.rootSignatureIndex = (uint32_t)rootEl;
element.registerSpace = range.RegisterSpace;
element.visibility = ToShaderStageMask(p.ShaderVisibility);
@@ -1364,7 +1364,7 @@ void D3D12Replay::FillRootElements(uint32_t eventId, const D3D12RenderState::Roo
rootElements.resize_for_index(ridx);
D3D12Pipe::RootSignatureRange &element = rootElements[ridx++];
element.immediate = true;
element.rootElement = (uint32_t)i;
element.rootSignatureIndex = (uint32_t)i;
element.type = BindType::Sampler;
element.registerSpace = sampDesc.RegisterSpace;
element.visibility = ToShaderStageMask(sampDesc.ShaderVisibility);
+1 -1
View File
@@ -1370,7 +1370,7 @@ template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, D3D12Pipe::RootSignatureRange &el)
{
SERIALISE_MEMBER(immediate);
SERIALISE_MEMBER(rootElement);
SERIALISE_MEMBER(rootSignatureIndex);
SERIALISE_MEMBER(type);
SERIALISE_MEMBER(visibility);
SERIALISE_MEMBER(registerSpace);