1139{
1141 if (!ctx) {
1143 "Window not registered for submit_and_present");
1144 return;
1145 }
1146
1148
1149 size_t frame_index = ctx->current_frame;
1150 auto& in_flight = ctx->in_flight[frame_index];
1151 auto& image_available = ctx->image_available[frame_index];
1152 auto& render_finished = ctx->render_finished[frame_index];
1153
1156 : nullptr;
1157
1158 std::vector<vk::Semaphore> wait_sems { image_available };
1159 std::vector<vk::PipelineStageFlags> wait_stages {
1160 vk::PipelineStageFlagBits::eColorAttachmentOutput
1161 };
1162
1163 if (deferred_sem) {
1164 wait_sems.push_back(deferred_sem);
1165 wait_stages.emplace_back(vk::PipelineStageFlagBits::eFragmentShader);
1166 }
1167
1168 vk::SubmitInfo submit_info {};
1169 submit_info.waitSemaphoreCount = static_cast<uint32_t>(wait_sems.size());
1170 submit_info.pWaitSemaphores = wait_sems.data();
1171 submit_info.pWaitDstStageMask = wait_stages.data();
1172 submit_info.commandBufferCount = 1;
1173 submit_info.pCommandBuffers = &command_buffer;
1174 submit_info.signalSemaphoreCount = 1;
1175 submit_info.pSignalSemaphores = &render_finished;
1176
1177 try {
1178 auto result = graphics_queue.submit(1, &submit_info, in_flight);
1179 } catch (const vk::SystemError& e) {
1181 "Failed to submit primary command buffer: {}", e.what());
1182 return;
1183 }
1184
1185 bool present_success = ctx->swapchain->present(
1186 ctx->current_image_index, render_finished, graphics_queue);
1187
1188 if (!present_success) {
1189 ctx->needs_recreation = true;
1190 }
1191
1192 if (present_success)
1194
1195 ctx->current_frame = (frame_index + 1) % ctx->in_flight.size();
1196
1198 "Window '{}': frame submitted and presented",
1199 window->get_create_info().title);
1200}
#define MF_RT_ERROR(comp, ctx,...)
#define MF_RT_TRACE(comp, ctx,...)
vk::Semaphore flush_deferred_commands()
Flush deferred commands and return a semaphore that signals when they are complete.
void capture_frame(WindowRenderContext &ctx)
Capture the current frame from a window's swapchain.
BackendResourceManager * m_resource_manager
WindowRenderContext * find_window_context(const std::shared_ptr< Window > &window)
vk::Queue get_graphics_queue() const
Get graphics queue.
@ GraphicsCallback
Graphics/visual rendering callback - frame-rate real-time.
@ Core
Core engine, backend, subsystems.