#pragma once #include "xe_window.hpp" #include #include namespace xe { struct SwapChainSupportDetails { VkSurfaceCapabilitiesKHR capabilities; std::vector formats; std::vector presentModes; }; struct QueueFamilyIndices { uint32_t graphicsFamily; uint32_t presentFamily; bool graphicsFamilyHasValue = false; bool presentFamilyHasValue = false; bool isComplete() { return graphicsFamilyHasValue && presentFamilyHasValue; } }; class Device { public: #ifdef NDEBUG const bool enableValidationLayers = false; #else const bool enableValidationLayers = true; #endif Device(Window &window); ~Device(); Device(const Device &) = delete; void operator=(const Device &) = delete; Device(Device &&) = delete; Device &operator=(Device &&) = delete; VkCommandPool getCommandPool() { return commandPool; } VkDevice device() { return device_; } VkSurfaceKHR surface() { return surface_; } VkQueue graphicsQueue() { return graphicsQueue_; } VkQueue presentQueue() { return presentQueue_; } VkSampleCountFlagBits getSamples() { return msaaSamples; } float getAnisotropy() { return samplerAnisotropy; } SwapChainSupportDetails getSwapChainSupport() { return querySwapChainSupport(physicalDevice); } uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties); QueueFamilyIndices findPhysicalQueueFamilies() { return findQueueFamilies(physicalDevice); } VkFormat findSupportedFormat( const std::vector &candidates, VkImageTiling tiling, VkFormatFeatureFlags features); void createBuffer( VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer &buffer, VkDeviceMemory &bufferMemory); VkCommandBuffer beginSingleTimeCommands(); void endSingleTimeCommands(VkCommandBuffer commandBuffer); void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size); void copyBufferToImage(VkBuffer buffer, VkImage image, uint32_t width, uint32_t height, uint32_t layerCount); void createImageWithInfo( const VkImageCreateInfo &imageInfo, VkMemoryPropertyFlags properties, VkImage &image, VkDeviceMemory &imageMemory); VkPhysicalDeviceProperties properties; private: void createInstance(); void setupDebugMessenger(); void createSurface(); void pickPhysicalDevice(); void createLogicalDevice(); void createCommandPool(); bool isDeviceSuitable(VkPhysicalDevice device); std::vector getRequiredExtensions(); bool checkValidationLayerSupport(); QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device); void populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT &createInfo); void hasGflwRequiredInstanceExtensions(); bool checkDeviceExtensionSupport(VkPhysicalDevice device); SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device); VkSampleCountFlagBits getMaxUsableSampleCount(); VkInstance instance; VkDebugUtilsMessengerEXT debugMessenger; VkPhysicalDevice physicalDevice = VK_NULL_HANDLE; Window &window; VkCommandPool commandPool; VkDevice device_; VkSurfaceKHR surface_; VkQueue graphicsQueue_; VkQueue presentQueue_; VkSampleCountFlagBits msaaSamples = VK_SAMPLE_COUNT_1_BIT; float samplerAnisotropy = 1; const std::vector validationLayers = {"VK_LAYER_KHRONOS_validation"}; const std::vector deviceExtensions = {VK_KHR_SWAPCHAIN_EXTENSION_NAME, VK_KHR_MAINTENANCE1_EXTENSION_NAME}; }; }