// Copyright 2022 Simon Boyé #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include VkVertexInputBindingDescription vertex_binding_description(); std::array vertex_attributes_description(); class VulkanTutorial { public: enum QueueIndex { GRAPHIC_QUEUE, }; using Clock = std::chrono::high_resolution_clock; using TimePoint = Clock::time_point; using Duration = Clock::duration; using SecondsD = std::chrono::duration; public: VulkanTutorial(); VulkanTutorial(const VulkanTutorial&) = delete; ~VulkanTutorial(); VulkanTutorial& operator=(const VulkanTutorial&) = delete; void initialize(SDL_Window* window); void shutdown(); void set_camera(const Vector3& camera_position, const Vector3& camera_z, const Vector3& camera_y); void draw_frame(); void invalidate_swapchain(); private: void create_swapchain_objects(uint32_t image_count); void destroy_swapchain_objects(); void create_render_pass(); void create_descriptor_set_layout(); void create_graphic_pipeline(); void create_framebuffers(); void create_command_pool(); void create_vertex_buffer(); void create_index_buffer(); void create_uniform_buffer(); void create_descriptor_pool(); void create_descriptor_sets(); void create_command_buffers(); private: vk::Context m_context; vk::Swapchain m_swapchain; VkQueue m_graphic_queue = nullptr; VkQueue m_presentation_queue = nullptr; vk::RenderPass m_render_pass; VkDescriptorSetLayout m_descriptor_set_layout = VK_NULL_HANDLE; VkPipelineLayout m_pipeline_layout = VK_NULL_HANDLE; vk::Pipeline m_pipeline; std::vector m_framebuffers; VkCommandPool m_command_pool = VK_NULL_HANDLE; vk::Buffer m_vertex_buffer; vk::Buffer m_index_buffer; std::vector m_uniform_buffers; std::vector m_uniform_buffer_offsets; vk::MemoryBlock m_uniform_buffer_memory; VkDescriptorPool m_descriptor_pool = VK_NULL_HANDLE; std::vector m_descriptor_sets; std::vector m_command_buffers; std::vector m_render_done; Vector3 m_camera_position = Vector3(0.0f, 0.0f, -3.0f); Vector3 m_camera_z = Vector3(0.0f, 0.0f, 1.0f); Vector3 m_camera_y = Vector3(0.0f, 1.0f, 0.0f); TimePoint m_last_frame_time; Duration m_time = Duration(0); };