Consistently use original command buffer IDs in maps

* If we use the live ID then re-recorded command buffers can cause maps to
  slowly grow in size.
This commit is contained in:
baldurk
2020-07-29 10:43:57 +01:00
parent d020543065
commit 23fc093a67
4 changed files with 38 additions and 64 deletions
+1 -1
View File
@@ -3687,7 +3687,7 @@ bool WrappedVulkan::InRerecordRange(ResourceId cmdid)
}
// otherwise just check if we have a re-record command buffer for this, as then we're doing a full
// re-record and replay
// re-record and replay of the command buffer
return m_RerecordCmds.find(cmdid) != m_RerecordCmds.end();
}
@@ -488,7 +488,6 @@ bool WrappedVulkan::Serialise_vkCreateCommandPool(SerialiserType &ser, VkDevice
{
ResourceId live = GetResourceManager()->WrapResource(Unwrap(device), pool);
GetResourceManager()->AddLiveResource(CmdPool, pool);
InsertCommandQueueFamily(live, CreateInfo.queueFamilyIndex);
}
AddResource(CmdPool, ResourceType::Pool, "Command Pool");
@@ -583,15 +582,15 @@ bool WrappedVulkan::Serialise_vkAllocateCommandBuffers(SerialiserType &ser, VkDe
{
ResourceId live = GetResourceManager()->WrapResource(Unwrap(device), cmd);
GetResourceManager()->AddLiveResource(CommandBuffer, cmd);
auto cmdQueueFamilyIt = m_commandQueueFamilies.find(GetResID(AllocateInfo.commandPool));
ResourceId poolId = GetResourceManager()->GetOriginalID(GetResID(AllocateInfo.commandPool));
auto cmdQueueFamilyIt = m_commandQueueFamilies.find(poolId);
if(cmdQueueFamilyIt == m_commandQueueFamilies.end())
{
RDCERR("Missing queue family for %s", ToStr(GetResID(AllocateInfo.commandPool)).c_str());
RDCERR("Missing queue family for %s", ToStr(poolId).c_str());
}
else
{
InsertCommandQueueFamily(CommandBuffer, cmdQueueFamilyIt->second);
InsertCommandQueueFamily(live, cmdQueueFamilyIt->second);
}
}
@@ -867,13 +866,10 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(SerialiserType &ser, VkComman
// there's no issue with clashes here.
m_RerecordCmds[BakedCommandBuffer] = cmd;
m_RerecordCmds[m_LastCmdBufferID] = cmd;
InsertCommandQueueFamily(GetResID(cmd), FindCommandQueueFamily(m_LastCmdBufferID));
InsertCommandQueueFamily(BakedCommandBuffer, FindCommandQueueFamily(m_LastCmdBufferID));
m_RerecordCmdList.push_back({AllocateInfo.commandPool, cmd});
m_BakedCmdBufferInfo[GetResID(cmd)].level = AllocateInfo.level;
m_BakedCmdBufferInfo[GetResID(cmd)].beginFlags = BeginInfo.flags;
// add one-time submit flag as this partial cmd buffer will only be submitted once
BeginInfo.flags |= VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
if(AllocateInfo.level == VK_COMMAND_BUFFER_LEVEL_SECONDARY)
@@ -971,8 +967,6 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(SerialiserType &ser, VkComman
}
ObjDisp(device)->BeginCommandBuffer(Unwrap(cmd), &unwrappedBeginInfo);
InsertCommandQueueFamily(GetResourceManager()->GetLiveID(BakedCommandBuffer),
FindCommandQueueFamily(BakedCommandBuffer));
}
}
@@ -1451,13 +1445,12 @@ bool WrappedVulkan::Serialise_vkCmdBeginRenderPass(SerialiserType &ser, VkComman
m_DrawcallCallback->PostRemisc(eventId, drawFlags, commandBuffer);
}
ResourceId cmd = GetResID(commandBuffer);
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imageStates,
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[m_LastCmdBufferID].imageStates,
FindCommandQueueFamily(m_LastCmdBufferID),
(uint32_t)imgBarriers.size(), imgBarriers.data());
if(m_FirstEventID == m_LastEventID)
UpdateImageStates(m_BakedCmdBufferInfo[cmd].imageStates);
UpdateImageStates(m_BakedCmdBufferInfo[m_LastCmdBufferID].imageStates);
}
}
else
@@ -1514,8 +1507,7 @@ bool WrappedVulkan::Serialise_vkCmdBeginRenderPass(SerialiserType &ser, VkComman
rdcarray<VkImageMemoryBarrier> imgBarriers = GetImplicitRenderPassBarriers();
ResourceId cmd = GetResID(commandBuffer);
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imageStates,
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[m_LastCmdBufferID].imageStates,
FindCommandQueueFamily(m_LastCmdBufferID),
(uint32_t)imgBarriers.size(), imgBarriers.data());
@@ -1676,8 +1668,7 @@ bool WrappedVulkan::Serialise_vkCmdNextSubpass(SerialiserType &ser, VkCommandBuf
rdcarray<VkImageMemoryBarrier> imgBarriers = GetImplicitRenderPassBarriers();
ResourceId cmd = GetResID(commandBuffer);
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imageStates,
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[m_LastCmdBufferID].imageStates,
FindCommandQueueFamily(m_LastCmdBufferID),
(uint32_t)imgBarriers.size(), imgBarriers.data());
}
@@ -1693,8 +1684,7 @@ bool WrappedVulkan::Serialise_vkCmdNextSubpass(SerialiserType &ser, VkCommandBuf
rdcarray<VkImageMemoryBarrier> imgBarriers = GetImplicitRenderPassBarriers();
ResourceId cmd = GetResID(commandBuffer);
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imageStates,
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[m_LastCmdBufferID].imageStates,
FindCommandQueueFamily(m_LastCmdBufferID),
(uint32_t)imgBarriers.size(), imgBarriers.data());
@@ -1801,8 +1791,7 @@ bool WrappedVulkan::Serialise_vkCmdEndRenderPass(SerialiserType &ser, VkCommandB
}
}
ResourceId cmd = GetResID(commandBuffer);
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imageStates,
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[m_LastCmdBufferID].imageStates,
FindCommandQueueFamily(m_LastCmdBufferID),
(uint32_t)imgBarriers.size(), imgBarriers.data());
}
@@ -1820,8 +1809,7 @@ bool WrappedVulkan::Serialise_vkCmdEndRenderPass(SerialiserType &ser, VkCommandB
rdcarray<VkImageMemoryBarrier> imgBarriers = GetImplicitRenderPassBarriers(~0U);
ResourceId cmd = GetResID(commandBuffer);
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imageStates,
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[m_LastCmdBufferID].imageStates,
FindCommandQueueFamily(m_LastCmdBufferID),
(uint32_t)imgBarriers.size(), imgBarriers.data());
@@ -2061,13 +2049,12 @@ bool WrappedVulkan::Serialise_vkCmdBeginRenderPass2(SerialiserType &ser,
m_DrawcallCallback->PostRemisc(eventId, drawFlags, commandBuffer);
}
ResourceId cmd = GetResID(commandBuffer);
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imageStates,
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[m_LastCmdBufferID].imageStates,
FindCommandQueueFamily(m_LastCmdBufferID),
(uint32_t)imgBarriers.size(), imgBarriers.data());
if(m_FirstEventID == m_LastEventID)
UpdateImageStates(m_BakedCmdBufferInfo[cmd].imageStates);
UpdateImageStates(m_BakedCmdBufferInfo[m_LastCmdBufferID].imageStates);
}
}
else
@@ -2125,8 +2112,7 @@ bool WrappedVulkan::Serialise_vkCmdBeginRenderPass2(SerialiserType &ser,
rdcarray<VkImageMemoryBarrier> imgBarriers = GetImplicitRenderPassBarriers();
ResourceId cmd = GetResID(commandBuffer);
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imageStates,
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[m_LastCmdBufferID].imageStates,
FindCommandQueueFamily(m_LastCmdBufferID),
(uint32_t)imgBarriers.size(), imgBarriers.data());
@@ -2304,8 +2290,7 @@ bool WrappedVulkan::Serialise_vkCmdNextSubpass2(SerialiserType &ser, VkCommandBu
rdcarray<VkImageMemoryBarrier> imgBarriers = GetImplicitRenderPassBarriers();
ResourceId cmd = GetResID(commandBuffer);
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imageStates,
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[m_LastCmdBufferID].imageStates,
FindCommandQueueFamily(m_LastCmdBufferID),
(uint32_t)imgBarriers.size(), imgBarriers.data());
}
@@ -2322,8 +2307,7 @@ bool WrappedVulkan::Serialise_vkCmdNextSubpass2(SerialiserType &ser, VkCommandBu
rdcarray<VkImageMemoryBarrier> imgBarriers = GetImplicitRenderPassBarriers();
ResourceId cmd = GetResID(commandBuffer);
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imageStates,
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[m_LastCmdBufferID].imageStates,
FindCommandQueueFamily(m_LastCmdBufferID),
(uint32_t)imgBarriers.size(), imgBarriers.data());
@@ -2450,8 +2434,7 @@ bool WrappedVulkan::Serialise_vkCmdEndRenderPass2(SerialiserType &ser, VkCommand
}
}
ResourceId cmd = GetResID(commandBuffer);
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imageStates,
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[m_LastCmdBufferID].imageStates,
FindCommandQueueFamily(m_LastCmdBufferID),
(uint32_t)imgBarriers.size(), imgBarriers.data());
}
@@ -2462,8 +2445,7 @@ bool WrappedVulkan::Serialise_vkCmdEndRenderPass2(SerialiserType &ser, VkCommand
rdcarray<VkImageMemoryBarrier> imgBarriers = GetImplicitRenderPassBarriers(~0U);
ResourceId cmd = GetResID(commandBuffer);
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imageStates,
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[m_LastCmdBufferID].imageStates,
FindCommandQueueFamily(m_LastCmdBufferID),
(uint32_t)imgBarriers.size(), imgBarriers.data());
@@ -3419,8 +3401,7 @@ bool WrappedVulkan::Serialise_vkCmdPipelineBarrier(
if(commandBuffer != VK_NULL_HANDLE)
{
ResourceId cmd = GetResID(commandBuffer);
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imageStates,
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[m_LastCmdBufferID].imageStates,
FindCommandQueueFamily(m_LastCmdBufferID),
(uint32_t)imgBarriers.size(), imgBarriers.data());
@@ -3853,26 +3834,20 @@ bool WrappedVulkan::Serialise_vkCmdExecuteCommands(SerialiserType &ser, VkComman
->CmdExecuteCommands(Unwrap(commandBuffer), commandBufferCount,
UnwrapArray(pCommandBuffers, commandBufferCount));
// merge barriers into parent command buffer
for(uint32_t i = 0; i < commandBufferCount; i++)
// append deferred indirect copies and merge barriers into parent command buffer
{
ImageState::Merge(m_BakedCmdBufferInfo[GetResID(commandBuffer)].imageStates,
m_BakedCmdBufferInfo[GetResID(pCommandBuffers[i])].imageStates,
GetImageTransitionInfo());
}
// append deferred indirect copies
{
rdcarray<VkIndirectRecordData> &dstIndirect =
m_BakedCmdBufferInfo[m_LastCmdBufferID].indirectCopies;
BakedCmdBufferInfo &dst = m_BakedCmdBufferInfo[m_LastCmdBufferID];
for(uint32_t i = 0; i < commandBufferCount; i++)
{
// indirectCopies are stored in m_BakedCmdBufferInfo[m_LastCmdBufferID] which is an
// original ID
ResourceId origId = GetResourceManager()->GetOriginalID(GetResID(pCommandBuffers[i]));
ResourceId origSecondId = GetResourceManager()->GetOriginalID(GetResID(pCommandBuffers[i]));
BakedCmdBufferInfo &src = m_BakedCmdBufferInfo[origSecondId];
dstIndirect.append(m_BakedCmdBufferInfo[origId].indirectCopies);
dst.indirectCopies.append(src.indirectCopies);
ImageState::Merge(dst.imageStates, src.imageStates, GetImageTransitionInfo());
}
}
@@ -4067,15 +4042,15 @@ bool WrappedVulkan::Serialise_vkCmdExecuteCommands(SerialiserType &ser, VkComman
if(eid <= m_LastEventID || fullRecord)
{
VkCommandBuffer cmd = RerecordCmdBuf(cmdid);
ResourceId rerecord = GetResID(cmd);
#if ENABLED(VERBOSE_PARTIAL_REPLAY)
ResourceId rerecord = GetResID(cmd);
RDCDEBUG("ExecuteCommands re-recorded replay of %s, using %s (%u -> %u <= %u)",
ToStr(cmdid).c_str(), ToStr(rerecord).c_str(), eid, end, m_LastEventID);
#endif
rerecordedCmds.push_back(Unwrap(cmd));
ImageState::Merge(m_BakedCmdBufferInfo[GetResID(commandBuffer)].imageStates,
m_BakedCmdBufferInfo[rerecord].imageStates, GetImageTransitionInfo());
ImageState::Merge(m_BakedCmdBufferInfo[m_LastCmdBufferID].imageStates,
m_BakedCmdBufferInfo[cmdid].imageStates, GetImageTransitionInfo());
}
else
{
@@ -263,12 +263,12 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(SerialiserType &ser, VkQueue queue,
for(uint32_t c = 0; c < submitInfo.commandBufferCount; c++)
{
ResourceId liveCmd = GetResID(submitInfo.pCommandBuffers[c]);
ResourceId cmd = GetResourceManager()->GetOriginalID(liveCmd);
ResourceId cmd =
GetResourceManager()->GetOriginalID(GetResID(submitInfo.pCommandBuffers[c]));
BakedCmdBufferInfo &cmdBufInfo = m_BakedCmdBufferInfo[cmd];
UpdateImageStates(m_BakedCmdBufferInfo[liveCmd].imageStates);
UpdateImageStates(m_BakedCmdBufferInfo[cmd].imageStates);
rdcstr name = StringFormat::Fmt("=> %s[%u]: vkBeginCommandBuffer(%s)", basename.c_str(),
c, ToStr(cmd).c_str());
@@ -391,14 +391,14 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(SerialiserType &ser, VkQueue queue,
if(eid <= m_LastEventID)
{
VkCommandBuffer cmd = RerecordCmdBuf(cmdId);
ResourceId rerecord = GetResID(cmd);
#if ENABLED(VERBOSE_PARTIAL_REPLAY)
ResourceId rerecord = GetResID(cmd);
RDCDEBUG("Queue Submit re-recorded replay of %s, using %s (%u -> %u <= %u)",
ToStr(cmdId).c_str(), ToStr(rerecord).c_str(), eid, end, m_LastEventID);
#endif
rerecordedCmds.push_back(Unwrap(cmd));
UpdateImageStates(m_BakedCmdBufferInfo[rerecord].imageStates);
UpdateImageStates(m_BakedCmdBufferInfo[cmdId].imageStates);
}
else
{
@@ -852,10 +852,9 @@ bool WrappedVulkan::Serialise_vkCmdWaitEvents(
}
}
ResourceId cmd = GetResID(commandBuffer);
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[cmd].imageStates,
m_commandQueueFamilies[cmd], (uint32_t)imgBarriers.size(),
&imgBarriers[0]);
GetResourceManager()->RecordBarriers(m_BakedCmdBufferInfo[m_LastCmdBufferID].imageStates,
m_commandQueueFamilies[m_LastCmdBufferID],
(uint32_t)imgBarriers.size(), &imgBarriers[0]);
if(commandBuffer != VK_NULL_HANDLE)
{