From 6271f5ce797bf12be64c710b66b1b9e93a239829 Mon Sep 17 00:00:00 2001 From: Chuyan Zhang Date: Thu, 10 Oct 2024 18:51:05 -0700 Subject: move to new resource abstraction --- include/vulkan_helper.h | 126 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 include/vulkan_helper.h (limited to 'include/vulkan_helper.h') diff --git a/include/vulkan_helper.h b/include/vulkan_helper.h new file mode 100644 index 0000000..ec115fa --- /dev/null +++ b/include/vulkan_helper.h @@ -0,0 +1,126 @@ +#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 \ No newline at end of file -- cgit v1.2.3-70-g09d2