Newer
Older
ForwardPlusRenderer / include / Device.h
#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