85 lines
3.7 KiB
C++
85 lines
3.7 KiB
C++
#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();
|
|
|
|
void requery(basalt::Window& window, VkPhysicalDevice phy, const basalt::darray<VkSurfaceFormatKHR>& allowed_formats, const basalt::darray<VkPresentModeKHR>& allowed_present_modes);
|
|
|
|
VkSurfaceFormatKHR get_surface_format(const basalt::darray<VkSurfaceFormatKHR>& allowed_formats);
|
|
VkPresentModeKHR get_present_mode(const basalt::darray<VkPresentModeKHR>& allowed_present_modes);
|
|
VkExtent2D get_framebuffer_extent(basalt::Window& window, bool clamp=true);
|
|
|
|
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;
|
|
|
|
VkPhysicalDeviceMemoryProperties memory_props;
|
|
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;
|
|
};
|
|
} |