Improve handling of resource arrays for D3D12

When getting read only resources from the pipe state, stitch back up
according to the bindpoint mappings. When displaying resources in UI,
don't traverse unbounded arrays. Fix resource swizzle on load/sample/
gather instructions, which happens on fetch result, not on the source
operand. Added more tests for unbounded arrays and different ways to
index into arrays.
This commit is contained in:
Steve Karolewics
2020-03-16 20:01:30 +00:00
committed by Baldur Karlsson
parent a344d226ee
commit 67447b7b7e
6 changed files with 166 additions and 37 deletions
+24 -2
View File
@@ -2269,6 +2269,14 @@ void ShaderViewer::updateDebugState()
VariableTag(DebugVariableReference(DebugVariableType::ReadOnlyResource, ro.name))));
ui->constants->addTopLevelItem(node);
}
else if(bind.arraySize == ~0U)
{
RDTreeWidgetItem *node = new RDTreeWidgetItem(
{m_ShaderDetails->readOnlyResources[i].name, ro.name, lit("[unbounded]"), QString()});
node->setTag(QVariant::fromValue(
VariableTag(DebugVariableReference(DebugVariableType::ReadOnlyResource, ro.name))));
ui->constants->addTopLevelItem(node);
}
else
{
RDTreeWidgetItem *node =
@@ -2325,7 +2333,15 @@ void ShaderViewer::updateDebugState()
new RDTreeWidgetItem({m_ShaderDetails->readWriteResources[i].name, rw.name,
lit("Resource"), ToQStr(rwBind.resources[0].resourceId)});
node->setTag(QVariant::fromValue(
VariableTag(DebugVariableReference(DebugVariableType::ReadOnlyResource, rw.name))));
VariableTag(DebugVariableReference(DebugVariableType::ReadWriteResource, rw.name))));
ui->constants->addTopLevelItem(node);
}
else if(bind.arraySize == ~0U)
{
RDTreeWidgetItem *node = new RDTreeWidgetItem(
{m_ShaderDetails->readWriteResources[i].name, rw.name, lit("[unbounded]"), QString()});
node->setTag(QVariant::fromValue(
VariableTag(DebugVariableReference(DebugVariableType::ReadWriteResource, rw.name))));
ui->constants->addTopLevelItem(node);
}
else
@@ -2334,7 +2350,7 @@ void ShaderViewer::updateDebugState()
new RDTreeWidgetItem({m_ShaderDetails->readWriteResources[i].name, rw.name,
QFormatStr("[%1]").arg(bind.arraySize), QString()});
node->setTag(QVariant::fromValue(
VariableTag(DebugVariableReference(DebugVariableType::ReadOnlyResource, rw.name))));
VariableTag(DebugVariableReference(DebugVariableType::ReadWriteResource, rw.name))));
for(uint32_t a = 0; a < bind.arraySize; a++)
{
@@ -2764,6 +2780,12 @@ RDTreeWidgetItem *ShaderViewer::makeSourceVariableNode(const SourceVariableMappi
{
value = ToQStr(res.resources[0].resourceId);
}
else if(bind.arraySize == ~0U)
{
regNames = QString();
typeName = lit("[unbounded]");
value = QString();
}
else
{
for(uint32_t a = 0; a < bind.arraySize; a++)