diff --git a/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp b/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp index c82fe1c4f..cf97255e9 100644 --- a/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp +++ b/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp @@ -358,7 +358,8 @@ QVariant RDTreeWidgetItem::data(int column, int role) const } else if(role == Qt::ToolTipRole && !m_widget->m_instantTooltips) { - return m_tooltip; + if(!m_tooltip.isEmpty()) + return m_tooltip; } else if(role == Qt::FontRole) { diff --git a/qrenderdoc/Widgets/Extended/RDTreeWidget.h b/qrenderdoc/Widgets/Extended/RDTreeWidget.h index 927a7e57d..77d283dc7 100644 --- a/qrenderdoc/Widgets/Extended/RDTreeWidget.h +++ b/qrenderdoc/Widgets/Extended/RDTreeWidget.h @@ -115,14 +115,19 @@ public: m_tooltip = value; dataChanged(0, Qt::ToolTipRole); } + inline void setToolTip(int column, const QString &value) + { + setData(column, Qt::ToolTipRole, value); + dataChanged(0, Qt::ToolTipRole); + } inline Qt::CheckState checkState(int column) const { - return static_cast(data(column, Qt::CheckStateRole).toInt()); + return (Qt::CheckState)data(column, Qt::CheckStateRole).toInt(); } inline void setCheckState(int column, Qt::CheckState state) { - setData(column, Qt::CheckStateRole, static_cast(state)); + setData(column, Qt::CheckStateRole, int(state)); dataChanged(column, Qt::CheckStateRole); } diff --git a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp index 03a5c835c..c7387a427 100644 --- a/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/D3D11PipelineStateViewer.cpp @@ -1823,12 +1823,12 @@ void D3D11PipelineStateViewer::setState() ui->depthWrite->setPixmap(state.outputMerger.depthStencilState.depthWrites ? tick : cross); ui->stencilEnabled->setPixmap(state.outputMerger.depthStencilState.stencilEnable ? tick : cross); - ui->stencilReadMask->setText( - Formatter::Format((uint8_t)state.outputMerger.depthStencilState.frontFace.compareMask, true)); - ui->stencilWriteMask->setText( - Formatter::Format((uint8_t)state.outputMerger.depthStencilState.frontFace.writeMask, true)); - ui->stencilRef->setText( - Formatter::Format((uint8_t)state.outputMerger.depthStencilState.frontFace.reference, true)); + m_Common.SetStencilLabelValue( + ui->stencilReadMask, (uint8_t)state.outputMerger.depthStencilState.frontFace.compareMask); + m_Common.SetStencilLabelValue(ui->stencilWriteMask, + (uint8_t)state.outputMerger.depthStencilState.frontFace.writeMask); + m_Common.SetStencilLabelValue(ui->stencilRef, + (uint8_t)state.outputMerger.depthStencilState.frontFace.reference); ui->stencils->beginUpdate(); ui->stencils->clear(); diff --git a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp index 586ceebe8..dad74182b 100644 --- a/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/D3D12PipelineStateViewer.cpp @@ -1800,12 +1800,12 @@ void D3D12PipelineStateViewer::setState() } ui->stencilEnabled->setPixmap(state.outputMerger.depthStencilState.stencilEnable ? tick : cross); - ui->stencilReadMask->setText( - Formatter::Format((uint8_t)state.outputMerger.depthStencilState.frontFace.compareMask, true)); - ui->stencilWriteMask->setText( - Formatter::Format((uint8_t)state.outputMerger.depthStencilState.frontFace.writeMask, true)); - ui->stencilRef->setText( - Formatter::Format((uint8_t)state.outputMerger.depthStencilState.frontFace.reference, true)); + m_Common.SetStencilLabelValue( + ui->stencilReadMask, (uint8_t)state.outputMerger.depthStencilState.frontFace.compareMask); + m_Common.SetStencilLabelValue(ui->stencilWriteMask, + (uint8_t)state.outputMerger.depthStencilState.frontFace.writeMask); + m_Common.SetStencilLabelValue(ui->stencilRef, + (uint8_t)state.outputMerger.depthStencilState.frontFace.reference); ui->stencils->beginUpdate(); ui->stencils->clear(); diff --git a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp index 3048762a9..a648cf479 100644 --- a/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/GLPipelineStateViewer.cpp @@ -2102,14 +2102,19 @@ void GLPipelineStateViewer::setState() ui->stencils->clear(); if(state.stencilState.stencilEnable) { - ui->stencils->addTopLevelItem(new RDTreeWidgetItem( - {tr("Front"), ToQStr(state.stencilState.frontFace.function), - ToQStr(state.stencilState.frontFace.failOperation), - ToQStr(state.stencilState.frontFace.depthFailOperation), - ToQStr(state.stencilState.frontFace.passOperation), - Formatter::Format((uint8_t)state.stencilState.frontFace.writeMask, true), - Formatter::Format((uint8_t)state.stencilState.frontFace.compareMask, true), - Formatter::Format((uint8_t)state.stencilState.frontFace.reference, true)})); + ui->stencils->addTopLevelItem(new RDTreeWidgetItem({ + tr("Front"), ToQStr(state.stencilState.frontFace.function), + ToQStr(state.stencilState.frontFace.failOperation), + ToQStr(state.stencilState.frontFace.depthFailOperation), + ToQStr(state.stencilState.frontFace.passOperation), QVariant(), QVariant(), QVariant(), + })); + + m_Common.SetStencilTreeItemValue(ui->stencils->topLevelItem(0), 5, + state.stencilState.frontFace.writeMask); + m_Common.SetStencilTreeItemValue(ui->stencils->topLevelItem(0), 6, + state.stencilState.frontFace.compareMask); + m_Common.SetStencilTreeItemValue(ui->stencils->topLevelItem(0), 7, + state.stencilState.frontFace.reference); ui->stencils->addTopLevelItem(new RDTreeWidgetItem( {tr("Back"), ToQStr(state.stencilState.backFace.function), @@ -2119,6 +2124,13 @@ void GLPipelineStateViewer::setState() Formatter::Format((uint8_t)state.stencilState.backFace.writeMask, true), Formatter::Format((uint8_t)state.stencilState.backFace.compareMask, true), Formatter::Format((uint8_t)state.stencilState.backFace.reference, true)})); + + m_Common.SetStencilTreeItemValue(ui->stencils->topLevelItem(1), 5, + state.stencilState.backFace.writeMask); + m_Common.SetStencilTreeItemValue(ui->stencils->topLevelItem(1), 6, + state.stencilState.backFace.compareMask); + m_Common.SetStencilTreeItemValue(ui->stencils->topLevelItem(1), 7, + state.stencilState.backFace.reference); } else { diff --git a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp index ebc6e1c57..26b476e61 100644 --- a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp @@ -32,6 +32,7 @@ #include "Code/QRDUtils.h" #include "Code/Resources.h" #include "Widgets/Extended/RDLabel.h" +#include "Widgets/Extended/RDTreeWidget.h" #include "toolwindowmanager/ToolWindowManager.h" #include "D3D11PipelineStateViewer.h" #include "D3D12PipelineStateViewer.h" @@ -656,6 +657,24 @@ void PipelineStateViewer::showEvent(QShowEvent *event) } } +void PipelineStateViewer::SetStencilLabelValue(QLabel *label, uint8_t value) +{ + label->setText(Formatter::Format(value, true)); + label->setToolTip(tr("%1 / 0x%2 / 0b%3") + .arg(value, 3, 10, QLatin1Char(' ')) + .arg(Formatter::Format(value, true)) + .arg(value, 8, 2, QLatin1Char('0'))); +} + +void PipelineStateViewer::SetStencilTreeItemValue(RDTreeWidgetItem *item, int column, uint8_t value) +{ + item->setText(column, Formatter::Format(value, true)); + item->setToolTip(column, tr("%1 / 0x%2 / 0b%3") + .arg(value, 3, 10, QLatin1Char(' ')) + .arg(Formatter::Format(value, true)) + .arg(value, 8, 2, QLatin1Char('0'))); +} + QString PipelineStateViewer::GenerateHLSLStub(const ShaderBindpointMapping &bindpointMapping, const ShaderReflection *shaderDetails, const QString &entryFunc) diff --git a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.h b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.h index cccca69d9..541300c60 100644 --- a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.h +++ b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.h @@ -38,6 +38,7 @@ class QXmlStreamWriter; class QToolButton; class QMenu; class RDLabel; +class RDTreeWidgetItem; class D3D11PipelineStateViewer; class D3D12PipelineStateViewer; @@ -67,6 +68,9 @@ public: QVariant persistData(); void setPersistData(const QVariant &persistData); + void SetStencilLabelValue(QLabel *label, uint8_t value); + void SetStencilTreeItemValue(RDTreeWidgetItem *item, int column, uint8_t value); + void SetupShaderEditButton(QToolButton *button, ResourceId pipelineId, ResourceId shaderId, const ShaderBindpointMapping &bindpointMapping, const ShaderReflection *shaderDetails); diff --git a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp index 177bf2fd3..f6afee017 100644 --- a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp @@ -2574,22 +2574,33 @@ void VulkanPipelineStateViewer::setState() ui->stencils->clear(); if(state.depthStencil.stencilTestEnable) { - ui->stencils->addTopLevelItem(new RDTreeWidgetItem( - {tr("Front"), ToQStr(state.depthStencil.frontFace.function), - ToQStr(state.depthStencil.frontFace.failOperation), - ToQStr(state.depthStencil.frontFace.depthFailOperation), - ToQStr(state.depthStencil.frontFace.passOperation), - Formatter::Format((uint8_t)state.depthStencil.frontFace.writeMask, true), - Formatter::Format((uint8_t)state.depthStencil.frontFace.compareMask, true), - Formatter::Format((uint8_t)state.depthStencil.frontFace.reference, true)})); - ui->stencils->addTopLevelItem(new RDTreeWidgetItem( - {tr("Back"), ToQStr(state.depthStencil.backFace.function), - ToQStr(state.depthStencil.backFace.failOperation), - ToQStr(state.depthStencil.backFace.depthFailOperation), - ToQStr(state.depthStencil.backFace.passOperation), - Formatter::Format((uint8_t)state.depthStencil.backFace.writeMask, true), - Formatter::Format((uint8_t)state.depthStencil.backFace.compareMask, true), - Formatter::Format((uint8_t)state.depthStencil.backFace.reference, true)})); + ui->stencils->addTopLevelItem(new RDTreeWidgetItem({ + tr("Front"), ToQStr(state.depthStencil.frontFace.function), + ToQStr(state.depthStencil.frontFace.failOperation), + ToQStr(state.depthStencil.frontFace.depthFailOperation), + ToQStr(state.depthStencil.frontFace.passOperation), QVariant(), QVariant(), QVariant(), + })); + + m_Common.SetStencilTreeItemValue(ui->stencils->topLevelItem(0), 5, + state.depthStencil.frontFace.writeMask); + m_Common.SetStencilTreeItemValue(ui->stencils->topLevelItem(0), 6, + state.depthStencil.frontFace.compareMask); + m_Common.SetStencilTreeItemValue(ui->stencils->topLevelItem(0), 7, + state.depthStencil.frontFace.reference); + + ui->stencils->addTopLevelItem(new RDTreeWidgetItem({ + tr("Back"), ToQStr(state.depthStencil.backFace.function), + ToQStr(state.depthStencil.backFace.failOperation), + ToQStr(state.depthStencil.backFace.depthFailOperation), + ToQStr(state.depthStencil.backFace.passOperation), QVariant(), QVariant(), QVariant(), + })); + + m_Common.SetStencilTreeItemValue(ui->stencils->topLevelItem(1), 5, + state.depthStencil.backFace.writeMask); + m_Common.SetStencilTreeItemValue(ui->stencils->topLevelItem(1), 6, + state.depthStencil.backFace.compareMask); + m_Common.SetStencilTreeItemValue(ui->stencils->topLevelItem(1), 7, + state.depthStencil.backFace.reference); } else { diff --git a/qrenderdoc/Windows/TextureViewer.cpp b/qrenderdoc/Windows/TextureViewer.cpp index a63556a41..1c4b627d1 100644 --- a/qrenderdoc/Windows/TextureViewer.cpp +++ b/qrenderdoc/Windows/TextureViewer.cpp @@ -1082,6 +1082,7 @@ void TextureViewer::UI_UpdateStatusText() ui->hoverText->setText(hoverText); QString pickedText; + QString pickedTooltip; if(m_PickedPoint.x() >= 0) { @@ -1126,10 +1127,24 @@ void TextureViewer::UI_UpdateStatusText() pickedText += Formatter::Format(val.floatValue[0]); } - int stencil = (int)(255.0f * val.floatValue[1]); + if(tex.format.type == ResourceFormatType::D16S8 || + tex.format.type == ResourceFormatType::D24S8 || + tex.format.type == ResourceFormatType::D32S8 || tex.format.type == ResourceFormatType::S8) + { + int stencil = (int)(255.0f * val.floatValue[1]); - pickedText += - tr(", Stencil %1 / 0x%2").arg(stencil).arg(Formatter::Format(uint8_t(stencil & 0xff), true)); + if(tex.format.type == ResourceFormatType::S8) + pickedText.clear(); + else + pickedText += lit(", "); + + pickedText += tr("Stencil 0x%1").arg(Formatter::Format(uint8_t(stencil & 0xff), true)); + + pickedTooltip = tr("Stencil: %1 / 0x%2 / 0b%3") + .arg(stencil, 3, 10, QLatin1Char(' ')) + .arg(Formatter::Format(uint8_t(stencil & 0xff), true)) + .arg(stencil, 8, 2, QLatin1Char('0')); + } } else { @@ -1185,6 +1200,7 @@ void TextureViewer::UI_UpdateStatusText() pickedText += QString(m_HighWaterStatusLength - pickedText.length(), QLatin1Char(' ')); ui->pickedText->setText(pickedText); + ui->pickedText->setToolTip(pickedTooltip); } void TextureViewer::UI_UpdateTextureDetails()