#pragma once #include #include #include #include #include #include #include "AllocatedImage.h" #include "DeletionQueue.h" #include "Logger.h" #include "src/DescriptorAllocator.h" namespace Lunar { struct FrameData { VkCommandPool command_pool; VkCommandBuffer main_command_buffer; VkSemaphore swapchain_semaphore; VkFence render_fence; DeletionQueue deletion_queue; }; constexpr unsigned FRAME_OVERLAP = 2; class VulkanRenderer { public: 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; 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 imgui_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 recreate_swapchain(uint32_t width, uint32_t height) -> void; auto destroy_swapchain() -> 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 {}; 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 {}; 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 }; } m_vk; SDL_Window *m_window { nullptr }; Logger &m_logger; }; } // namespace Lunar