Record secondary command buffers and execute as block

* Not supporting image transitions within secondary command buffers, and
  doesn't support partial executes of secondary command buffers on the
  replay side.
This commit is contained in:
baldurk
2016-02-07 18:45:32 +01:00
parent 9fceda593f
commit 5586ae028f
3 changed files with 47 additions and 2 deletions
+4
View File
@@ -590,6 +590,8 @@ struct CmdBufferRecordingInfo
// used to look up all the frame refs per-desc set and apply them on queue
// submit with latest binding refs.
set<VkDescriptorSet> boundDescSets;
vector<VkResourceRecord *> subcmds;
};
struct MemMapState
@@ -636,6 +638,8 @@ struct VkResourceRecord : public ResourceRecord
SwapChunks(bakedCommands);
cmdInfo->dirtied.swap(bakedCommands->cmdInfo->dirtied);
cmdInfo->boundDescSets.swap(bakedCommands->cmdInfo->boundDescSets);
cmdInfo->imgtransitions.swap(bakedCommands->cmdInfo->imgtransitions);
cmdInfo->subcmds.swap(bakedCommands->cmdInfo->subcmds);
}
void AddBindFrameRef(ResourceId id, FrameRefType ref)
@@ -766,7 +766,7 @@ bool WrappedVulkan::Serialise_vkCmdExecuteCommands(
{
ResourceId id;
if(m_State >= WRITING)
id = GetResID(pCmdBuffers[i]);
id = GetRecord(pCmdBuffers[i])->bakedCommands->GetResourceID();
localSerialiser->Serialise("pCmdBuffers[]", id);
@@ -792,6 +792,15 @@ bool WrappedVulkan::Serialise_vkCmdExecuteCommands(
cmdBuffer = GetResourceManager()->GetLiveHandle<VkCmdBuffer>(cmdid);
ObjDisp(cmdBuffer)->CmdExecuteCommands(Unwrap(cmdBuffer), count, &cmds[0]);
const string desc = localSerialiser->GetDebugStr();
AddEvent(NEXT_SUBPASS, desc);
FetchDrawcall draw;
draw.name = "vkCmdExecuteCommands()";
draw.flags |= eDraw_CmdList;
AddDrawcall(draw, true);
}
return true;
@@ -806,7 +815,28 @@ void WrappedVulkan::vkCmdExecuteCommands(
for(uint32_t i=0; i < cmdBuffersCount; i++) unwrapped[i] = Unwrap(pCmdBuffers[i]);
ObjDisp(cmdBuffer)->CmdExecuteCommands(Unwrap(cmdBuffer), cmdBuffersCount, unwrapped);
// VKTODOHIGH stub function
if(m_State >= WRITING)
{
VkResourceRecord *record = GetRecord(cmdBuffer);
CACHE_THREAD_SERIALISER();
SCOPED_SERIALISE_CONTEXT(EXEC_CMDS);
Serialise_vkCmdExecuteCommands(localSerialiser, cmdBuffer, cmdBuffersCount, pCmdBuffers);
record->AddChunk(scope.Get());
for(uint32_t i=0; i < cmdBuffersCount; i++)
{
VkResourceRecord *execRecord = GetRecord(pCmdBuffers[i]);
record->cmdInfo->dirtied.insert(execRecord->bakedCommands->cmdInfo->dirtied.begin(), execRecord->bakedCommands->cmdInfo->dirtied.end());
record->cmdInfo->boundDescSets.insert(execRecord->bakedCommands->cmdInfo->boundDescSets.begin(), execRecord->bakedCommands->cmdInfo->boundDescSets.end());
record->cmdInfo->subcmds.push_back(execRecord);
// VKTODOHIGH need to merge transitions into parent command buffer
//GetResourceManager()->RecordTransitions();
}
}
}
bool WrappedVulkan::Serialise_vkCmdEndRenderPass(
@@ -408,6 +408,15 @@ VkResult WrappedVulkan::vkQueueSubmit(
// ref the parent command buffer by itself, this will pull in the cmd buffer pool
GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_Read);
for(size_t i=0; i < record->bakedCommands->cmdInfo->subcmds.size(); i++)
{
record->bakedCommands->cmdInfo->subcmds[i]->bakedCommands->AddResourceReferences(GetResourceManager());
record->bakedCommands->cmdInfo->subcmds[i]->bakedCommands->AddReferencedIDs(refdIDs);
GetResourceManager()->MarkResourceFrameReferenced(record->bakedCommands->cmdInfo->subcmds[i]->GetResourceID(), eFrameRef_Read);
record->bakedCommands->cmdInfo->subcmds[i]->bakedCommands->AddRef();
}
GetResourceManager()->MarkResourceFrameReferenced(GetResID(queue), eFrameRef_Read);
@@ -417,6 +426,8 @@ VkResult WrappedVulkan::vkQueueSubmit(
{
SCOPED_LOCK(m_CmdBufferRecordsLock);
m_CmdBufferRecords.push_back(record->bakedCommands);
for(size_t i=0; i < record->bakedCommands->cmdInfo->subcmds.size(); i++)
m_CmdBufferRecords.push_back(record->bakedCommands->cmdInfo->subcmds[i]->bakedCommands);
}
record->bakedCommands->AddRef();