From 75c1d37a4560080b49231fa74ade21cf74b86de2 Mon Sep 17 00:00:00 2001 From: Shahbaz Youssefi Date: Wed, 24 Aug 2022 10:02:49 -0400 Subject: [PATCH] Expose Vulkan depth clip range in the UI This change exposes the VkPipelineViewportDepthClipControlCreateInfoEXT::negativeOneToOne pipeline state in the UI. While not a per-viewport state, this state is output alongside viewport information. If the extension is not used, or if this flag is false, [0, 1] is shown as the depth clip range. If the flag is true, [-1, 1] is shown. --- .../VulkanPipelineStateViewer.cpp | 23 +++++++++++-------- renderdoc/api/replay/vk_pipestate.h | 3 +++ renderdoc/driver/vulkan/vk_replay.cpp | 5 ++++ renderdoc/replay/renderdoc_serialise.inl | 1 + 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp index 80daa2a7c..6229f2d77 100644 --- a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp @@ -332,9 +332,9 @@ VulkanPipelineStateViewer::VulkanPipelineStateViewer(ICaptureContext &ctx, RDHeaderView *header = new RDHeaderView(Qt::Horizontal, this); ui->viewports->setHeader(header); - ui->viewports->setColumns( - {tr("Slot"), tr("X"), tr("Y"), tr("Width"), tr("Height"), tr("MinDepth"), tr("MaxDepth")}); - header->setColumnStretchHints({-1, -1, -1, -1, -1, -1, 1}); + ui->viewports->setColumns({tr("Slot"), tr("X"), tr("Y"), tr("Width"), tr("Height"), + tr("MinDepth"), tr("MaxDepth"), tr("NDCDepthRange")}); + header->setColumnStretchHints({-1, -1, -1, -1, -1, -1, -1, 1}); header->setMinimumSectionSize(40); ui->viewports->setClearSelectionOnFocusLoss(true); @@ -2430,11 +2430,14 @@ void VulkanPipelineStateViewer::setState() } { + const QString ndcDepthRange = + state.viewportScissor.depthNegativeOneToOne ? lit("[-1, 1]") : lit("[0, 1]"); + int i = 0; for(const VKPipe::ViewportScissor &v : state.viewportScissor.viewportScissors) { - RDTreeWidgetItem *node = new RDTreeWidgetItem( - {i, v.vp.x, v.vp.y, v.vp.width, v.vp.height, v.vp.minDepth, v.vp.maxDepth}); + RDTreeWidgetItem *node = new RDTreeWidgetItem({i, v.vp.x, v.vp.y, v.vp.width, v.vp.height, + v.vp.minDepth, v.vp.maxDepth, ndcDepthRange}); ui->viewports->addTopLevelItem(node); if(v.vp.width == 0 || v.vp.height == 0) @@ -3880,6 +3883,8 @@ void VulkanPipelineStateViewer::exportHTML(QXmlStreamWriter &xml, const VKPipe:: xml.writeCharacters(tr("Viewports")); xml.writeEndElement(); + const QString ndcDepthRange = vp.depthNegativeOneToOne ? lit("[-1, 1]") : lit("[0, 1]"); + QList rows; int i = 0; @@ -3887,14 +3892,14 @@ void VulkanPipelineStateViewer::exportHTML(QXmlStreamWriter &xml, const VKPipe:: { const Viewport &v = vs.vp; - rows.push_back({i, v.x, v.y, v.width, v.height, v.minDepth, v.maxDepth}); + rows.push_back({i, v.x, v.y, v.width, v.height, v.minDepth, v.maxDepth, ndcDepthRange}); i++; } - m_Common.exportHTMLTable(xml, {tr("Slot"), tr("X"), tr("Y"), tr("Width"), tr("Height"), - tr("Min Depth"), tr("Max Depth")}, - rows); + QStringList header = {tr("Slot"), tr("X"), tr("Y"), tr("Width"), + tr("Height"), tr("Min Depth"), tr("Max Depth"), tr("NDC Depth Range")}; + m_Common.exportHTMLTable(xml, header, rows); } { diff --git a/renderdoc/api/replay/vk_pipestate.h b/renderdoc/api/replay/vk_pipestate.h index 9167d9131..93e974bf7 100644 --- a/renderdoc/api/replay/vk_pipestate.h +++ b/renderdoc/api/replay/vk_pipestate.h @@ -781,6 +781,9 @@ and a fragment in none of them is discarded. disabled, since with no rectangles no fragment can be inside one. )"); bool discardRectanglesExclusive = true; + + DOCUMENT(R"(Whether depth clip range is set to [-1, 1] through VK_EXT_depth_clip_control.)"); + bool depthNegativeOneToOne = false; }; DOCUMENT("Describes the rasterizer state in the pipeline."); diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 94640a5a2..e8e30dbab 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -1362,6 +1362,10 @@ void VulkanReplay::SavePipelineState(uint32_t eventId) (p.discardMode == VK_DISCARD_RECTANGLE_MODE_EXCLUSIVE_EXT); } + { + ret.viewportScissor.depthNegativeOneToOne = p.negativeOneToOne; + } + // Rasterizer ret.rasterizer.depthClampEnable = p.depthClampEnable; ret.rasterizer.depthClipEnable = p.depthClipEnable; @@ -1565,6 +1569,7 @@ void VulkanReplay::SavePipelineState(uint32_t eventId) ret.viewportScissor.viewportScissors.clear(); ret.viewportScissor.discardRectangles.clear(); ret.viewportScissor.discardRectanglesExclusive = true; + ret.viewportScissor.depthNegativeOneToOne = false; ret.colorBlend.blends.clear(); } diff --git a/renderdoc/replay/renderdoc_serialise.inl b/renderdoc/replay/renderdoc_serialise.inl index 3512472df..064b2ede8 100644 --- a/renderdoc/replay/renderdoc_serialise.inl +++ b/renderdoc/replay/renderdoc_serialise.inl @@ -2130,6 +2130,7 @@ void DoSerialise(SerialiserType &ser, VKPipe::ViewState &el) SERIALISE_MEMBER(viewportScissors); SERIALISE_MEMBER(discardRectangles); SERIALISE_MEMBER(discardRectanglesExclusive); + SERIALISE_MEMBER(depthNegativeOneToOne); SIZE_CHECK(56); }