diff --git a/include/Nazara/Vulkan/VkDevice.hpp b/include/Nazara/Vulkan/VkDevice.hpp index 1b9d3a470..680b8c998 100644 --- a/include/Nazara/Vulkan/VkDevice.hpp +++ b/include/Nazara/Vulkan/VkDevice.hpp @@ -27,6 +27,8 @@ namespace Nz class NAZARA_VULKAN_API Device : public HandledObject { public: + struct QueueFamilyInfo; + inline Device(Instance& instance); Device(const Device&) = delete; Device(Device&&) = delete; @@ -35,6 +37,7 @@ namespace Nz bool Create(VkPhysicalDevice device, const VkDeviceCreateInfo& createInfo, const VkAllocationCallbacks* allocator = nullptr); inline void Destroy(); + inline const std::vector& GetEnabledQueues() const; inline Queue GetQueue(UInt32 queueFamilyIndex, UInt32 queueIndex); inline Instance& GetInstance(); inline const Instance& GetInstance() const; @@ -184,6 +187,15 @@ namespace Nz #undef NAZARA_VULKAN_DEVICE_FUNCTION + struct QueueFamilyInfo + { + std::vector queues; + VkExtent3D minImageTransferGranularity; + VkQueueFlags flags; + UInt32 familyIndex; + UInt32 timestampValidBits; + }; + private: inline PFN_vkVoidFunction GetProcAddr(const char* name); @@ -193,6 +205,7 @@ namespace Nz VkResult m_lastErrorCode; std::unordered_set m_loadedExtensions; std::unordered_set m_loadedLayers; + std::vector m_enabledQueuesInfos; }; } } diff --git a/include/Nazara/Vulkan/VkDevice.inl b/include/Nazara/Vulkan/VkDevice.inl index a42bd8a87..f6fded6f5 100644 --- a/include/Nazara/Vulkan/VkDevice.inl +++ b/include/Nazara/Vulkan/VkDevice.inl @@ -34,6 +34,11 @@ namespace Nz } } + inline const std::vector& Device::GetEnabledQueues() const + { + return m_enabledQueuesInfos; + } + 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 c2f39da76..73f6f6bdb 100644 --- a/src/Nazara/Vulkan/VkDevice.cpp +++ b/src/Nazara/Vulkan/VkDevice.cpp @@ -13,6 +13,13 @@ namespace Nz { bool Device::Create(VkPhysicalDevice device, const VkDeviceCreateInfo& createInfo, const VkAllocationCallbacks* allocator) { + std::vector queuesProperties; + if (!m_instance.GetPhysicalDeviceQueueFamilyProperties(device, &queuesProperties)) + { + NazaraError("Failed to query queue family properties"); + return false; + } + m_lastErrorCode = m_instance.vkCreateDevice(device, &createInfo, allocator, &m_device); if (m_lastErrorCode != VkResult::VK_SUCCESS) { @@ -33,6 +40,25 @@ namespace Nz for (UInt32 i = 0; i < createInfo.enabledLayerCount; ++i) m_loadedLayers.insert(createInfo.ppEnabledLayerNames[i]); + // And retains informations about queues + m_enabledQueuesInfos.resize(createInfo.queueCreateInfoCount); + for (UInt32 i = 0; i < createInfo.queueCreateInfoCount; ++i) + { + const VkDeviceQueueCreateInfo& queueCreateInfo = createInfo.pQueueCreateInfos[i]; + QueueFamilyInfo& info = m_enabledQueuesInfos[i]; + + info.familyIndex = queueCreateInfo.queueFamilyIndex; + + const VkQueueFamilyProperties& queueProperties = queuesProperties[info.familyIndex]; + info.flags = queueProperties.queueFlags; + info.minImageTransferGranularity = queueProperties.minImageTransferGranularity; + info.timestampValidBits = queueProperties.timestampValidBits; + + info.queues.resize(queueCreateInfo.queueCount); + for (UInt32 queueCount = 0; queueCount < queueCreateInfo.queueCount; ++queueCount) + info.queues[queueCount] = queueCreateInfo.pQueuePriorities[queueCount]; + } + #define NAZARA_VULKAN_LOAD_DEVICE(func) func = reinterpret_cast(GetProcAddr(#func)) try