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:
30
include/vulkan/basalt_queue.h
Normal file
30
include/vulkan/basalt_queue.h
Normal file
@@ -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;
|
||||||
|
};
|
||||||
|
}
|
||||||
29
src/vulkan/basalt_queue.cpp
Normal file
29
src/vulkan/basalt_queue.cpp
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user