#pragma once #include "forward.hpp" #include "../../../core/utils/logger.hpp" #include #include struct GLFWwindow; namespace render::vk { struct SwapChainSupportDetails { VkSurfaceCapabilitiesKHR capabilities; std::vector formats; std::vector presentModes; static SwapChainSupportDetails Query(VkPhysicalDevice, VkSurfaceKHR); bool isValid() const { return !formats.empty() && !presentModes.empty(); } }; struct QueueFamilyIndices { std::optional graphicsFamily; std::optional presentFamily; std::optional transferFamily; static QueueFamilyIndices Query(VkPhysicalDevice, VkSurfaceKHR); bool isComplete() const { return graphicsFamily.has_value() && presentFamily.has_value(); } bool isOptimal() const { return isComplete() && transferFamily.has_value(); } }; struct PhysicalDeviceInfo { PhysicalDeviceInfo() {} PhysicalDeviceInfo(GLFWwindow *window, VkPhysicalDevice device, VkSurfaceKHR surface): window(window), device(device), surface(surface), swapDetails(SwapChainSupportDetails::Query(device, surface)), queueIndices(QueueFamilyIndices::Query(device, surface)) { vkGetPhysicalDeviceProperties(device, &properties); vkGetPhysicalDeviceFeatures(device, &features); } VkSurfaceFormatKHR getSurfaceFormat() const; std::optional findSupportedFormat(const std::vector &candidates, VkImageTiling tiling, VkFormatFeatureFlags features) const; VkFormat findDepthFormat() const; bool hasMemoryBudget() const; static bool HasStencilComponent(VkFormat format) { return format == VK_FORMAT_D32_SFLOAT_S8_UINT || format == VK_FORMAT_D24_UNORM_S8_UINT; } GLFWwindow *window; VkPhysicalDevice device = VK_NULL_HANDLE; VkSurfaceKHR surface; SwapChainSupportDetails swapDetails; QueueFamilyIndices queueIndices; VkPhysicalDeviceProperties properties; VkPhysicalDeviceFeatures features; std::vector optionalExtensions; }; }