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/gltf_loader.h | 9 ++++ include/render_assets.h | 94 +++++++++++++++++++++++++++++++++ include/render_graph.h | 57 ++++++++++++++++++++ include/render_pass.h | 23 +++++++++ include/resources/buffer.h | 37 +++++++++++++ include/resources/image.h | 71 +++++++++++++++++++++++++ include/shader.h | 39 ++++++++++++++ include/vulkan_helper.h | 126 +++++++++++++++++++++++++++++++++++++++++++++ include/vulkan_swapchain.h | 47 +++++++++++++++++ src/gltf_loader.h | 9 ---- src/render_assets.h | 94 --------------------------------- src/render_graph.h | 41 --------------- src/render_pass.h | 23 --------- src/resources/buffer.cpp | 56 ++++++++++++++++++++ src/resources/image.cpp | 43 ++++++++++++++++ src/shader.h | 39 -------------- src/vulkan_helper.h | 118 ------------------------------------------ src/vulkan_swapchain.h | 47 ----------------- xmake.lua | 1 + 19 files changed, 603 insertions(+), 371 deletions(-) create mode 100644 include/gltf_loader.h create mode 100644 include/render_assets.h create mode 100644 include/render_graph.h create mode 100644 include/render_pass.h create mode 100644 include/resources/buffer.h create mode 100644 include/resources/image.h create mode 100644 include/shader.h create mode 100644 include/vulkan_helper.h create mode 100644 include/vulkan_swapchain.h delete mode 100644 src/gltf_loader.h delete mode 100644 src/render_assets.h delete mode 100644 src/render_graph.h delete mode 100644 src/render_pass.h create mode 100644 src/resources/buffer.cpp create mode 100644 src/resources/image.cpp delete mode 100644 src/shader.h delete mode 100644 src/vulkan_helper.h delete mode 100644 src/vulkan_swapchain.h diff --git a/include/gltf_loader.h b/include/gltf_loader.h new file mode 100644 index 0000000..4b3190b --- /dev/null +++ b/include/gltf_loader.h @@ -0,0 +1,9 @@ +#ifndef GLTF_LOADER_H + +#define GLTF_LOADER_H +#include +#include "render_assets.h" +#include "tiny_gltf.h" + +bool load_gltf(const std::string_view path, iris::Scene &scene); +#endif \ No newline at end of file diff --git a/include/render_assets.h b/include/render_assets.h new file mode 100644 index 0000000..1819271 --- /dev/null +++ b/include/render_assets.h @@ -0,0 +1,94 @@ +#pragma once + +#include +#include +#include +#include + +namespace iris { + +struct Mesh { + std::string name; + std::vector vertices; + std::vector normals; + std::vector texcoords; + // Note: w component is a sign, 1.0 or -1.0 + std::vector tangents; + std::vector indices; + int32_t material_index; + + // AABB + glm::vec3 p_min; + glm::vec3 p_max; +}; + +struct Material { + std::string name; + glm::vec4 base_color; + float metallic; + float roughness; + + int32_t base_color_texture; + int32_t metallic_roughness_texture; + int32_t normal_texture; + int32_t occulsion_texture; + int32_t emissive_texture; +}; + + +struct Image { + std::vector data; + glm::uvec3 extent; + int32_t bits_per_channel; +}; + +struct Sampler2D { + int32_t min_filter; + int32_t mag_filter; + int32_t wrap_s; + int32_t wrap_t; +}; + +struct Texture { + std::string name; + Image image; + Sampler2D sampler; +}; + +struct Camera { + enum struct Tag { + Perspective, + Orthographic, + } intrinsic_tag; + struct PerspectiveCamera { + float fovx; + float fovy; + float aspect; + float znear; + float zfar; + }; + + struct OrthographicCamera { + float xmag; + float ymag; + float znear; + float zfar; + }; + union { + PerspectiveCamera perspective; + OrthographicCamera orthographic; + } intrinsic; + glm::vec3 position; + glm::vec3 direction; + glm::vec3 up; +}; + +struct Scene { + std::vector meshes; + std::vector materials; + std::vector textures; + + Camera camera; +}; + +} // namespace iris \ No newline at end of file diff --git a/include/render_graph.h b/include/render_graph.h new file mode 100644 index 0000000..b32d3eb --- /dev/null +++ b/include/render_graph.h @@ -0,0 +1,57 @@ +#pragma once + +#include "render_pass.h" +#include +#include + +namespace iris { + +struct BufferDesc { + +}; + +struct ImageDesc { + +}; + +struct ImageWithSamplerDesc { + +}; + +struct AccelerationStructureDesc { + +}; + +struct CreatedRenderResource { + enum struct Type { + Buffer, + Image, + ImageWithSampler, + AccelerationStructure, + } type; + + +}; + +struct ImportedRenderResource { + +}; + +struct RenderResource { + enum struct Type { + Created, + Imported, + } type; + + union { + CreatedRenderResource created; + ImportedRenderResource imported; + } inner; +}; + +struct RenderGraph { + std::vector passes; + std::vector resources; +}; + +} // namespace iris \ No newline at end of file diff --git a/include/render_pass.h b/include/render_pass.h new file mode 100644 index 0000000..b01bcae --- /dev/null +++ b/include/render_pass.h @@ -0,0 +1,23 @@ +#pragma once + +enum struct RenderPassType { + RayTracing, + Compute, + Rasterization // Not intended to implement, want to make a pure ray tracer +}; + +struct RayTracingPass { + +}; + +struct ComputePass { + +}; + +struct RenderPass { + RenderPassType type; + union { + RayTracingPass ray_tracing; + ComputePass compute; + } inner; +}; diff --git a/include/resources/buffer.h b/include/resources/buffer.h new file mode 100644 index 0000000..7c6fe0e --- /dev/null +++ b/include/resources/buffer.h @@ -0,0 +1,37 @@ +#pragma once + +#include +#include +#include +#include +#include +namespace iris { + +struct BufferDesc { + uint64_t size; + std::optional alignment; + VkBufferUsageFlags buffer_usage; + VmaMemoryUsage memory_usage; +}; + +struct Buffer_tt { + VkBuffer handle; + BufferDesc desc; + + // Used during release + VkDevice device; + VmaAllocator allocator; + VmaAllocation allocation; + void release(); + + // Used during map/unmap + std::optional mapped_data; + void *map(); + void unmap(); + + ~Buffer_tt() { release(); } +}; + +typedef std::shared_ptr Buffer_s; + +} // namespace iris \ No newline at end of file diff --git a/include/resources/image.h b/include/resources/image.h new file mode 100644 index 0000000..391c023 --- /dev/null +++ b/include/resources/image.h @@ -0,0 +1,71 @@ +#pragma once + +#include +#include +#include +namespace iris { + +enum struct ImageType { + Texture1D, + Texture1DArray, + Texture2D, + Texture2DArray, + Texture3D, + TextureCube, + TextureCubeArray, +}; + +struct ImageDesc { + ImageType image_type; + VkImageUsageFlags image_usage; + VkImageCreateFlags create_flags; + VmaAllocationCreateFlags alloc_flags; + + VkFormat format; + VkExtent3D extent; + uint32_t mip_levels; + uint32_t array_layers; +}; + +struct ImageViewDesc { + VkImageViewType view_type; + VkFormat format; + VkImageAspectFlags aspect_mask; + uint32_t base_mip_level; + uint32_t mip_levels; + uint32_t base_array_layer; + uint32_t array_layers; + + bool operator==(const ImageViewDesc& other) const = default; +}; + +struct ImageViewDescHash { + std::size_t operator()(const ImageViewDesc& desc) const noexcept { + auto h = std::hash{}(desc.view_type); + h ^= std::hash{}(desc.format) + 0x9e3779b9 + (h << 6) + (h >> 2); + h ^= std::hash{}(desc.aspect_mask) + 0x9e3779b9 + (h << 6) + (h >> 2); + h ^= std::hash{}(desc.base_mip_level) + 0x9e3779b9 + (h << 6) + (h >> 2); + h ^= std::hash{}(desc.mip_levels) + 0x9e3779b9 + (h << 6) + (h >> 2); + h ^= std::hash{}(desc.base_array_layer) + 0x9e3779b9 + (h << 6) + (h >> 2); + h ^= std::hash{}(desc.array_layers) + 0x9e3779b9 + (h << 6) + (h >> 2); + return h; + } +}; + +struct Image_tt { + VkImage handle; + ImageDesc desc; + + // Used during release + VkDevice device; + VmaAllocator allocator; + VmaAllocation allocation; + + // store all the image views + std::unordered_map image_views; + VkImageView get_image_view(const ImageViewDesc &desc); + + void release(); +}; + +} // namespace iris \ No newline at end of file diff --git a/include/shader.h b/include/shader.h new file mode 100644 index 0000000..b34fd92 --- /dev/null +++ b/include/shader.h @@ -0,0 +1,39 @@ +#pragma once +#include +#include +#include +#include +#include + +namespace iris { + +struct ShaderDesc { + // Name of the shader, filename if loaded from file + std::string name; + // Source code of the shader + std::string source; + // Entry name of the shader + std::string entry_point; + + // Shader type + enum struct Type { + eRayGen, + eMiss, + eClosestHit, + eAnyHit, + eIntersection, + eCallable, + eCompute, + } type; + + // Compiled binary + std::vector compiled_binary; + + static Type shader_type_from_string(std::string_view type); + ShaderDesc( + const std::string_view path, + std::vector defines, + std::vector> valued_defines); +}; + +} // namespace iris \ No newline at end of file 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 diff --git a/include/vulkan_swapchain.h b/include/vulkan_swapchain.h new file mode 100644 index 0000000..8d4604e --- /dev/null +++ b/include/vulkan_swapchain.h @@ -0,0 +1,47 @@ +#pragma once +#include "imgui_impl_glfw.h" +#include "vulkan_helper.h" +#include "vulkan/vulkan_core.h" +#include +#include +#include +#include + +std::vector get_glfw_instance_extensions(); + +namespace iris { + +struct Swapchain { + Device device; + + VkSurfaceKHR surface = VK_NULL_HANDLE; + VkSwapchainKHR swapchain = VK_NULL_HANDLE; + VkRenderPass render_pass = VK_NULL_HANDLE; + VkDescriptorPool descriptor_pool = VK_NULL_HANDLE; + GLFWwindow *window = nullptr; + uint32_t width = -1; + uint32_t height = -1; + bool needs_recreate = false; + + static constexpr uint32_t SWAPCHAIN_IMAGE_COUNT = 3; + VkImage swapchain_images[SWAPCHAIN_IMAGE_COUNT]; + VkImageView swapchain_image_views[SWAPCHAIN_IMAGE_COUNT]; + VkFramebuffer framebuffers[SWAPCHAIN_IMAGE_COUNT]; + VkSemaphore image_available_semaphores[SWAPCHAIN_IMAGE_COUNT]; + VkSemaphore render_finished_semaphores[SWAPCHAIN_IMAGE_COUNT]; + CommandBuffer cmd_buf; + + Texture2D upload_texture; + + ImGuiContext *imgui_context = nullptr; + uint32_t semaphore_index = 0; + uint32_t frame_index = 0; + + void resize(uint32_t new_width, uint32_t new_height); + void start_frame(); + void display(Texture2D &texture); + void release(); + Swapchain(GLFWwindow *window, iris::Device device, uint32_t width, uint32_t height); +}; + +} // namespace iris \ No newline at end of file diff --git a/src/gltf_loader.h b/src/gltf_loader.h deleted file mode 100644 index 4b3190b..0000000 --- a/src/gltf_loader.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef GLTF_LOADER_H - -#define GLTF_LOADER_H -#include -#include "render_assets.h" -#include "tiny_gltf.h" - -bool load_gltf(const std::string_view path, iris::Scene &scene); -#endif \ No newline at end of file diff --git a/src/render_assets.h b/src/render_assets.h deleted file mode 100644 index 1819271..0000000 --- a/src/render_assets.h +++ /dev/null @@ -1,94 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -namespace iris { - -struct Mesh { - std::string name; - std::vector vertices; - std::vector normals; - std::vector texcoords; - // Note: w component is a sign, 1.0 or -1.0 - std::vector tangents; - std::vector indices; - int32_t material_index; - - // AABB - glm::vec3 p_min; - glm::vec3 p_max; -}; - -struct Material { - std::string name; - glm::vec4 base_color; - float metallic; - float roughness; - - int32_t base_color_texture; - int32_t metallic_roughness_texture; - int32_t normal_texture; - int32_t occulsion_texture; - int32_t emissive_texture; -}; - - -struct Image { - std::vector data; - glm::uvec3 extent; - int32_t bits_per_channel; -}; - -struct Sampler2D { - int32_t min_filter; - int32_t mag_filter; - int32_t wrap_s; - int32_t wrap_t; -}; - -struct Texture { - std::string name; - Image image; - Sampler2D sampler; -}; - -struct Camera { - enum struct Tag { - Perspective, - Orthographic, - } intrinsic_tag; - struct PerspectiveCamera { - float fovx; - float fovy; - float aspect; - float znear; - float zfar; - }; - - struct OrthographicCamera { - float xmag; - float ymag; - float znear; - float zfar; - }; - union { - PerspectiveCamera perspective; - OrthographicCamera orthographic; - } intrinsic; - glm::vec3 position; - glm::vec3 direction; - glm::vec3 up; -}; - -struct Scene { - std::vector meshes; - std::vector materials; - std::vector textures; - - Camera camera; -}; - -} // namespace iris \ No newline at end of file diff --git a/src/render_graph.h b/src/render_graph.h deleted file mode 100644 index f09d6cb..0000000 --- a/src/render_graph.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once - -#include "render_pass.h" -#include -#include - -namespace iris { - -struct CreatedRenderResource { - enum struct Type { - Buffer, - Image, - ImageWithSampler, - AccelerationStructure, - } type; - - -}; - -struct ImportedRenderResource { - -}; - -struct RenderResource { - enum struct Type { - Created, - Imported, - } type; - - union { - CreatedRenderResource created; - ImportedRenderResource imported; - } inner; -}; - -struct RenderGraph { - std::vector passes; - std::vector resources; -}; - -} // namespace iris \ No newline at end of file diff --git a/src/render_pass.h b/src/render_pass.h deleted file mode 100644 index b01bcae..0000000 --- a/src/render_pass.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -enum struct RenderPassType { - RayTracing, - Compute, - Rasterization // Not intended to implement, want to make a pure ray tracer -}; - -struct RayTracingPass { - -}; - -struct ComputePass { - -}; - -struct RenderPass { - RenderPassType type; - union { - RayTracingPass ray_tracing; - ComputePass compute; - } inner; -}; diff --git a/src/resources/buffer.cpp b/src/resources/buffer.cpp new file mode 100644 index 0000000..8568466 --- /dev/null +++ b/src/resources/buffer.cpp @@ -0,0 +1,56 @@ +#include "resources/buffer.h" +#include "vulkan_helper.h" +#include + +namespace iris { + +void *Buffer_tt::map() { + if (!mapped_data.has_value()) { + CHECK_VULKAN(vmaMapMemory(allocator, allocation, &mapped_data.value())); + } + return mapped_data.value(); +} + +void Buffer_tt::unmap() { + if (mapped_data.has_value()) { + vmaUnmapMemory(allocator, allocation); + mapped_data.reset(); + } else { + spdlog::warn("Buffer is not mapped, skipping"); + } +} + +void Buffer_tt::release() { + if (handle != VK_NULL_HANDLE) { + spdlog::debug("Destroying buffer: 0x{:x}", (uint64_t)handle); + vkDeviceWaitIdle(device); + vmaDestroyBuffer(allocator, handle, allocation); + handle = VK_NULL_HANDLE; + } +} + +std::shared_ptr Device::create_buffer(BufferDesc desc) { + VkBufferCreateInfo buffer_create_info = { + .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, + .size = desc.size, + .usage = desc.buffer_usage, + }; + VmaAllocationCreateInfo alloc_create_info = { + .usage = desc.memory_usage, + }; + std::shared_ptr buffer = std::make_shared(); + buffer->device = this->device; + buffer->allocator = this->allocator; + buffer->desc = desc; + CHECK_VULKAN(vmaCreateBuffer( + allocator, + &buffer_create_info, + &alloc_create_info, + &buffer->handle, + &buffer->allocation, + VK_NULL_HANDLE)); + spdlog::debug("Created buffer: 0x{:x}", (uint64_t)buffer->handle); + return buffer; +} + +} // namespace iris \ No newline at end of file diff --git a/src/resources/image.cpp b/src/resources/image.cpp new file mode 100644 index 0000000..0c51b2d --- /dev/null +++ b/src/resources/image.cpp @@ -0,0 +1,43 @@ +#include "resources/image.h" +#include "vulkan_helper.h" +#include + +namespace iris { + +VkImageView Image_tt::get_image_view(const ImageViewDesc &desc) { + auto it = image_views.find(desc); + if (it != image_views.end()) { + return it->second; + } + + // Not found, create the image view + VkImageViewCreateInfo view_create_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .image = handle, + .viewType = desc.view_type, + .format = desc.format, + .components = { + .r = VK_COMPONENT_SWIZZLE_IDENTITY, + .g = VK_COMPONENT_SWIZZLE_IDENTITY, + .b = VK_COMPONENT_SWIZZLE_IDENTITY, + .a = VK_COMPONENT_SWIZZLE_IDENTITY, + }, + .subresourceRange = { + .aspectMask = desc.aspect_mask, + .baseMipLevel = desc.base_mip_level, + .levelCount = desc.mip_levels, + .baseArrayLayer = desc.base_array_layer, + .layerCount = desc.array_layers, + }, + }; + VkImageView view; + CHECK_VULKAN(vkCreateImageView( + device, + &view_create_info, + nullptr, + &view)); + image_views[desc] = view; + return view; +} + +} // namespace iris \ No newline at end of file diff --git a/src/shader.h b/src/shader.h deleted file mode 100644 index b34fd92..0000000 --- a/src/shader.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include - -namespace iris { - -struct ShaderDesc { - // Name of the shader, filename if loaded from file - std::string name; - // Source code of the shader - std::string source; - // Entry name of the shader - std::string entry_point; - - // Shader type - enum struct Type { - eRayGen, - eMiss, - eClosestHit, - eAnyHit, - eIntersection, - eCallable, - eCompute, - } type; - - // Compiled binary - std::vector compiled_binary; - - static Type shader_type_from_string(std::string_view type); - ShaderDesc( - const std::string_view path, - std::vector defines, - std::vector> valued_defines); -}; - -} // namespace iris \ No newline at end of file diff --git a/src/vulkan_helper.h b/src/vulkan_helper.h deleted file mode 100644 index 04fcead..0000000 --- a/src/vulkan_helper.h +++ /dev/null @@ -1,118 +0,0 @@ -#pragma once - -#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, - }); - - CommandBuffer create_command_buffer(); -}; - -} // namespace iris \ No newline at end of file diff --git a/src/vulkan_swapchain.h b/src/vulkan_swapchain.h deleted file mode 100644 index 8d4604e..0000000 --- a/src/vulkan_swapchain.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once -#include "imgui_impl_glfw.h" -#include "vulkan_helper.h" -#include "vulkan/vulkan_core.h" -#include -#include -#include -#include - -std::vector get_glfw_instance_extensions(); - -namespace iris { - -struct Swapchain { - Device device; - - VkSurfaceKHR surface = VK_NULL_HANDLE; - VkSwapchainKHR swapchain = VK_NULL_HANDLE; - VkRenderPass render_pass = VK_NULL_HANDLE; - VkDescriptorPool descriptor_pool = VK_NULL_HANDLE; - GLFWwindow *window = nullptr; - uint32_t width = -1; - uint32_t height = -1; - bool needs_recreate = false; - - static constexpr uint32_t SWAPCHAIN_IMAGE_COUNT = 3; - VkImage swapchain_images[SWAPCHAIN_IMAGE_COUNT]; - VkImageView swapchain_image_views[SWAPCHAIN_IMAGE_COUNT]; - VkFramebuffer framebuffers[SWAPCHAIN_IMAGE_COUNT]; - VkSemaphore image_available_semaphores[SWAPCHAIN_IMAGE_COUNT]; - VkSemaphore render_finished_semaphores[SWAPCHAIN_IMAGE_COUNT]; - CommandBuffer cmd_buf; - - Texture2D upload_texture; - - ImGuiContext *imgui_context = nullptr; - uint32_t semaphore_index = 0; - uint32_t frame_index = 0; - - void resize(uint32_t new_width, uint32_t new_height); - void start_frame(); - void display(Texture2D &texture); - void release(); - Swapchain(GLFWwindow *window, iris::Device device, uint32_t width, uint32_t height); -}; - -} // namespace iris \ No newline at end of file diff --git a/xmake.lua b/xmake.lua index 41b1d0e..2b21ba8 100644 --- a/xmake.lua +++ b/xmake.lua @@ -66,6 +66,7 @@ target("glm") target("iris_renderer") set_kind("binary") add_files(path.join(src_dir, "**.cpp")) + add_includedirs("include") -- Link external libraries add_deps("argparse", "imgui", "tinygltf", "tinyobjloader", "stb", "glm") -- cgit v1.2.3-70-g09d2