#pragma once #include "resources/buffer.h" #include "resources/image.h" #include #include #include #include #include #include #include #include #define CHECK_VULKAN(result) \ do { \ VkResult res = result; \ if (res != VK_SUCCESS) { \ spdlog::error("Vulkan error: {}", string_VkResult(res)); \ abort(); \ } \ } while (0) namespace iris { struct Buffer_t { VkBuffer buffer; VkDevice device; VmaAllocator allocator; VmaAllocation allocation; VkBufferUsageFlags flags; VkDeviceSize size; void *mapped_data = nullptr; void* map(); void unmap(); void release(); ~Buffer_t() { release(); } }; typedef std::shared_ptr Buffer; struct Texture2D_t { VkImage image; VkDevice device; VmaAllocator allocator; VmaAllocation allocation; VkImageView image_view; VkImageLayout layout; VkImageUsageFlags flags; VkExtent2D extent; void release(); ~Texture2D_t() { release(); } }; typedef std::shared_ptr Texture2D; // This is a really brute-force implementation, // every command pool contains only 1 command buffer struct CommandBuffer { VkDevice device; VkCommandPool pool; VkCommandBuffer buffer; VkFence fence; VkQueue queue; CommandBuffer(VkDevice device, uint32_t queue_family_index, VkQueue queue); void release(); void begin(VkCommandBufferUsageFlags flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); void submit_sync(); ~CommandBuffer() { release(); } }; struct Device { VkInstance instance; VkPhysicalDevice physical_device; VkDevice device; uint32_t main_queue_family_index; VkQueue graphics_queue; VmaAllocator allocator; #ifdef USE_VULKAN_VALIDATION_LAYERS VkDebugReportCallbackEXT debugReportCallback; VkDebugUtilsMessengerEXT debugUtilsMessenger; #endif Device() = delete; Device( std::vector layers, std::vector instance_extensions); void destroy(); Buffer create_buffer( VkDeviceSize size, VkBufferUsageFlags usage, VmaAllocationCreateInfo create_info = { .usage = VMA_MEMORY_USAGE_AUTO, }); Texture2D create_texture( VkExtent2D extent, VkFormat format, VkImageUsageFlags usage, VmaAllocationCreateInfo create_info = { .usage = VMA_MEMORY_USAGE_AUTO, }); Texture2D create_texture_from_image( const char* filename, VkFormat format, VkImageUsageFlags usage, VmaAllocationCreateInfo create_info = { .usage = VMA_MEMORY_USAGE_AUTO, }); std::shared_ptr create_buffer( BufferDesc desc); std::shared_ptr create_image( ImageDesc desc); CommandBuffer create_command_buffer(); }; } // namespace iris