11use async_channel:: { Receiver , Sender } ;
22use bevy_app:: { App , SubApp } ;
3- use bevy_ecs:: { schedule:: MainThreadExecutor , system:: Resource , world:: Mut } ;
3+ use bevy_ecs:: {
4+ schedule:: MainThreadExecutor ,
5+ system:: Resource ,
6+ world:: { Mut , World } ,
7+ } ;
48use bevy_tasks:: ComputeTaskPool ;
59
610#[ cfg( feature = "trace" ) ]
711use bevy_utils:: tracing:: Instrument ;
812
9- use crate :: RenderApp ;
13+ use crate :: { PipelinedRenderingUpdateApp , RenderApp } ;
1014
1115/// Resource to be used for pipelined rendering for sending the render app from the main thread to the rendering thread
1216#[ derive( Resource ) ]
@@ -17,7 +21,12 @@ pub struct MainToRenderAppSender(pub Sender<SubApp>);
1721pub struct RenderToMainAppReceiver ( pub Receiver < SubApp > ) ;
1822
1923/// sets up the render thread and insert resource into the main app for controlling the render thread
20- pub fn setup_pipelined_rendering ( app : & mut App ) {
24+ pub fn setup_rendering ( app : & mut App ) {
25+ // skip this if pipelined rendering is not enabled
26+ if app. get_sub_app ( PipelinedRenderingUpdateApp ) . is_err ( ) {
27+ return ;
28+ }
29+
2130 let ( app_to_render_sender, app_to_render_receiver) = async_channel:: bounded :: < SubApp > ( 1 ) ;
2231 let ( render_to_app_sender, render_to_app_receiver) = async_channel:: bounded :: < SubApp > ( 1 ) ;
2332
@@ -31,55 +40,38 @@ pub fn setup_pipelined_rendering(app: &mut App) {
3140 loop {
3241 // TODO: exit loop when app is exited
3342 let recv_task = app_to_render_receiver. recv ( ) ;
34- #[ cfg( feature = "trace" ) ]
35- let span = bevy_utils:: tracing:: info_span!( "receive render world from main" ) ;
36- #[ cfg( feature = "trace" ) ]
37- let recv_task = recv_task. instrument ( span) ;
3843 let mut sub_app = recv_task. await . unwrap ( ) ;
3944 sub_app. run ( ) ;
4045 render_to_app_sender. send ( sub_app) . await . unwrap ( ) ;
4146 }
4247 } ;
4348 #[ cfg( feature = "trace" ) ]
44- let span = bevy_utils:: tracing:: info_span!( "render task " ) ;
49+ let span = bevy_utils:: tracing:: info_span!( "render app " ) ;
4550 #[ cfg( feature = "trace" ) ]
4651 let render_task = render_task. instrument ( span) ;
4752 ComputeTaskPool :: get ( ) . spawn ( render_task) . detach ( ) ;
4853}
4954
50- pub fn update_rendering ( app : & mut App ) {
51- app. update ( ) ;
52-
55+ pub fn update_rendering ( app_world : & mut World ) {
5356 // wait to get the render app back to signal that rendering is finished
54- let mut render_app = app
55- . world
57+ let mut render_app = app_world
5658 . resource_scope ( |world, main_thread_executor : Mut < MainThreadExecutor > | {
5759 ComputeTaskPool :: get ( )
5860 . scope ( Some ( main_thread_executor. 0 . clone ( ) ) , |s| {
5961 s. spawn ( async {
6062 let receiver = world. get_resource :: < RenderToMainAppReceiver > ( ) . unwrap ( ) ;
6163 let recv = receiver. 0 . recv ( ) ;
62- #[ cfg( feature = "trace" ) ]
63- let span = bevy_utils:: tracing:: info_span!( "wait for render" ) ;
64- #[ cfg( feature = "trace" ) ]
65- let recv = recv. instrument ( span) ;
6664 recv. await . unwrap ( )
6765 } ) ;
6866 } )
6967 . pop ( )
7068 } )
7169 . unwrap ( ) ;
7270
73- render_app. extract ( & mut app. world ) ;
74-
75- {
76- #[ cfg( feature = "trace" ) ]
77- let _span = bevy_utils:: tracing:: info_span!( "send world to render" ) . entered ( ) ;
78- app. world
79- . resource_scope ( |_world, sender : Mut < MainToRenderAppSender > | {
80- sender. 0 . send_blocking ( render_app) . unwrap ( ) ;
81- } ) ;
82- }
71+ render_app. extract ( app_world) ;
8372
73+ app_world. resource_scope ( |_world, sender : Mut < MainToRenderAppSender > | {
74+ sender. 0 . send_blocking ( render_app) . unwrap ( ) ;
75+ } ) ;
8476 // frame pacing plugin should run here somehow. i.e. after rendering, but before input handling
8577}
0 commit comments