#pragma once #include #include #include #include #include #include #include #include "DeletionQueue.h" #include "DescriptorAllocator.h" #include "Loader.h" #include "Logger.h" #include "Types.h" namespace Lunar { struct GPUDrawPushConstants { smath::Mat4 world_matrix; VkDeviceAddress vertex_buffer; }; constexpr unsigned FRAME_OVERLAP = 2; struct VulkanRenderer { VulkanRenderer(SDL_Window *window, Logger &logger); ~VulkanRenderer(); auto render() -> void; auto resize(uint32_t width, uint32_t height) -> void; auto immediate_submit(std::function &&function) -> void; auto upload_mesh(std::span indices, std::span vertices) -> GPUMeshBuffers; auto logger() const -> Logger & { return m_logger; } private: auto vk_init() -> void; auto swapchain_init() -> void; auto commands_init() -> void; auto sync_init() -> void; auto descriptors_init() -> void; auto pipelines_init() -> void; auto background_pipelines_init() -> void; auto triangle_pipeline_init() -> void; auto mesh_pipeline_init() -> void; auto imgui_init() -> void; auto default_data_init() -> void; auto draw_background(VkCommandBuffer cmd) -> void; auto draw_geometry(VkCommandBuffer cmd) -> void; auto draw_imgui(VkCommandBuffer cmd, VkImageView target_image_view) -> void; auto create_swapchain(uint32_t width, uint32_t height) -> void; auto create_draw_image(uint32_t width, uint32_t height) -> void; auto update_draw_image_descriptor() -> void; auto destroy_draw_image() -> void; auto create_depth_image(uint32_t width, uint32_t height) -> void; auto destroy_depth_image() -> void; auto recreate_swapchain(uint32_t width, uint32_t height) -> void; auto destroy_swapchain() -> void; auto create_buffer(size_t alloc_size, VkBufferUsageFlags usage, VmaMemoryUsage memory_usage) -> AllocatedBuffer; auto destroy_buffer(AllocatedBuffer &buffer) -> void; struct { vkb::Instance instance; vkb::PhysicalDevice phys_dev; vkb::Device dev; vkb::Swapchain swapchain; } m_vkb; struct { auto get_current_frame() -> FrameData & { return frames.at(frame_number % frames.size()); } VkSwapchainKHR swapchain { VK_NULL_HANDLE }; VkSurfaceKHR surface { nullptr }; VkFormat swapchain_image_format; uint32_t graphics_queue_family { 0 }; VkQueue graphics_queue { nullptr }; std::vector swapchain_images; std::vector swapchain_image_views; std::vector present_semaphores; VkExtent2D swapchain_extent; std::array frames; AllocatedImage draw_image {}; AllocatedImage depth_image {}; VkExtent2D draw_extent {}; VmaAllocator allocator; DescriptorAllocator descriptor_allocator; VkDescriptorSet draw_image_descriptors; VkDescriptorSetLayout draw_image_descriptor_layout; VkPipeline gradient_pipeline {}; VkPipelineLayout gradient_pipeline_layout {}; VkPipeline triangle_pipeline {}; VkPipelineLayout triangle_pipeline_layout {}; VkPipeline mesh_pipeline {}; VkPipelineLayout mesh_pipeline_layout {}; GPUMeshBuffers rectangle; VkDescriptorPool imgui_descriptor_pool { VK_NULL_HANDLE }; DeletionQueue deletion_queue; VkFence imm_fence {}; VkCommandBuffer imm_command_buffer {}; VkCommandPool imm_command_pool {}; uint64_t frame_number { 0 }; std::vector> test_meshes; } m_vk; SDL_Window *m_window { nullptr }; Logger &m_logger; }; } // namespace Lunar