#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& allowed_formats, const basalt::darray& allowed_present_modes); VkSurfaceFormatKHR get_surface_format(const basalt::darray& allowed_formats); VkPresentModeKHR get_present_mode(const basalt::darray& allowed_present_modes); VkExtent2D get_framebuffer_extent(basalt::Window& window, bool clamp=true); VkSurfaceCapabilitiesKHR surface_capabilities; basalt::darray surface_formats; basalt::darray 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&& enabled_extensions, VkSurfaceKHR surface); operator VkPhysicalDevice() noexcept; VkPhysicalDeviceMemoryProperties memory_props; basalt::darray 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& 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 device_rankings; basalt::darray devices; basalt::darray props; basalt::darray features; basalt::darray support_details; basalt::darray enabled_extensions; basalt::Context& ctx; VkSurfaceKHR surface; bool using_swapchain = false; }; }