From fb826ee724485442e83db7002c3b2164e080eb5e Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 4 Apr 2019 13:11:18 +0100 Subject: [PATCH] Fix the set of queues made available to initial state CONCURRENT buffers * We don't want to enable all queues on the physical device because not all of them are necessarily enabled in the device itself. --- renderdoc/driver/vulkan/vk_core.h | 5 +++-- renderdoc/driver/vulkan/vk_initstate.cpp | 7 ++----- renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp | 5 +++++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index f120eb9be..9f8f245a3 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -396,8 +396,9 @@ private: vector m_ReplayPhysicalDevicesUsed; // the queue families (an array of count for each) for the created device - vector m_QueueFamilies; - vector m_QueueFamilyCounts; + std::vector m_QueueFamilies; + std::vector m_QueueFamilyCounts; + std::vector m_QueueFamilyIndices; // a small amount of helper code during capture for handling resources on different queues in init // states diff --git a/renderdoc/driver/vulkan/vk_initstate.cpp b/renderdoc/driver/vulkan/vk_initstate.cpp index 83d9eb0cd..244427271 100644 --- a/renderdoc/driver/vulkan/vk_initstate.cpp +++ b/renderdoc/driver/vulkan/vk_initstate.cpp @@ -550,11 +550,8 @@ bool WrappedVulkan::Prepare_InitialState(WrappedVkRes *res) // we make the buffer concurrently accessible by all queue families to not invalidate the // contents of the memory we're reading back from. bufInfo.sharingMode = VK_SHARING_MODE_CONCURRENT; - bufInfo.queueFamilyIndexCount = m_PhysicalDeviceData.queueCount; - std::vector queues; - for(uint32_t i = 0; i < bufInfo.queueFamilyIndexCount; i++) - queues.push_back(i); - bufInfo.pQueueFamilyIndices = queues.data(); + bufInfo.queueFamilyIndexCount = (uint32_t)m_QueueFamilyIndices.size(); + bufInfo.pQueueFamilyIndices = m_QueueFamilyIndices.data(); // spec requires that CONCURRENT must specify more than one queue family. If there is only one // queue family, we can safely use exclusive. diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 50379e851..1ccc4f3cf 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -2191,6 +2191,7 @@ VkResult WrappedVulkan::vkCreateDevice(VkPhysicalDevice physicalDevice, m_QueueFamilies.resize(createInfo.queueCreateInfoCount); m_QueueFamilyCounts.resize(createInfo.queueCreateInfoCount); + m_QueueFamilyIndices.clear(); for(size_t i = 0; i < createInfo.queueCreateInfoCount; i++) { uint32_t family = createInfo.pQueueCreateInfos[i].queueFamilyIndex; @@ -2202,6 +2203,10 @@ VkResult WrappedVulkan::vkCreateDevice(VkPhysicalDevice physicalDevice, m_QueueFamilyCounts[family] = count; for(uint32_t q = 0; q < count; q++) m_QueueFamilies[family][q] = VK_NULL_HANDLE; + + if(std::find(m_QueueFamilyIndices.begin(), m_QueueFamilyIndices.end(), family) == + m_QueueFamilyIndices.end()) + m_QueueFamilyIndices.push_back(family); } VkLayerDeviceCreateInfo *layerCreateInfo = (VkLayerDeviceCreateInfo *)pCreateInfo->pNext;