mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-09-21 05:05:44 +00:00
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:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user