From 296680d32a45307ee0ec2dea51e91f1585049552 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 5 Jul 2016 18:09:37 +0200 Subject: [PATCH] Vulkan/Device: Fix Queue stuff Former-commit-id: 124691546da9e4ce867df931c97b828efef237ca [formerly 9ce524972a4ca15755b9b575560046251a8063f7] Former-commit-id: 2ac3db1c0c11573e3ea6439cb3bb8f8c8dec9451 --- include/Nazara/Vulkan/VkDevice.hpp | 9 +++++---- include/Nazara/Vulkan/VkDevice.inl | 7 +++++++ src/Nazara/Vulkan/VkDevice.cpp | 22 +++++++++++++--------- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/include/Nazara/Vulkan/VkDevice.hpp b/include/Nazara/Vulkan/VkDevice.hpp index 7a5e21247..c9044fb1c 100644 --- a/include/Nazara/Vulkan/VkDevice.hpp +++ b/include/Nazara/Vulkan/VkDevice.hpp @@ -29,6 +29,7 @@ namespace Nz public: struct QueueFamilyInfo; struct QueueInfo; + using QueueList = std::vector; inline Device(Instance& instance); Device(const Device&) = delete; @@ -39,6 +40,7 @@ namespace Nz inline void Destroy(); inline const std::vector& GetEnabledQueues() const; + inline const QueueList& GetEnabledQueues(UInt32 familyQueue) const; inline Queue GetQueue(UInt32 queueFamilyIndex, UInt32 queueIndex); inline Instance& GetInstance(); @@ -195,13 +197,11 @@ namespace Nz struct QueueInfo { QueueFamilyInfo* familyInfo; - Queue queue; + VkQueue queue; float priority; }; - using QueueList = std::vector; - - struct QueueFamilyInfoi + struct QueueFamilyInfo { QueueList queues; VkExtent3D minImageTransferGranularity; @@ -221,6 +221,7 @@ namespace Nz std::unordered_set m_loadedExtensions; std::unordered_set m_loadedLayers; std::vector m_enabledQueuesInfos; + std::vector m_queuesByFamily; }; } } diff --git a/include/Nazara/Vulkan/VkDevice.inl b/include/Nazara/Vulkan/VkDevice.inl index f97b06c13..700cf15db 100644 --- a/include/Nazara/Vulkan/VkDevice.inl +++ b/include/Nazara/Vulkan/VkDevice.inl @@ -41,6 +41,13 @@ namespace Nz return m_enabledQueuesInfos; } + inline const Device::QueueList& Device::GetEnabledQueues(UInt32 familyQueue) const + { + NazaraAssert(familyQueue < m_enabledQueuesInfos.size(), "Invalid family queue"); + + return *m_queuesByFamily[familyQueue]; + } + inline Queue Device::GetQueue(UInt32 queueFamilyIndex, UInt32 queueIndex) { VkQueue queue; diff --git a/src/Nazara/Vulkan/VkDevice.cpp b/src/Nazara/Vulkan/VkDevice.cpp index c5b878361..9ecbf57de 100644 --- a/src/Nazara/Vulkan/VkDevice.cpp +++ b/src/Nazara/Vulkan/VkDevice.cpp @@ -35,6 +35,13 @@ namespace Nz else m_allocator.pfnAllocation = nullptr; + // Parse extensions and layers + for (UInt32 i = 0; i < createInfo.enabledExtensionCount; ++i) + m_loadedExtensions.insert(createInfo.ppEnabledExtensionNames[i]); + + for (UInt32 i = 0; i < createInfo.enabledLayerCount; ++i) + m_loadedLayers.insert(createInfo.ppEnabledLayerNames[i]); + // Load all device-related functions #define NAZARA_VULKAN_LOAD_DEVICE(func) func = reinterpret_cast(GetProcAddr(#func)) @@ -177,13 +184,6 @@ namespace Nz #undef NAZARA_VULKAN_LOAD_DEVICE - // Parse extensions and layers - for (UInt32 i = 0; i < createInfo.enabledExtensionCount; ++i) - m_loadedExtensions.insert(createInfo.ppEnabledExtensionNames[i]); - - for (UInt32 i = 0; i < createInfo.enabledLayerCount; ++i) - m_loadedLayers.insert(createInfo.ppEnabledLayerNames[i]); - // And retains informations about queues UInt32 maxFamilyIndex = 0; m_enabledQueuesInfos.resize(createInfo.queueCreateInfoCount); @@ -204,13 +204,17 @@ namespace Nz info.queues.resize(queueCreateInfo.queueCount); for (UInt32 queueIndex = 0; queueIndex < queueCreateInfo.queueCount; ++queueIndex) { - QueueInfo queueInfo; + QueueInfo& queueInfo = info.queues[queueIndex]; queueInfo.familyInfo = &info; queueInfo.priority = queueCreateInfo.pQueuePriorities[queueIndex]; - queueInfo.queue = GetQueue(info.familyIndex, queueIndex); + vkGetDeviceQueue(m_device, info.familyIndex, queueIndex, &queueInfo.queue); } } + m_queuesByFamily.resize(maxFamilyIndex + 1); + for (const QueueFamilyInfo& familyInfo : m_enabledQueuesInfos) + m_queuesByFamily[familyInfo.familyIndex] = &familyInfo.queues; + return true; } }