mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-06 06:41:05 +00:00
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:
@@ -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>> ©Offsets);
|
||||
|
||||
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>> ©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<VkBuffer>(id)),
|
||||
m_DescriptorBufferVersions[version].UnwrappedBuffer(), 1, ®ion);
|
||||
ObjDisp(cmdBuf)->CmdCopyBuffer(Unwrap(cmdBuf),
|
||||
Unwrap(GetResourceManager()->GetCurrentHandle<VkBuffer>(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<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;
|
||||
|
||||
Reference in New Issue
Block a user