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:
82
include/vulkan/basalt_physical_device.h
Normal file
82
include/vulkan/basalt_physical_device.h
Normal 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;
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user