diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 83fcaf9d0..8f172f39a 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -502,19 +502,31 @@ VkResult WrappedVulkan::vkCreateInstance( VkResult WrappedVulkan::vkDestroyInstance( VkInstance instance) { - dispatch_key key = get_dispatch_key(instance); - VkResult ret = ObjDisp(instance)->DestroyInstance(Unwrap(instance)); - - if(ret != VK_SUCCESS) - return ret; - if(RenderDoc::Inst().GetCaptureOptions().DebugDeviceMode && m_MsgCallback != VK_NULL_HANDLE) { ObjDisp(instance)->DbgDestroyMsgCallback(Unwrap(instance), m_MsgCallback); } + dispatch_key key = get_dispatch_key(instance); + VkResult ret = ObjDisp(instance)->DestroyInstance(Unwrap(instance)); + + if(ret != VK_SUCCESS) + return ret; + + if(m_FrameCaptureRecord) + { + RDCASSERT(m_FrameCaptureRecord->GetRefCount() == 1); + m_FrameCaptureRecord->Delete(GetResourceManager()); + m_FrameCaptureRecord = NULL; + } + + for(size_t i=0; i < m_PhysicalReplayData.size(); i++) + GetResourceManager()->ReleaseWrappedResource(m_PhysicalReplayData[i].phys); + GetResourceManager()->ReleaseWrappedResource(instance); + m_ResourceManager->Shutdown(); + destroy_dispatch_table(renderdoc_instance_table_map, key); return VK_SUCCESS; @@ -862,6 +874,24 @@ VkResult WrappedVulkan::vkCreateDevice( { ResourceId id = GetResourceManager()->WrapResource(*pDevice, *pDevice); + if(m_State >= WRITING) + { + Chunk *chunk = NULL; + + { + SCOPED_SERIALISE_CONTEXT(CREATE_DEVICE); + Serialise_vkCreateDevice(physicalDevice, &createInfo, pDevice); + + chunk = scope.Get(); + } + + m_InstanceRecord->AddChunk(chunk); + } + else + { + GetResourceManager()->AddLiveResource(id, *pDevice); + } + found = false; for(size_t i=0; i < m_PhysicalReplayData.size(); i++) @@ -902,24 +932,6 @@ VkResult WrappedVulkan::vkCreateDevice( if(!found) RDCERR("Couldn't find VkPhysicalDevice for vkCreateDevice!"); - - if(m_State >= WRITING) - { - Chunk *chunk = NULL; - - { - SCOPED_SERIALISE_CONTEXT(CREATE_DEVICE); - Serialise_vkCreateDevice(physicalDevice, &createInfo, pDevice); - - chunk = scope.Get(); - } - - m_InstanceRecord->AddChunk(chunk); - } - else - { - GetResourceManager()->AddLiveResource(id, *pDevice); - } } SAFE_DELETE_ARRAY(modQueues); @@ -936,27 +948,6 @@ VkResult WrappedVulkan::vkDestroyDevice(VkDevice device) { if(m_PhysicalReplayData[i].dev == device) { - if(i == (size_t)m_SwapPhysDevice) - { - // VKTODOHIGH m_InstanceRecord - - if(m_FrameCaptureRecord) - { - RDCASSERT(m_FrameCaptureRecord->GetRefCount() == 1); - m_FrameCaptureRecord->Delete(GetResourceManager()); - m_FrameCaptureRecord = NULL; - } - - m_ResourceManager->Shutdown(); - - m_FrameCaptureRecord = GetResourceManager()->AddResourceRecord(ResourceIDGen::GetNewUniqueID()); - m_FrameCaptureRecord->DataInSerialiser = false; - m_FrameCaptureRecord->Length = 0; - m_FrameCaptureRecord->NumSubResources = 0; - m_FrameCaptureRecord->SpecialResource = true; - m_FrameCaptureRecord->SubResources = NULL; - } - if(m_PhysicalReplayData[i].cmd != VK_NULL_HANDLE) ObjDisp(device)->DestroyCommandBuffer(Unwrap(device), Unwrap(m_PhysicalReplayData[i].cmd)); @@ -967,10 +958,14 @@ VkResult WrappedVulkan::vkDestroyDevice(VkDevice device) break; } } + + vector &queues = m_InstanceRecord->queues; + for(size_t i=0; i < queues.size(); i++) + GetResourceManager()->ReleaseWrappedResource(queues[i]); } dispatch_key key = get_dispatch_key(device); - VkResult ret = ObjDisp(device)->DestroyDevice(device); + VkResult ret = ObjDisp(device)->DestroyDevice(Unwrap(device)); destroy_dispatch_table(renderdoc_device_table_map, key); GetResourceManager()->ReleaseWrappedResource(device); @@ -1193,6 +1188,8 @@ VkResult WrappedVulkan::vkGetDeviceQueue( VkResourceRecord *record = GetResourceManager()->AddResourceRecord(*pQueue); RDCASSERT(record); + m_InstanceRecord->queues.push_back(*pQueue); + record->AddChunk(chunk); } else @@ -5878,77 +5875,77 @@ bool WrappedVulkan::ReleaseResource(WrappedVkRes *res) vt->DestroyDevice(disp->real.As()); break; case eResDeviceMemory: - vt->FreeMemory(dev, nondisp->real.As()); + vt->FreeMemory(Unwrap(dev), nondisp->real.As()); break; case eResBuffer: - vt->DestroyBuffer(dev, nondisp->real.As()); + vt->DestroyBuffer(Unwrap(dev), nondisp->real.As()); break; case eResBufferView: - vt->DestroyBufferView(dev, nondisp->real.As()); + vt->DestroyBufferView(Unwrap(dev), nondisp->real.As()); break; case eResImage: - vt->DestroyImage(dev, nondisp->real.As()); + vt->DestroyImage(Unwrap(dev), nondisp->real.As()); break; case eResImageView: - vt->DestroyImageView(dev, nondisp->real.As()); + vt->DestroyImageView(Unwrap(dev), nondisp->real.As()); break; case eResAttachmentView: - vt->DestroyAttachmentView(dev, nondisp->real.As()); + vt->DestroyAttachmentView(Unwrap(dev), nondisp->real.As()); break; case eResFramebuffer: - vt->DestroyFramebuffer(dev, nondisp->real.As()); + vt->DestroyFramebuffer(Unwrap(dev), nondisp->real.As()); break; case eResRenderPass: - vt->DestroyRenderPass(dev, nondisp->real.As()); + vt->DestroyRenderPass(Unwrap(dev), nondisp->real.As()); break; case eResShaderModule: - vt->DestroyShaderModule(dev, nondisp->real.As()); + vt->DestroyShaderModule(Unwrap(dev), nondisp->real.As()); break; case eResShader: - vt->DestroyShader(dev, nondisp->real.As()); + vt->DestroyShader(Unwrap(dev), nondisp->real.As()); break; case eResPipelineCache: - vt->DestroyPipelineCache(dev, nondisp->real.As()); + vt->DestroyPipelineCache(Unwrap(dev), nondisp->real.As()); break; case eResPipelineLayout: - vt->DestroyPipelineLayout(dev, nondisp->real.As()); + vt->DestroyPipelineLayout(Unwrap(dev), nondisp->real.As()); break; case eResPipeline: - vt->DestroyPipeline(dev, nondisp->real.As()); + vt->DestroyPipeline(Unwrap(dev), nondisp->real.As()); break; case eResSampler: - vt->DestroySampler(dev, nondisp->real.As()); + vt->DestroySampler(Unwrap(dev), nondisp->real.As()); break; case eResDescriptorPool: - vt->DestroyDescriptorPool(dev, nondisp->real.As()); + vt->DestroyDescriptorPool(Unwrap(dev), nondisp->real.As()); break; case eResDescriptorSetLayout: - vt->DestroyDescriptorSetLayout(dev, nondisp->real.As()); + vt->DestroyDescriptorSetLayout(Unwrap(dev), nondisp->real.As()); break; case eResViewportState: - vt->DestroyDynamicViewportState(dev, nondisp->real.As()); + vt->DestroyDynamicViewportState(Unwrap(dev), nondisp->real.As()); break; case eResRasterState: - vt->DestroyDynamicViewportState(dev, nondisp->real.As()); + vt->DestroyDynamicViewportState(Unwrap(dev), nondisp->real.As()); break; case eResColorBlendState: - vt->DestroyDynamicColorBlendState(dev, nondisp->real.As()); + vt->DestroyDynamicColorBlendState(Unwrap(dev), nondisp->real.As()); break; case eResDepthStencilState: - vt->DestroyDynamicDepthStencilState(dev, nondisp->real.As()); + vt->DestroyDynamicDepthStencilState(Unwrap(dev), nondisp->real.As()); break; case eResCmdPool: - vt->DestroyCommandPool(dev, nondisp->real.As()); + vt->DestroyCommandPool(Unwrap(dev), nondisp->real.As()); break; case eResCmdBuffer: - vt->DestroyCommandBuffer(dev, disp->real.As()); + vt->DestroyCommandBuffer(Unwrap(dev), disp->real.As()); break; case eResFence: // VKTODOLOW - //vt->DestroyFence(dev, nondisp->real.As()); + //vt->DestroyFence(Unwrap(dev), nondisp->real.As()); break; case eResSemaphore: - vt->DestroySemaphore(dev, nondisp->real.As()); + vt->DestroySemaphore(Unwrap(dev), nondisp->real.As()); break; } diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 627cf5d52..2acd2d23f 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -598,6 +598,9 @@ struct VkResourceRecord : public ResourceRecord // submit with latest binding refs. set boundDescSets; + // queues associated with this instance, so they can be shut down on destruction + vector queues; + // descriptor set bindings for this descriptor set. Filled out on // create from the layout. ResourceId layout;