// ============================================= // Aster: physical_device.h // Copyright (c) 2020-2024 Anish Bhobe // ============================================= #pragma once #include "global.h" #include "window.h" struct QueueFamilyIndices { static constexpr u32 invalid_value = 0xFFFFFFFFu; u32 graphics_idx{ invalid_value }; u32 present_idx{ invalid_value }; u32 compute_idx{ invalid_value }; u32 transfer_idx{ invalid_value }; [[nodiscard]] b8 has_graphics() const { return graphics_idx != invalid_value; } [[nodiscard]] b8 has_present() const { return present_idx != invalid_value; } [[nodiscard]] b8 has_compute() const { return compute_idx != invalid_value; } [[nodiscard]] b8 has_transfer() const { return transfer_idx != invalid_value; } }; struct PhysicalDevice { vk::raii::PhysicalDevice device; vk::PhysicalDeviceProperties properties; vk::PhysicalDeviceFeatures features; QueueFamilyIndices queue_families; PhysicalDevice(const Window *const _window, vk::raii::PhysicalDevice _device) : device{ std::move(_device) } { properties = device.getProperties(); features = device.getFeatures(); queue_families = get_queue_families(_window, &device); } private: [[nodiscard]] static QueueFamilyIndices get_queue_families(const Window *_window, const vk::raii::PhysicalDevice *_device); };