From 506c38bcbba6d1258fe9567703fb8ac2b7c11c28 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 17 Dec 2015 12:53:11 +0100 Subject: [PATCH] Remove use of GetWrapper while capturing --- renderdoc/driver/vulkan/vk_core.h | 1 + .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 2 +- .../vulkan/wrappers/vk_device_funcs.cpp | 23 ++++++++++- .../driver/vulkan/wrappers/vk_queue_funcs.cpp | 13 +++--- .../driver/vulkan/wrappers/vk_sync_funcs.cpp | 41 ++++++++----------- .../driver/vulkan/wrappers/vk_wsi_funcs.cpp | 12 +++++- 6 files changed, 56 insertions(+), 36 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 814034d62..9afcdd0e0 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -194,6 +194,7 @@ private: VkQueue m_Queue; // the queue used for our own command buffer work vector m_PhysicalDevices; + vector m_QueueFamilies; vector m_MemIdxMaps; void RemapMemoryIndices(VkPhysicalDeviceMemoryProperties *memProps, uint32_t **memIdxMap); diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 3d5bb3515..107cc3bae 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -329,7 +329,7 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer( GetResourceManager()->WrapResource(Unwrap(device), cmd); } - m_PartialReplayData.resultPartialCmdPool = (VkCommandPool)uint64_t(GetResourceManager()->GetWrapper(ToTypedHandle(allocInfo.commandPool))); + m_PartialReplayData.resultPartialCmdPool = GetResourceManager()->GetNonDispWrapper(allocInfo.commandPool)->real.As(); m_PartialReplayData.resultPartialCmdBuffer = cmd; m_PartialReplayData.partialDevice = device; diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 71762d292..73a012efd 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -212,6 +212,13 @@ void WrappedVulkan::Shutdown() m_Device = VK_NULL_HANDLE; m_Instance = VK_NULL_HANDLE; + m_PhysicalDevices.clear(); + + for(size_t i=0; i < m_QueueFamilies.size(); i++) + delete[] m_QueueFamilies[i]; + + m_QueueFamilies.clear(); + // finally destroy device then instance vt->DestroyDevice(dev, NULL); vit->DestroyInstance(inst, NULL); @@ -333,9 +340,9 @@ VkResult WrappedVulkan::vkEnumeratePhysicalDevices( // it's perfectly valid for enumerate type functions to return the same handle // each time. If that happens, we will already have a wrapper created so just // return the wrapped object to the user and do nothing else - if(GetResourceManager()->HasWrapper(ToTypedHandle(devices[i]))) + if(m_PhysicalDevices[i] != VK_NULL_HANDLE) { - devices[i] = (VkPhysicalDevice)GetResourceManager()->GetWrapper(ToTypedHandle(devices[i])); + devices[i] = m_PhysicalDevices[i]; } else { @@ -667,6 +674,18 @@ VkResult WrappedVulkan::vkCreateDevice( RDCDEBUG("Might want to fiddle with createinfo - e.g. to remove VK_RenderDoc from set of extensions or similar"); + m_QueueFamilies.resize(createInfo.queueCreateInfoCount); + for(size_t i=0; i < m_QueueFamilies.size(); i++) + { + uint32_t family = createInfo.pQueueCreateInfos[i].queueFamilyIndex; + uint32_t count = createInfo.pQueueCreateInfos[i].queueCount; + m_QueueFamilies.resize(RDCMAX(m_QueueFamilies.size(), size_t(family+1))); + + m_QueueFamilies[family] = new VkQueue[count]; + for(uint32_t q=0; q < count; q++) + m_QueueFamilies[family][q] = VK_NULL_HANDLE; + } + VkResult ret = GetDeviceDispatchTable(*pDevice)->CreateDevice(Unwrap(physicalDevice), &createInfo, pAllocator, pDevice); if(ret == VK_SUCCESS) diff --git a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp index 0a7b37388..fe3851671 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -69,19 +69,20 @@ void WrappedVulkan::vkGetDeviceQueue( { ObjDisp(device)->GetDeviceQueue(Unwrap(device), queueFamilyIndex, queueIndex, pQueue); + RDCASSERT(m_State >= WRITING); + { // it's perfectly valid for enumerate type functions to return the same handle // each time. If that happens, we will already have a wrapper created so just // return the wrapped object to the user and do nothing else - if(GetResourceManager()->HasWrapper(ToTypedHandle(*pQueue))) + if(m_QueueFamilies[queueFamilyIndex][queueIndex] != VK_NULL_HANDLE) { - *pQueue = (VkQueue)GetResourceManager()->GetWrapper(ToTypedHandle(*pQueue)); + *pQueue = m_QueueFamilies[queueFamilyIndex][queueIndex]; } else { ResourceId id = GetResourceManager()->WrapResource(Unwrap(device), *pQueue); - if(m_State >= WRITING) { Chunk *chunk = NULL; @@ -108,10 +109,8 @@ void WrappedVulkan::vkGetDeviceQueue( record->AddChunk(chunk); } - else - { - GetResourceManager()->AddLiveResource(id, *pQueue); - } + + m_QueueFamilies[queueFamilyIndex][queueIndex] = *pQueue; if(queueFamilyIndex == m_QueueFamilyIdx) { diff --git a/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp index 9986e9a51..92b5ee6ca 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp @@ -523,34 +523,27 @@ VkResult WrappedVulkan::vkCreateSemaphore( if(ret == VK_SUCCESS) { - if(GetResourceManager()->HasWrapper(ToTypedHandle(*pSemaphore))) + ResourceId id = GetResourceManager()->WrapResource(Unwrap(device), *pSemaphore); + + if(m_State >= WRITING) { - *pSemaphore = (VkSemaphore)(uint64_t)GetResourceManager()->GetWrapper(ToTypedHandle(*pSemaphore)); + Chunk *chunk = NULL; + + { + CACHE_THREAD_SERIALISER(); + + SCOPED_SERIALISE_CONTEXT(CREATE_SEMAPHORE); + Serialise_vkCreateSemaphore(localSerialiser, device, pCreateInfo, NULL, pSemaphore); + + chunk = scope.Get(); + } + + VkResourceRecord *record = GetResourceManager()->AddResourceRecord(*pSemaphore); + record->AddChunk(chunk); } else { - ResourceId id = GetResourceManager()->WrapResource(Unwrap(device), *pSemaphore); - - if(m_State >= WRITING) - { - Chunk *chunk = NULL; - - { - CACHE_THREAD_SERIALISER(); - - SCOPED_SERIALISE_CONTEXT(CREATE_SEMAPHORE); - Serialise_vkCreateSemaphore(localSerialiser, device, pCreateInfo, NULL, pSemaphore); - - chunk = scope.Get(); - } - - VkResourceRecord *record = GetResourceManager()->AddResourceRecord(*pSemaphore); - record->AddChunk(chunk); - } - else - { - GetResourceManager()->AddLiveResource(id, *pSemaphore); - } + GetResourceManager()->AddLiveResource(id, *pSemaphore); } } diff --git a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp index 634423a46..7731f2742 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp @@ -106,13 +106,15 @@ VkResult WrappedVulkan::vkGetSwapchainImagesKHR( { uint32_t numImages = *pCount; + VkResourceRecord *swapRecord = GetRecord(swapchain); + for(uint32_t i=0; i < numImages; i++) { // these were all wrapped and serialised on swapchain create - we just have to // return the wrapped image in that case - if(GetResourceManager()->HasWrapper(ToTypedHandle(pSwapchainImages[i]))) + if(swapRecord->swapInfo->images[i].im != VK_NULL_HANDLE) { - pSwapchainImages[i] = (VkImage)(uint64_t)GetResourceManager()->GetWrapper(ToTypedHandle(pSwapchainImages[i])); + pSwapchainImages[i] = swapRecord->swapInfo->images[i].im; } else { @@ -378,6 +380,12 @@ VkResult WrappedVulkan::vkCreateSwapchainKHR( swapInfo.lastPresent = 0; swapInfo.images.resize(numSwapImages); + for(uint32_t i=0; i < numSwapImages; i++) + { + swapInfo.images[i].im = VK_NULL_HANDLE; + swapInfo.images[i].view = VK_NULL_HANDLE; + swapInfo.images[i].fb = VK_NULL_HANDLE; + } VkImage* images = new VkImage[numSwapImages];