Don't version descriptor buffers inside a render pass

* Defer it until after like we do with indirect draw readbacks
This commit is contained in:
baldurk
2025-10-27 11:50:36 +00:00
parent c756088d11
commit 2ea010f3e2
2 changed files with 55 additions and 5 deletions
+9
View File
@@ -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<uint64_t> descBufOffsets;
struct DeferredDescBufCopy
{
VkBuffer unwrappedDstBuffer;
rdcarray<rdcpair<VkDeviceAddress, uint64_t>> copyOffsets;
};
rdcarray<DeferredDescBufCopy> descBufDeferredCopies;
};
uint64_t m_FakePushSetID = 0;
@@ -1097,6 +1104,8 @@ private:
rdcarray<GPUBuffer> m_DescriptorBufferVersions;
void VersionDescriptorBuffers(VkCommandBuffer cmd);
void CopyVersionedDescriptorBuffer(VkCommandBuffer cmdBuf, VkBuffer unwrappedDstBuf,
const rdcarray<rdcpair<VkDeviceAddress, uint64_t>> &copyOffsets);
std::map<ResourceId, rdcarray<EventUsage>> m_ResourceUses;
std::map<uint32_t, EventFlags> m_EventFlags;
@@ -370,20 +370,37 @@ void WrappedVulkan::VersionDescriptorBuffers(VkCommandBuffer cmd)
GPUBuffer::eGPUBufferReadback);
}
rdcarray<rdcpair<VkDeviceAddress, uint64_t>> 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<rdcpair<VkDeviceAddress, uint64_t>> &copyOffsets)
{
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<VkBuffer>(id)),
m_DescriptorBufferVersions[version].UnwrappedBuffer(), 1, &region);
ObjDisp(cmdBuf)->CmdCopyBuffer(Unwrap(cmdBuf),
Unwrap(GetResourceManager()->GetCurrentHandle<VkBuffer>(id)),
unwrappedDstBuf, 1, &region);
}
}
@@ -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<VkImageMemoryBarrier> 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<VkImageMemoryBarrier> 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;