diff --git a/renderdoc/driver/vulkan/vk_pixelhistory.cpp b/renderdoc/driver/vulkan/vk_pixelhistory.cpp index 1eefa53eb..f75c697af 100644 --- a/renderdoc/driver/vulkan/vk_pixelhistory.cpp +++ b/renderdoc/driver/vulkan/vk_pixelhistory.cpp @@ -827,11 +827,10 @@ protected: memcpy(stages.data(), pipeCreateInfo.pStages, stages.byteSize()); EventFlags eventFlags = m_pDriver->GetEventFlags(eid); - VkShaderModule replacementShaders[5] = {}; + VkShaderModule replacementShaders[NumShaderStages] = {}; // Clean shaders - uint32_t numberOfStages = 5; - for(size_t i = 0; i < numberOfStages; i++) + for(size_t i = 0; i < NumShaderStages; i++) { if((eventFlags & PipeStageRWEventFlags(StageFromIndex(i))) != EventFlags::NoFlags) replacementShaders[i] = m_ShaderCache->GetShaderWithoutSideEffects( @@ -2434,11 +2433,10 @@ private: const VulkanCreationInfo::Pipeline &p = m_pDriver->GetDebugManager()->GetPipelineInfo(basePipeline); EventFlags eventShaderFlags = m_pDriver->GetEventFlags(eid); - uint32_t numberOfStages = 5; rdcarray replacementShaders; - replacementShaders.resize(numberOfStages); + replacementShaders.resize(NumShaderStages); // Replace fragment shader because it might have early fragments - for(size_t i = 0; i < numberOfStages; i++) + for(size_t i = 0; i < replacementShaders.size(); i++) { if(p.shaders[i].module == ResourceId()) continue; @@ -3104,11 +3102,10 @@ struct VulkanPixelHistoryPerFragmentCallback : VulkanPixelHistoryCallback memcpy(stages.data(), pipeCreateInfo.pStages, stages.byteSize()); EventFlags eventFlags = m_pDriver->GetEventFlags(eid); - VkShaderModule replacementShaders[5] = {}; + VkShaderModule replacementShaders[NumShaderStages] = {}; // Clean shaders - uint32_t numberOfStages = 5; - for(size_t i = 0; i < numberOfStages; i++) + for(size_t i = 0; i < NumShaderStages; i++) { if((eventFlags & PipeStageRWEventFlags(StageFromIndex(i))) != EventFlags::NoFlags) replacementShaders[i] = m_ShaderCache->GetShaderWithoutSideEffects( @@ -3199,6 +3196,7 @@ struct VulkanPixelHistoryPerFragmentCallback : VulkanPixelHistoryCallback stageCI.module = m_ShaderCache->GetPrimitiveIdShader(colorOutputIndex); stageCI.pName = "main"; bool gsFound = false; + bool meshFound = false; bool fsFound = false; for(uint32_t i = 0; i < pipeCreateInfo.stageCount; i++) { @@ -3207,6 +3205,11 @@ struct VulkanPixelHistoryPerFragmentCallback : VulkanPixelHistoryCallback gsFound = true; break; } + if(stages[i].stage == VK_SHADER_STAGE_MESH_BIT_EXT) + { + meshFound = true; + break; + } if(stages[i].stage == VK_SHADER_STAGE_FRAGMENT_BIT) { stages[i] = stageCI; @@ -3220,7 +3223,7 @@ struct VulkanPixelHistoryPerFragmentCallback : VulkanPixelHistoryCallback pipeCreateInfo.pStages = stages.data(); } - if(!gsFound) + if(!gsFound && !meshFound) { vkr = m_pDriver->vkCreateGraphicsPipelines(m_pDriver->GetDev(), VK_NULL_HANDLE, 1, &pipeCreateInfo, NULL, &pipes.primitiveIdPipe);