From 0c71c71645f273103005e60b495fcbe7eacb6be3 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 3 Sep 2020 18:58:30 +0100 Subject: [PATCH] Store command buffer page set in baked commands. Closes #2039 * If we keep the page set in the command buffer and destroy it on reset, we'll free the pages behind the baked chunks that we stored. If a capture records and resets a command buffer multiple times within a capture we need to store multiple baked command buffers. * So instead we give the baked commands ownership of those pages and reset them when the baked commands record is destroyed (either because the command buffer has been reset as it was before - or if we hold onto a reference during capture then after the capture is done). --- renderdoc/driver/vulkan/vk_resources.h | 6 ++++++ renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp | 6 +----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index aaeaf5255..046ce0903 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -1011,6 +1011,12 @@ struct ImageState; struct CmdBufferRecordingInfo { + ~CmdBufferRecordingInfo() + { + if(alloc) + alloc->ResetPageSet(pageSet); + } + VkDevice device; VkCommandBufferAllocateInfo allocInfo; diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 4aec92f93..700f8bc78 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -1020,8 +1020,6 @@ VkResult WrappedVulkan::vkBeginCommandBuffer(VkCommandBuffer commandBuffer, if(record->bakedCommands) record->bakedCommands->Delete(GetResourceManager()); - record->cmdInfo->alloc->ResetPageSet(record->cmdInfo->pageSet); - record->bakedCommands = GetResourceManager()->AddResourceRecord(ResourceIDGen::GetNewUniqueID()); record->bakedCommands->DisableChunkLocking(); record->bakedCommands->InternalResource = true; @@ -1242,7 +1240,7 @@ VkResult WrappedVulkan::vkEndCommandBuffer(VkCommandBuffer commandBuffer) // if we can't reset command buffers there's no need to claim a set of pages if(record->pool->cmdPoolInfo->allowCmdBufReset) - record->cmdInfo->pageSet = record->cmdInfo->alloc->GetPageSet(); + record->bakedCommands->cmdInfo->pageSet = record->cmdInfo->alloc->GetPageSet(); record->Bake(); } @@ -1272,8 +1270,6 @@ VkResult WrappedVulkan::vkResetCommandBuffer(VkCommandBuffer commandBuffer, if(record->bakedCommands) record->bakedCommands->Delete(GetResourceManager()); - record->cmdInfo->alloc->ResetPageSet(record->cmdInfo->pageSet); - record->bakedCommands = NULL; }