diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 1aa53c52c..d1b29612e 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -557,7 +557,7 @@ private: std::vector> imgbarriers; - ResourceId pushDescriptorID[64]; + ResourceId pushDescriptorID[2][64]; VulkanDrawcallTreeNode *draw; // the root draw to copy from when submitting uint32_t eventCount; // how many events are in this cmd buffer, for quick skipping @@ -1759,7 +1759,8 @@ public: VkShaderInfoTypeAMD infoType, size_t *pInfoSize, void *pInfo); // VK_KHR_push_descriptor - void ApplyPushDescriptorWrites(VkPipelineLayout layout, uint32_t set, uint32_t descriptorWriteCount, + void ApplyPushDescriptorWrites(VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, + uint32_t set, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites); IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdPushDescriptorSetKHR, VkCommandBuffer commandBuffer, diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 4dbebcd91..079309a0d 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -601,16 +601,20 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(SerialiserType &ser, VkComman // when loading, allocate a new resource ID for each push descriptor slot in this command buffer if(IsLoading(m_State)) { - for(size_t i = 0; i < ARRAY_COUNT(BakedCmdBufferInfo::pushDescriptorID); i++) - m_BakedCmdBufferInfo[BakedCommandBuffer].pushDescriptorID[i] = - ResourceIDGen::GetNewUniqueID(); + for(int p = 0; p < 2; p++) + for(size_t i = 0; i < ARRAY_COUNT(BakedCmdBufferInfo::pushDescriptorID[p]); i++) + m_BakedCmdBufferInfo[BakedCommandBuffer].pushDescriptorID[p][i] = + ResourceIDGen::GetNewUniqueID(); } // clear/invalidate descriptor set state for this command buffer. - for(size_t i = 0; i < ARRAY_COUNT(BakedCmdBufferInfo::pushDescriptorID); i++) + for(int p = 0; p < 2; p++) { - m_DescriptorSetState[m_BakedCmdBufferInfo[BakedCommandBuffer].pushDescriptorID[i]] = - DescriptorSetInfo(true); + for(size_t i = 0; i < ARRAY_COUNT(BakedCmdBufferInfo::pushDescriptorID[p]); i++) + { + m_DescriptorSetState[m_BakedCmdBufferInfo[BakedCommandBuffer].pushDescriptorID[p][i]] = + DescriptorSetInfo(true); + } } m_BakedCmdBufferInfo[m_LastCmdBufferID].level = m_BakedCmdBufferInfo[BakedCommandBuffer].level = @@ -3388,14 +3392,17 @@ void WrappedVulkan::vkCmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, } } -void WrappedVulkan::ApplyPushDescriptorWrites(VkPipelineLayout layout, uint32_t set, +void WrappedVulkan::ApplyPushDescriptorWrites(VkPipelineBindPoint pipelineBindPoint, + VkPipelineLayout layout, uint32_t set, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites) { - ResourceId setId = m_BakedCmdBufferInfo[m_LastCmdBufferID].pushDescriptorID[set]; + const VulkanCreationInfo::PipelineLayout &pipeLayoutInfo = + m_CreationInfo.m_PipelineLayout[GetResID(layout)]; - const std::vector &descSetLayouts = - m_CreationInfo.m_PipelineLayout[GetResID(layout)].descSetLayouts; + ResourceId setId = m_BakedCmdBufferInfo[m_LastCmdBufferID].pushDescriptorID[pipelineBindPoint][set]; + + const std::vector &descSetLayouts = pipeLayoutInfo.descSetLayouts; const DescSetLayout &desclayout = m_CreationInfo.m_DescSetLayout[descSetLayouts[set]]; @@ -3503,7 +3510,8 @@ bool WrappedVulkan::Serialise_vkCmdPushDescriptorSetKHR(SerialiserType &ser, { m_LastCmdBufferID = GetResourceManager()->GetOriginalID(GetResID(commandBuffer)); - ResourceId setId = m_BakedCmdBufferInfo[m_LastCmdBufferID].pushDescriptorID[set]; + ResourceId setId = + m_BakedCmdBufferInfo[m_LastCmdBufferID].pushDescriptorID[pipelineBindPoint][set]; if(IsActiveReplaying(m_State)) { @@ -3555,7 +3563,8 @@ bool WrappedVulkan::Serialise_vkCmdPushDescriptorSetKHR(SerialiserType &ser, // without worrying about overlap. We just need to check that we're in the record range so // that we don't pull in descriptor updates after the point in the command buffer we're // recording to - ApplyPushDescriptorWrites(layout, set, descriptorWriteCount, pDescriptorWrites); + ApplyPushDescriptorWrites(pipelineBindPoint, layout, set, descriptorWriteCount, + pDescriptorWrites); // now unwrap everything in-place to save on temp allocs. VkWriteDescriptorSet *writes = (VkWriteDescriptorSet *)pDescriptorWrites; @@ -3773,7 +3782,10 @@ bool WrappedVulkan::Serialise_vkCmdPushDescriptorSetWithTemplateKHR( { m_LastCmdBufferID = GetResourceManager()->GetOriginalID(GetResID(commandBuffer)); - ResourceId setId = m_BakedCmdBufferInfo[m_LastCmdBufferID].pushDescriptorID[set]; + VkPipelineBindPoint bindPoint = + m_CreationInfo.m_DescUpdateTemplate[GetResID(descriptorUpdateTemplate)].bindPoint; + + ResourceId setId = m_BakedCmdBufferInfo[m_LastCmdBufferID].pushDescriptorID[bindPoint][set]; if(IsActiveReplaying(m_State)) { @@ -3784,10 +3796,8 @@ bool WrappedVulkan::Serialise_vkCmdPushDescriptorSetWithTemplateKHR( if(ShouldUpdateRenderState(m_LastCmdBufferID)) { std::vector &descsets = - (m_CreationInfo.m_DescUpdateTemplate[GetResID(descriptorUpdateTemplate)].bindPoint == - VK_PIPELINE_BIND_POINT_GRAPHICS) - ? m_RenderState.graphics.descSets - : m_RenderState.compute.descSets; + (bindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) ? m_RenderState.graphics.descSets + : m_RenderState.compute.descSets; // expand as necessary if(descsets.size() < set + 1) @@ -3823,14 +3833,12 @@ bool WrappedVulkan::Serialise_vkCmdPushDescriptorSetWithTemplateKHR( if(commandBuffer != VK_NULL_HANDLE) { - VkPipelineBindPoint bindPoint = - m_CreationInfo.m_DescUpdateTemplate[GetResID(descriptorUpdateTemplate)].bindPoint; - // since we version push descriptors per-command buffer, we can safely update them always // without worrying about overlap. We just need to check that we're in the record range so // that we don't pull in descriptor updates after the point in the command buffer we're // recording to - ApplyPushDescriptorWrites(layout, set, (uint32_t)apply.writes.size(), apply.writes.data()); + ApplyPushDescriptorWrites(bindPoint, layout, set, (uint32_t)apply.writes.size(), + apply.writes.data()); // now unwrap everything in-place to save on temp allocs. VkWriteDescriptorSet *writes = (VkWriteDescriptorSet *)apply.writes.data(); diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 3aa32fcbc..0630a6451 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -1689,7 +1689,7 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi // MoltenVK reports 0x3fffffff for this limit so just ignore that value if it comes up RDCASSERT(m_PhysicalDeviceData.props.limits.maxBoundDescriptorSets < - ARRAY_COUNT(BakedCmdBufferInfo::pushDescriptorID) || + ARRAY_COUNT(BakedCmdBufferInfo::pushDescriptorID[0]) || m_PhysicalDeviceData.props.limits.maxBoundDescriptorSets >= 0x10000000, m_PhysicalDeviceData.props.limits.maxBoundDescriptorSets);