Begin handling partial replay of both primary and secondary cmd buffers

This commit is contained in:
baldurk
2016-07-19 12:41:21 +02:00
parent 24b644b8e3
commit cc04fa33a9
9 changed files with 148 additions and 104 deletions
+1 -1
View File
@@ -246,7 +246,7 @@ class WrappedID3D12CommandQueue : public ID3D12CommandQueue,
}
bool ShouldRerecordCmd(ResourceId cmdid);
bool InRerecordRange();
bool InRerecordRange(ResourceId cmdid);
ID3D12GraphicsCommandList *RerecordCmdList(ResourceId cmdid);
void ProcessChunk(uint64_t offset, D3D12ChunkType context);
+47 -33
View File
@@ -283,12 +283,6 @@ WrappedVulkan::WrappedVulkan(const char *logFilename) : m_RenderState(&m_Creatio
m_LastCmdBufferID = ResourceId();
m_PartialReplayData.renderPassActive = false;
m_PartialReplayData.resultPartialCmdBuffer = VK_NULL_HANDLE;
m_PartialReplayData.outsideCmdBuffer = VK_NULL_HANDLE;
m_PartialReplayData.partialParent = ResourceId();
m_PartialReplayData.baseEvent = 0;
m_DrawcallStack.push_back(&m_ParentDrawcall);
m_SetDeviceLoaderData = NULL;
@@ -1629,12 +1623,15 @@ void WrappedVulkan::ContextReplayLog(LogState readType, uint32_t startEventID, u
m_CleanupEvents.clear();
if(m_PartialReplayData.resultPartialCmdBuffer != VK_NULL_HANDLE)
for(int p = 0; p < ePartialNum; p++)
{
// deliberately call our own function, so this is destroyed as a wrapped object
vkFreeCommandBuffers(m_PartialReplayData.partialDevice, m_PartialReplayData.resultPartialCmdPool,
1, &m_PartialReplayData.resultPartialCmdBuffer);
m_PartialReplayData.resultPartialCmdBuffer = VK_NULL_HANDLE;
if(m_Partial[p].resultPartialCmdBuffer != VK_NULL_HANDLE)
{
// deliberately call our own function, so this is destroyed as a wrapped object
vkFreeCommandBuffers(m_Partial[p].partialDevice, m_Partial[p].resultPartialCmdPool, 1,
&m_Partial[p].resultPartialCmdBuffer);
m_Partial[p].resultPartialCmdBuffer = VK_NULL_HANDLE;
}
}
for(auto it = m_RerecordCmds.begin(); it != m_RerecordCmds.end(); ++it)
@@ -2123,10 +2120,10 @@ void WrappedVulkan::ReplayLog(uint32_t startEventID, uint32_t endEventID, Replay
{
if(!partial)
{
m_PartialReplayData.renderPassActive = false;
RDCASSERT(m_PartialReplayData.resultPartialCmdBuffer == VK_NULL_HANDLE);
m_PartialReplayData.partialParent = ResourceId();
m_PartialReplayData.baseEvent = 0;
RDCASSERT(m_Partial[Primary].resultPartialCmdBuffer == VK_NULL_HANDLE);
RDCASSERT(m_Partial[Secondary].resultPartialCmdBuffer == VK_NULL_HANDLE);
m_Partial[Primary].Reset();
m_Partial[Secondary].Reset();
m_RenderState = VulkanRenderState(&m_CreationInfo);
m_RenderState.m_ResourceManager = GetResourceManager();
}
@@ -2141,7 +2138,7 @@ void WrappedVulkan::ReplayLog(uint32_t startEventID, uint32_t endEventID, Replay
// has chosen a subsection that lies within a command buffer
if(partial)
{
VkCommandBuffer cmd = m_PartialReplayData.outsideCmdBuffer = GetNextCmd();
VkCommandBuffer cmd = m_Partial[Primary].outsideCmdBuffer = GetNextCmd();
VkCommandBufferBeginInfo beginInfo = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, NULL,
VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT};
@@ -2149,10 +2146,10 @@ void WrappedVulkan::ReplayLog(uint32_t startEventID, uint32_t endEventID, Replay
vkr = ObjDisp(cmd)->BeginCommandBuffer(Unwrap(cmd), &beginInfo);
RDCASSERTEQUAL(vkr, VK_SUCCESS);
rpWasActive = m_PartialReplayData.renderPassActive;
rpWasActive = m_Partial[Primary].renderPassActive;
// if a render pass was active, begin it and set up the partial replay state
if(m_PartialReplayData.renderPassActive)
if(m_Partial[Primary].renderPassActive)
m_RenderState.BeginRenderPassAndApplyState(cmd);
// if we had a compute pipeline, need to bind that
else if(m_RenderState.compute.pipeline != ResourceId())
@@ -2174,25 +2171,25 @@ void WrappedVulkan::ReplayLog(uint32_t startEventID, uint32_t endEventID, Replay
else
RDCFATAL("Unexpected replay type");
if(m_PartialReplayData.outsideCmdBuffer != VK_NULL_HANDLE)
if(m_Partial[Primary].outsideCmdBuffer != VK_NULL_HANDLE)
{
VkCommandBuffer cmd = m_PartialReplayData.outsideCmdBuffer;
VkCommandBuffer cmd = m_Partial[Primary].outsideCmdBuffer;
// check if the render pass is active - it could have become active
// even if it wasn't before (if the above event was a CmdBeginRenderPass)
if(m_PartialReplayData.renderPassActive)
if(m_Partial[Primary].renderPassActive)
m_RenderState.EndRenderPass(cmd);
// we might have replayed a CmdBeginRenderPass or CmdEndRenderPass,
// but we want to keep the partial replay data state intact, so restore
// whether or not a render pass was active.
m_PartialReplayData.renderPassActive = rpWasActive;
m_Partial[Primary].renderPassActive = rpWasActive;
ObjDisp(cmd)->EndCommandBuffer(Unwrap(cmd));
SubmitCmds();
m_PartialReplayData.outsideCmdBuffer = VK_NULL_HANDLE;
m_Partial[Primary].outsideCmdBuffer = VK_NULL_HANDLE;
}
#if defined(SINGLE_FLUSH_VALIDATE)
@@ -2379,31 +2376,39 @@ VkBool32 WrappedVulkan::DebugCallback(VkDebugReportFlagsEXT flags,
bool WrappedVulkan::ShouldRerecordCmd(ResourceId cmdid)
{
if(m_PartialReplayData.outsideCmdBuffer != VK_NULL_HANDLE)
if(m_Partial[Primary].outsideCmdBuffer != VK_NULL_HANDLE)
return true;
if(m_DrawcallCallback && m_DrawcallCallback->RecordAllCmds())
return true;
return cmdid == m_PartialReplayData.partialParent;
return cmdid == m_Partial[Primary].partialParent || cmdid == m_Partial[Secondary].partialParent;
}
bool WrappedVulkan::InRerecordRange()
bool WrappedVulkan::InRerecordRange(ResourceId cmdid)
{
if(m_PartialReplayData.outsideCmdBuffer != VK_NULL_HANDLE)
if(m_Partial[Primary].outsideCmdBuffer != VK_NULL_HANDLE)
return true;
if(m_DrawcallCallback && m_DrawcallCallback->RecordAllCmds())
return true;
return m_BakedCmdBufferInfo[m_PartialReplayData.partialParent].curEventID <=
m_LastEventID - m_PartialReplayData.baseEvent;
for(int p = 0; p < ePartialNum; p++)
{
if(cmdid == m_Partial[p].partialParent)
{
return m_BakedCmdBufferInfo[m_Partial[p].partialParent].curEventID <=
m_LastEventID - m_Partial[p].baseEvent;
}
}
return false;
}
VkCommandBuffer WrappedVulkan::RerecordCmdBuf(ResourceId cmdid)
VkCommandBuffer WrappedVulkan::RerecordCmdBuf(ResourceId cmdid, PartialReplayIndex partialType)
{
if(m_PartialReplayData.outsideCmdBuffer != VK_NULL_HANDLE)
return m_PartialReplayData.outsideCmdBuffer;
if(m_Partial[Primary].outsideCmdBuffer != VK_NULL_HANDLE)
return m_Partial[Primary].outsideCmdBuffer;
if(m_DrawcallCallback && m_DrawcallCallback->RecordAllCmds())
{
@@ -2414,7 +2419,16 @@ VkCommandBuffer WrappedVulkan::RerecordCmdBuf(ResourceId cmdid)
return it->second;
}
return m_PartialReplayData.resultPartialCmdBuffer;
if(partialType != ePartialNum)
return m_Partial[partialType].resultPartialCmdBuffer;
for(int p = 0; p < ePartialNum; p++)
if(cmdid == m_Partial[p].partialParent)
return m_Partial[p].resultPartialCmdBuffer;
RDCERR("Calling re-record for invalid command buffer id");
return VK_NULL_HANDLE;
}
void WrappedVulkan::AddDrawcall(const FetchDrawcall &d, bool hasEvents)
+22 -3
View File
@@ -396,8 +396,27 @@ private:
};
vector<DrawcallUse> m_DrawcallUses;
enum PartialReplayIndex
{
Primary,
Secondary,
ePartialNum
};
struct PartialReplayData
{
PartialReplayData() { Reset(); }
void Reset()
{
resultPartialCmdPool = VK_NULL_HANDLE;
resultPartialCmdBuffer = VK_NULL_HANDLE;
partialDevice = VK_NULL_HANDLE;
outsideCmdBuffer = VK_NULL_HANDLE;
partialParent = ResourceId();
baseEvent = 0;
renderPassActive = false;
}
// if we're doing a partial replay, by definition only one command
// buffer will be partial at any one time. While replaying through
// the command buffer chunks, the partial command buffer will be
@@ -447,7 +466,7 @@ private:
// reach the vkEndCommandBuffer that we also need to end a render
// pass.
bool renderPassActive;
} m_PartialReplayData;
} m_Partial[ePartialNum];
map<ResourceId, VkCommandBuffer> m_RerecordCmds;
@@ -457,8 +476,8 @@ private:
VulkanRenderState m_RenderState;
bool ShouldRerecordCmd(ResourceId cmdid);
bool InRerecordRange();
VkCommandBuffer RerecordCmdBuf(ResourceId cmdid);
bool InRerecordRange(ResourceId cmdid);
VkCommandBuffer RerecordCmdBuf(ResourceId cmdid, PartialReplayIndex partialType = ePartialNum);
// this info is stored in the record on capture, but we
// need it on replay too
+2 -1
View File
@@ -3913,7 +3913,8 @@ ResourceId VulkanDebugManager::RenderOverlay(ResourceId texid, TextureDisplayOve
VkImageSubresourceRange subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
if(!m_pDriver->m_PartialReplayData.renderPassActive)
// Secondary commands can't have render passes
if(!m_pDriver->m_Partial[WrappedVulkan::Primary].renderPassActive)
{
// don't do anything, no drawcall capable of making overlays selected
float black[] = {0.0f, 0.0f, 0.0f, 0.0f};
@@ -321,26 +321,33 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(Serialiser *localSerialiser,
if(m_State == EXECUTING)
{
const vector<uint32_t> &baseEvents = m_PartialReplayData.cmdBufferSubmits[bakeId];
uint32_t length = m_BakedCmdBufferInfo[bakeId].eventCount;
const uint32_t length = m_BakedCmdBufferInfo[bakeId].eventCount;
bool partial = false;
int partialType = ePartialNum;
for(auto it = baseEvents.begin(); it != baseEvents.end(); ++it)
// check for partial execution of this command buffer
for(int p = 0; p < ePartialNum; p++)
{
if(*it <= m_LastEventID && m_LastEventID < (*it + length))
const vector<uint32_t> &baseEvents = m_Partial[p].cmdBufferSubmits[bakeId];
for(auto it = baseEvents.begin(); it != baseEvents.end(); ++it)
{
RDCDEBUG("vkBegin - partial detected %u < %u < %u, %llu -> %llu", *it, m_LastEventID,
*it + length, cmdId, bakeId);
if(*it <= m_LastEventID && m_LastEventID < (*it + length))
{
RDCDEBUG("vkBegin - partial detected %u < %u < %u, %llu -> %llu", *it, m_LastEventID,
*it + length, cmdId, bakeId);
m_PartialReplayData.partialParent = cmdId;
m_PartialReplayData.baseEvent = *it;
m_PartialReplayData.renderPassActive = false;
m_PartialReplayData.partialDevice = device;
m_PartialReplayData.resultPartialCmdPool =
(VkCommandPool)(uint64_t)GetResourceManager()->GetNonDispWrapper(allocInfo.commandPool);
m_Partial[p].partialParent = cmdId;
m_Partial[p].baseEvent = *it;
m_Partial[p].renderPassActive = false;
m_Partial[p].partialDevice = device;
m_Partial[p].resultPartialCmdPool =
(VkCommandPool)(uint64_t)GetResourceManager()->GetNonDispWrapper(allocInfo.commandPool);
partial = true;
partial = true;
partialType = p;
}
}
}
@@ -367,7 +374,7 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(Serialiser *localSerialiser,
if(partial)
{
m_PartialReplayData.resultPartialCmdBuffer = cmd;
m_Partial[partialType].resultPartialCmdBuffer = cmd;
}
else
{
@@ -519,7 +526,8 @@ bool WrappedVulkan::Serialise_vkEndCommandBuffer(Serialiser *localSerialiser,
bool recordAll = m_DrawcallCallback && m_DrawcallCallback->RecordAllCmds();
if(!recordAll && m_PartialReplayData.renderPassActive)
if(!recordAll && m_Partial[Primary].partialParent == cmdid &&
m_Partial[Primary].renderPassActive)
{
uint32_t numSubpasses =
(uint32_t)m_CreationInfo.m_RenderPass[m_RenderState.renderPass].subpasses.size();
@@ -536,7 +544,8 @@ bool WrappedVulkan::Serialise_vkEndCommandBuffer(Serialiser *localSerialiser,
// duplicates when it comes time to clean up. See above in vkBeginCommandBuffer
m_RerecordCmds.erase(cmdid);
m_PartialReplayData.partialParent = ResourceId();
if(m_Partial[Primary].partialParent == cmdid)
m_Partial[Primary].partialParent = ResourceId();
}
m_BakedCmdBufferInfo[cmdid].curEventID = 0;
@@ -655,11 +664,11 @@ bool WrappedVulkan::Serialise_vkCmdBeginRenderPass(Serialiser *localSerialiser,
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
m_PartialReplayData.renderPassActive = true;
m_Partial[Primary].renderPassActive = true;
ObjDisp(commandBuffer)->CmdBeginRenderPass(Unwrap(commandBuffer), &beginInfo, cont);
m_RenderState.subpass = 0;
@@ -752,7 +761,7 @@ bool WrappedVulkan::Serialise_vkCmdNextSubpass(Serialiser *localSerialiser,
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
@@ -841,7 +850,7 @@ bool WrappedVulkan::Serialise_vkCmdExecuteCommands(Serialiser *localSerialiser,
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
@@ -919,11 +928,11 @@ bool WrappedVulkan::Serialise_vkCmdEndRenderPass(Serialiser *localSerialiser,
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
m_PartialReplayData.renderPassActive = false;
m_Partial[Primary].renderPassActive = false;
ObjDisp(commandBuffer)->CmdEndRenderPass(Unwrap(commandBuffer));
}
}
@@ -988,7 +997,7 @@ bool WrappedVulkan::Serialise_vkCmdBindPipeline(Serialiser *localSerialiser,
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
pipeline = GetResourceManager()->GetLiveHandle<VkPipeline>(pipeid);
commandBuffer = RerecordCmdBuf(cmdid);
@@ -1133,7 +1142,7 @@ bool WrappedVulkan::Serialise_vkCmdBindDescriptorSets(
{
layout = GetResourceManager()->GetLiveHandle<VkPipelineLayout>(layoutid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
@@ -1313,7 +1322,7 @@ bool WrappedVulkan::Serialise_vkCmdBindVertexBuffers(Serialiser *localSerialiser
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
ObjDisp(commandBuffer)
@@ -1399,7 +1408,7 @@ bool WrappedVulkan::Serialise_vkCmdBindIndexBuffer(Serialiser *localSerialiser,
{
buffer = GetResourceManager()->GetLiveHandle<VkBuffer>(bufid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
ObjDisp(commandBuffer)->CmdBindIndexBuffer(Unwrap(commandBuffer), Unwrap(buffer), offs, idxType);
@@ -1471,7 +1480,7 @@ bool WrappedVulkan::Serialise_vkCmdUpdateBuffer(Serialiser *localSerialiser,
{
destBuffer = GetResourceManager()->GetLiveHandle<VkBuffer>(bufid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
ObjDisp(commandBuffer)
@@ -1546,7 +1555,7 @@ bool WrappedVulkan::Serialise_vkCmdFillBuffer(Serialiser *localSerialiser,
{
destBuffer = GetResourceManager()->GetLiveHandle<VkBuffer>(bufid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
ObjDisp(commandBuffer)->CmdFillBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), offs, sz, d);
@@ -1614,7 +1623,7 @@ bool WrappedVulkan::Serialise_vkCmdPushConstants(Serialiser *localSerialiser,
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
layout = GetResourceManager()->GetLiveHandle<VkPipelineLayout>(layid);
@@ -1717,7 +1726,7 @@ bool WrappedVulkan::Serialise_vkCmdPipelineBarrier(
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
ObjDisp(commandBuffer)
@@ -1835,7 +1844,7 @@ bool WrappedVulkan::Serialise_vkCmdWriteTimestamp(Serialiser *localSerialiser,
{
queryPool = GetResourceManager()->GetLiveHandle<VkQueryPool>(poolid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
ObjDisp(commandBuffer)->CmdWriteTimestamp(Unwrap(commandBuffer), stage, Unwrap(queryPool), q);
@@ -1900,7 +1909,7 @@ bool WrappedVulkan::Serialise_vkCmdCopyQueryPoolResults(
queryPool = GetResourceManager()->GetLiveHandle<VkQueryPool>(qid);
destBuffer = GetResourceManager()->GetLiveHandle<VkBuffer>(bufid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
ObjDisp(commandBuffer)
@@ -1978,7 +1987,7 @@ bool WrappedVulkan::Serialise_vkCmdBeginQuery(Serialiser *localSerialiser,
{
queryPool = GetResourceManager()->GetLiveHandle<VkQueryPool>(qid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
ObjDisp(commandBuffer)->CmdBeginQuery(Unwrap(commandBuffer), Unwrap(queryPool), q, f);
@@ -2033,7 +2042,7 @@ bool WrappedVulkan::Serialise_vkCmdEndQuery(Serialiser *localSerialiser,
{
queryPool = GetResourceManager()->GetLiveHandle<VkQueryPool>(qid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
ObjDisp(commandBuffer)->CmdEndQuery(Unwrap(commandBuffer), Unwrap(queryPool), q);
@@ -2089,7 +2098,7 @@ bool WrappedVulkan::Serialise_vkCmdResetQueryPool(Serialiser *localSerialiser,
{
queryPool = GetResourceManager()->GetLiveHandle<VkQueryPool>(qid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
ObjDisp(commandBuffer)->CmdResetQueryPool(Unwrap(commandBuffer), Unwrap(queryPool), first, count);
@@ -42,7 +42,7 @@ bool WrappedVulkan::Serialise_vkCmdDraw(Serialiser *localSerialiser, VkCommandBu
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
@@ -127,7 +127,7 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndexed(Serialiser *localSerialiser,
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
@@ -219,7 +219,7 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndirect(Serialiser *localSerialiser,
{
buffer = GetResourceManager()->GetLiveHandle<VkBuffer>(bufid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
@@ -328,7 +328,7 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndexedIndirect(Serialiser *localSerialis
{
buffer = GetResourceManager()->GetLiveHandle<VkBuffer>(bufid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
@@ -435,7 +435,7 @@ bool WrappedVulkan::Serialise_vkCmdDispatch(Serialiser *localSerialiser,
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
@@ -514,7 +514,7 @@ bool WrappedVulkan::Serialise_vkCmdDispatchIndirect(Serialiser *localSerialiser,
{
buffer = GetResourceManager()->GetLiveHandle<VkBuffer>(bufid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
@@ -622,7 +622,7 @@ bool WrappedVulkan::Serialise_vkCmdBlitImage(Serialiser *localSerialiser,
srcImage = GetResourceManager()->GetLiveHandle<VkImage>(srcid);
destImage = GetResourceManager()->GetLiveHandle<VkImage>(dstid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
ObjDisp(commandBuffer)
@@ -737,7 +737,7 @@ bool WrappedVulkan::Serialise_vkCmdResolveImage(Serialiser *localSerialiser,
srcImage = GetResourceManager()->GetLiveHandle<VkImage>(srcid);
destImage = GetResourceManager()->GetLiveHandle<VkImage>(dstid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
ObjDisp(commandBuffer)
@@ -852,7 +852,7 @@ bool WrappedVulkan::Serialise_vkCmdCopyImage(Serialiser *localSerialiser,
srcImage = GetResourceManager()->GetLiveHandle<VkImage>(srcid);
destImage = GetResourceManager()->GetLiveHandle<VkImage>(dstid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
ObjDisp(commandBuffer)
@@ -967,7 +967,7 @@ bool WrappedVulkan::Serialise_vkCmdCopyBufferToImage(Serialiser *localSerialiser
srcBuffer = GetResourceManager()->GetLiveHandle<VkBuffer>(bufid);
destImage = GetResourceManager()->GetLiveHandle<VkImage>(imgid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
ObjDisp(commandBuffer)
@@ -1073,7 +1073,7 @@ bool WrappedVulkan::Serialise_vkCmdCopyImageToBuffer(Serialiser *localSerialiser
srcImage = GetResourceManager()->GetLiveHandle<VkImage>(imgid);
destBuffer = GetResourceManager()->GetLiveHandle<VkBuffer>(bufid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
ObjDisp(commandBuffer)
@@ -1180,7 +1180,7 @@ bool WrappedVulkan::Serialise_vkCmdCopyBuffer(Serialiser *localSerialiser,
srcBuffer = GetResourceManager()->GetLiveHandle<VkBuffer>(srcid);
destBuffer = GetResourceManager()->GetLiveHandle<VkBuffer>(dstid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
ObjDisp(commandBuffer)
@@ -1296,7 +1296,7 @@ bool WrappedVulkan::Serialise_vkCmdClearColorImage(Serialiser *localSerialiser,
{
image = GetResourceManager()->GetLiveHandle<VkImage>(imgid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
ObjDisp(commandBuffer)
@@ -1384,7 +1384,7 @@ bool WrappedVulkan::Serialise_vkCmdClearDepthStencilImage(
{
image = GetResourceManager()->GetLiveHandle<VkImage>(imgid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
ObjDisp(commandBuffer)
@@ -1475,7 +1475,7 @@ bool WrappedVulkan::Serialise_vkCmdClearAttachments(Serialiser *localSerialiser,
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
commandBuffer = RerecordCmdBuf(cmdid);
ObjDisp(commandBuffer)->CmdClearAttachments(Unwrap(commandBuffer), acount, atts, rcount, rects);
@@ -40,7 +40,7 @@ bool WrappedVulkan::Serialise_vkCmdSetViewport(Serialiser *localSerialiser,
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
cmdBuffer = RerecordCmdBuf(cmdid);
ObjDisp(cmdBuffer)->CmdSetViewport(Unwrap(cmdBuffer), first, count, views);
@@ -100,7 +100,7 @@ bool WrappedVulkan::Serialise_vkCmdSetScissor(Serialiser *localSerialiser,
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
cmdBuffer = RerecordCmdBuf(cmdid);
ObjDisp(cmdBuffer)->CmdSetScissor(Unwrap(cmdBuffer), first, count, scissors);
@@ -157,7 +157,7 @@ bool WrappedVulkan::Serialise_vkCmdSetLineWidth(Serialiser *localSerialiser,
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
cmdBuffer = RerecordCmdBuf(cmdid);
ObjDisp(cmdBuffer)->CmdSetLineWidth(Unwrap(cmdBuffer), width);
@@ -209,7 +209,7 @@ bool WrappedVulkan::Serialise_vkCmdSetDepthBias(Serialiser *localSerialiser,
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
cmdBuffer = RerecordCmdBuf(cmdid);
ObjDisp(cmdBuffer)->CmdSetDepthBias(Unwrap(cmdBuffer), bias, biasclamp, slope);
@@ -273,7 +273,7 @@ bool WrappedVulkan::Serialise_vkCmdSetBlendConstants(Serialiser *localSerialiser
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
cmdBuffer = RerecordCmdBuf(cmdid);
ObjDisp(cmdBuffer)->CmdSetBlendConstants(Unwrap(cmdBuffer), blendFactor);
@@ -324,7 +324,7 @@ bool WrappedVulkan::Serialise_vkCmdSetDepthBounds(Serialiser *localSerialiser,
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
cmdBuffer = RerecordCmdBuf(cmdid);
ObjDisp(cmdBuffer)->CmdSetDepthBounds(Unwrap(cmdBuffer), mind, maxd);
@@ -378,7 +378,7 @@ bool WrappedVulkan::Serialise_vkCmdSetStencilCompareMask(Serialiser *localSerial
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
cmdBuffer = RerecordCmdBuf(cmdid);
ObjDisp(cmdBuffer)->CmdSetStencilCompareMask(Unwrap(cmdBuffer), face, mask);
@@ -435,7 +435,7 @@ bool WrappedVulkan::Serialise_vkCmdSetStencilWriteMask(Serialiser *localSerialis
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
cmdBuffer = RerecordCmdBuf(cmdid);
ObjDisp(cmdBuffer)->CmdSetStencilWriteMask(Unwrap(cmdBuffer), face, mask);
@@ -492,7 +492,7 @@ bool WrappedVulkan::Serialise_vkCmdSetStencilReference(Serialiser *localSerialis
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
cmdBuffer = RerecordCmdBuf(cmdid);
ObjDisp(cmdBuffer)->CmdSetStencilReference(Unwrap(cmdBuffer), face, mask);
@@ -232,7 +232,8 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(Serialiser *localSerialiser, VkQueue
m_DebugMessages.back().eventID += m_RootEventID;
}
m_PartialReplayData.cmdBufferSubmits[cmdIds[c]].push_back(m_RootEventID);
// only primary command buffers can be submitted
m_Partial[Primary].cmdBufferSubmits[cmdIds[c]].push_back(m_RootEventID);
m_RootEventID += cmdBufInfo.eventCount;
m_RootDrawcallID += cmdBufInfo.drawCount;
@@ -315,12 +316,12 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(Serialiser *localSerialiser, VkQueue
uint32_t end = eid + m_BakedCmdBufferInfo[cmdIds[c]].eventCount;
if(eid == m_PartialReplayData.baseEvent)
if(eid == m_Partial[Primary].baseEvent)
{
ResourceId partial = GetResID(RerecordCmdBuf(cmdIds[c]));
ResourceId partial = GetResID(RerecordCmdBuf(cmdIds[c], Primary));
RDCDEBUG("Queue Submit partial replay of %llu at %u, using %llu", cmdIds[c], eid, partial);
trimmedCmdIds.push_back(partial);
trimmedCmds.push_back(Unwrap(RerecordCmdBuf(cmdIds[c])));
trimmedCmds.push_back(Unwrap(RerecordCmdBuf(cmdIds[c], Primary)));
}
else if(m_LastEventID >= end)
{
@@ -563,7 +563,7 @@ bool WrappedVulkan::Serialise_vkCmdSetEvent(Serialiser *localSerialiser, VkComma
{
event = GetResourceManager()->GetLiveHandle<VkEvent>(eid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
cmdBuffer = RerecordCmdBuf(cmdid);
ObjDisp(cmdBuffer)->CmdSetEvent(Unwrap(cmdBuffer), Unwrap(event), mask);
@@ -619,7 +619,7 @@ bool WrappedVulkan::Serialise_vkCmdResetEvent(Serialiser *localSerialiser, VkCom
{
event = GetResourceManager()->GetLiveHandle<VkEvent>(eid);
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
cmdBuffer = RerecordCmdBuf(cmdid);
// ObjDisp(cmdBuffer)->CmdResetEvent(Unwrap(cmdBuffer), Unwrap(event), mask);
@@ -711,7 +711,7 @@ bool WrappedVulkan::Serialise_vkCmdWaitEvents(
if(m_State == EXECUTING)
{
if(ShouldRerecordCmd(cmdid) && InRerecordRange())
if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid))
{
cmdBuffer = RerecordCmdBuf(cmdid);