From 14011011fea2a9b23b959dfc2fd6fb4df4772c35 Mon Sep 17 00:00:00 2001 From: koe Date: Fri, 5 Jan 2024 22:32:18 -0600 Subject: [PATCH 1/2] refactor render_system into multiple systems --- crates/bevy_render/src/lib.rs | 10 +++-- crates/bevy_render/src/renderer/mod.rs | 59 ++++++++++++++------------ 2 files changed, 40 insertions(+), 29 deletions(-) diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index 4f06c11e0291d..94bfdf5675187 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -52,7 +52,7 @@ use crate::{ mesh::{morph::MorphPlugin, Mesh, MeshPlugin}, render_asset::prepare_assets, render_resource::{PipelineCache, Shader, ShaderLoader}, - renderer::{render_system, RenderInstance}, + renderer::{finalize_render_system, present_system, render_graph_system, send_time_system, RenderInstance}, settings::RenderCreation, view::{ViewPlugin, WindowRenderPlugin}, }; @@ -424,9 +424,13 @@ unsafe fn initialize_render_app(app: &mut App) { // is running in parallel with the main app. apply_extract_commands.in_set(RenderSet::ExtractCommands), ( - PipelineCache::process_pipeline_queue_system.before(render_system), - render_system, + PipelineCache::process_pipeline_queue_system, + render_graph_system, + present_system, + finalize_render_system, + send_time_system, ) + .chain() .in_set(RenderSet::Render), World::clear_entities.in_set(RenderSet::Cleanup), ), diff --git a/crates/bevy_render/src/renderer/mod.rs b/crates/bevy_render/src/renderer/mod.rs index 73992091ea57e..8951468646dbc 100644 --- a/crates/bevy_render/src/renderer/mod.rs +++ b/crates/bevy_render/src/renderer/mod.rs @@ -22,7 +22,7 @@ use wgpu::{ }; /// Updates the [`RenderGraph`] with all of its nodes and then runs it to render the entire frame. -pub fn render_system(world: &mut World) { +pub fn render_graph_system(world: &mut World) { world.resource_scope(|world, mut graph: Mut| { graph.update(world); }); @@ -53,40 +53,47 @@ pub fn render_system(world: &mut World) { panic!("Error running render graph: {e}"); } +} - { - let _span = info_span!("present_frames").entered(); +/// Presents the frame in all extracted windows. +pub fn present_system(world: &mut World) { + let _span = info_span!("present_frames").entered(); - // Remove ViewTarget components to ensure swap chain TextureViews are dropped. - // If all TextureViews aren't dropped before present, acquiring the next swap chain texture will fail. - let view_entities = world - .query_filtered::>() - .iter(world) - .collect::>(); - for view_entity in view_entities { - world.entity_mut(view_entity).remove::(); - } + // Remove ViewTarget components to ensure swap chain TextureViews are dropped. + // If all TextureViews aren't dropped before present, acquiring the next swap chain texture will fail. + let view_entities = world + .query_filtered::>() + .iter(world) + .collect::>(); + for view_entity in view_entities { + world.entity_mut(view_entity).remove::(); + } - let mut windows = world.resource_mut::(); - for window in windows.values_mut() { - if let Some(wrapped_texture) = window.swap_chain_texture.take() { - if let Some(surface_texture) = wrapped_texture.try_unwrap() { - surface_texture.present(); - } + let mut windows = world.resource_mut::(); + for window in windows.values_mut() { + if let Some(wrapped_texture) = window.swap_chain_texture.take() { + if let Some(surface_texture) = wrapped_texture.try_unwrap() { + surface_texture.present(); } } - - #[cfg(feature = "tracing-tracy")] - bevy_utils::tracing::event!( - bevy_utils::tracing::Level::INFO, - message = "finished frame", - tracy.frame_mark = true - ); } + #[cfg(feature = "tracing-tracy")] + bevy_utils::tracing::event!( + bevy_utils::tracing::Level::INFO, + message = "finished frame", + tracy.frame_mark = true + ); +} + +/// Finalizes any post-rendering rendering tasks. +/// - Collects screenshots. +pub fn finalize_render_system(world: &mut World) { crate::view::screenshot::collect_screenshots(world); +} - // update the time and send it to the app world +/// Updates the time and sends it to the app world. +pub fn send_time_system(world: &mut World) { let time_sender = world.resource::(); if let Err(error) = time_sender.0.try_send(Instant::now()) { match error { From bfa99b54b1c67d58a813093eb2360c9d8a4aed79 Mon Sep 17 00:00:00 2001 From: koe Date: Fri, 5 Jan 2024 22:49:17 -0600 Subject: [PATCH 2/2] fmt --- crates/bevy_render/src/lib.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index 94bfdf5675187..7e80f857c84e1 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -52,7 +52,10 @@ use crate::{ mesh::{morph::MorphPlugin, Mesh, MeshPlugin}, render_asset::prepare_assets, render_resource::{PipelineCache, Shader, ShaderLoader}, - renderer::{finalize_render_system, present_system, render_graph_system, send_time_system, RenderInstance}, + renderer::{ + finalize_render_system, present_system, render_graph_system, send_time_system, + RenderInstance, + }, settings::RenderCreation, view::{ViewPlugin, WindowRenderPlugin}, };