Split shader/program labels in pipeline state views up to wrap better

* If program or shader names are very long then combining them can cause
  problems with how wide the widgets get. Splitting each element into a label
  that can wrap around and be truncated individually produces better behaviour.
This commit is contained in:
baldurk
2025-09-16 16:30:53 +01:00
parent b9b8fe4b1b
commit 157941e31f
14 changed files with 1217 additions and 194 deletions
+7 -2
View File
@@ -174,9 +174,8 @@ rdcstr DoStringise(const PointerVal &el)
}
}
QString GetTruncatedResourceName(const ICaptureContext &ctx, ResourceId id)
void TruncateStringFromEnd(QString &name)
{
QString name = ctx.GetResourceName(id);
if(name.length() > 64)
{
QTextBoundaryFinder boundaries(QTextBoundaryFinder::Grapheme, name.data(), name.length());
@@ -187,6 +186,12 @@ QString GetTruncatedResourceName(const ICaptureContext &ctx, ResourceId id)
name.resize(pos);
name += lit("...");
}
}
QString GetTruncatedResourceName(const ICaptureContext &ctx, ResourceId id)
{
QString name = ctx.GetResourceName(id);
TruncateStringFromEnd(name);
return name;
}
+2
View File
@@ -1047,6 +1047,8 @@ void BringToForeground(QWidget *window);
bool IsDarkTheme();
void TruncateStringFromEnd(QString &name);
float getLuminance(const QColor &col);
QColor contrastingColor(const QColor &col, const QColor &defaultCol);
@@ -84,8 +84,13 @@ D3D11PipelineStateViewer::D3D11PipelineStateViewer(ICaptureContext &ctx,
const QIcon &action_hover = Icons::action_hover();
RDLabel *objectLabels[] = {
ui->vsShader, ui->hsShader, ui->dsShader, ui->gsShader,
ui->psShader, ui->csShader, ui->iaBytecode,
ui->iaBytecode,
ui->vsShader, ui->hsShader, ui->dsShader,
ui->gsShader, ui->psShader, ui->csShader,
ui->vsShaderDebug, ui->hsShaderDebug, ui->dsShaderDebug,
ui->gsShaderDebug, ui->psShaderDebug, ui->csShaderDebug,
};
QToolButton *viewButtons[] = {
@@ -123,21 +128,28 @@ D3D11PipelineStateViewer::D3D11PipelineStateViewer(ICaptureContext &ctx,
ui->vsClasses, ui->hsClasses, ui->dsClasses, ui->gsClasses, ui->psClasses, ui->csClasses,
};
// setup FlowLayout for CS shader group, with debugging controls
{
QLayout *oldLayout = ui->csShaderGroup->layout();
// setup FlowLayout for shader groups
QWidget *shaderGroups[] = {
ui->vsShaderGroup, ui->hsShaderGroup, ui->dsShaderGroup,
ui->gsShaderGroup, ui->psShaderGroup, ui->csShaderGroup,
};
QObjectList childs = ui->csShaderGroup->children();
// setup FlowLayout for shader groups
for(QWidget *shaderGroup : shaderGroups)
{
QLayout *oldLayout = shaderGroup->layout();
QObjectList childs = shaderGroup->children();
childs.removeOne((QObject *)oldLayout);
delete oldLayout;
FlowLayout *csShaderFlow = new FlowLayout(ui->csShaderGroup, -1, 3, 3);
FlowLayout *shaderFlow = new FlowLayout(shaderGroup, -1, 3, 3);
for(QObject *o : childs)
csShaderFlow->addWidget(qobject_cast<QWidget *>(o));
shaderFlow->addWidget(qobject_cast<QWidget *>(o));
ui->csShaderGroup->setLayout(csShaderFlow);
shaderGroup->setLayout(shaderFlow);
}
for(QToolButton *b : viewButtons)
@@ -1068,9 +1080,9 @@ const D3D11Pipe::Shader *D3D11PipelineStateViewer::stageForSender(QWidget *widge
return NULL;
}
void D3D11PipelineStateViewer::clearShaderState(RDLabel *shader, RDTreeWidget *tex,
RDTreeWidget *samp, RDTreeWidget *cbuffer,
RDTreeWidget *sub)
void D3D11PipelineStateViewer::clearShaderState(RDLabel *shader, RDLabel *shaderDebug,
RDTreeWidget *tex, RDTreeWidget *samp,
RDTreeWidget *cbuffer, RDTreeWidget *sub)
{
shader->setText(ToQStr(ResourceId()));
tex->clear();
@@ -1090,12 +1102,18 @@ void D3D11PipelineStateViewer::clearState()
ui->topology->setText(QString());
ui->topologyDiagram->setPixmap(QPixmap());
clearShaderState(ui->vsShader, ui->vsResources, ui->vsSamplers, ui->vsCBuffers, ui->vsClasses);
clearShaderState(ui->gsShader, ui->gsResources, ui->gsSamplers, ui->gsCBuffers, ui->gsClasses);
clearShaderState(ui->hsShader, ui->hsResources, ui->hsSamplers, ui->hsCBuffers, ui->hsClasses);
clearShaderState(ui->dsShader, ui->dsResources, ui->dsSamplers, ui->dsCBuffers, ui->dsClasses);
clearShaderState(ui->psShader, ui->psResources, ui->psSamplers, ui->psCBuffers, ui->psClasses);
clearShaderState(ui->csShader, ui->csResources, ui->csSamplers, ui->csCBuffers, ui->csClasses);
clearShaderState(ui->vsShader, ui->vsShaderDebug, ui->vsResources, ui->vsSamplers, ui->vsCBuffers,
ui->vsClasses);
clearShaderState(ui->gsShader, ui->gsShaderDebug, ui->gsResources, ui->gsSamplers, ui->gsCBuffers,
ui->gsClasses);
clearShaderState(ui->hsShader, ui->hsShaderDebug, ui->hsResources, ui->hsSamplers, ui->hsCBuffers,
ui->hsClasses);
clearShaderState(ui->dsShader, ui->dsShaderDebug, ui->dsResources, ui->dsSamplers, ui->dsCBuffers,
ui->dsClasses);
clearShaderState(ui->psShader, ui->psShaderDebug, ui->psResources, ui->psSamplers, ui->psCBuffers,
ui->psClasses);
clearShaderState(ui->csShader, ui->csShaderDebug, ui->csResources, ui->csSamplers, ui->csCBuffers,
ui->csClasses);
QToolButton *shaderButtons[] = {
ui->vsShaderViewButton, ui->hsShaderViewButton, ui->dsShaderViewButton,
@@ -1161,24 +1179,33 @@ void D3D11PipelineStateViewer::clearState()
}
void D3D11PipelineStateViewer::setShaderState(const D3D11Pipe::Shader &stage, RDLabel *shader,
RDTreeWidget *resources, RDTreeWidget *samplers,
RDTreeWidget *cbuffers, RDTreeWidget *classes)
RDLabel *shaderDebug, RDTreeWidget *resources,
RDTreeWidget *samplers, RDTreeWidget *cbuffers,
RDTreeWidget *classes)
{
ShaderReflection *shaderDetails = stage.reflection;
QString shText = ToQStr(stage.resourceId);
shader->setText(ToQStr(stage.resourceId));
if(shaderDetails && !shaderDetails->debugInfo.files.empty())
{
const ShaderDebugInfo &dbg = shaderDetails->debugInfo;
int entryFile = qMax(0, dbg.entryLocation.fileIndex);
shText += QFormatStr(": %1() - %2")
.arg(shaderDetails->entryPoint)
.arg(QFileInfo(dbg.files[entryFile].filename).fileName());
}
QString entryName = dbg.entrySourceName;
TruncateStringFromEnd(entryName);
shader->setText(shText);
QString filename = QFileInfo(dbg.files[entryFile].filename).fileName();
TruncateStringFromEnd(filename);
QString shText = QFormatStr("%1() - %2").arg(entryName).arg(filename);
shaderDebug->show();
shaderDebug->setText(shText);
}
else
{
shaderDebug->hide();
}
for(int i = 0; i < stage.classInstances.count(); i++)
{
@@ -1616,18 +1643,18 @@ void D3D11PipelineStateViewer::setState()
targets[i] = true;
}
setShaderState(state.vertexShader, ui->vsShader, ui->vsResources, ui->vsSamplers,
ui->vsCBuffers, ui->vsClasses);
setShaderState(state.geometryShader, ui->gsShader, ui->gsResources, ui->gsSamplers,
ui->gsCBuffers, ui->gsClasses);
setShaderState(state.hullShader, ui->hsShader, ui->hsResources, ui->hsSamplers, ui->hsCBuffers,
ui->hsClasses);
setShaderState(state.domainShader, ui->dsShader, ui->dsResources, ui->dsSamplers,
ui->dsCBuffers, ui->dsClasses);
setShaderState(state.pixelShader, ui->psShader, ui->psResources, ui->psSamplers, ui->psCBuffers,
ui->psClasses);
setShaderState(state.computeShader, ui->csShader, ui->csResources, ui->csSamplers,
ui->csCBuffers, ui->csClasses);
setShaderState(state.vertexShader, ui->vsShader, ui->vsShaderDebug, ui->vsResources,
ui->vsSamplers, ui->vsCBuffers, ui->vsClasses);
setShaderState(state.geometryShader, ui->gsShader, ui->gsShaderDebug, ui->gsResources,
ui->gsSamplers, ui->gsCBuffers, ui->gsClasses);
setShaderState(state.hullShader, ui->hsShader, ui->hsShaderDebug, ui->hsResources,
ui->hsSamplers, ui->hsCBuffers, ui->hsClasses);
setShaderState(state.domainShader, ui->dsShader, ui->dsShaderDebug, ui->dsResources,
ui->dsSamplers, ui->dsCBuffers, ui->dsClasses);
setShaderState(state.pixelShader, ui->psShader, ui->psShaderDebug, ui->psResources,
ui->psSamplers, ui->psCBuffers, ui->psClasses);
setShaderState(state.computeShader, ui->csShader, ui->csShaderDebug, ui->csResources,
ui->csSamplers, ui->csCBuffers, ui->csClasses);
const ShaderReflection *shaderRefls[NumShaderStages];
RDTreeWidget *resources[] = {
@@ -89,8 +89,9 @@ private:
PipelineStateViewer &m_Common;
ComputeDebugSelector *m_ComputeDebugSelector;
void setShaderState(const D3D11Pipe::Shader &stage, RDLabel *shader, RDTreeWidget *tex,
RDTreeWidget *samp, RDTreeWidget *cbuffer, RDTreeWidget *classes);
void setShaderState(const D3D11Pipe::Shader &stage, RDLabel *shader, RDLabel *shaderDebug,
RDTreeWidget *tex, RDTreeWidget *samp, RDTreeWidget *cbuffer,
RDTreeWidget *classes);
void addResourceRow(const D3D11ViewTag &view, const ShaderResource *shaderBind, bool usedSlot,
RDTreeWidget *resources);
@@ -99,8 +100,8 @@ private:
void addCBufferRow(const Descriptor &b, uint32_t reg, const ConstantBlock *shaderBind,
bool usedSlot, RDTreeWidget *cbuffers);
void clearShaderState(RDLabel *shader, RDTreeWidget *tex, RDTreeWidget *samp,
RDTreeWidget *cbuffer, RDTreeWidget *classes);
void clearShaderState(RDLabel *shader, RDLabel *shaderDebug, RDTreeWidget *tex,
RDTreeWidget *samp, RDTreeWidget *cbuffer, RDTreeWidget *classes);
void setState();
void clearState();
@@ -622,6 +622,25 @@
</property>
<item>
<widget class="RDLabel" name="vsShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="vsShaderDebug">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
@@ -1012,6 +1031,25 @@
</property>
<item>
<widget class="RDLabel" name="hsShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="hsShaderDebug">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
@@ -1399,6 +1437,25 @@
</property>
<item>
<widget class="RDLabel" name="dsShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="dsShaderDebug">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
@@ -1786,6 +1843,25 @@
</property>
<item>
<widget class="RDLabel" name="gsShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="gsShaderDebug">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
@@ -2844,6 +2920,25 @@
</property>
<item>
<widget class="RDLabel" name="psShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="psShaderDebug">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
@@ -4010,6 +4105,31 @@
</property>
<item>
<widget class="RDLabel" name="csShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="csShaderDebug">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -106,8 +106,11 @@ D3D12PipelineStateViewer::D3D12PipelineStateViewer(ICaptureContext &ctx,
const QIcon &action_hover = Icons::action_hover();
RDLabel *shaderLabels[] = {
ui->vsShader, ui->hsShader, ui->dsShader, ui->gsShader,
ui->psShader, ui->csShader, ui->asShader, ui->msShader,
ui->vsPipeline, ui->hsPipeline, ui->dsPipeline, ui->gsPipeline,
ui->psPipeline, ui->csPipeline, ui->asPipeline, ui->msPipeline,
ui->vsShader, ui->hsShader, ui->dsShader, ui->gsShader,
ui->psShader, ui->csShader, ui->asShader, ui->msShader,
};
RDLabel *rootsigLabels[] = {
@@ -158,21 +161,28 @@ D3D12PipelineStateViewer::D3D12PipelineStateViewer(ICaptureContext &ctx,
ui->psCBuffers, ui->csCBuffers, ui->asCBuffers, ui->msCBuffers,
};
// setup FlowLayout for CS shader group, with debugging controls
{
QLayout *oldLayout = ui->csShaderGroup->layout();
// setup FlowLayout for shader groups
QWidget *shaderGroups[] = {
ui->vsShaderGroup, ui->hsShaderGroup, ui->dsShaderGroup, ui->gsShaderGroup,
ui->psShaderGroup, ui->csShaderGroup, ui->asShaderGroup, ui->msShaderGroup,
};
QObjectList childs = ui->csShaderGroup->children();
// setup FlowLayout for shader groups
for(QWidget *shaderGroup : shaderGroups)
{
QLayout *oldLayout = shaderGroup->layout();
QObjectList childs = shaderGroup->children();
childs.removeOne((QObject *)oldLayout);
delete oldLayout;
FlowLayout *csShaderFlow = new FlowLayout(ui->csShaderGroup, -1, 3, 3);
FlowLayout *shaderFlow = new FlowLayout(shaderGroup, -1, 3, 3);
for(QObject *o : childs)
csShaderFlow->addWidget(qobject_cast<QWidget *>(o));
shaderFlow->addWidget(qobject_cast<QWidget *>(o));
ui->csShaderGroup->setLayout(csShaderFlow);
shaderGroup->setLayout(shaderFlow);
}
for(QToolButton *b : viewButtons)
@@ -1030,12 +1040,14 @@ void D3D12PipelineStateViewer::setNewMeshPipeFlow()
ui->pipeFlow->setIsolatedStage(5); // compute shader isolated
}
void D3D12PipelineStateViewer::clearShaderState(RDLabel *shader, RDLabel *rootSig,
RDTreeWidget *tex, RDTreeWidget *samp,
RDTreeWidget *cbuffer, RDTreeWidget *sub)
void D3D12PipelineStateViewer::clearShaderState(RDLabel *shader, RDLabel *shaderDebug,
RDLabel *rootSig, RDTreeWidget *tex,
RDTreeWidget *samp, RDTreeWidget *cbuffer,
RDTreeWidget *sub)
{
rootSig->setText(ToQStr(ResourceId()));
shader->setText(ToQStr(ResourceId()));
shaderDebug->hide();
tex->clear();
samp->clear();
sub->clear();
@@ -1053,22 +1065,22 @@ void D3D12PipelineStateViewer::clearState()
ui->primRestart->setVisible(false);
ui->topologyDiagram->setPixmap(QPixmap());
clearShaderState(ui->asShader, ui->asRootSig, ui->asResources, ui->asSamplers, ui->asCBuffers,
ui->asUAVs);
clearShaderState(ui->msShader, ui->msRootSig, ui->msResources, ui->msSamplers, ui->msCBuffers,
ui->msUAVs);
clearShaderState(ui->vsShader, ui->vsRootSig, ui->vsResources, ui->vsSamplers, ui->vsCBuffers,
ui->vsUAVs);
clearShaderState(ui->gsShader, ui->gsRootSig, ui->gsResources, ui->gsSamplers, ui->gsCBuffers,
ui->gsUAVs);
clearShaderState(ui->hsShader, ui->hsRootSig, ui->hsResources, ui->hsSamplers, ui->hsCBuffers,
ui->hsUAVs);
clearShaderState(ui->dsShader, ui->dsRootSig, ui->dsResources, ui->dsSamplers, ui->dsCBuffers,
ui->dsUAVs);
clearShaderState(ui->psShader, ui->psRootSig, ui->psResources, ui->psSamplers, ui->psCBuffers,
ui->psUAVs);
clearShaderState(ui->csShader, ui->csRootSig, ui->csResources, ui->csSamplers, ui->csCBuffers,
ui->csUAVs);
clearShaderState(ui->asPipeline, ui->asShader, ui->asRootSig, ui->asResources, ui->asSamplers,
ui->asCBuffers, ui->asUAVs);
clearShaderState(ui->msPipeline, ui->msShader, ui->msRootSig, ui->msResources, ui->msSamplers,
ui->msCBuffers, ui->msUAVs);
clearShaderState(ui->vsPipeline, ui->vsShader, ui->vsRootSig, ui->vsResources, ui->vsSamplers,
ui->vsCBuffers, ui->vsUAVs);
clearShaderState(ui->gsPipeline, ui->gsShader, ui->gsRootSig, ui->gsResources, ui->gsSamplers,
ui->gsCBuffers, ui->gsUAVs);
clearShaderState(ui->hsPipeline, ui->hsShader, ui->hsRootSig, ui->hsResources, ui->hsSamplers,
ui->hsCBuffers, ui->hsUAVs);
clearShaderState(ui->dsPipeline, ui->dsShader, ui->dsRootSig, ui->dsResources, ui->dsSamplers,
ui->dsCBuffers, ui->dsUAVs);
clearShaderState(ui->psPipeline, ui->psShader, ui->psRootSig, ui->psResources, ui->psSamplers,
ui->psCBuffers, ui->psUAVs);
clearShaderState(ui->csPipeline, ui->csShader, ui->csRootSig, ui->csResources, ui->csSamplers,
ui->csCBuffers, ui->csUAVs);
ui->gsStreamOut->clear();
@@ -1157,8 +1169,8 @@ void D3D12PipelineStateViewer::clearState()
ui->computeDebugSelector->setEnabled(false);
}
void D3D12PipelineStateViewer::setShaderState(const D3D12Pipe::Shader &stage, RDLabel *shader,
RDLabel *rootSig)
void D3D12PipelineStateViewer::setShaderState(const D3D12Pipe::Shader &stage, RDLabel *pipeline,
RDLabel *shader, RDLabel *rootSig)
{
ShaderReflection *shaderDetails = stage.reflection;
const D3D12Pipe::State &state = *m_Ctx.CurD3D12PipelineState();
@@ -1171,17 +1183,27 @@ void D3D12PipelineStateViewer::setShaderState(const D3D12Pipe::Shader &stage, RD
shText = tr("%1 - %2 Shader")
.arg(ToQStr(state.pipelineResourceId))
.arg(ToQStr(stage.stage, GraphicsAPI::D3D12));
pipeline->setText(shText);
if(shaderDetails && !shaderDetails->debugInfo.files.empty())
{
const ShaderDebugInfo &dbg = shaderDetails->debugInfo;
int entryFile = qMax(0, dbg.entryLocation.fileIndex);
shText += QFormatStr(": %1() - %2")
.arg(shaderDetails->debugInfo.entrySourceName)
.arg(QFileInfo(dbg.files[entryFile].filename).fileName());
QString entryName = dbg.entrySourceName;
TruncateStringFromEnd(entryName);
QString filename = QFileInfo(dbg.files[entryFile].filename).fileName();
TruncateStringFromEnd(filename);
shText = QFormatStr("%1() - %2").arg(entryName).arg(filename);
shader->show();
shader->setText(shText);
}
else
{
shader->hide();
}
shader->setText(shText);
}
void D3D12PipelineStateViewer::setState()
@@ -1264,8 +1286,8 @@ void D3D12PipelineStateViewer::setState()
if(m_MeshPipe)
{
setShaderState(state.ampShader, ui->asShader, ui->asRootSig);
setShaderState(state.meshShader, ui->msShader, ui->msRootSig);
setShaderState(state.ampShader, ui->asPipeline, ui->asShader, ui->asRootSig);
setShaderState(state.meshShader, ui->msPipeline, ui->msShader, ui->msRootSig);
if(state.meshShader.reflection)
ui->msTopology->setText(ToQStr(state.meshShader.reflection->outputTopology));
@@ -1557,14 +1579,14 @@ void D3D12PipelineStateViewer::setState()
ui->iaBuffers->endUpdate();
ui->iaBuffers->verticalScrollBar()->setValue(vs);
setShaderState(state.vertexShader, ui->vsShader, ui->vsRootSig);
setShaderState(state.geometryShader, ui->gsShader, ui->gsRootSig);
setShaderState(state.hullShader, ui->hsShader, ui->hsRootSig);
setShaderState(state.domainShader, ui->dsShader, ui->dsRootSig);
setShaderState(state.vertexShader, ui->vsPipeline, ui->vsShader, ui->vsRootSig);
setShaderState(state.geometryShader, ui->gsPipeline, ui->gsShader, ui->gsRootSig);
setShaderState(state.hullShader, ui->hsPipeline, ui->hsShader, ui->hsRootSig);
setShaderState(state.domainShader, ui->dsPipeline, ui->dsShader, ui->dsRootSig);
}
setShaderState(state.pixelShader, ui->psShader, ui->psRootSig);
setShaderState(state.computeShader, ui->csShader, ui->csRootSig);
setShaderState(state.pixelShader, ui->psPipeline, ui->psShader, ui->psRootSig);
setShaderState(state.computeShader, ui->csPipeline, ui->csShader, ui->csRootSig);
// fill in descriptor access
{
@@ -93,13 +93,14 @@ private:
void setOldMeshPipeFlow();
void setNewMeshPipeFlow();
void setShaderState(const D3D12Pipe::Shader &stage, RDLabel *shader, RDLabel *rootSig);
void setShaderState(const D3D12Pipe::Shader &stage, RDLabel *pipeline, RDLabel *shader,
RDLabel *rootSig);
void addResourceRow(const D3D12ViewTag &view, const ShaderResource *shaderInput, bool spacesUsed,
RDTreeWidget *resources);
void clearShaderState(RDLabel *shader, RDLabel *rootSig, RDTreeWidget *tex, RDTreeWidget *samp,
RDTreeWidget *cbuffer, RDTreeWidget *uavs);
void clearShaderState(RDLabel *pipeline, RDLabel *shader, RDLabel *rootSig, RDTreeWidget *tex,
RDTreeWidget *samp, RDTreeWidget *cbuffer, RDTreeWidget *uavs);
void setState();
void clearState();
@@ -548,8 +548,27 @@
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="vsPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="vsShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
@@ -977,8 +996,27 @@
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="hsPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="hsShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
@@ -1406,8 +1444,27 @@
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="dsPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="dsShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
@@ -1835,8 +1892,27 @@
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="gsPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="gsShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
@@ -2884,8 +2960,27 @@
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="psPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="psShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
@@ -3853,8 +3948,27 @@
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="csPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="csShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
@@ -4314,8 +4428,27 @@
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="asPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="asShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
@@ -4758,8 +4891,27 @@
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="msPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="msShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
@@ -30,6 +30,7 @@
#include <QXmlStreamWriter>
#include "Code/Resources.h"
#include "Widgets/Extended/RDHeaderView.h"
#include "flowlayout/FlowLayout.h"
#include "toolwindowmanager/ToolWindowManager.h"
#include "PipelineStateViewer.h"
#include "ui_GLPipelineStateViewer.h"
@@ -89,8 +90,16 @@ GLPipelineStateViewer::GLPipelineStateViewer(ICaptureContext &ctx, PipelineState
const QIcon &action_hover = Icons::action_hover();
RDLabel *shaderLabels[] = {
ui->vaoLabel, ui->vsShader, ui->tcsShader, ui->tesShader,
ui->gsShader, ui->fsShader, ui->csShader,
ui->vaoLabel,
ui->vsPipeline, ui->tcsPipeline, ui->tesPipeline,
ui->gsPipeline, ui->fsPipeline, ui->csPipeline,
ui->vsProgram, ui->tcsProgram, ui->tesProgram,
ui->gsProgram, ui->fsProgram, ui->csProgram,
ui->vsShader, ui->tcsShader, ui->tesShader,
ui->gsShader, ui->fsShader, ui->csShader,
};
QToolButton *viewButtons[] = {
@@ -132,6 +141,29 @@ GLPipelineStateViewer::GLPipelineStateViewer(ICaptureContext &ctx, PipelineState
ui->gsReadWrite, ui->fsReadWrite, ui->csReadWrite,
};
QWidget *shaderGroups[] = {
ui->vsShaderGroup, ui->tcsShaderGroup, ui->tesShaderGroup,
ui->gsShaderGroup, ui->fsShaderGroup, ui->csShaderGroup,
};
// setup FlowLayout for shader groups
for(QWidget *shaderGroup : shaderGroups)
{
QLayout *oldLayout = shaderGroup->layout();
QObjectList childs = shaderGroup->children();
childs.removeOne((QObject *)oldLayout);
delete oldLayout;
FlowLayout *shaderFlow = new FlowLayout(shaderGroup, -1, 3, 3);
for(QObject *o : childs)
shaderFlow->addWidget(qobject_cast<QWidget *>(o));
shaderGroup->setLayout(shaderFlow);
}
for(QToolButton *b : viewButtons)
QObject::connect(b, &QToolButton::clicked, this, &GLPipelineStateViewer::shaderView_clicked);
@@ -140,7 +172,7 @@ GLPipelineStateViewer::GLPipelineStateViewer(ICaptureContext &ctx, PipelineState
b->setAutoFillBackground(true);
b->setBackgroundRole(QPalette::ToolTipBase);
b->setForegroundRole(QPalette::ToolTipText);
b->setMinimumSizeHint(QSize(250, 0));
b->setMinimumSizeHint(QSize(150, 0));
}
for(RDLabel *b : {ui->xfbObj, ui->readFBO, ui->drawFBO})
@@ -1136,10 +1168,13 @@ const GLPipe::Shader *GLPipelineStateViewer::stageForSender(QWidget *widget)
return NULL;
}
void GLPipelineStateViewer::clearShaderState(RDLabel *shader, RDTreeWidget *tex, RDTreeWidget *samp,
void GLPipelineStateViewer::clearShaderState(RDLabel *pipeline, RDLabel *program, RDLabel *shader,
RDTreeWidget *tex, RDTreeWidget *samp,
RDTreeWidget *ubo, RDTreeWidget *sub, RDTreeWidget *rw)
{
shader->setText(tr("Unbound Shader"));
pipeline->hide();
program->setText(ToQStr(ResourceId()));
shader->setText(ToQStr(ResourceId()));
tex->clear();
samp->clear();
sub->clear();
@@ -1160,18 +1195,18 @@ void GLPipelineStateViewer::clearState()
ui->primRestart->setVisible(false);
ui->topologyDiagram->setPixmap(QPixmap());
clearShaderState(ui->vsShader, ui->vsTextures, ui->vsSamplers, ui->vsUBOs, ui->vsSubroutines,
ui->vsReadWrite);
clearShaderState(ui->gsShader, ui->gsTextures, ui->gsSamplers, ui->gsUBOs, ui->gsSubroutines,
ui->gsReadWrite);
clearShaderState(ui->tcsShader, ui->tcsTextures, ui->tcsSamplers, ui->tcsUBOs, ui->tcsSubroutines,
ui->tcsReadWrite);
clearShaderState(ui->tesShader, ui->tesTextures, ui->tesSamplers, ui->tesUBOs, ui->tesSubroutines,
ui->tesReadWrite);
clearShaderState(ui->fsShader, ui->fsTextures, ui->fsSamplers, ui->fsUBOs, ui->fsSubroutines,
ui->fsReadWrite);
clearShaderState(ui->csShader, ui->csTextures, ui->csSamplers, ui->csUBOs, ui->csSubroutines,
ui->csReadWrite);
clearShaderState(ui->vsPipeline, ui->vsProgram, ui->vsShader, ui->vsTextures, ui->vsSamplers,
ui->vsUBOs, ui->vsSubroutines, ui->vsReadWrite);
clearShaderState(ui->gsPipeline, ui->gsProgram, ui->gsShader, ui->gsTextures, ui->gsSamplers,
ui->gsUBOs, ui->gsSubroutines, ui->gsReadWrite);
clearShaderState(ui->tcsPipeline, ui->tcsProgram, ui->tcsShader, ui->tcsTextures, ui->tcsSamplers,
ui->tcsUBOs, ui->tcsSubroutines, ui->tcsReadWrite);
clearShaderState(ui->tesPipeline, ui->tesProgram, ui->tesShader, ui->tesTextures, ui->tesSamplers,
ui->tesUBOs, ui->tesSubroutines, ui->tesReadWrite);
clearShaderState(ui->fsPipeline, ui->fsProgram, ui->fsShader, ui->fsTextures, ui->fsSamplers,
ui->fsUBOs, ui->fsSubroutines, ui->fsReadWrite);
clearShaderState(ui->csPipeline, ui->csProgram, ui->csShader, ui->csTextures, ui->csSamplers,
ui->csUBOs, ui->csSubroutines, ui->csReadWrite);
ui->xfbBuffers->clear();
@@ -1240,28 +1275,25 @@ void GLPipelineStateViewer::clearState()
ui->stencils->clear();
}
void GLPipelineStateViewer::setShaderState(const GLPipe::Shader &stage, RDLabel *shader,
RDTreeWidget *subs)
void GLPipelineStateViewer::setShaderState(const GLPipe::Shader &stage, RDLabel *pipeline,
RDLabel *program, RDLabel *shader, RDTreeWidget *subs)
{
ShaderReflection *shaderDetails = stage.reflection;
const GLPipe::State &state = *m_Ctx.CurGLPipelineState();
if(stage.shaderResourceId == ResourceId())
if(state.pipelineResourceId != ResourceId())
{
shader->setText(ToQStr(stage.shaderResourceId));
pipeline->show();
pipeline->setText(ToQStr(state.pipelineResourceId));
}
else
{
QString shText = ToQStr(stage.shaderResourceId);
shText = ToQStr(stage.programResourceId) + lit(" > ") + shText;
if(state.pipelineResourceId != ResourceId())
shText = ToQStr(state.pipelineResourceId) + lit(" > ") + shText;
shader->setText(shText);
pipeline->hide();
}
program->setText(ToQStr(stage.programResourceId));
shader->setText(ToQStr(stage.shaderResourceId));
int vs = subs->verticalScrollBar()->value();
subs->beginUpdate();
subs->clear();
@@ -1835,12 +1867,18 @@ void GLPipelineStateViewer::setState()
// UBOs don't have to be sorted because there's only one type there, the locations are already
// in order
setShaderState(state.vertexShader, ui->vsShader, ui->vsSubroutines);
setShaderState(state.geometryShader, ui->gsShader, ui->gsSubroutines);
setShaderState(state.tessControlShader, ui->tcsShader, ui->tcsSubroutines);
setShaderState(state.tessEvalShader, ui->tesShader, ui->tesSubroutines);
setShaderState(state.fragmentShader, ui->fsShader, ui->fsSubroutines);
setShaderState(state.computeShader, ui->csShader, ui->csSubroutines);
setShaderState(state.vertexShader, ui->vsPipeline, ui->vsProgram, ui->vsShader,
ui->vsSubroutines);
setShaderState(state.geometryShader, ui->gsPipeline, ui->gsProgram, ui->gsShader,
ui->gsSubroutines);
setShaderState(state.tessControlShader, ui->tcsPipeline, ui->tcsProgram, ui->tcsShader,
ui->tcsSubroutines);
setShaderState(state.tessEvalShader, ui->tesPipeline, ui->tesProgram, ui->tesShader,
ui->tesSubroutines);
setShaderState(state.fragmentShader, ui->fsPipeline, ui->fsProgram, ui->fsShader,
ui->fsSubroutines);
setShaderState(state.computeShader, ui->csPipeline, ui->csProgram, ui->csShader,
ui->csSubroutines);
ui->vsReadWrite->parentWidget()->setVisible(ui->vsReadWrite->topLevelItemCount() > 0 &&
shaderRefls[0] &&
@@ -92,7 +92,8 @@ private:
const GLPipe::VertexAttribute &val);
GLReadWriteType GetGLReadWriteType(ShaderResource res);
void setShaderState(const GLPipe::Shader &stage, RDLabel *shader, RDTreeWidget *sub);
void setShaderState(const GLPipe::Shader &stage, RDLabel *pipeline, RDLabel *program,
RDLabel *shader, RDTreeWidget *sub);
void addUBORow(const Descriptor &descriptor, uint32_t reg, uint32_t index,
const ConstantBlock *shaderBind, bool usedSlot, RDTreeWidget *ubos);
@@ -106,8 +107,8 @@ private:
const GLPipe::TextureCompleteness *texCompleteness,
RDTreeWidgetItem *readwrites);
void clearShaderState(RDLabel *shader, RDTreeWidget *tex, RDTreeWidget *samp, RDTreeWidget *ubo,
RDTreeWidget *sub, RDTreeWidget *rw);
void clearShaderState(RDLabel *pipeline, RDLabel *program, RDLabel *shader, RDTreeWidget *tex,
RDTreeWidget *samp, RDTreeWidget *ubo, RDTreeWidget *sub, RDTreeWidget *rw);
void setState();
void clearState();
@@ -572,7 +572,13 @@
<number>4</number>
</property>
<item>
<widget class="RDLabel" name="vsShader">
<widget class="RDLabel" name="vsPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
@@ -582,8 +588,55 @@
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="toolTip">
<string>Open Shader Source</string>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="vsProgram">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
<height>0</height>
</size>
</property>
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="vsShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
<height>0</height>
</size>
</property>
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
@@ -1026,7 +1079,13 @@
<number>4</number>
</property>
<item>
<widget class="RDLabel" name="tcsShader">
<widget class="RDLabel" name="tcsPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
@@ -1036,8 +1095,55 @@
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="toolTip">
<string>Open Shader Source</string>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="tcsProgram">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
<height>0</height>
</size>
</property>
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="tcsShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
<height>0</height>
</size>
</property>
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
@@ -1480,7 +1586,13 @@
<number>4</number>
</property>
<item>
<widget class="RDLabel" name="tesShader">
<widget class="RDLabel" name="tesPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
@@ -1490,8 +1602,55 @@
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="toolTip">
<string>Open Shader Source</string>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="tesProgram">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
<height>0</height>
</size>
</property>
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="tesShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
<height>0</height>
</size>
</property>
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
@@ -1934,7 +2093,13 @@
<number>4</number>
</property>
<item>
<widget class="RDLabel" name="gsShader">
<widget class="RDLabel" name="gsPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
@@ -1944,8 +2109,55 @@
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="toolTip">
<string>Open Shader Source</string>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="gsProgram">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
<height>0</height>
</size>
</property>
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="gsShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
<height>0</height>
</size>
</property>
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
@@ -3368,7 +3580,13 @@
<number>4</number>
</property>
<item>
<widget class="RDLabel" name="fsShader">
<widget class="RDLabel" name="fsPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
@@ -3378,8 +3596,55 @@
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="toolTip">
<string>Open Shader Source</string>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="fsProgram">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
<height>0</height>
</size>
</property>
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="fsShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
<height>0</height>
</size>
</property>
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
@@ -4339,7 +4604,13 @@
<number>4</number>
</property>
<item>
<widget class="RDLabel" name="csShader">
<widget class="RDLabel" name="csPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
@@ -4349,8 +4620,55 @@
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="toolTip">
<string>Open Shader Source</string>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="csProgram">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
<height>0</height>
</size>
</property>
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="csShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
<height>0</height>
</size>
</property>
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
@@ -148,8 +148,14 @@ VulkanPipelineStateViewer::VulkanPipelineStateViewer(ICaptureContext &ctx,
const QIcon &action_hover = Icons::action_hover();
RDLabel *shaderLabels[] = {
ui->tsShader, ui->msShader, ui->vsShader, ui->tcsShader,
ui->tesShader, ui->gsShader, ui->fsShader, ui->csShader,
ui->tsPipeline, ui->msPipeline, ui->vsPipeline, ui->tcsPipeline,
ui->tesPipeline, ui->gsPipeline, ui->fsPipeline, ui->csPipeline,
ui->tsShader, ui->msShader, ui->vsShader, ui->tcsShader,
ui->tesShader, ui->gsShader, ui->fsShader, ui->csShader,
ui->tsShaderDebug, ui->msShaderDebug, ui->vsShaderDebug, ui->tcsShaderDebug,
ui->tesShaderDebug, ui->gsShaderDebug, ui->fsShaderDebug, ui->csShaderDebug,
};
RDLabel *pipeLayoutLabels[] = {
@@ -201,21 +207,28 @@ VulkanPipelineStateViewer::VulkanPipelineStateViewer(ICaptureContext &ctx,
ui->tesDescSets, ui->gsDescSets, ui->fsDescSets, ui->csDescSets,
};
// setup FlowLayout for CS shader group, with debugging controls
{
QLayout *oldLayout = ui->csShaderGroup->layout();
// setup FlowLayout for shader groups
QWidget *shaderGroups[] = {
ui->tsShaderGroup, ui->msShaderGroup, ui->vsShaderGroup, ui->tcsShaderGroup,
ui->tesShaderGroup, ui->gsShaderGroup, ui->fsShaderGroup, ui->csShaderGroup,
};
QObjectList childs = ui->csShaderGroup->children();
// setup FlowLayout for shader groups
for(QWidget *shaderGroup : shaderGroups)
{
QLayout *oldLayout = shaderGroup->layout();
QObjectList childs = shaderGroup->children();
childs.removeOne((QObject *)oldLayout);
delete oldLayout;
FlowLayout *csShaderFlow = new FlowLayout(ui->csShaderGroup, -1, 3, 3);
FlowLayout *shaderFlow = new FlowLayout(shaderGroup, -1, 3, 3);
for(QObject *o : childs)
csShaderFlow->addWidget(qobject_cast<QWidget *>(o));
shaderFlow->addWidget(qobject_cast<QWidget *>(o));
ui->csShaderGroup->setLayout(csShaderFlow);
shaderGroup->setLayout(shaderFlow);
}
for(QToolButton *b : viewButtons)
@@ -951,12 +964,16 @@ void VulkanPipelineStateViewer::setNewMeshPipeFlow()
ui->pipeFlow->setIsolatedStage(5); // compute shader isolated
}
void VulkanPipelineStateViewer::clearShaderState(RDLabel *shader, RDLabel *pipeLayout,
void VulkanPipelineStateViewer::clearShaderState(RDLabel *pipeline, RDLabel *shader,
RDLabel *shaderDebug, RDLabel *pipeLayout,
RDTreeWidget *resources, RDTreeWidget *cbuffers,
RDTreeWidget *descSets)
{
pipeLayout->setText(tr("Pipeline Layout"));
shader->setText(QFormatStr("%1: %1").arg(ToQStr(ResourceId())));
pipeline->show();
pipeline->setText(ToQStr(ResourceId()));
shader->setText(ToQStr(ResourceId()));
shaderDebug->hide();
resources->clear();
cbuffers->clear();
descSets->clear();
@@ -976,14 +993,22 @@ void VulkanPipelineStateViewer::clearState()
ui->primRestart->setVisible(false);
ui->topologyDiagram->setPixmap(QPixmap());
clearShaderState(ui->tsShader, ui->tsPipeLayout, ui->tsResources, ui->tsUBOs, ui->tsDescSets);
clearShaderState(ui->msShader, ui->msPipeLayout, ui->msResources, ui->msUBOs, ui->msDescSets);
clearShaderState(ui->vsShader, ui->vsPipeLayout, ui->vsResources, ui->vsUBOs, ui->vsDescSets);
clearShaderState(ui->tcsShader, ui->tcsPipeLayout, ui->tcsResources, ui->tcsUBOs, ui->tcsDescSets);
clearShaderState(ui->tesShader, ui->tesPipeLayout, ui->tesResources, ui->tesUBOs, ui->tesDescSets);
clearShaderState(ui->gsShader, ui->gsPipeLayout, ui->gsResources, ui->gsUBOs, ui->gsDescSets);
clearShaderState(ui->fsShader, ui->fsPipeLayout, ui->fsResources, ui->fsUBOs, ui->fsDescSets);
clearShaderState(ui->csShader, ui->csPipeLayout, ui->csResources, ui->csUBOs, ui->csDescSets);
clearShaderState(ui->tsPipeline, ui->tsShader, ui->tsShaderDebug, ui->tsPipeLayout,
ui->tsResources, ui->tsUBOs, ui->tsDescSets);
clearShaderState(ui->msPipeline, ui->msShader, ui->msShaderDebug, ui->msPipeLayout,
ui->msResources, ui->msUBOs, ui->msDescSets);
clearShaderState(ui->vsPipeline, ui->vsShader, ui->vsShaderDebug, ui->vsPipeLayout,
ui->vsResources, ui->vsUBOs, ui->vsDescSets);
clearShaderState(ui->tcsPipeline, ui->tcsShader, ui->tcsShaderDebug, ui->tcsPipeLayout,
ui->tcsResources, ui->tcsUBOs, ui->tcsDescSets);
clearShaderState(ui->tesPipeline, ui->tesShader, ui->tesShaderDebug, ui->tesPipeLayout,
ui->tesResources, ui->tesUBOs, ui->tesDescSets);
clearShaderState(ui->gsPipeline, ui->gsShader, ui->gsShaderDebug, ui->gsPipeLayout,
ui->gsResources, ui->gsUBOs, ui->gsDescSets);
clearShaderState(ui->fsPipeline, ui->fsShader, ui->fsShaderDebug, ui->fsPipeLayout,
ui->fsResources, ui->fsUBOs, ui->fsDescSets);
clearShaderState(ui->csPipeline, ui->csShader, ui->csShaderDebug, ui->csPipeLayout,
ui->csResources, ui->csUBOs, ui->csDescSets);
ui->xfbBuffers->clear();
@@ -1693,35 +1718,50 @@ void VulkanPipelineStateViewer::addConstantBlockRow(const ConstantBlock *cblock,
}
void VulkanPipelineStateViewer::setShaderState(const VKPipe::Pipeline &pipe,
const VKPipe::Shader &stage, RDLabel *shader,
const VKPipe::Shader &stage, RDLabel *pipeline,
RDLabel *shader, RDLabel *shaderDebug,
RDLabel *pipeLayout, RDTreeWidget *descSets)
{
ShaderReflection *shaderDetails = stage.reflection;
QString shText;
if(stage.shaderObject)
shText = QFormatStr("%1").arg(ToQStr(stage.resourceId));
{
pipeline->hide();
shader->setText(ToQStr(stage.resourceId));
}
else
shText = QFormatStr("%1: %2").arg(ToQStr(pipe.pipelineResourceId)).arg(ToQStr(stage.resourceId));
{
pipeline->show();
pipeline->setText(ToQStr(pipe.pipelineResourceId));
shader->setText(ToQStr(stage.resourceId));
}
if(shaderDetails != NULL)
{
QString entryFunc = shaderDetails->entryPoint;
if(entryFunc != lit("main"))
shText += lit(": ") + entryFunc + lit("()");
QString shText = entryFunc + lit("()");
const ShaderDebugInfo &dbg = shaderDetails->debugInfo;
int entryFile = qMax(0, dbg.entryLocation.fileIndex);
if(!dbg.files.isEmpty())
shText += lit(" - ") + QFileInfo(dbg.files[entryFile].filename).fileName();
{
QString filename = QFileInfo(dbg.files[entryFile].filename).fileName();
TruncateStringFromEnd(filename);
shText += lit(" - ") + filename;
}
if(stage.requiredSubgroupSize != 0)
shText += tr(" (Subgroup size %1)").arg(stage.requiredSubgroupSize);
shaderDebug->show();
shaderDebug->setText(shText);
}
else
{
shaderDebug->hide();
}
if(stage.requiredSubgroupSize != 0)
shText += tr(" (Subgroup size %1)").arg(stage.requiredSubgroupSize);
shader->setText(shText);
if(pipe.pipelineComputeLayoutResourceId != ResourceId())
{
@@ -1952,8 +1992,10 @@ void VulkanPipelineStateViewer::setState()
if(m_MeshPipe)
{
setShaderState(state.graphics, state.taskShader, ui->tsShader, ui->tsPipeLayout, ui->tsDescSets);
setShaderState(state.graphics, state.meshShader, ui->msShader, ui->msPipeLayout, ui->msDescSets);
setShaderState(state.graphics, state.taskShader, ui->tsPipeline, ui->tsShader,
ui->tsShaderDebug, ui->tsPipeLayout, ui->tsDescSets);
setShaderState(state.graphics, state.meshShader, ui->msPipeline, ui->msShader,
ui->msShaderDebug, ui->msPipeLayout, ui->msDescSets);
if(state.meshShader.reflection)
ui->msTopology->setText(ToQStr(state.meshShader.reflection->outputTopology));
@@ -2225,19 +2267,20 @@ void VulkanPipelineStateViewer::setState()
ui->viBuffers->endUpdate();
ui->viBuffers->verticalScrollBar()->setValue(vs);
setShaderState(state.graphics, state.vertexShader, ui->vsShader, ui->vsPipeLayout,
ui->vsDescSets);
setShaderState(state.graphics, state.geometryShader, ui->gsShader, ui->gsPipeLayout,
ui->gsDescSets);
setShaderState(state.graphics, state.tessControlShader, ui->tcsShader, ui->tcsPipeLayout,
ui->tcsDescSets);
setShaderState(state.graphics, state.tessEvalShader, ui->tesShader, ui->tesPipeLayout,
ui->tesDescSets);
setShaderState(state.graphics, state.vertexShader, ui->vsPipeline, ui->vsShader,
ui->vsShaderDebug, ui->vsPipeLayout, ui->vsDescSets);
setShaderState(state.graphics, state.geometryShader, ui->gsPipeline, ui->gsShader,
ui->gsShaderDebug, ui->gsPipeLayout, ui->gsDescSets);
setShaderState(state.graphics, state.tessControlShader, ui->tcsPipeline, ui->tcsShader,
ui->tcsShaderDebug, ui->tcsPipeLayout, ui->tcsDescSets);
setShaderState(state.graphics, state.tessEvalShader, ui->tesPipeline, ui->tesShader,
ui->tesShaderDebug, ui->tesPipeLayout, ui->tesDescSets);
}
setShaderState(state.graphics, state.fragmentShader, ui->fsShader, ui->fsPipeLayout,
ui->fsDescSets);
setShaderState(state.compute, state.computeShader, ui->csShader, ui->csPipeLayout, ui->csDescSets);
setShaderState(state.graphics, state.fragmentShader, ui->fsPipeline, ui->fsShader,
ui->fsShaderDebug, ui->fsPipeLayout, ui->fsDescSets);
setShaderState(state.compute, state.computeShader, ui->csPipeline, ui->csShader,
ui->csShaderDebug, ui->csPipeLayout, ui->csDescSets);
// fill in descriptor access
{
@@ -112,10 +112,11 @@ private:
void addConstantBlockRow(const ConstantBlock *cblock, const UsedDescriptor &used,
uint32_t dynamicOffset, RDTreeWidget *ubos);
void setShaderState(const VKPipe::Pipeline &pipe, const VKPipe::Shader &stage, RDLabel *shader,
RDLabel *pipeLayout, RDTreeWidget *descSets);
void clearShaderState(RDLabel *shader, RDLabel *pipeLayout, RDTreeWidget *resources,
RDTreeWidget *cbuffers, RDTreeWidget *descSets);
void setShaderState(const VKPipe::Pipeline &pipe, const VKPipe::Shader &stage, RDLabel *pipeline,
RDLabel *shader, RDLabel *shaderDebug, RDLabel *pipeLayout,
RDTreeWidget *descSets);
void clearShaderState(RDLabel *pipeline, RDLabel *shader, RDLabel *shaderDebug, RDLabel *pipeLayout,
RDTreeWidget *resources, RDTreeWidget *cbuffers, RDTreeWidget *descSets);
void setState();
void clearState();
@@ -521,8 +521,46 @@
<property name="bottomMargin">
<number>4</number>
</property>
<item>
<widget class="RDLabel" name="vsPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="vsShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="vsShaderDebug">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
@@ -910,8 +948,46 @@
<property name="bottomMargin">
<number>4</number>
</property>
<item>
<widget class="RDLabel" name="tcsPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="tcsShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="tcsShaderDebug">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
@@ -1299,8 +1375,46 @@
<property name="bottomMargin">
<number>4</number>
</property>
<item>
<widget class="RDLabel" name="tesPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="tesShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="tesShaderDebug">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
@@ -1688,8 +1802,46 @@
<property name="bottomMargin">
<number>4</number>
</property>
<item>
<widget class="RDLabel" name="gsPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="gsShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="gsShaderDebug">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
@@ -3200,8 +3352,46 @@
<property name="bottomMargin">
<number>4</number>
</property>
<item>
<widget class="RDLabel" name="fsPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="fsShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="fsShaderDebug">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
@@ -4145,10 +4335,36 @@
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="RDLabel" name="csPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="csShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="csShaderDebug">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -4632,8 +4848,46 @@
<property name="bottomMargin">
<number>4</number>
</property>
<item>
<widget class="RDLabel" name="tsPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="tsShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="tsShaderDebug">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
@@ -5021,8 +5275,46 @@
<property name="bottomMargin">
<number>4</number>
</property>
<item>
<widget class="RDLabel" name="msPipeline">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="msShader">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="msShaderDebug">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>