Don't use pre-created pipeline for viewport/scissor overlay rendering

* This allows us to use the per-overlay renderpass which includes multiview
  properties.
This commit is contained in:
baldurk
2026-01-30 15:59:20 +00:00
parent fe7462330f
commit 6a915b67ba
3 changed files with 43 additions and 24 deletions
+29 -13
View File
@@ -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);
+13 -10
View File
@@ -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)
+1 -1
View File
@@ -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;