#pragma once #include "cve_window.hpp" // std lib headers #include #include namespace cve { 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 CveDevice { public: #ifdef NDEBUG const bool enableValidationLayers = false; #else const bool enableValidationLayers = true; #endif CveDevice(CveWindow &window); ~CveDevice(); // Not copyable or movable CveDevice(const CveDevice &) = delete; void operator=(const CveDevice &) = delete; CveDevice(CveDevice &&) = delete; CveDevice &operator=(CveDevice &&) = delete; VkCommandPool getCommandPool() { return commandPool; } VkDevice device() { return device_; } VkSurfaceKHR surface() { return surface_; } VkQueue graphicsQueue() { return graphicsQueue_; } VkQueue presentQueue() { return presentQueue_; } 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); // Buffer Helper Functions 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(); // helper functions 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); VkInstance instance; VkDebugUtilsMessengerEXT debugMessenger; VkPhysicalDevice physicalDevice = VK_NULL_HANDLE; CveWindow &window; VkCommandPool commandPool; VkDevice device_; VkSurfaceKHR surface_; VkQueue graphicsQueue_; VkQueue presentQueue_; const std::vector validationLayers = {"VK_LAYER_KHRONOS_validation"}; const std::vector deviceExtensions = {VK_KHR_SWAPCHAIN_EXTENSION_NAME}; }; } // namespace lve