#pragma once #include #include namespace VkObjects { class Surface; class Instance; class PhysicalDevice final { public: struct QueueFamilyIndices { uint32_t graphics_family = 0; uint32_t present_family = 0; uint32_t transfer_family = 0; }; QueueFamilyIndices queue_family_indices_{}; private: VkPhysicalDevice physical_device_ = nullptr; // Выбрасывает исключение если не подходит static QueueFamilyIndices is_device_suitable(VkPhysicalDevice device, VkSurfaceKHR surface, const std::vector& device_extensions); static bool check_device_extensions_support(VkPhysicalDevice device, const std::vector& device_extensions); static QueueFamilyIndices find_queue_family_indices(VkPhysicalDevice physical_device, VkSurfaceKHR surface); public: explicit PhysicalDevice(const Instance& instance, const Surface& surface, const std::vector& device_extensions); inline VkPhysicalDevice get_native() const { return physical_device_; } inline QueueFamilyIndices get_queue_family_indices() const { return queue_family_indices_; } std::vector get_unique_family_indices() const; }; }