/* * Vulkan device class * * Encapsulates a physical Vulkan device and its logical representation * * Copyright (C) by Sascha Willems - www.saschawillems.de * * This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) */ #pragma once #include "VulkanBuffer.h" #include "VulkanTools.h" #include "vulkan/vulkan.h" #include #include #include namespace vks { struct VulkanDevice { /** @brief Physical device representation */ VkPhysicalDevice physicalDevice; /** @brief Logical device representation (application's view of the device) */ VkDevice logicalDevice; /** @brief Properties of the physical device including limits that the application can check against */ VkPhysicalDeviceProperties properties; /** @brief Features of the physical device that an application can use to check if a feature is supported */ VkPhysicalDeviceFeatures features; /** @brief Features that have been enabled for use on the physical device */ VkPhysicalDeviceFeatures enabledFeatures; /** @brief Memory types and heaps of the physical device */ VkPhysicalDeviceMemoryProperties memoryProperties; /** @brief Queue family properties of the physical device */ std::vector queueFamilyProperties; /** @brief List of extensions supported by the device */ std::vector supportedExtensions; /** @brief Default command pool for the graphics queue family index */ VkCommandPool commandPool = VK_NULL_HANDLE; /** @brief Set to true when the debug marker extension is detected */ bool enableDebugMarkers = false; /** @brief Contains queue family indices */ struct { uint32_t graphics; uint32_t compute; uint32_t transfer; } queueFamilyIndices; operator VkDevice() const { return logicalDevice; }; explicit VulkanDevice(VkPhysicalDevice physicalDevice); ~VulkanDevice(); uint32_t getMemoryType(uint32_t typeBits, VkMemoryPropertyFlags properties, VkBool32 *memTypeFound = nullptr) const; uint32_t getQueueFamilyIndex(VkQueueFlags queueFlags) const; VkResult createLogicalDevice(VkPhysicalDeviceFeatures enabledFeatures, std::vector enabledExtensions, void *pNextChain, bool useSwapChain = true, VkQueueFlags requestedQueueTypes = VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT); VkResult createBuffer(VkBufferUsageFlags usageFlags, VkMemoryPropertyFlags memoryPropertyFlags, VkDeviceSize size, VkBuffer *buffer, VkDeviceMemory *memory, void *data = nullptr); VkResult createBuffer(VkBufferUsageFlags usageFlags, VkMemoryPropertyFlags memoryPropertyFlags, vks::Buffer *buffer, VkDeviceSize size, void *data = nullptr); void copyBuffer(vks::Buffer *src, vks::Buffer *dst, VkQueue queue, VkBufferCopy *copyRegion = nullptr); VkCommandPool createCommandPool(uint32_t queueFamilyIndex, VkCommandPoolCreateFlags createFlags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); VkCommandBuffer createCommandBuffer(VkCommandBufferLevel level, VkCommandPool pool, bool begin = false); VkCommandBuffer createCommandBuffer(VkCommandBufferLevel level, bool begin = false); void flushCommandBuffer(VkCommandBuffer commandBuffer, VkQueue queue, VkCommandPool pool, bool free = true); void flushCommandBuffer(VkCommandBuffer commandBuffer, VkQueue queue, bool free = true); bool extensionSupported(std::string extension); VkFormat getSupportedDepthFormat(bool checkSamplingSupport); }; } // namespace vks