From a9affea030b0e24e95824a79902f3b40f8d6f0c8 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 2 Feb 2023 10:58:49 +0000 Subject: [PATCH] Fix some cases that didn't remap queue family indices. Closes #2837 --- renderdoc/driver/vulkan/vk_core.h | 1 + renderdoc/driver/vulkan/vk_manager.cpp | 3 ++- renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp | 8 ++++++++ renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp | 4 ++-- renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp | 7 +++++++ 5 files changed, 20 insertions(+), 3 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 785dec342..424c44e7c 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -1067,6 +1067,7 @@ public: return it->second.state; } + uint32_t RemapQueue(uint32_t q) { return m_QueueRemapping[q][0].family; } static rdcstr GetChunkName(uint32_t idx); VulkanResourceManager *GetResourceManager() { return m_ResourceManager; } VulkanDebugManager *GetDebugManager() { return m_DebugManager; } diff --git a/renderdoc/driver/vulkan/vk_manager.cpp b/renderdoc/driver/vulkan/vk_manager.cpp index ac7368afe..78202c05e 100644 --- a/renderdoc/driver/vulkan/vk_manager.cpp +++ b/renderdoc/driver/vulkan/vk_manager.cpp @@ -338,7 +338,7 @@ void VulkanResourceManager::SerialiseImageStates(SerialiserType &ser, ImageSubresourceStateForRange p; p.range = st.subresourceRange; p.range.sliceCount = imageLayouts.imageInfo.extent.depth; - p.state.oldQueueFamilyIndex = st.dstQueueFamilyIndex; + p.state.oldQueueFamilyIndex = m_Core->RemapQueue(st.dstQueueFamilyIndex); p.state.newQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; p.state.oldLayout = st.newLayout; p.state.newLayout = imageState.GetImageInfo().initialLayout; @@ -372,6 +372,7 @@ void VulkanResourceManager::SerialiseImageStates(SerialiserType &ser, // initial state to the state it was in at the beginning of the capture. ImageSubresourceState &state = it->state(); state.newLayout = imageState.GetImageInfo().initialLayout; + state.oldQueueFamilyIndex = m_Core->RemapQueue(state.oldQueueFamilyIndex); state.newQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; } } diff --git a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp index 77cab9fdd..d48b866ac 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp @@ -1526,6 +1526,14 @@ bool WrappedVulkan::Serialise_vkCreateQueryPool(SerialiserType &ser, VkDevice de { VkQueryPool pool = VK_NULL_HANDLE; + VkQueryPoolPerformanceCreateInfoKHR *perfInfo = + (VkQueryPoolPerformanceCreateInfoKHR *)FindNextStruct( + &CreateInfo, VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR); + if(perfInfo) + { + perfInfo->queueFamilyIndex = m_QueueRemapping[perfInfo->queueFamilyIndex][0].family; + } + VkResult ret = ObjDisp(device)->CreateQueryPool(Unwrap(device), &CreateInfo, NULL, &pool); if(ret != VK_SUCCESS) diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index 0bcfa7eaa..ea8e3d6a9 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -1627,7 +1627,7 @@ bool WrappedVulkan::Serialise_vkCreateBuffer(SerialiserType &ser, VkDevice devic CreateInfo.usage |= VK_BUFFER_USAGE_TRANSFER_DST_BIT; // remap the queue family indices - if(CreateInfo.sharingMode == VK_SHARING_MODE_EXCLUSIVE) + if(CreateInfo.sharingMode == VK_SHARING_MODE_CONCURRENT) { uint32_t *queueFamiles = (uint32_t *)CreateInfo.pQueueFamilyIndices; for(uint32_t q = 0; q < CreateInfo.queueFamilyIndexCount; q++) @@ -2030,7 +2030,7 @@ bool WrappedVulkan::Serialise_vkCreateImage(SerialiserType &ser, VkDevice device CreateInfo.usage &= ~VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT; // remap the queue family indices - if(CreateInfo.sharingMode == VK_SHARING_MODE_EXCLUSIVE) + if(CreateInfo.sharingMode == VK_SHARING_MODE_CONCURRENT) { uint32_t *queueFamiles = (uint32_t *)CreateInfo.pQueueFamilyIndices; for(uint32_t q = 0; q < CreateInfo.queueFamilyIndexCount; q++) diff --git a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp index ee32445d8..fad4bea8c 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp @@ -391,6 +391,13 @@ bool WrappedVulkan::Serialise_vkCreateSwapchainKHR(SerialiserType &ser, VkDevice VK_IMAGE_LAYOUT_UNDEFINED, }; + if(CreateInfo.imageSharingMode == VK_SHARING_MODE_CONCURRENT) + { + uint32_t *queueFamiles = (uint32_t *)CreateInfo.pQueueFamilyIndices; + for(uint32_t q = 0; q < CreateInfo.queueFamilyIndexCount; q++) + queueFamiles[q] = m_QueueRemapping[queueFamiles[q]][0].family; + } + for(uint32_t i = 0; i < NumImages; i++) { VkDeviceMemory mem = VK_NULL_HANDLE;