#pragma once #include <stdafx.h> namespace fpr { class Device { const std::vector<const char*> required_extensions = { VK_KHR_SWAPCHAIN_EXTENSION_NAME }; // List of wanted formats for swapchain image presentation. const vk::Format wanted_formats[2] = { vk::Format::eR8G8B8A8Srgb, vk::Format::eB8G8R8A8Srgb }; vk::UniqueDevice m_logical_device; uint32_t m_compute_queue_index; uint32_t m_graphics_queue_index; uint32_t m_presentation_queue_index; vk::Queue m_graphics_queue; vk::Queue m_presentation_queue; vk::Queue m_compute_queue; vk::PhysicalDevice m_physical_device; void CreateLogicalDevice(); void GetBestDevice(vk::SurfaceKHR surface, vk::Instance& instance); void FindQueueFamilyIndices(vk::SurfaceKHR surface); bool IsDeviceSuitable(vk::PhysicalDevice device, vk::SurfaceKHR surface) const FPR_NOEXCEPT; bool DeviceSupportsSurface(vk::PhysicalDevice device, vk::SurfaceKHR surface) const FPR_NOEXCEPT; bool IsRequiredExtensionsSupported(vk::PhysicalDevice device) const; vk::SurfaceFormatKHR QueryBestSurfaceFormat(const std::vector<vk::SurfaceFormatKHR>& formats); public: Device(vk::SurfaceKHR surface, vk::Instance& instance); [[nodiscard]] uint32_t GetGraphicsQueueIndex() const FPR_NOEXCEPT; [[nodiscard]] uint32_t GetPresentQueueIndex() const FPR_NOEXCEPT; [[nodiscard]] uint32_t GetComputeQueueIndex() const FPR_NOEXCEPT; [[nodiscard]] const vk::Queue& GetGraphicsQueue() const FPR_NOEXCEPT; [[nodiscard]] const vk::Queue& GetPresentQueue() const FPR_NOEXCEPT; [[nodiscard]] const vk::Queue& GetComputeQueue() const FPR_NOEXCEPT; [[nodiscard]] vk::PhysicalDevice& GetPhysicalDeviceHandle() FPR_NOEXCEPT; [[nodiscard]] vk::Device& GetLogicalDeviceHandle() FPR_NOEXCEPT; Device(const Device& other) = delete; Device operator=(const Device& other) = delete; Device(const Device&& other) = delete; Device operator=(const Device&& other) = delete; }; } // namespace fpr