Created physical device object

Contains helper functions for picking the most suitable device in a rust/java factory-like way
Has cast operator for underlying vulkan object
This commit is contained in:
2025-07-07 22:48:07 +10:00
parent 175897e7d9
commit 78a5421021
2 changed files with 500 additions and 0 deletions

View File

@@ -0,0 +1,82 @@
#pragma once
#include "basalt_context.h"
namespace basalt
{
struct DeviceQueueFamilyIndicies
{
DeviceQueueFamilyIndicies(VkPhysicalDevice phys, VkSurfaceKHR surface);
DeviceQueueFamilyIndicies(u32 graphics=-1, u32 present=-1, u32 compute=-1, u32 transfer=-1);
u32 graphics = -1;
u32 present = -1;
u32 compute = -1;
u32 transfer = -1;
};
struct SwapchainSupportDetails
{
SwapchainSupportDetails();
SwapchainSupportDetails(VkPhysicalDevice phy, VkSurfaceKHR surface);
~SwapchainSupportDetails();
VkSurfaceFormatKHR get_surface_format(const std::initializer_list<VkSurfaceFormatKHR>& allowed_formats);
VkPresentModeKHR get_present_mode(const std::initializer_list<VkPresentModeKHR>& allowed_present_modes);
VkExtent2D get_framebuffer_extent(basalt::Window& window);
VkSurfaceCapabilitiesKHR surface_capabilities;
basalt::darray<VkSurfaceFormatKHR> surface_formats;
basalt::darray<VkPresentModeKHR> present_modes;
VkSurfaceFormatKHR cached_format = {VK_FORMAT_MAX_ENUM, VK_COLOR_SPACE_MAX_ENUM_KHR};
VkPresentModeKHR cached_present_mode = VK_PRESENT_MODE_MAX_ENUM_KHR;
};
class PhysicalDevice
{
public:
PhysicalDevice(VkPhysicalDevice dev, const DeviceQueueFamilyIndicies& indicies, basalt::darray<const char*>&& enabled_extensions, VkSurfaceKHR surface);
operator VkPhysicalDevice() noexcept;
basalt::darray<const char*> enabled_extensions;
DeviceQueueFamilyIndicies indicies;
VkSurfaceKHR surface;
VkPhysicalDevice phys;
};
class PhysicalDeviceSelector
{
public:
PhysicalDeviceSelector(const PhysicalDeviceSelector& src);
PhysicalDeviceSelector& operator =(const PhysicalDeviceSelector& src) = delete;
PhysicalDeviceSelector(PhysicalDeviceSelector&& other);
PhysicalDeviceSelector& operator =(PhysicalDeviceSelector&& other) = delete;
PhysicalDeviceSelector(basalt::Context& ctx, VkSurfaceKHR surface);
~PhysicalDeviceSelector();
uint32_t num_devices(void);
basalt::PhysicalDevice pick();
basalt::PhysicalDeviceSelector& prefer_types(const VkPhysicalDeviceType type, const float pv = 1.0f, const float nv = INFINITY);
basalt::PhysicalDeviceSelector& prefer_features(const VkPhysicalDeviceFeatures req, const float pv = 1.0f, const float nv = INFINITY);
basalt::PhysicalDeviceSelector& ensure_queues(const VkQueueFlagBits req_queues, const bool require_present, const float pv = 1.0f, const float nv = INFINITY);
basalt::PhysicalDeviceSelector& prefer_extension (const char* extension, const float pv = 1.0f, const float nv=INFINITY);
basalt::PhysicalDeviceSelector& prefer_extensions(const char** extensions, u32 num_extensions, const float pv = 1.0f, const float nv = INFINITY);
basalt::PhysicalDeviceSelector& prefer_extensions(const basalt::darray<const char*>& extensions, const float pv = 1.0f, const float nv = INFINITY);
basalt::PhysicalDeviceSelector& ensure_swapchain(void);
basalt::PhysicalDeviceSelector& prefer_surface_format(VkSurfaceFormatKHR format, const float pv = 1.0f, const float nv = INFINITY);
basalt::PhysicalDeviceSelector& prefer_present_mode(VkPresentModeKHR present_mode, const float pv = 1.0f, const float nv = INFINITY);
basalt::darray<float> device_rankings;
basalt::darray<VkPhysicalDevice> devices;
basalt::darray<VkPhysicalDeviceProperties> props;
basalt::darray<VkPhysicalDeviceFeatures> features;
basalt::darray<SwapchainSupportDetails> support_details;
basalt::darray<const char*> enabled_extensions;
basalt::Context& ctx;
VkSurfaceKHR surface;
bool using_swapchain = false;
};
}