From 850ff5b65d1759d205e34bc4d4b358b62fdc65e4 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 3 Feb 2020 13:14:17 +0000 Subject: [PATCH] Only promote one push constant range to compute, from vertex * The spec says that you can only have one push constant range per stage, so don't promote all push ranges to compute (as only one will be used in the vertex shader). --- renderdoc/driver/vulkan/vk_postvs.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_postvs.cpp b/renderdoc/driver/vulkan/vk_postvs.cpp index 18ef6f4d4..182f4a695 100644 --- a/renderdoc/driver/vulkan/vk_postvs.cpp +++ b/renderdoc/driver/vulkan/vk_postvs.cpp @@ -1642,11 +1642,23 @@ void VulkanReplay::FetchVSOut(uint32_t eventId) // create pipeline layout with new descriptor set layouts { - rdcarray push = creationInfo.m_PipelineLayout[pipeInfo.layout].pushRanges; + // the spec says only one push constant range may be used per stage, so at most one has + // VERTEX_BIT. Find it, and make it COMPUTE_BIT + VkPushConstantRange push; + uint32_t numPush = 0; + rdcarray oldPush = creationInfo.m_PipelineLayout[pipeInfo.layout].pushRanges; // ensure the push range is visible to the compute shader - for(VkPushConstantRange &range : push) - range.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; + for(const VkPushConstantRange &range : oldPush) + { + if(range.stageFlags == VK_SHADER_STAGE_VERTEX_BIT) + { + push = range; + push.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; + numPush = 1; + break; + } + } VkPipelineLayoutCreateInfo pipeLayoutInfo = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, @@ -1654,8 +1666,8 @@ void VulkanReplay::FetchVSOut(uint32_t eventId) 0, (uint32_t)setLayouts.size(), setLayouts.data(), - (uint32_t)push.size(), - push.data(), + numPush, + &push, }; vkr = m_pDriver->vkCreatePipelineLayout(dev, &pipeLayoutInfo, NULL, &pipeLayout);