From 7d0bbbda93a0480851d3cf42331b17b02e849ce2 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 14 Apr 2020 16:32:18 +0100 Subject: [PATCH] Patch all shader stages when using reserved binding * If we're not using buffer device address, we need to patch the other stages since we're offsetting all bindings by 1. --- renderdoc/driver/vulkan/vk_shaderdebug.cpp | 53 +++++++++++++++++----- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_shaderdebug.cpp b/renderdoc/driver/vulkan/vk_shaderdebug.cpp index bb8fd7b04..e84e6261d 100644 --- a/renderdoc/driver/vulkan/vk_shaderdebug.cpp +++ b/renderdoc/driver/vulkan/vk_shaderdebug.cpp @@ -2364,7 +2364,6 @@ ShaderDebugTrace *VulkanReplay::DebugPixel(uint32_t eventId, uint32_t x, uint32_ }, }; - VkShaderModule module = VK_NULL_HANDLE; VkSpecializationInfo specInfo = {}; specInfo.dataSize = sizeof(specData); specInfo.pData = &specData; @@ -2374,6 +2373,8 @@ ShaderDebugTrace *VulkanReplay::DebugPixel(uint32_t eventId, uint32_t x, uint32_ RDCCOMPILE_ASSERT((size_t)InputSpecConstant::Count == ARRAY_COUNT(specMaps), "Spec constants changed"); + rdcarray modules; + for(uint32_t i = 0; i < graphicsInfo.stageCount; i++) { VkPipelineShaderStageCreateInfo &stage = @@ -2384,20 +2385,49 @@ ShaderDebugTrace *VulkanReplay::DebugPixel(uint32_t eventId, uint32_t x, uint32_ moduleCreateInfo.pCode = fragspv.data(); moduleCreateInfo.codeSize = fragspv.size() * sizeof(uint32_t); - vkr = m_pDriver->vkCreateShaderModule(dev, &moduleCreateInfo, NULL, &module); + vkr = m_pDriver->vkCreateShaderModule(dev, &moduleCreateInfo, NULL, &stage.module); RDCASSERTEQUAL(vkr, VK_SUCCESS); - stage.module = module; - stage.pSpecializationInfo = &specInfo; - break; + modules.push_back(stage.module); } - } + else if(storageMode == Binding) + { + // if we're stealing a binding point, we need to patch all other shaders + rdcarray spirv = c.m_ShaderModule[GetResID(stage.module)].spirv.GetSPIRV(); - if(module == VK_NULL_HANDLE) - { - RDCERR("Couldn't find fragment shader in pipeline info!"); + { + rdcspv::Editor editor(spirv); + + editor.Prepare(); + + // patch all bindings up by 1 + for(rdcspv::Iter it = editor.Begin(rdcspv::Section::Annotations), + end = editor.End(rdcspv::Section::Annotations); + it < end; ++it) + { + if(it.opcode() == rdcspv::Op::Decorate) + { + rdcspv::OpDecorate dec(it); + if(dec.decoration == rdcspv::Decoration::Binding) + { + RDCASSERT(dec.decoration.binding != 0xffffffff); + dec.decoration.binding += 1; + it = dec; + } + } + } + } + + moduleCreateInfo.pCode = spirv.data(); + moduleCreateInfo.codeSize = spirv.size() * sizeof(uint32_t); + + vkr = m_pDriver->vkCreateShaderModule(dev, &moduleCreateInfo, NULL, &stage.module); + RDCASSERTEQUAL(vkr, VK_SUCCESS); + + modules.push_back(stage.module); + } } VkPipeline inputsPipe; @@ -2667,8 +2697,9 @@ ShaderDebugTrace *VulkanReplay::DebugPixel(uint32_t eventId, uint32_t x, uint32_ // delete pipeline m_pDriver->vkDestroyPipeline(dev, inputsPipe, NULL); - // delete shader module - m_pDriver->vkDestroyShaderModule(dev, module, NULL); + // delete shader modules + for(VkShaderModule s : modules) + m_pDriver->vkDestroyShaderModule(dev, s, NULL); return ret; }