37 enum class PrepareFrameOutcome
44 enum class RenderFrameOutcome
50 enum class FrameOutcome
60 PrepareFrameOutcome PrepareFrame();
61 RenderFrameOutcome RenderPreparedFrame();
62 FrameOutcome Update();
64 static std::string StringifyResultVk(VkResult result);
65 static void CheckVk(VkResult result);
71 void CaptureScreenshot(
const std::filesystem::path& filename, std::size_t
id = 0)
const;
73 std::shared_ptr<CommandPool> GetCommandPool(VkQueueFlagBits queueType = VK_QUEUE_GRAPHICS_BIT,
74 const std::thread::id& threadId = std::this_thread::get_id())
const;
82 return renderer_.get();
89 void SetRenderer(std::unique_ptr<Renderer>&& renderer);
91 const RenderStage* GetRenderStage(uint32_t index)
const;
93 const Descriptor* GetAttachment(
const std::string& name)
const;
94 const RenderTarget2D* GetRenderTarget(
const std::string& name)
const;
98 return physical_device_.get();
100 const LogicalDevice* GetLogicalDevice()
const
102 return logical_device_.get();
104 const VkPipelineCache& GetPipelineCache()
const
106 return pipeline_cache_;
109 const Surface* GetSurface(std::size_t
id)
const
111 return surfaces_[id].get();
113 const Swapchain* GetSwapchain(std::size_t
id)
const
115 return swapchains_[id].get();
117 bool HasSwapchain(std::size_t
id)
const
119 return id < swapchains_.size() &&
static_cast<bool>(swapchains_[id]);
121 bool HasPreparedFrame()
const
123 return prepared_frame_ready_;
125 uint32_t GetPreparedImageIndex(std::size_t
id)
const
127 ASSERT(prepared_frame_ready_ && HasSwapchain(
id),
"No prepared swapchain image is available");
128 return swapchains_[id]->GetActiveImageIndex();
130 void SetFramebufferResized(std::size_t
id)
132 per_surface_buffers_[id]->framebuffer_resized =
true;
135 const Instance* GetInstance()
const
137 return instance_.get();
139 const Window& GetWindow()
const
149 void CreatePipelineCache();
150 void ResetRenderStages();
151 void RebuildRenderStages(
bool recreateSwapchain);
152 void RecreateSwapchain();
153 void RecreateCommandBuffers(std::size_t
id);
154 void RebuildRenderTargets();
155 void RecreateAttachmentsMap();
156 void StartRenderpass(std::size_t
id, RenderStage& renderStage);
157 bool EndRenderpass(std::size_t
id, RenderStage& renderStage);
160 const ApplicationSpecification& specification_;
162 std::unique_ptr<Renderer> renderer_;
163 std::map<std::string, const Descriptor*> attachments_;
164 std::map<std::string, std::unique_ptr<RenderTarget2D>> render_targets_;
165 std::vector<std::unique_ptr<Swapchain>> swapchains_;
166 bool prepared_frame_ready_ =
false;
168 using CommandPoolKey = std::pair<std::thread::id, VkQueueFlagBits>;
170 mutable std::map<CommandPoolKey, std::shared_ptr<CommandPool>> command_pools_;
171 mutable std::mutex command_pools_mutex_;
173 Elapsed elapsed_purge_;
175 struct PerSurfaceBuffers
177 std::vector<VkSemaphore> present_completes;
178 std::vector<VkSemaphore> render_completes;
179 std::vector<VkFence> flight_fences;
180 std::vector<VkFence> image_fences;
181 std::size_t current_frame = 0;
182 bool framebuffer_resized =
false;
184 std::vector<std::unique_ptr<CommandBuffer>> command_buffers;
186 std::vector<std::unique_ptr<PerSurfaceBuffers>> per_surface_buffers_;
188 std::unique_ptr<Instance> instance_;
189 std::unique_ptr<PhysicalDevice> physical_device_;
190 std::unique_ptr<LogicalDevice> logical_device_;
191 VkPipelineCache pipeline_cache_ = VK_NULL_HANDLE;
192 std::vector<std::unique_ptr<Surface>> surfaces_;