diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 2f0b28f03..11948ba6d 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -860,6 +860,13 @@ private: uint32_t descBufVersionIdx = ~0U; // when multiple buffers are bound, the offsets of each in the single GPUBuffer where they are rdcarray descBufOffsets; + + struct DeferredDescBufCopy + { + VkBuffer unwrappedDstBuffer; + rdcarray> copyOffsets; + }; + rdcarray descBufDeferredCopies; }; uint64_t m_FakePushSetID = 0; @@ -1097,6 +1104,8 @@ private: rdcarray m_DescriptorBufferVersions; void VersionDescriptorBuffers(VkCommandBuffer cmd); + void CopyVersionedDescriptorBuffer(VkCommandBuffer cmdBuf, VkBuffer unwrappedDstBuf, + const rdcarray> ©Offsets); std::map> m_ResourceUses; std::map m_EventFlags; diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index a8314d92a..8675203d0 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -370,20 +370,37 @@ void WrappedVulkan::VersionDescriptorBuffers(VkCommandBuffer cmd) GPUBuffer::eGPUBufferReadback); } + rdcarray> copyOffsets; + for(uint32_t i = 0; i < renderstate.descBufs.size(); i++) + copyOffsets.push_back({renderstate.descBufs[i].address, offsets[i]}); + + if(!renderstate.ActiveRenderPass()) + CopyVersionedDescriptorBuffer(cmd, m_DescriptorBufferVersions[version].UnwrappedBuffer(), + copyOffsets); + else + m_BakedCmdBufferInfo[m_LastCmdBufferID].descBufDeferredCopies.push_back( + {m_DescriptorBufferVersions[version].UnwrappedBuffer(), copyOffsets}); +} + +void WrappedVulkan::CopyVersionedDescriptorBuffer( + VkCommandBuffer cmdBuf, VkBuffer unwrappedDstBuf, + const rdcarray> ©Offsets) +{ + for(uint32_t i = 0; i < copyOffsets.size(); i++) { ResourceId id; uint64_t offs; - GetResIDFromAddr(renderstate.descBufs[i].address, id, offs); + GetResIDFromAddr(copyOffsets[i].first, id, offs); const VkBufferCopy region = { offs, - offsets[i], + copyOffsets[i].second, m_CreationInfo.m_Buffer[id].size - offs, }; - ObjDisp(cmd)->CmdCopyBuffer(Unwrap(cmd), - Unwrap(GetResourceManager()->GetCurrentHandle(id)), - m_DescriptorBufferVersions[version].UnwrappedBuffer(), 1, ®ion); + ObjDisp(cmdBuf)->CmdCopyBuffer(Unwrap(cmdBuf), + Unwrap(GetResourceManager()->GetCurrentHandle(id)), + unwrappedDstBuf, 1, ®ion); } } @@ -2725,6 +2742,12 @@ bool WrappedVulkan::Serialise_vkCmdEndRenderPass(SerialiserType &ser, VkCommandB m_BakedCmdBufferInfo[m_LastCmdBufferID].indirectCopies) ExecuteIndirectReadback(commandBuffer, indirectcopy); + // and deferred descriptor buffer versions here + for(const BakedCmdBufferInfo::DeferredDescBufCopy &descVersion : + m_BakedCmdBufferInfo[m_LastCmdBufferID].descBufDeferredCopies) + CopyVersionedDescriptorBuffer(commandBuffer, descVersion.unwrappedDstBuffer, + descVersion.copyOffsets); + m_BakedCmdBufferInfo[m_LastCmdBufferID].indirectCopies.clear(); rdcarray imgBarriers = GetImplicitRenderPassBarriers(~0U); @@ -3391,6 +3414,12 @@ bool WrappedVulkan::Serialise_vkCmdEndRenderPass2(SerialiserType &ser, VkCommand m_BakedCmdBufferInfo[m_LastCmdBufferID].indirectCopies) ExecuteIndirectReadback(commandBuffer, indirectcopy); + // and deferred descriptor buffer versions here + for(const BakedCmdBufferInfo::DeferredDescBufCopy &descVersion : + m_BakedCmdBufferInfo[m_LastCmdBufferID].descBufDeferredCopies) + CopyVersionedDescriptorBuffer(commandBuffer, descVersion.unwrappedDstBuffer, + descVersion.copyOffsets); + rdcarray imgBarriers = GetImplicitRenderPassBarriers(~0U); GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[m_LastCmdBufferID].imageStates, @@ -8233,6 +8262,12 @@ bool WrappedVulkan::Serialise_vkCmdEndRendering(SerialiserType &ser, VkCommandBu m_BakedCmdBufferInfo[m_LastCmdBufferID].indirectCopies) ExecuteIndirectReadback(commandBuffer, indirectcopy); + // and deferred descriptor buffer versions here + for(const BakedCmdBufferInfo::DeferredDescBufCopy &descVersion : + m_BakedCmdBufferInfo[m_LastCmdBufferID].descBufDeferredCopies) + CopyVersionedDescriptorBuffer(commandBuffer, descVersion.unwrappedDstBuffer, + descVersion.copyOffsets); + m_BakedCmdBufferInfo[m_LastCmdBufferID].indirectCopies.clear(); VulkanRenderState &state = m_BakedCmdBufferInfo[m_LastCmdBufferID].state; @@ -8512,6 +8547,12 @@ bool WrappedVulkan::Serialise_vkCmdEndRendering2EXT(SerialiserType &ser, m_BakedCmdBufferInfo[m_LastCmdBufferID].indirectCopies) ExecuteIndirectReadback(commandBuffer, indirectcopy); + // and deferred descriptor buffer versions here + for(const BakedCmdBufferInfo::DeferredDescBufCopy &descVersion : + m_BakedCmdBufferInfo[m_LastCmdBufferID].descBufDeferredCopies) + CopyVersionedDescriptorBuffer(commandBuffer, descVersion.unwrappedDstBuffer, + descVersion.copyOffsets); + m_BakedCmdBufferInfo[m_LastCmdBufferID].indirectCopies.clear(); VulkanRenderState &state = m_BakedCmdBufferInfo[m_LastCmdBufferID].state;