VulkanBase.hpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #ifndef GAMINGCORE_VULKAN_BASE_HPP
  2. #define GAMINGCORE_VULKAN_BASE_HPP
  3. #include <core/Array.hpp>
  4. #include <core/List.hpp>
  5. #include <core/Types.hpp>
  6. #include <core/Utility.hpp>
  7. #define GLFW_INCLUDE_VULKAN
  8. #include <GLFW/glfw3.h>
  9. #include "core/VulkanUtility.hpp"
  10. namespace Core::Vulkan {
  11. [[maybe_unused]] constexpr u32 INVALID_QUEUE_FAMILY = 0xFFFF'FFFF;
  12. struct DeviceQueueData {
  13. u32 queueFamilyIndex = 0;
  14. float priority = 0.0f;
  15. };
  16. class Base {
  17. VkInstance instance;
  18. #ifdef DEBUG_VULKAN
  19. VkDebugUtilsMessengerEXT debugMessenger;
  20. VkDebugReportCallbackEXT debugReportCallback;
  21. #endif
  22. VkSurfaceKHR surface;
  23. VkPhysicalDevice physicalDevice;
  24. VkDevice device;
  25. public:
  26. Base();
  27. ~Base();
  28. Base(const Base&) = delete;
  29. Base(Base&&) = delete;
  30. Base& operator=(const Base&) = delete;
  31. Base& operator=(Base&&) = delete;
  32. bool init();
  33. void destroy();
  34. PFN_vkVoidFunction getFunction(const char* name);
  35. template<typename T>
  36. using PhysicalDeviceSelector = int (*)(Base&, T&);
  37. template<typename T>
  38. bool findPhysicalDevice(T& data, PhysicalDeviceSelector<T> s) {
  39. Core::Array<VkPhysicalDevice, 32> devices;
  40. u32 c = devices.getLength();
  41. VK_CHECK_TRUE(
  42. vkEnumeratePhysicalDevices(instance, &c, &devices[0]));
  43. int bestPoints = 0;
  44. VkPhysicalDevice best = VK_NULL_HANDLE;
  45. for(u32 i = 0; i < c; i++) {
  46. physicalDevice = devices[i];
  47. T userData;
  48. int points = s(*this, userData);
  49. if(points > bestPoints) {
  50. bestPoints = points;
  51. best = physicalDevice;
  52. data = userData;
  53. }
  54. }
  55. physicalDevice = best;
  56. return bestPoints == 0;
  57. }
  58. void getPhysicalDeviceProperties(VkPhysicalDeviceProperties& p);
  59. u32 findQueueFamily(VkQueueFlags flags);
  60. u32 findSurfaceQueueFamily();
  61. bool hasExtension(const char* extension);
  62. bool getSurfaceCapabilities(VkSurfaceCapabilitiesKHR& c);
  63. using SurfaceFormatSelector = int (*)(const VkSurfaceFormatKHR&);
  64. bool findSurfaceFormat(
  65. VkSurfaceFormatKHR& sf, SurfaceFormatSelector sfs);
  66. using SurfacePresentModeSelector = int (*)(VkPresentModeKHR);
  67. bool findSurfacePresentMode(
  68. VkPresentModeKHR& m, SurfacePresentModeSelector spms);
  69. bool initDevice(
  70. const List<DeviceQueueData> data,
  71. const List<const char*>& extensions);
  72. void waitForIdle();
  73. operator VkDevice() {
  74. return device;
  75. }
  76. operator VkSurfaceKHR() {
  77. return surface;
  78. }
  79. private:
  80. bool initInstance();
  81. #ifdef DEBUG_VULKAN
  82. bool initDebugMessenger();
  83. bool initDebugReportCallback();
  84. void destroyDebugMessenger();
  85. void destroyDebugReportCallback();
  86. #endif
  87. bool initSurface();
  88. };
  89. }
  90. #endif