From a0ef896d1e0321252ea2f915f5722699639a664e Mon Sep 17 00:00:00 2001 From: Riley King-Saunders Date: Mon, 7 Jul 2025 22:50:12 +1000 Subject: [PATCH] Created a paper-thin wrapper around a VkQueue mainly so it manages its own lifecycle so long as its associated device is alive --- include/vulkan/basalt_queue.h | 30 ++++++++++++++++++++++++++++++ src/vulkan/basalt_queue.cpp | 29 +++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 include/vulkan/basalt_queue.h create mode 100644 src/vulkan/basalt_queue.cpp diff --git a/include/vulkan/basalt_queue.h b/include/vulkan/basalt_queue.h new file mode 100644 index 0000000..b05c947 --- /dev/null +++ b/include/vulkan/basalt_queue.h @@ -0,0 +1,30 @@ +#pragma once +#include "basalt_window.h" + +namespace basalt +{ + class Device; + + typedef u16 QueueFlag; + typedef enum QueueFlags + { + QUEUE_FLAG_SUPPORTS_GRAPHICS = 1, + QUEUE_FLAG_SUPPORTS_PRESENT = 2, + QUEUE_FLAG_SUPPORTS_COMPUTE = 4, + QUEUE_FLAG_SUPPORTS_TRANSFER = 8 + } QueueFlags; + + class Queue + { + public: + Queue(const Queue&) = default; + Queue& operator =(const Queue&) = default; + Queue(Queue&&) = default; + Queue& operator =(Queue&&) = default; + + Queue(basalt::Device& dev, VkQueue queue, u32 family_index, VkSurfaceKHR surface=VK_NULL_HANDLE); + basalt::Device* device; + VkQueue queue; + QueueFlag flags; + }; +} \ No newline at end of file diff --git a/src/vulkan/basalt_queue.cpp b/src/vulkan/basalt_queue.cpp new file mode 100644 index 0000000..af07d6e --- /dev/null +++ b/src/vulkan/basalt_queue.cpp @@ -0,0 +1,29 @@ +#include "vulkan/basalt_queue.h" +#include "vulkan/basalt_device.h" + +basalt::Queue::Queue(basalt::Device& dev, VkQueue queue, u32 family_index, VkSurfaceKHR surface) : + device(&dev), queue(queue) +{ + VkResult err = VK_SUCCESS; + u32 num_queue_families = 0; + vkGetPhysicalDeviceQueueFamilyProperties(dev, &num_queue_families, VK_NULL_HANDLE); + basalt::darray queue_families(num_queue_families, + MEMORY_TAG_CLASS_ARRAY | MEMORY_TAG_ZONE_ENGINE | MEMORY_TAG_ALIGN_ANY); + vkGetPhysicalDeviceQueueFamilyProperties(dev, &num_queue_families, queue_families.m_pdata); + queue_families.m_nelements = num_queue_families; + + if (queue_families[family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) + this->flags |= QUEUE_FLAG_SUPPORTS_GRAPHICS; + if (queue_families[family_index].queueFlags & VK_QUEUE_TRANSFER_BIT) + this->flags |= QUEUE_FLAG_SUPPORTS_TRANSFER; + if (queue_families[family_index].queueFlags & VK_QUEUE_COMPUTE_BIT) + this->flags |= QUEUE_FLAG_SUPPORTS_COMPUTE; + + if (surface != VK_NULL_HANDLE) + { + VkBool32 present_supported = VK_FALSE; + VK_ASSERT(vkGetPhysicalDeviceSurfaceSupportKHR(dev, family_index, surface, &present_supported), "Failed to determine if physical device queue supports presenting to surface\n\tAt %s:%d\n\tError %s\n"); + if (present_supported) + this->flags |= QUEUE_FLAG_SUPPORTS_PRESENT; + } +}