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

This commit is contained in:
baldurk
2024-04-10 14:08:01 +01:00
parent 153cd2aa16
commit 1194531fc5
22 changed files with 3043 additions and 157 deletions
+1 -1
View File
@@ -2410,7 +2410,7 @@ QString BufferFormatter::GetBufferFormatString(Packing::Rules pack, ResourceId s
}
else
{
const auto &desc = res.variableType;
const ShaderConstantType &desc = res.variableType;
if(viewFormat.type == ResourceFormatType::Undefined)
{
+20
View File
@@ -42,6 +42,7 @@
#include "Windows/BufferViewer.h"
#include "Windows/CommentView.h"
#include "Windows/DebugMessageView.h"
#include "Windows/DescriptorViewer.h"
#include "Windows/Dialogs/CaptureDialog.h"
#include "Windows/Dialogs/CrashDialog.h"
#include "Windows/Dialogs/LiveCapture.h"
@@ -2589,6 +2590,25 @@ IShaderMessageViewer *CaptureContext::ViewShaderMessages(ShaderStageMask stages)
return new ShaderMessageViewer(*this, stages, m_MainWindow);
}
IDescriptorViewer *CaptureContext::ViewDescriptorStore(ResourceId id)
{
DescriptorViewer *viewer = new DescriptorViewer(*this, m_MainWindow);
viewer->ViewDescriptorStore(id);
return viewer;
}
IDescriptorViewer *CaptureContext::ViewDescriptors(const rdcarray<Descriptor> &descriptors,
const rdcarray<SamplerDescriptor> &samplerDescriptors)
{
DescriptorViewer *viewer = new DescriptorViewer(*this, m_MainWindow);
viewer->ViewDescriptors(descriptors, samplerDescriptors);
return viewer;
}
IBufferViewer *CaptureContext::ViewBuffer(uint64_t byteOffset, uint64_t byteSize, ResourceId id,
const rdcstr &format)
{
+3
View File
@@ -266,6 +266,9 @@ public:
IShaderMessageViewer *ViewShaderMessages(ShaderStageMask stages) override;
IDescriptorViewer *ViewDescriptorStore(ResourceId id) override;
IDescriptorViewer *ViewDescriptors(const rdcarray<Descriptor> &descriptors,
const rdcarray<SamplerDescriptor> &samplerDescriptors) override;
IBufferViewer *ViewBuffer(uint64_t byteOffset, uint64_t byteSize, ResourceId id,
const rdcstr &format = "") override;
IBufferViewer *ViewTextureAsBuffer(ResourceId id, const Subresource &sub,
+28
View File
@@ -2608,6 +2608,34 @@ through the execution of a given shader.
)");
virtual IShaderMessageViewer *ViewShaderMessages(ShaderStageMask stages) = 0;
DOCUMENT(R"(Show a new :class:`DescriptorViewer` window, showing the full raw contents of a
descriptor store.
:param renderdoc.ResourceId id: The ID of the descriptor store to fetch data from.
:return: The new :class:`DescriptorViewer` window opened, but not shown.
:rtype: DescriptorViewer
)");
virtual IDescriptorViewer *ViewDescriptorStore(ResourceId id) = 0;
DOCUMENT(R"(Show a new :class:`DescriptorViewer` window, showing contents of an arbitrary list of
descriptors.
The descriptor lists should be in parallel, with identical sizes. If a non-sampler descriptor is
to be displayed, the corresponding sampler descriptor should be uninitialised and vice-versa. If
the lists are not the same length, only indices up to the minimum of the two lengths will be used.
This function should not be used to view the entirety of a descriptor store - in that case the
:func:`ViewDescriptorStore` function will be more efficient.
:param List[renderdoc.Descriptor] descriptors: The list of descriptors to process and show.
:param List[renderdoc.Descriptor] samplerDescriptors: The list of sampler descriptors to process and
show.
:return: The new :class:`DescriptorViewer` window opened, but not shown.
:rtype: DescriptorViewer
)");
virtual IDescriptorViewer *ViewDescriptors(const rdcarray<Descriptor> &descriptors,
const rdcarray<SamplerDescriptor> &samplerDescriptors) = 0;
DOCUMENT(R"(Show a new :class:`BufferViewer` window, showing a read-only view of buffer data.
:param int byteOffset: The offset in bytes to the start of the buffer data to show.
+128
View File
@@ -1365,6 +1365,134 @@ bool RichTextViewDelegate::linkHover(QMouseEvent *e, const QFont &font, const QM
return false;
}
ButtonDelegate::ButtonDelegate(const QIcon &icon, QString text, QWidget *parent)
: m_Icon(icon), m_Text(text), QStyledItemDelegate(parent)
{
}
void ButtonDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
if(m_VisibleRole != -1 && index.data(m_VisibleRole) != m_VisibleValue)
return QStyledItemDelegate::paint(painter, option, index);
// draw the background to get selection etc
QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &option, painter);
QStyleOptionButton button;
button.text = m_Text;
button.icon = m_Icon;
if(m_EnableRole == -1 || index.data(m_EnableRole) == m_EnableValue)
button.state = QStyle::State_Enabled;
if(m_ClickedIndex == index)
button.state |= QStyle::State_Sunken;
QSize sz =
QApplication::style()->sizeFromContents(QStyle::CT_PushButton, &button, option.decorationSize);
button.rect = getButtonRect(option.rect, sz);
button.iconSize = option.decorationSize;
QApplication::style()->drawControl(QStyle::CE_PushButton, &button, painter);
}
QSize ButtonDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if(m_VisibleRole != -1 && index.data(m_VisibleRole) != m_VisibleValue)
return QStyledItemDelegate::sizeHint(option, index);
QStyleOptionButton button;
button.text = m_Text;
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(m_VisibleRole != -1 && index.data(m_VisibleRole) != m_VisibleValue)
return QStyledItemDelegate::editorEvent(event, model, option, index);
if(event->type() == QEvent::MouseButtonPress)
{
QMouseEvent *e = (QMouseEvent *)event;
QPoint p = e->pos();
QSize sz = sizeHint(option, index);
QRect rect = getButtonRect(option.rect, sz);
if(rect.contains(p) && (m_EnableRole == -1 || index.data(m_EnableRole) == m_EnableValue))
{
m_ClickedIndex = index;
return true;
}
}
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 = sizeHint(option, index);
QRect rect = getButtonRect(option.rect, 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 = sizeHint(option, index);
QRect rect = getButtonRect(option.rect, sz);
if(rect.contains(p))
{
emit messageClicked(index);
return true;
}
}
}
return QStyledItemDelegate::editorEvent(event, model, option, index);
}
QRect ButtonDelegate::getButtonRect(const QRect boundsRect, const QSize sz) const
{
QRect rect = boundsRect;
rect.setWidth(qMin(rect.width(), sz.width()));
rect.setHeight(qMin(rect.height(), sz.height()));
if(m_Centered)
rect.moveLeft(rect.center().x() - rect.width() / 2);
rect.moveTop(rect.center().y() - rect.height() / 2);
// clip if the rounding from centering caused us to go out of bounds
rect.setTop(qMax(rect.top(), boundsRect.top()));
rect.setLeft(qMax(rect.left(), boundsRect.left()));
return rect;
}
#include "renderdoc_tostr.inl"
QString ToQStr(const ResourceUsage usage, const GraphicsAPI apitype)
+41
View File
@@ -766,6 +766,47 @@ private:
QAbstractItemView *m_widget;
};
class ButtonDelegate : public QStyledItemDelegate
{
private:
Q_OBJECT
QModelIndex m_ClickedIndex;
QIcon m_Icon;
QString m_Text;
bool m_Centered = true;
int m_EnableRole = -1;
QVariant m_EnableValue;
int m_VisibleRole = -1;
QVariant m_VisibleValue;
QRect getButtonRect(const QRect boundsRect, const QSize sz) const;
public:
ButtonDelegate(const QIcon &icon, QString text, 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;
void setVisibleTrigger(int role, QVariant value)
{
m_VisibleRole = role;
m_VisibleValue = value;
}
void setEnableTrigger(int role, QVariant value)
{
m_EnableRole = role;
m_EnableValue = value;
}
void setCentred(bool centered) { m_Centered = centered; }
signals:
void messageClicked(const QModelIndex &index);
};
class StructuredDataItemModel : public QAbstractItemModel
{
public:
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
+3
View File
@@ -190,6 +190,7 @@ SOURCES += Code/qrenderdoc.cpp \
Windows/TextureViewer.cpp \
Windows/ShaderViewer.cpp \
Windows/ShaderMessageViewer.cpp \
Windows/DescriptorViewer.cpp \
Widgets/Extended/RDLineEdit.cpp \
Widgets/Extended/RDTextEdit.cpp \
Widgets/Extended/RDLabel.cpp \
@@ -275,6 +276,7 @@ HEADERS += Code/CaptureContext.h \
Windows/TextureViewer.h \
Windows/ShaderViewer.h \
Windows/ShaderMessageViewer.h \
Windows/DescriptorViewer.h \
Widgets/Extended/RDLineEdit.h \
Widgets/Extended/RDTextEdit.h \
Widgets/Extended/RDLabel.h \
@@ -356,6 +358,7 @@ FORMS += Windows/Dialogs/AboutDialog.ui \
Windows/BufferViewer.ui \
Windows/ShaderViewer.ui \
Windows/ShaderMessageViewer.ui \
Windows/DescriptorViewer.ui \
Windows/DebugMessageView.ui \
Windows/LogView.ui \
Windows/CommentView.ui \
+15
View File
@@ -628,6 +628,7 @@
<ClCompile Include="$(IntDir)generated\moc_DebugMessageView.cpp" />
<ClCompile Include="$(IntDir)generated\moc_LogView.cpp" />
<ClCompile Include="$(IntDir)generated\moc_CommentView.cpp" />
<ClCompile Include="$(IntDir)generated\moc_DescriptorViewer.cpp" />
<ClCompile Include="$(IntDir)generated\moc_EventBrowser.cpp" />
<ClCompile Include="$(IntDir)generated\moc_GLPipelineStateViewer.cpp" />
<ClCompile Include="$(IntDir)generated\moc_LiveCapture.cpp" />
@@ -747,6 +748,7 @@
<ClCompile Include="Windows\DebugMessageView.cpp" />
<ClCompile Include="Windows\LogView.cpp" />
<ClCompile Include="Windows\CommentView.cpp" />
<ClCompile Include="Windows\DescriptorViewer.cpp" />
<ClCompile Include="Windows\Dialogs\AboutDialog.cpp" />
<ClCompile Include="Windows\Dialogs\CrashDialog.cpp" />
<ClCompile Include="Windows\Dialogs\UpdateDialog.cpp" />
@@ -968,6 +970,7 @@
<ClInclude Include="$(IntDir)generated\ui_DebugMessageView.h" />
<ClInclude Include="$(IntDir)generated\ui_LogView.h" />
<ClInclude Include="$(IntDir)generated\ui_CommentView.h" />
<ClInclude Include="$(IntDir)generated\ui_DescriptorViewer.h" />
<ClInclude Include="$(IntDir)generated\ui_EventBrowser.h" />
<ClInclude Include="$(IntDir)generated\ui_GLPipelineStateViewer.h" />
<ClInclude Include="$(IntDir)generated\ui_LiveCapture.h" />
@@ -1223,6 +1226,12 @@
<Message>MOC %(Filename).h</Message>
<Outputs>$(IntDir)generated\moc_%(Filename).cpp</Outputs>
</CustomBuild>
<CustomBuild Include="Windows\DescriptorViewer.h">
<AdditionalInputs>%(Fullpath);$(QtBinDir)\moc.exe;%(AdditionalInputs)</AdditionalInputs>
<Command>"$(QtBinDir)\moc.exe" -DUNICODE -DWIN32 -DWIN64 -D_WIN32 -D_WIN64 -DRENDERDOC_PLATFORM_WIN32 -DSCINTILLA_QT=1 -DSCI_LEXER=1 -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D_MSC_VER=1900 -I"$(ProjectDir)." -I"$(SolutionDir)\renderdoc\api\replay" -I"$(QtIncludeDir)" -I"$(QtIncludeDir)\QtWidgets" -I"$(QtIncludeDir)\QtGui" -I"$(QtIncludeDir)\QtCore" "%(Fullpath)" -o "$(IntDir)generated\moc_%(Filename).cpp"</Command>
<Message>MOC %(Filename).h</Message>
<Outputs>$(IntDir)generated\moc_%(Filename).cpp</Outputs>
</CustomBuild>
<CustomBuild Include="Windows\Dialogs\AboutDialog.h">
<AdditionalInputs>%(Fullpath);$(QtBinDir)\moc.exe;%(AdditionalInputs)</AdditionalInputs>
<Command>"$(QtBinDir)\moc.exe" -DUNICODE -DWIN32 -DWIN64 -D_WIN32 -D_WIN64 -DRENDERDOC_PLATFORM_WIN32 -DSCINTILLA_QT=1 -DSCI_LEXER=1 -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D_MSC_VER=1900 -I"$(ProjectDir)." -I"$(SolutionDir)\renderdoc\api\replay" -I"$(QtIncludeDir)" -I"$(QtIncludeDir)\QtWidgets" -I"$(QtIncludeDir)\QtGui" -I"$(QtIncludeDir)\QtCore" "%(Fullpath)" -o "$(IntDir)generated\moc_%(Filename).cpp"</Command>
@@ -1518,6 +1527,12 @@
<Message>UIC %(Filename).ui</Message>
<Outputs>$(IntDir)generated\ui_%(Filename).h</Outputs>
</CustomBuild>
<CustomBuild Include="Windows\DescriptorViewer.ui">
<AdditionalInputs>%(Fullpath);$(QtBinDir)\uic.exe;%(AdditionalInputs)</AdditionalInputs>
<Command>"$(QtBinDir)\uic.exe" "%(Fullpath)" -o "$(IntDir)generated\ui_%(Filename).h"</Command>
<Message>UIC %(Filename).ui</Message>
<Outputs>$(IntDir)generated\ui_%(Filename).h</Outputs>
</CustomBuild>
<CustomBuild Include="Windows\Dialogs\AboutDialog.ui">
<AdditionalInputs>%(Fullpath);$(QtBinDir)\uic.exe;%(AdditionalInputs)</AdditionalInputs>
<Command>"$(QtBinDir)\uic.exe" "%(Fullpath)" -o "$(IntDir)generated\ui_%(Filename).h"</Command>
@@ -378,6 +378,9 @@
<ClCompile Include="Windows\CommentView.cpp">
<Filter>Windows</Filter>
</ClCompile>
<ClCompile Include="Windows\DescriptorViewer.cpp">
<Filter>Windows</Filter>
</ClCompile>
<ClCompile Include="Windows\StatisticsViewer.cpp">
<Filter>Windows</Filter>
</ClCompile>
@@ -432,6 +435,9 @@
<ClCompile Include="$(IntDir)generated\moc_CommentView.cpp">
<Filter>Generated Files</Filter>
</ClCompile>
<ClCompile Include="$(IntDir)generated\moc_DescriptorViewer.cpp">
<Filter>Generated Files</Filter>
</ClCompile>
<ClCompile Include="$(IntDir)generated\moc_EventBrowser.cpp">
<Filter>Generated Files</Filter>
</ClCompile>
@@ -992,6 +998,9 @@
<ClInclude Include="$(IntDir)generated\ui_CommentView.h">
<Filter>Generated Files</Filter>
</ClInclude>
<ClInclude Include="$(IntDir)generated\ui_DescriptorViewer.h">
<Filter>Generated Files</Filter>
</ClInclude>
<ClInclude Include="$(IntDir)generated\ui_EnvironmentEditor.h">
<Filter>Generated Files</Filter>
</ClInclude>
@@ -1190,6 +1199,9 @@
<CustomBuild Include="Windows\CommentView.ui">
<Filter>Windows</Filter>
</CustomBuild>
<CustomBuild Include="Windows\DescriptorViewer.ui">
<Filter>Windows</Filter>
</CustomBuild>
<CustomBuild Include="Windows\EventBrowser.ui">
<Filter>Windows</Filter>
</CustomBuild>
@@ -1277,6 +1289,9 @@
<CustomBuild Include="Windows\CommentView.h">
<Filter>Windows</Filter>
</CustomBuild>
<CustomBuild Include="Windows\DescriptorViewer.h">
<Filter>Windows</Filter>
</CustomBuild>
<CustomBuild Include="Windows\EventBrowser.h">
<Filter>Windows</Filter>
</CustomBuild>