From 5586ae028f7825437f44f65a05b303fb1ba17da1 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 6 Nov 2015 21:03:57 +0100 Subject: [PATCH] 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. --- renderdoc/driver/vulkan/vk_resources.h | 4 +++ .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 34 +++++++++++++++++-- .../driver/vulkan/wrappers/vk_queue_funcs.cpp | 11 ++++++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index b6222d485..1ed63a229 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -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 boundDescSets; + + vector 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) diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index de4777aef..5195a7f9a 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -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(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( diff --git a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp index 716c093b9..b62c80268 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -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();