From 157941e31f895097ad80f1b1dfa35dea02db00cf Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 16 Sep 2025 16:30:53 +0100 Subject: [PATCH] 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. --- qrenderdoc/Code/QRDUtils.cpp | 9 +- qrenderdoc/Code/QRDUtils.h | 2 + .../D3D11PipelineStateViewer.cpp | 103 +++-- .../PipelineState/D3D11PipelineStateViewer.h | 9 +- .../PipelineState/D3D11PipelineStateViewer.ui | 120 ++++++ .../D3D12PipelineStateViewer.cpp | 106 +++--- .../PipelineState/D3D12PipelineStateViewer.h | 7 +- .../PipelineState/D3D12PipelineStateViewer.ui | 152 ++++++++ .../PipelineState/GLPipelineStateViewer.cpp | 108 ++++-- .../PipelineState/GLPipelineStateViewer.h | 7 +- .../PipelineState/GLPipelineStateViewer.ui | 354 +++++++++++++++++- .../VulkanPipelineStateViewer.cpp | 131 ++++--- .../PipelineState/VulkanPipelineStateViewer.h | 9 +- .../VulkanPipelineStateViewer.ui | 294 ++++++++++++++- 14 files changed, 1217 insertions(+), 194 deletions(-) diff --git a/qrenderdoc/Code/QRDUtils.cpp b/qrenderdoc/Code/QRDUtils.cpp index ef35d1d85..5ae512e7c 100644 --- a/qrenderdoc/Code/QRDUtils.cpp +++ b/qrenderdoc/Code/QRDUtils.cpp @@ -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; } diff --git a/qrenderdoc/Code/QRDUtils.h b/qrenderdoc/Code/QRDUtils.h index f66dc83aa..a9bf563d4 100644 --- a/qrenderdoc/Code/QRDUtils.h +++ b/qrenderdoc/Code/QRDUtils.h @@ -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); diff --git a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp index e8a83be75..5290ba8f4 100644 --- a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp @@ -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(o)); + shaderFlow->addWidget(qobject_cast(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[] = { diff --git a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.h b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.h index 632069557..dcdd3afbf 100644 --- a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.h +++ b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.h @@ -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(); diff --git a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.ui b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.ui index a9a5647e0..5c77dc3b1 100644 --- a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.ui +++ b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.ui @@ -622,6 +622,25 @@ + + + 0 + 0 + + + + QFrame::Box + + + + + + + + 0 + 0 + + QFrame::Box @@ -1012,6 +1031,25 @@ + + + 0 + 0 + + + + QFrame::Box + + + + + + + + 0 + 0 + + QFrame::Box @@ -1399,6 +1437,25 @@ + + + 0 + 0 + + + + QFrame::Box + + + + + + + + 0 + 0 + + QFrame::Box @@ -1786,6 +1843,25 @@ + + + 0 + 0 + + + + QFrame::Box + + + + + + + + 0 + 0 + + QFrame::Box @@ -2844,6 +2920,25 @@ + + + 0 + 0 + + + + QFrame::Box + + + + + + + + 0 + 0 + + QFrame::Box @@ -4010,6 +4105,31 @@ + + + 0 + 0 + + + + + 0 + 0 + + + + QFrame::Box + + + + + + + + 0 + 0 + + 0 diff --git a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp index d6da988db..565d83915 100644 --- a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp @@ -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(o)); + shaderFlow->addWidget(qobject_cast(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 { diff --git a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.h b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.h index b817c6074..9170450df 100644 --- a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.h +++ b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.h @@ -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(); diff --git a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.ui b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.ui index 4634623bd..ae182c502 100644 --- a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.ui +++ b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.ui @@ -548,8 +548,27 @@ + + + + + 0 + 0 + + + + QFrame::Box + + + + + + 0 + 0 + + QFrame::Box @@ -977,8 +996,27 @@ + + + + + 0 + 0 + + + + QFrame::Box + + + + + + 0 + 0 + + QFrame::Box @@ -1406,8 +1444,27 @@ + + + + + 0 + 0 + + + + QFrame::Box + + + + + + 0 + 0 + + QFrame::Box @@ -1835,8 +1892,27 @@ + + + + + 0 + 0 + + + + QFrame::Box + + + + + + 0 + 0 + + QFrame::Box @@ -2884,8 +2960,27 @@ + + + + + 0 + 0 + + + + QFrame::Box + + + + + + 0 + 0 + + QFrame::Box @@ -3853,8 +3948,27 @@ + + + + + 0 + 0 + + + + QFrame::Box + + + + + + 0 + 0 + + QFrame::Box @@ -4314,8 +4428,27 @@ + + + + + 0 + 0 + + + + QFrame::Box + + + + + + 0 + 0 + + QFrame::Box @@ -4758,8 +4891,27 @@ + + + + + 0 + 0 + + + + QFrame::Box + + + + + + 0 + 0 + + QFrame::Box diff --git a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp index 391cfdb0d..970e24f86 100644 --- a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp @@ -30,6 +30,7 @@ #include #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(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] && diff --git a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.h b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.h index 499f19769..5c9500d6b 100644 --- a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.h +++ b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.h @@ -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(); diff --git a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.ui b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.ui index c00f4842d..fb7763e9a 100644 --- a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.ui +++ b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.ui @@ -572,7 +572,13 @@ 4 - + + + + 0 + 0 + + 250 @@ -582,8 +588,55 @@ PointingHandCursor - - Open Shader Source + + QFrame::Box + + + + + + + + + + + 0 + 0 + + + + + 250 + 0 + + + + PointingHandCursor + + + QFrame::Box + + + + + + + + + + + 0 + 0 + + + + + 250 + 0 + + + + PointingHandCursor QFrame::Box @@ -1026,7 +1079,13 @@ 4 - + + + + 0 + 0 + + 250 @@ -1036,8 +1095,55 @@ PointingHandCursor - - Open Shader Source + + QFrame::Box + + + + + + + + + + + 0 + 0 + + + + + 250 + 0 + + + + PointingHandCursor + + + QFrame::Box + + + + + + + + + + + 0 + 0 + + + + + 250 + 0 + + + + PointingHandCursor QFrame::Box @@ -1480,7 +1586,13 @@ 4 - + + + + 0 + 0 + + 250 @@ -1490,8 +1602,55 @@ PointingHandCursor - - Open Shader Source + + QFrame::Box + + + + + + + + + + + 0 + 0 + + + + + 250 + 0 + + + + PointingHandCursor + + + QFrame::Box + + + + + + + + + + + 0 + 0 + + + + + 250 + 0 + + + + PointingHandCursor QFrame::Box @@ -1934,7 +2093,13 @@ 4 - + + + + 0 + 0 + + 250 @@ -1944,8 +2109,55 @@ PointingHandCursor - - Open Shader Source + + QFrame::Box + + + + + + + + + + + 0 + 0 + + + + + 250 + 0 + + + + PointingHandCursor + + + QFrame::Box + + + + + + + + + + + 0 + 0 + + + + + 250 + 0 + + + + PointingHandCursor QFrame::Box @@ -3368,7 +3580,13 @@ 4 - + + + + 0 + 0 + + 250 @@ -3378,8 +3596,55 @@ PointingHandCursor - - Open Shader Source + + QFrame::Box + + + + + + + + + + + 0 + 0 + + + + + 250 + 0 + + + + PointingHandCursor + + + QFrame::Box + + + + + + + + + + + 0 + 0 + + + + + 250 + 0 + + + + PointingHandCursor QFrame::Box @@ -4339,7 +4604,13 @@ 4 - + + + + 0 + 0 + + 250 @@ -4349,8 +4620,55 @@ PointingHandCursor - - Open Shader Source + + QFrame::Box + + + + + + + + + + + 0 + 0 + + + + + 250 + 0 + + + + PointingHandCursor + + + QFrame::Box + + + + + + + + + + + 0 + 0 + + + + + 250 + 0 + + + + PointingHandCursor QFrame::Box diff --git a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp index 1d2290a51..1b4a9c4d6 100644 --- a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp @@ -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(o)); + shaderFlow->addWidget(qobject_cast(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 { diff --git a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.h b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.h index 433c78c6e..fff461f90 100644 --- a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.h +++ b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.h @@ -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(); diff --git a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.ui b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.ui index 74a9b5f3e..1d8e58e99 100644 --- a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.ui +++ b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.ui @@ -521,8 +521,46 @@ 4 + + + + + 0 + 0 + + + + QFrame::Box + + + + + + + + + 0 + 0 + + + + QFrame::Box + + + + + + + + + + + 0 + 0 + + QFrame::Box @@ -910,8 +948,46 @@ 4 + + + + + 0 + 0 + + + + QFrame::Box + + + + + + + + + 0 + 0 + + + + QFrame::Box + + + + + + + + + + + 0 + 0 + + QFrame::Box @@ -1299,8 +1375,46 @@ 4 + + + + + 0 + 0 + + + + QFrame::Box + + + + + + + + + 0 + 0 + + + + QFrame::Box + + + + + + + + + + + 0 + 0 + + QFrame::Box @@ -1688,8 +1802,46 @@ 4 + + + + + 0 + 0 + + + + QFrame::Box + + + + + + + + + 0 + 0 + + + + QFrame::Box + + + + + + + + + + + 0 + 0 + + QFrame::Box @@ -3200,8 +3352,46 @@ 4 + + + + + 0 + 0 + + + + QFrame::Box + + + + + + + + + 0 + 0 + + + + QFrame::Box + + + + + + + + + + + 0 + 0 + + QFrame::Box @@ -4145,10 +4335,36 @@ 0 + + + + + 0 + 0 + + + + QFrame::Box + + + - + + 0 + 0 + + + + QFrame::Box + + + + + + + 0 0 @@ -4632,8 +4848,46 @@ 4 + + + + + 0 + 0 + + + + QFrame::Box + + + + + + + + + 0 + 0 + + + + QFrame::Box + + + + + + + + + + + 0 + 0 + + QFrame::Box @@ -5021,8 +5275,46 @@ 4 + + + + + 0 + 0 + + + + QFrame::Box + + + + + + + + + 0 + 0 + + + + QFrame::Box + + + + + + + + + + + 0 + 0 + + QFrame::Box