Add a descriptor viewer for showing all of a heap, root sig, or set

This commit is contained in:
baldurk
2024-04-10 18:58:53 +01:00
parent 153cd2aa16
commit 1194531fc5
22 changed files with 3043 additions and 157 deletions
File diff suppressed because it is too large Load Diff
+83
View File
@@ -0,0 +1,83 @@
/******************************************************************************
* The MIT License (MIT)
*
* Copyright (c) 2019-2024 Baldur Karlsson
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
******************************************************************************/
#pragma once
#include <QFrame>
#include "Code/Interface/QRDInterface.h"
namespace Ui
{
class DescriptorViewer;
}
class DescriptorItemModel;
class DescriptorViewer : public QFrame, public IDescriptorViewer, public ICaptureViewer
{
Q_OBJECT
public:
explicit DescriptorViewer(ICaptureContext &ctx, QWidget *parent = 0);
~DescriptorViewer();
void ViewDescriptorStore(ResourceId id);
void ViewDescriptors(const rdcarray<Descriptor> &descriptors,
const rdcarray<SamplerDescriptor> &samplerDescriptors);
void ViewD3D12State();
// IDescriptorViewer
QWidget *Widget() override { return this; }
// ICaptureViewer
void OnCaptureLoaded() override;
void OnCaptureClosed() override;
void OnSelectedEventChanged(uint32_t eventId) override {}
void OnEventChanged(uint32_t eventId) override;
private slots:
void on_pipeButton_clicked();
private:
Ui::DescriptorViewer *ui;
ICaptureContext &m_Ctx;
DescriptorStoreDescription m_DescriptorStore;
rdcarray<Descriptor> m_Descriptors;
rdcarray<SamplerDescriptor> m_SamplerDescriptors;
rdcarray<DescriptorLogicalLocation> m_Locations;
// the descriptors array is always full (we don't worry about the overallocation for only-samplers),
// but if we fetched these ourselves we will have fetched samplers sparsely only when necessary.
// This array is the same size as m_Descriptors in that case containing the lookup indices in the samplers array
rdcarray<uint32_t> m_DescriptorToSamplerLookup;
rdcarray<ResourceId> m_D3D12Heaps;
D3D12Pipe::RootSignature m_D3D12RootSig;
// make the model a friend for simplicity
friend class DescriptorItemModel;
DescriptorItemModel *m_Model;
};
+142
View File
@@ -0,0 +1,142 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DescriptorViewer</class>
<widget class="QFrame" name="DescriptorViewer">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Descriptor Viewer</string>
</property>
<layout class="QVBoxLayout" name="mainLayout">
<property name="leftMargin">
<number>3</number>
</property>
<property name="topMargin">
<number>3</number>
</property>
<property name="rightMargin">
<number>3</number>
</property>
<property name="bottomMargin">
<number>3</number>
</property>
<item>
<layout class="QHBoxLayout" name="toolbarHorizontalLayout">
<property name="spacing">
<number>5</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>6</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="QToolButton" name="pipeButton">
<property name="text">
<string>Open Pipeline State</string>
</property>
<property name="icon">
<iconset resource="../Resources/resources.qrc">
<normaloff>:/action.png</normaloff>:/action.png</iconset>
</property>
<property name="toolTip">
<string>Open the pipeline state viewer to more easily show the current bindings.</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="pipeLabel">
<property name="text">
<string></string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<spacer name="toolbarHorizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="RDTreeView" name="descriptors">
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="midLineWidth">
<number>1</number>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="indentation">
<number>12</number>
</property>
<property name="rootIsDecorated">
<bool>true</bool>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<property name="allColumnsShowFocus">
<bool>true</bool>
</property>
<property name="headerHidden">
<bool>false</bool>
</property>
<attribute name="headerCascadingSectionResizes">
<bool>false</bool>
</attribute>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>RDTreeView</class>
<extends>QTreeWidget</extends>
<header>Widgets/Extended/RDTreeView.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
@@ -31,6 +31,7 @@
#include "Code/Resources.h"
#include "Widgets/ComputeDebugSelector.h"
#include "Widgets/Extended/RDHeaderView.h"
#include "Windows/DescriptorViewer.h"
#include "flowlayout/FlowLayout.h"
#include "toolwindowmanager/ToolWindowManager.h"
#include "PipelineStateViewer.h"
@@ -114,6 +115,11 @@ D3D12PipelineStateViewer::D3D12PipelineStateViewer(ICaptureContext &ctx,
ui->psRootSig, ui->csRootSig, ui->asRootSig, ui->msRootSig,
};
QToolButton *sigButtons[] = {
ui->vsRootSigButton, ui->hsRootSigButton, ui->dsRootSigButton, ui->gsRootSigButton,
ui->psRootSigButton, ui->csRootSigButton, ui->asRootSigButton, ui->msRootSigButton,
};
QToolButton *viewButtons[] = {
ui->vsShaderViewButton, ui->hsShaderViewButton, ui->dsShaderViewButton,
ui->gsShaderViewButton, ui->psShaderViewButton, ui->csShaderViewButton,
@@ -172,6 +178,9 @@ D3D12PipelineStateViewer::D3D12PipelineStateViewer(ICaptureContext &ctx,
for(QToolButton *b : viewButtons)
QObject::connect(b, &QToolButton::clicked, this, &D3D12PipelineStateViewer::shaderView_clicked);
for(QToolButton *b : sigButtons)
QObject::connect(b, &QToolButton::clicked, this, &D3D12PipelineStateViewer::rootSigView_clicked);
for(RDLabel *b : shaderLabels)
{
b->setAutoFillBackground(true);
@@ -1086,6 +1095,14 @@ void D3D12PipelineStateViewer::clearState()
for(QToolButton *b : shaderButtons)
b->setEnabled(false);
QToolButton *sigButtons[] = {
ui->vsRootSigButton, ui->hsRootSigButton, ui->dsRootSigButton, ui->gsRootSigButton,
ui->psRootSigButton, ui->csRootSigButton, ui->asRootSigButton, ui->msRootSigButton,
};
for(QToolButton *b : sigButtons)
b->setEnabled(false);
const QPixmap &tick = Pixmaps::tick(this);
const QPixmap &cross = Pixmaps::cross(this);
@@ -1883,6 +1900,14 @@ void D3D12PipelineStateViewer::setState()
m_Common.SetupShaderEditButton(b, state.pipelineResourceId, stage->resourceId, stage->reflection);
}
QToolButton *sigButtons[] = {
ui->vsRootSigButton, ui->hsRootSigButton, ui->dsRootSigButton, ui->gsRootSigButton,
ui->psRootSigButton, ui->csRootSigButton, ui->asRootSigButton, ui->msRootSigButton,
};
for(QToolButton *b : sigButtons)
b->setEnabled(state.rootSignature.resourceId != ResourceId());
bool streamoutSet = false;
vs = ui->gsStreamOut->verticalScrollBar()->value();
ui->gsStreamOut->beginUpdate();
@@ -2537,6 +2562,15 @@ void D3D12PipelineStateViewer::shaderView_clicked()
m_Ctx.AddDockWindow(shad->Widget(), DockReference::AddTo, this);
}
void D3D12PipelineStateViewer::rootSigView_clicked()
{
DescriptorViewer *view = (DescriptorViewer *)m_Ctx.ViewDescriptors({}, {});
view->ViewD3D12State();
m_Ctx.AddDockWindow(view->Widget(), DockReference::AddTo, this);
}
void D3D12PipelineStateViewer::shaderSave_clicked()
{
const D3D12Pipe::Shader *stage = stageForSender(qobject_cast<QWidget *>(QObject::sender()));
@@ -74,6 +74,7 @@ private slots:
// manual slots
void shaderView_clicked();
void rootSigView_clicked();
void shaderSave_clicked();
void resource_itemActivated(RDTreeWidgetItem *item, int column);
void cbuffer_itemActivated(RDTreeWidgetItem *item, int column);
@@ -506,7 +506,7 @@
</sizepolicy>
</property>
<property name="title">
<string>Shader</string>
<string>Root Signature &amp;&amp; Shader</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="spacing">
@@ -525,6 +525,29 @@
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="vsRootSigButton">
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="toolTip">
<string>Open Root Signature View</string>
</property>
<property name="text">
<string>View</string>
</property>
<property name="icon">
<iconset resource="../../Resources/resources.qrc">
<normaloff>:/action.png</normaloff>:/action.png</iconset>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="vsShader">
<property name="frameShape">
@@ -912,7 +935,7 @@
</sizepolicy>
</property>
<property name="title">
<string>Shader</string>
<string>Root Signature &amp;&amp; Shader</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<property name="spacing">
@@ -931,6 +954,29 @@
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="hsRootSigButton">
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="toolTip">
<string>Open Root Signature View</string>
</property>
<property name="text">
<string>View</string>
</property>
<property name="icon">
<iconset resource="../../Resources/resources.qrc">
<normaloff>:/action.png</normaloff>:/action.png</iconset>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="hsShader">
<property name="frameShape">
@@ -1318,7 +1364,7 @@
</sizepolicy>
</property>
<property name="title">
<string>Shader</string>
<string>Root Signature &amp;&amp; Shader</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_10">
<property name="spacing">
@@ -1337,6 +1383,29 @@
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="dsRootSigButton">
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="toolTip">
<string>Open Root Signature View</string>
</property>
<property name="text">
<string>View</string>
</property>
<property name="icon">
<iconset resource="../../Resources/resources.qrc">
<normaloff>:/action.png</normaloff>:/action.png</iconset>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="dsShader">
<property name="frameShape">
@@ -1724,7 +1793,7 @@
</sizepolicy>
</property>
<property name="title">
<string>Shader</string>
<string>Root Signature &amp;&amp; Shader</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_13">
<property name="spacing">
@@ -1743,6 +1812,29 @@
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="gsRootSigButton">
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="toolTip">
<string>Open Root Signature View</string>
</property>
<property name="text">
<string>View</string>
</property>
<property name="icon">
<iconset resource="../../Resources/resources.qrc">
<normaloff>:/action.png</normaloff>:/action.png</iconset>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="gsShader">
<property name="frameShape">
@@ -2750,7 +2842,7 @@
</sizepolicy>
</property>
<property name="title">
<string>Shader</string>
<string>Root Signature &amp;&amp; Shader</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_16">
<property name="spacing">
@@ -2769,6 +2861,29 @@
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="psRootSigButton">
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="toolTip">
<string>Open Root Signature View</string>
</property>
<property name="text">
<string>View</string>
</property>
<property name="icon">
<iconset resource="../../Resources/resources.qrc">
<normaloff>:/action.png</normaloff>:/action.png</iconset>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="psShader">
<property name="frameShape">
@@ -3684,7 +3799,7 @@
</sizepolicy>
</property>
<property name="title">
<string>Shader</string>
<string>Root Signature &amp;&amp; Shader</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<property name="spacing">
@@ -3715,6 +3830,29 @@
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="csRootSigButton">
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="toolTip">
<string>Open Root Signature View</string>
</property>
<property name="text">
<string>View</string>
</property>
<property name="icon">
<iconset resource="../../Resources/resources.qrc">
<normaloff>:/action.png</normaloff>:/action.png</iconset>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="csShader">
<property name="frameShape">
@@ -4122,7 +4260,7 @@
</sizepolicy>
</property>
<property name="title">
<string>Shader</string>
<string>Root Signature &amp;&amp; Shader</string>
</property>
<layout class="QHBoxLayout" name="asHorizontalLayout1">
<property name="spacing">
@@ -4153,6 +4291,29 @@
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="asRootSigButton">
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="toolTip">
<string>Open Root Signature View</string>
</property>
<property name="text">
<string>View</string>
</property>
<property name="icon">
<iconset resource="../../Resources/resources.qrc">
<normaloff>:/action.png</normaloff>:/action.png</iconset>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="asShader">
<property name="frameShape">
@@ -4543,7 +4704,7 @@
</sizepolicy>
</property>
<property name="title">
<string>Shader</string>
<string>Root Signature &amp;&amp; Shader</string>
</property>
<layout class="QHBoxLayout" name="msHorizontalLayout1">
<property name="spacing">
@@ -4574,6 +4735,29 @@
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="msRootSigButton">
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="toolTip">
<string>Open Root Signature View</string>
</property>
<property name="text">
<string>View</string>
</property>
<property name="icon">
<iconset resource="../../Resources/resources.qrc">
<normaloff>:/action.png</normaloff>:/action.png</iconset>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="RDLabel" name="msShader">
<property name="frameShape">
@@ -145,6 +145,11 @@ VulkanPipelineStateViewer::VulkanPipelineStateViewer(ICaptureContext &ctx,
ui->tesShader, ui->gsShader, ui->fsShader, ui->csShader,
};
RDLabel *pipeLayoutLabels[] = {
ui->tsPipeLayout, ui->msPipeLayout, ui->vsPipeLayout, ui->tcsPipeLayout,
ui->tesPipeLayout, ui->gsPipeLayout, ui->fsPipeLayout, ui->csPipeLayout,
};
QToolButton *viewButtons[] = {
ui->tsShaderViewButton, ui->msShaderViewButton, ui->vsShaderViewButton,
ui->tcsShaderViewButton, ui->tesShaderViewButton, ui->gsShaderViewButton,
@@ -184,6 +189,11 @@ VulkanPipelineStateViewer::VulkanPipelineStateViewer(ICaptureContext &ctx,
ui->tesUBOs, ui->gsUBOs, ui->fsUBOs, ui->csUBOs,
};
RDTreeWidget *descSets[] = {
ui->tsDescSets, ui->msDescSets, ui->vsDescSets, ui->tcsDescSets,
ui->tesDescSets, ui->gsDescSets, ui->fsDescSets, ui->csDescSets,
};
// setup FlowLayout for CS shader group, with debugging controls
{
QLayout *oldLayout = ui->csShaderGroup->layout();
@@ -210,8 +220,28 @@ VulkanPipelineStateViewer::VulkanPipelineStateViewer(ICaptureContext &ctx,
b->setBackgroundRole(QPalette::ToolTipBase);
b->setForegroundRole(QPalette::ToolTipText);
b->setMinimumSizeHint(QSize(250, 0));
b->setFont(Formatter::PreferredFont());
}
for(RDLabel *b : pipeLayoutLabels)
{
b->setAutoFillBackground(true);
b->setBackgroundRole(QPalette::ToolTipBase);
b->setForegroundRole(QPalette::ToolTipText);
b->setMinimumSizeHint(QSize(250, ui->vsShaderViewButton->minimumSizeHint().height()));
b->setFont(Formatter::PreferredFont());
}
// collapse the descriptor groups by default
ui->vsDescGroup->setCollapsed(true);
ui->tcsDescGroup->setCollapsed(true);
ui->tesDescGroup->setCollapsed(true);
ui->gsDescGroup->setCollapsed(true);
ui->fsDescGroup->setCollapsed(true);
ui->csDescGroup->setCollapsed(true);
ui->tsDescGroup->setCollapsed(true);
ui->msDescGroup->setCollapsed(true);
QObject::connect(m_ComputeDebugSelector, &ComputeDebugSelector::beginDebug, this,
&VulkanPipelineStateViewer::computeDebugSelector_beginDebug);
@@ -251,6 +281,10 @@ VulkanPipelineStateViewer::VulkanPipelineStateViewer(ICaptureContext &ctx,
QObject::connect(ubo, &RDTreeWidget::itemActivated, this,
&VulkanPipelineStateViewer::ubo_itemActivated);
for(RDTreeWidget *desc : descSets)
QObject::connect(desc, &RDTreeWidget::itemActivated, this,
&VulkanPipelineStateViewer::descSet_itemActivated);
{
QMenu *extensionsMenu = new QMenu(this);
@@ -328,6 +362,23 @@ VulkanPipelineStateViewer::VulkanPipelineStateViewer(ICaptureContext &ctx,
m_Common.SetupResourceView(ubo);
}
for(RDTreeWidget *desc : descSets)
{
RDHeaderView *header = new RDHeaderView(Qt::Horizontal, this);
desc->setHeader(header);
desc->setColumns({tr("Index"), tr("Layout"), tr("Bound Set"), tr("Go")});
header->setColumnStretchHints({-1, 4, 4, -1});
desc->setHoverIconColumn(3, action, action_hover);
desc->setClearSelectionOnFocusLoss(true);
desc->setInstantTooltips(true);
m_Common.SetupResourceView(desc);
}
ui->vsDescGroupVLayout->activate();
{
RDHeaderView *header = new RDHeaderView(Qt::Horizontal, this);
ui->xfbBuffers->setHeader(header);
@@ -441,28 +492,20 @@ VulkanPipelineStateViewer::VulkanPipelineStateViewer(ICaptureContext &ctx,
ui->viAttrs->setFont(Formatter::PreferredFont());
ui->viBuffers->setFont(Formatter::PreferredFont());
ui->tsShader->setFont(Formatter::PreferredFont());
ui->tsResources->setFont(Formatter::PreferredFont());
ui->tsUBOs->setFont(Formatter::PreferredFont());
ui->msShader->setFont(Formatter::PreferredFont());
ui->msResources->setFont(Formatter::PreferredFont());
ui->msUBOs->setFont(Formatter::PreferredFont());
ui->vsShader->setFont(Formatter::PreferredFont());
ui->vsResources->setFont(Formatter::PreferredFont());
ui->vsUBOs->setFont(Formatter::PreferredFont());
ui->gsShader->setFont(Formatter::PreferredFont());
ui->gsResources->setFont(Formatter::PreferredFont());
ui->gsUBOs->setFont(Formatter::PreferredFont());
ui->tcsShader->setFont(Formatter::PreferredFont());
ui->tcsResources->setFont(Formatter::PreferredFont());
ui->tcsUBOs->setFont(Formatter::PreferredFont());
ui->tesShader->setFont(Formatter::PreferredFont());
ui->tesResources->setFont(Formatter::PreferredFont());
ui->tesUBOs->setFont(Formatter::PreferredFont());
ui->fsShader->setFont(Formatter::PreferredFont());
ui->fsResources->setFont(Formatter::PreferredFont());
ui->fsUBOs->setFont(Formatter::PreferredFont());
ui->csShader->setFont(Formatter::PreferredFont());
ui->csResources->setFont(Formatter::PreferredFont());
ui->csUBOs->setFont(Formatter::PreferredFont());
ui->xfbBuffers->setFont(Formatter::PreferredFont());
@@ -895,12 +938,15 @@ void VulkanPipelineStateViewer::setNewMeshPipeFlow()
ui->pipeFlow->setIsolatedStage(5); // compute shader isolated
}
void VulkanPipelineStateViewer::clearShaderState(RDLabel *shader, RDTreeWidget *resources,
RDTreeWidget *cbuffers)
void VulkanPipelineStateViewer::clearShaderState(RDLabel *shader, RDLabel *pipeLayout,
RDTreeWidget *resources, RDTreeWidget *cbuffers,
RDTreeWidget *descSets)
{
pipeLayout->setText(tr("Pipeline Layout"));
shader->setText(QFormatStr("%1: %1").arg(ToQStr(ResourceId())));
resources->clear();
cbuffers->clear();
descSets->clear();
}
void VulkanPipelineStateViewer::clearState()
@@ -917,14 +963,14 @@ void VulkanPipelineStateViewer::clearState()
ui->primRestart->setVisible(false);
ui->topologyDiagram->setPixmap(QPixmap());
clearShaderState(ui->tsShader, ui->tsResources, ui->tsUBOs);
clearShaderState(ui->msShader, ui->msResources, ui->msUBOs);
clearShaderState(ui->vsShader, ui->vsResources, ui->vsUBOs);
clearShaderState(ui->tcsShader, ui->tcsResources, ui->tcsUBOs);
clearShaderState(ui->tesShader, ui->tesResources, ui->tesUBOs);
clearShaderState(ui->gsShader, ui->gsResources, ui->gsUBOs);
clearShaderState(ui->fsShader, ui->fsResources, ui->fsUBOs);
clearShaderState(ui->csShader, ui->csResources, ui->csUBOs);
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);
ui->xfbBuffers->clear();
@@ -1618,7 +1664,8 @@ void VulkanPipelineStateViewer::addConstantBlockRow(const ConstantBlock *cblock,
}
void VulkanPipelineStateViewer::setShaderState(const VKPipe::Pipeline &pipe,
const VKPipe::Shader &stage, RDLabel *shader)
const VKPipe::Shader &stage, RDLabel *shader,
RDLabel *pipeLayout, RDTreeWidget *descSets)
{
ShaderReflection *shaderDetails = stage.reflection;
@@ -1643,6 +1690,31 @@ void VulkanPipelineStateViewer::setShaderState(const VKPipe::Pipeline &pipe,
shText += tr(" (Subgroup size %1)").arg(stage.requiredSubgroupSize);
shader->setText(shText);
if(pipe.pipelineComputeLayoutResourceId != ResourceId())
{
pipeLayout->setText(tr("Pipeline Layout: %1").arg(ToQStr(pipe.pipelineComputeLayoutResourceId)));
}
else if(pipe.pipelinePreRastLayoutResourceId == pipe.pipelineFragmentLayoutResourceId)
{
pipeLayout->setText(tr("Pipeline Layout: %1").arg(ToQStr(pipe.pipelineFragmentLayoutResourceId)));
}
else
{
pipeLayout->setText(tr("Pipeline Layouts: %1 and %2")
.arg(ToQStr(pipe.pipelinePreRastLayoutResourceId))
.arg(ToQStr(pipe.pipelineFragmentLayoutResourceId)));
}
descSets->clear();
for(uint32_t i = 0; i < pipe.descriptorSets.size(); i++)
{
RDTreeWidgetItem *item =
new RDTreeWidgetItem({i, pipe.descriptorSets[i].layoutResourceId,
pipe.descriptorSets[i].descriptorSetResourceId, QString()});
item->setTag(i);
descSets->addTopLevelItem(item);
}
}
void VulkanPipelineStateViewer::setState()
@@ -1727,8 +1799,8 @@ void VulkanPipelineStateViewer::setState()
if(m_MeshPipe)
{
setShaderState(state.graphics, state.taskShader, ui->tsShader);
setShaderState(state.graphics, state.meshShader, ui->msShader);
setShaderState(state.graphics, state.taskShader, ui->tsShader, ui->tsPipeLayout, ui->tsDescSets);
setShaderState(state.graphics, state.meshShader, ui->msShader, ui->msPipeLayout, ui->msDescSets);
if(state.meshShader.reflection)
ui->msTopology->setText(ToQStr(state.meshShader.reflection->outputTopology));
@@ -1998,14 +2070,19 @@ void VulkanPipelineStateViewer::setState()
ui->viBuffers->endUpdate();
ui->viBuffers->verticalScrollBar()->setValue(vs);
setShaderState(state.graphics, state.vertexShader, ui->vsShader);
setShaderState(state.graphics, state.geometryShader, ui->gsShader);
setShaderState(state.graphics, state.tessControlShader, ui->tcsShader);
setShaderState(state.graphics, state.tessEvalShader, ui->tesShader);
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.fragmentShader, ui->fsShader);
setShaderState(state.compute, state.computeShader, ui->csShader);
setShaderState(state.graphics, state.fragmentShader, ui->fsShader, ui->fsPipeLayout,
ui->fsDescSets);
setShaderState(state.compute, state.computeShader, ui->csShader, ui->csPipeLayout, ui->csDescSets);
// fill in descriptor access
{
@@ -3016,6 +3093,27 @@ void VulkanPipelineStateViewer::ubo_itemActivated(RDTreeWidgetItem *item, int co
m_Ctx.AddDockWindow(prev->Widget(), DockReference::TransientPopupArea, this, 0.3f);
}
void VulkanPipelineStateViewer::descSet_itemActivated(RDTreeWidgetItem *item, int column)
{
const VKPipe::Shader *stage = stageForSender(item->treeWidget());
if(stage == NULL)
return;
int index = item->tag().toInt();
const rdcarray<VKPipe::DescriptorSet> &descSets =
stage->stage == ShaderStage::Compute ? m_Ctx.CurVulkanPipelineState()->compute.descriptorSets
: m_Ctx.CurVulkanPipelineState()->graphics.descriptorSets;
if(index < descSets.count())
{
IDescriptorViewer *viewer = m_Ctx.ViewDescriptorStore(descSets[index].descriptorSetResourceId);
m_Ctx.AddDockWindow(viewer->Widget(), DockReference::AddTo, this);
}
}
void VulkanPipelineStateViewer::on_viAttrs_itemActivated(RDTreeWidgetItem *item, int column)
{
on_meshView_clicked();
@@ -86,6 +86,7 @@ private slots:
void resource_itemActivated(RDTreeWidgetItem *item, int column);
void resource_hoverItemChanged(RDTreeWidgetItem *hover);
void ubo_itemActivated(RDTreeWidgetItem *item, int column);
void descSet_itemActivated(RDTreeWidgetItem *item, int column);
void vertex_leave(QEvent *e);
void on_computeDebugSelector_clicked();
@@ -111,8 +112,10 @@ 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);
void clearShaderState(RDLabel *shader, RDTreeWidget *res, RDTreeWidget *ubo);
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 setState();
void clearState();
@@ -633,6 +633,83 @@
</layout>
</widget>
</item>
<item>
<widget class="CollapseGroupBox" name="vsDescGroup">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Descriptor Sets</string>
</property>
<layout class="QVBoxLayout" name="vsDescGroupVLayout">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="RDLabel" name="vsPipeLayout">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<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="RDTreeWidget" name="vsDescSets">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<property name="allColumnsShowFocus">
<bool>true</bool>
</property>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QScrollArea" name="vsScroll">
<property name="frameShape">
@@ -945,6 +1022,83 @@
</layout>
</widget>
</item>
<item>
<widget class="CollapseGroupBox" name="tcsDescGroup">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Descriptor Sets</string>
</property>
<layout class="QVBoxLayout" name="tcsDescGroupVLayout">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="RDLabel" name="tcsPipeLayout">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<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="RDTreeWidget" name="tcsDescSets">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<property name="allColumnsShowFocus">
<bool>true</bool>
</property>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QScrollArea" name="tcsScroll">
<property name="frameShape">
@@ -1257,6 +1411,83 @@
</layout>
</widget>
</item>
<item>
<widget class="CollapseGroupBox" name="tesDescGroup">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Descriptor Sets</string>
</property>
<layout class="QVBoxLayout" name="tesDescGroupVLayout">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="RDLabel" name="tesPipeLayout">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<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="RDTreeWidget" name="tesDescSets">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<property name="allColumnsShowFocus">
<bool>true</bool>
</property>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QScrollArea" name="tesScroll">
<property name="frameShape">
@@ -1569,6 +1800,83 @@
</layout>
</widget>
</item>
<item>
<widget class="CollapseGroupBox" name="gsDescGroup">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Descriptor Sets</string>
</property>
<layout class="QVBoxLayout" name="gsDescGroupVLayout">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="RDLabel" name="gsPipeLayout">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<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="RDTreeWidget" name="gsDescSets">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<property name="allColumnsShowFocus">
<bool>true</bool>
</property>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QScrollArea" name="gsScroll">
<property name="frameShape">
@@ -3004,6 +3312,83 @@
</layout>
</widget>
</item>
<item>
<widget class="CollapseGroupBox" name="fsDescGroup">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Descriptor Sets</string>
</property>
<layout class="QVBoxLayout" name="fsDescGroupVLayout">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="RDLabel" name="fsPipeLayout">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<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="RDTreeWidget" name="fsDescSets">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<property name="allColumnsShowFocus">
<bool>true</bool>
</property>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QScrollArea" name="fsScroll">
<property name="frameShape">
@@ -3895,6 +4280,83 @@
</layout>
</widget>
</item>
<item>
<widget class="CollapseGroupBox" name="csDescGroup">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Descriptor Sets</string>
</property>
<layout class="QVBoxLayout" name="csDescGroupVLayout">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="RDLabel" name="csPipeLayout">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<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="RDTreeWidget" name="csDescSets">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<property name="allColumnsShowFocus">
<bool>true</bool>
</property>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="csConditionalRenderingGroup">
<property name="title">
@@ -4282,6 +4744,83 @@
</layout>
</widget>
</item>
<item>
<widget class="CollapseGroupBox" name="tsDescGroup">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Descriptor Sets</string>
</property>
<layout class="QVBoxLayout" name="tsDescGroupVLayout">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="RDLabel" name="tsPipeLayout">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<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="RDTreeWidget" name="tsDescSets">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<property name="allColumnsShowFocus">
<bool>true</bool>
</property>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QScrollArea" name="tsScroll">
<property name="frameShape">
@@ -4628,6 +5167,83 @@
</layout>
</widget>
</item>
<item>
<widget class="CollapseGroupBox" name="msDescGroup">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Descriptor Sets</string>
</property>
<layout class="QVBoxLayout" name="msDescGroupVLayout">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="RDLabel" name="msPipeLayout">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<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="RDTreeWidget" name="msDescSets">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<property name="allColumnsShowFocus">
<bool>true</bool>
</property>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QScrollArea" name="msScroll">
<property name="frameShape">
+11
View File
@@ -835,6 +835,17 @@ struct CaptureContextInvoker : ObjectForwarder<ICaptureContext>
return InvokeRetFunction<IShaderMessageViewer *>(&ICaptureContext::ViewShaderMessages, stages);
}
virtual IDescriptorViewer *ViewDescriptorStore(ResourceId id) override
{
return InvokeRetFunction<IDescriptorViewer *>(&ICaptureContext::ViewDescriptorStore, id);
}
virtual IDescriptorViewer *ViewDescriptors(const rdcarray<Descriptor> &descriptors,
const rdcarray<SamplerDescriptor> &samplerDescriptors) override
{
return InvokeRetFunction<IDescriptorViewer *>(&ICaptureContext::ViewDescriptors, descriptors,
samplerDescriptors);
}
virtual IBufferViewer *ViewBuffer(uint64_t byteOffset, uint64_t byteSize, ResourceId id,
const rdcstr &format = "") override
{
+9 -1
View File
@@ -262,7 +262,8 @@ void ResourceInspector::Inspect(ResourceId id)
m_Resource = id;
ui->viewContents->setVisible(m_Ctx.GetTexture(id) || m_Ctx.GetBuffer(id));
ui->viewContents->setVisible(m_Ctx.GetTexture(id) || m_Ctx.GetBuffer(id) ||
m_Ctx.GetDescriptorStore(id));
m_Entries.clear();
@@ -568,6 +569,7 @@ void ResourceInspector::on_viewContents_clicked()
{
TextureDescription *tex = m_Ctx.GetTexture(m_Resource);
BufferDescription *buf = m_Ctx.GetBuffer(m_Resource);
DescriptorStoreDescription *desc = m_Ctx.GetDescriptorStore(m_Resource);
if(tex)
{
@@ -592,6 +594,12 @@ void ResourceInspector::on_viewContents_clicked()
m_Ctx.AddDockWindow(viewer->Widget(), DockReference::AddTo, this);
}
else if(desc)
{
IDescriptorViewer *viewer = m_Ctx.ViewDescriptorStore(desc->resourceId);
m_Ctx.AddDockWindow(viewer->Widget(), DockReference::AddTo, this);
}
else if(!m_Entries.isEmpty())
{
ShaderEntryPoint entry = m_Entries[0];
+4 -98
View File
@@ -37,102 +37,6 @@
static const int debuggableRole = Qt::UserRole + 1;
static const int gotoableRole = Qt::UserRole + 2;
ButtonDelegate::ButtonDelegate(const QIcon &icon, int enableRole, QWidget *parent)
: m_Icon(icon), m_EnableRole(enableRole), QStyledItemDelegate(parent)
{
}
void ButtonDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
// draw the background to get selection etc
QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &option, painter);
QStyleOptionButton button;
QSize sz = sizeHint(option, index);
button.rect = option.rect;
button.rect.setLeft(button.rect.center().x() - sz.width() / 2);
button.rect.setTop(button.rect.center().y() - sz.height() / 2);
button.rect.setSize(sz);
button.icon = m_Icon;
button.iconSize = sz;
if(m_EnableRole == 0 || index.data(m_EnableRole).toBool())
button.state = QStyle::State_Enabled;
if(m_ClickedIndex == index)
button.state |= QStyle::State_Sunken;
QApplication::style()->drawControl(QStyle::CE_PushButton, &button, painter);
}
QSize ButtonDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionButton button;
button.icon = m_Icon;
button.state = QStyle::State_Enabled;
return QApplication::style()->sizeFromContents(QStyle::CT_PushButton, &button,
option.decorationSize);
}
bool ButtonDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
const QStyleOptionViewItem &option, const QModelIndex &index)
{
if(event->type() == QEvent::MouseButtonPress)
{
if(m_EnableRole == 0 || index.data(m_EnableRole).toBool())
m_ClickedIndex = index;
}
else if(event->type() == QEvent::MouseMove)
{
QMouseEvent *e = (QMouseEvent *)event;
if(m_ClickedIndex != index || (e->buttons() & Qt::LeftButton) == 0)
{
m_ClickedIndex = QModelIndex();
}
else
{
QPoint p = e->pos();
QSize sz = option.decorationSize;
QRect rect = option.rect;
rect.setLeft(rect.center().x() - sz.width() / 2);
rect.setTop(rect.center().y() - sz.height() / 2);
rect.setSize(sz);
if(!rect.contains(p))
{
m_ClickedIndex = QModelIndex();
}
}
}
else if(event->type() == QEvent::MouseButtonRelease)
{
if(m_ClickedIndex == index && index != QModelIndex())
{
m_ClickedIndex = QModelIndex();
QMouseEvent *e = (QMouseEvent *)event;
QPoint p = e->pos();
QSize sz = option.decorationSize;
QRect rect = option.rect;
rect.setLeft(rect.center().x() - sz.width() / 2);
rect.setTop(rect.center().y() - sz.height() / 2);
rect.setSize(sz);
if(rect.contains(p))
emit messageClicked(index);
}
}
return true;
}
ShaderMessageViewer::ShaderMessageViewer(ICaptureContext &ctx, ShaderStageMask stages, QWidget *parent)
: QFrame(parent), ui(new Ui::ShaderMessageViewer), m_Ctx(ctx)
{
@@ -211,7 +115,8 @@ ShaderMessageViewer::ShaderMessageViewer(ICaptureContext &ctx, ShaderStageMask s
int sortColumn = 0;
m_debugDelegate = new ButtonDelegate(Icons::wrench(), debuggableRole, this);
m_debugDelegate = new ButtonDelegate(Icons::wrench(), QString(), this);
m_debugDelegate->setEnableTrigger(debuggableRole, true);
if(m_Action && (m_Action->flags & ActionFlags::Dispatch))
{
@@ -248,7 +153,8 @@ ShaderMessageViewer::ShaderMessageViewer(ICaptureContext &ctx, ShaderStageMask s
m_LayoutStage = ShaderStage::Vertex;
}
m_gotoDelegate = new ButtonDelegate(Icons::find(), gotoableRole, this);
m_gotoDelegate = new ButtonDelegate(Icons::find(), QString(), this);
m_gotoDelegate->setEnableTrigger(gotoableRole, true);
ui->messages->setItemDelegateForColumn(0, m_debugDelegate);
ui->messages->setItemDelegateForColumn(1, m_gotoDelegate);
+2 -20
View File
@@ -28,31 +28,13 @@
#include <QStyledItemDelegate>
#include "Code/Interface/QRDInterface.h"
class ButtonDelegate;
namespace Ui
{
class ShaderMessageViewer;
}
class ButtonDelegate : public QStyledItemDelegate
{
private:
Q_OBJECT
QModelIndex m_ClickedIndex;
QIcon m_Icon;
int m_EnableRole;
public:
ButtonDelegate(const QIcon &icon, int enableRole, QWidget *parent);
void paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const override;
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option,
const QModelIndex &index) override;
signals:
void messageClicked(const QModelIndex &index);
};
class ShaderMessageViewer : public QFrame, public IShaderMessageViewer, public ICaptureViewer
{
Q_OBJECT