#pragma once #include "volk/volk.h" #include "vk_mem_alloc/vk_mem_alloc.h" #include #include #include #include class VulkanSwapChain; class VulkanSemaphore; class VulkanFence; class VulkanPhysicalDevice { public: VkPhysicalDevice Device = VK_NULL_HANDLE; std::vector Extensions; std::vector QueueFamilies; VkPhysicalDeviceProperties Properties = {}; VkPhysicalDeviceFeatures Features = {}; VkPhysicalDeviceMemoryProperties MemoryProperties = {}; }; class VulkanCompatibleDevice { public: VulkanPhysicalDevice *device = nullptr; int graphicsFamily = -1; int transferFamily = -1; int presentFamily = -1; }; class VulkanDevice { public: VulkanDevice(); ~VulkanDevice(); void SetDebugObjectName(const char *name, uint64_t handle, VkObjectType type) { if (!DebugLayerActive) return; VkDebugUtilsObjectNameInfoEXT info = {}; info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; info.objectHandle = handle; info.objectType = type; info.pObjectName = name; vkSetDebugUtilsObjectNameEXT(device, &info); } uint32_t FindMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties); // Instance setup std::vector AvailableLayers; std::vector Extensions; std::vector EnabledExtensions; std::vector OptionalExtensions = { VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME }; std::vector EnabledValidationLayers; // Device setup VkPhysicalDeviceFeatures UsedDeviceFeatures = {}; std::vector EnabledDeviceExtensions = { VK_KHR_SWAPCHAIN_EXTENSION_NAME }; std::vector OptionalDeviceExtensions = { VK_EXT_HDR_METADATA_EXTENSION_NAME }; VulkanPhysicalDevice PhysicalDevice; bool DebugLayerActive = false; VkInstance instance = VK_NULL_HANDLE; VkSurfaceKHR surface = VK_NULL_HANDLE; VkDevice device = VK_NULL_HANDLE; VmaAllocator allocator = VK_NULL_HANDLE; VkQueue graphicsQueue = VK_NULL_HANDLE; VkQueue presentQueue = VK_NULL_HANDLE; VkQueue transferQueue = VK_NULL_HANDLE; int graphicsFamily = -1; int transferFamily = -1; int presentFamily = -1; private: void CreateInstance(); void CreateSurface(); void SelectPhysicalDevice(); void CreateDevice(); void CreateAllocator(); void ReleaseResources(); void SelectFeatures(); static bool CheckRequiredFeatures(const VkPhysicalDeviceFeatures &f); VkDebugUtilsMessengerEXT debugMessenger = VK_NULL_HANDLE; static VKAPI_ATTR VkBool32 VKAPI_CALL DebugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData); static void InitVolk(); static std::vector GetAvailableLayers(); static std::vector GetExtensions(); static std::vector GetPlatformExtensions(); static std::vector GetPhysicalDevices(VkInstance instance); };