From 6a915b67baf65be1df4b4ffbe5e3b915fa4249ff Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 30 Jan 2026 12:02:32 +0000 Subject: [PATCH] Don't use pre-created pipeline for viewport/scissor overlay rendering * This allows us to use the per-overlay renderpass which includes multiview properties. --- renderdoc/driver/vulkan/vk_debug.cpp | 42 ++++++++++++++++++-------- renderdoc/driver/vulkan/vk_overlay.cpp | 23 ++++++++------ renderdoc/driver/vulkan/vk_replay.h | 2 +- 3 files changed, 43 insertions(+), 24 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_debug.cpp b/renderdoc/driver/vulkan/vk_debug.cpp index 87a88f9e7..da025d7fa 100644 --- a/renderdoc/driver/vulkan/vk_debug.cpp +++ b/renderdoc/driver/vulkan/vk_debug.cpp @@ -4637,12 +4637,9 @@ void VulkanReplay::OverlayRendering::Init(WrappedVulkan *driver, VkDescriptorPoo uint32_t samplesHandled = 0; - RDCCOMPILE_ASSERT(ARRAY_COUNT(m_CheckerF16Pipeline) == ARRAY_COUNT(m_QuadResolvePipeline), - "Arrays are mismatched in size!"); - uint32_t supportedColorSampleCounts = driver->GetDeviceProps().limits.framebufferColorSampleCounts; - for(size_t i = 0; i < ARRAY_COUNT(m_CheckerF16Pipeline); i++) + for(size_t i = 0; i < ARRAY_COUNT(m_QuadResolvePipeline); i++) { VkSampleCountFlagBits samples = VkSampleCountFlagBits(1 << i); @@ -4662,13 +4659,6 @@ void VulkanReplay::OverlayRendering::Init(WrappedVulkan *driver, VkDescriptorPoo pipeInfo.renderPass = RGBA16MSRP; pipeInfo.sampleCount = VkSampleCountFlagBits(1 << i); - // set up outline pipeline configuration - pipeInfo.blendEnable = true; - pipeInfo.fragment = shaderCache->GetBuiltinModule(BuiltinShader::CheckerboardFS); - pipeInfo.pipeLayout = m_CheckerPipeLayout; - - CREATE_OBJECT(m_CheckerF16Pipeline[i], pipeInfo); - // set up quad resolve pipeline configuration pipeInfo.blendEnable = false; pipeInfo.fragment = shaderCache->GetBuiltinModule(BuiltinShader::QuadResolveFS); @@ -4976,6 +4966,34 @@ void VulkanReplay::OverlayRendering::Init(WrappedVulkan *driver, VkDescriptorPoo driver->vkDestroyRenderPass(driver->GetDev(), SRGBA8MSRP, NULL); } +VkPipeline VulkanReplay::OverlayRendering::CreateTempViewportPipe(WrappedVulkan *driver) +{ + VulkanShaderCache *shaderCache = driver->GetShaderCache(); + + ConciseGraphicsPipeline pipeInfo = { + NoDepthRP, + m_CheckerPipeLayout, + shaderCache->GetBuiltinModule(BuiltinShader::BlitVS), + shaderCache->GetBuiltinModule(BuiltinShader::CheckerboardFS), + {VK_DYNAMIC_STATE_VIEWPORT}, + Samples, + false, // sampleRateShading + false, // depthEnable + false, // stencilEnable + StencilMode::KEEP, + true, // colourOutput + true, // blendEnable + VK_BLEND_FACTOR_SRC_ALPHA, + VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, + 0xf, // writeMask + }; + + VkPipeline ret; + CREATE_OBJECT(ret, pipeInfo); + + return ret; +} + VkPipeline VulkanReplay::OverlayRendering::CreateTempMultiviewQuadResolvePipe(WrappedVulkan *driver) { VulkanShaderCache *shaderCache = driver->GetShaderCache(); @@ -5038,8 +5056,6 @@ void VulkanReplay::OverlayRendering::Destroy(WrappedVulkan *driver) driver->vkDestroyDescriptorSetLayout(driver->GetDev(), m_CheckerDescSetLayout, NULL); driver->vkDestroyPipelineLayout(driver->GetDev(), m_CheckerPipeLayout, NULL); - for(size_t i = 0; i < ARRAY_COUNT(m_CheckerF16Pipeline); i++) - driver->vkDestroyPipeline(driver->GetDev(), m_CheckerF16Pipeline[i], NULL); driver->vkDestroyPipeline(driver->GetDev(), m_CheckerPipeline, NULL); driver->vkDestroyPipeline(driver->GetDev(), m_CheckerMSAAPipeline, NULL); diff --git a/renderdoc/driver/vulkan/vk_overlay.cpp b/renderdoc/driver/vulkan/vk_overlay.cpp index 499170fb7..8cfb4f7a9 100644 --- a/renderdoc/driver/vulkan/vk_overlay.cpp +++ b/renderdoc/driver/vulkan/vk_overlay.cpp @@ -1451,6 +1451,7 @@ ResourceId VulkanReplay::RenderOverlay(ResourceId texid, FloatVector clearCol, D VulkanRenderState prevstate = state; // make patched shader + VkPipeline checkerPipe = VK_NULL_HANDLE; VkShaderModule mod[2] = {0}; VkPipeline pipe[2] = {0}; VkShaderEXT shad[2] = {0}; @@ -1559,6 +1560,8 @@ ResourceId VulkanReplay::RenderOverlay(ResourceId texid, FloatVector clearCol, D CHECK_VKR(m_pDriver, vkr); } + checkerPipe = m_Overlay.CreateTempViewportPipe(m_pDriver); + // disable tests in dynamic state too state.depthTestEnable = VK_FALSE; state.depthWriteEnable = VK_FALSE; @@ -1671,8 +1674,7 @@ ResourceId VulkanReplay::RenderOverlay(ResourceId texid, FloatVector clearCol, D m_Overlay.m_CheckerUBO.Unmap(); - vt->CmdBindPipeline(Unwrap(cmd), VK_PIPELINE_BIND_POINT_GRAPHICS, - Unwrap(m_Overlay.m_CheckerF16Pipeline[SampleIndex(iminfo.samples)])); + vt->CmdBindPipeline(Unwrap(cmd), VK_PIPELINE_BIND_POINT_GRAPHICS, Unwrap(checkerPipe)); vt->CmdBindDescriptorSets(Unwrap(cmd), VK_PIPELINE_BIND_POINT_GRAPHICS, Unwrap(m_Overlay.m_CheckerPipeLayout), 0, 1, UnwrapPtr(m_Overlay.m_CheckerDescSet), 1, &uboOffs); @@ -1727,14 +1729,6 @@ ResourceId VulkanReplay::RenderOverlay(ResourceId texid, FloatVector clearCol, D m_pDriver->SubmitCmds(); m_pDriver->FlushQ(); - cmd = m_pDriver->GetNextCmd(); - - if(cmd == VK_NULL_HANDLE) - return ResourceId(); - - vkr = vt->BeginCommandBuffer(Unwrap(cmd), &beginInfo); - CHECK_VKR(m_pDriver, vkr); - for(int i = 0; i < 2; i++) { if(shad[i] != VK_NULL_HANDLE) @@ -1742,6 +1736,15 @@ ResourceId VulkanReplay::RenderOverlay(ResourceId texid, FloatVector clearCol, D m_pDriver->vkDestroyPipeline(m_Device, pipe[i], NULL); m_pDriver->vkDestroyShaderModule(m_Device, mod[i], NULL); } + m_pDriver->vkDestroyPipeline(m_Device, checkerPipe, NULL); + + cmd = m_pDriver->GetNextCmd(); + + if(cmd == VK_NULL_HANDLE) + return ResourceId(); + + vkr = vt->BeginCommandBuffer(Unwrap(cmd), &beginInfo); + CHECK_VKR(m_pDriver, vkr); } } else if(overlay == DebugOverlay::BackfaceCull) diff --git a/renderdoc/driver/vulkan/vk_replay.h b/renderdoc/driver/vulkan/vk_replay.h index 4841f7b21..7a6e144ad 100644 --- a/renderdoc/driver/vulkan/vk_replay.h +++ b/renderdoc/driver/vulkan/vk_replay.h @@ -713,6 +713,7 @@ private: void Init(WrappedVulkan *driver, VkDescriptorPool descriptorPool); void Destroy(WrappedVulkan *driver); + VkPipeline CreateTempViewportPipe(WrappedVulkan *driver); VkPipeline CreateTempMultiviewQuadResolvePipe(WrappedVulkan *driver); VkDeviceMemory ImageMem = VK_NULL_HANDLE; @@ -734,7 +735,6 @@ private: VkDescriptorSet m_CheckerDescSet = VK_NULL_HANDLE; VkPipeline m_CheckerPipeline = VK_NULL_HANDLE; VkPipeline m_CheckerMSAAPipeline = VK_NULL_HANDLE; - VkPipeline m_CheckerF16Pipeline[8] = {VK_NULL_HANDLE}; GPUBuffer m_CheckerUBO; VkDescriptorSetLayout m_QuadDescSetLayout = VK_NULL_HANDLE;