Created a paper-thin wrapper around a VkQueue mainly so it manages its own lifecycle so long as its associated device is alive

This commit is contained in:
2025-07-07 22:50:12 +10:00
parent 42c45bbeb2
commit a0ef896d1e
2 changed files with 59 additions and 0 deletions

View File

@@ -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<VkQueueFamilyProperties> 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;
}
}