@@ -19,16 +19,15 @@ mod ex {
1919
2020 fn render_thread (
2121 window : Arc < Window > ,
22- surface : Arc < Mutex < Surface > > ,
23- do_render : mpsc:: Receiver < ( ) > ,
22+ do_render : mpsc:: Receiver < Arc < Mutex < Surface > > > ,
2423 done : mpsc:: Sender < ( ) > ,
2524 ) {
2625 loop {
2726 println ! ( "waiting for render..." ) ;
28- if do_render. recv ( ) . is_err ( ) {
29- println ! ( "surface state destroyed" ) ;
27+ let Ok ( surface ) = do_render. recv ( ) else {
28+ println ! ( "main thread destroyed" ) ;
3029 break ;
31- }
30+ } ;
3231
3332 // Perform the rendering.
3433 let mut surface = surface. lock ( ) . unwrap ( ) ;
@@ -73,15 +72,6 @@ mod ex {
7372
7473 let context = softbuffer:: Context :: new ( window. clone ( ) ) . unwrap ( ) ;
7574
76- ( window, context)
77- } ,
78- |_elwt, ( window, context) | {
79- let surface = {
80- println ! ( "making surface..." ) ;
81- let surface = softbuffer:: Surface :: new ( context, window. clone ( ) ) . unwrap ( ) ;
82- Arc :: new ( Mutex :: new ( surface) )
83- } ;
84-
8575 // Spawn a thread to handle rendering for this specific surface. The channels will
8676 // be closed and the thread will be stopped whenever this surface (the returned
8777 // context below) is dropped, so that it can all be recreated again (on Android)
@@ -91,28 +81,33 @@ mod ex {
9181 println ! ( "starting thread..." ) ;
9282 std:: thread:: spawn ( {
9383 let window = window. clone ( ) ;
94- let surface = surface. clone ( ) ;
95- move || render_thread ( window, surface, do_render, render_done)
84+ move || render_thread ( window, do_render, render_done)
9685 } ) ;
9786
98- ( surface, start_render, finish_render)
87+ ( window, context, start_render, finish_render)
88+ } ,
89+ |_elwt, ( window, context, _start_render, _finish_render) | {
90+ println ! ( "making surface..." ) ;
91+ Arc :: new ( Mutex :: new (
92+ softbuffer:: Surface :: new ( context, window. clone ( ) ) . unwrap ( ) ,
93+ ) )
9994 } ,
10095 )
10196 . with_event_handler ( |state, surface, event, elwt| {
102- let ( window, _context) = state;
97+ let ( window, _context, start_render , finish_render ) = state;
10398 elwt. set_control_flow ( ControlFlow :: Wait ) ;
10499
105100 match event {
106101 Event :: WindowEvent {
107102 window_id,
108103 event : WindowEvent :: RedrawRequested ,
109104 } if window_id == window. id ( ) => {
110- let Some ( ( _surface , start_render , finish_render ) ) = surface else {
105+ let Some ( surface ) = surface else {
111106 eprintln ! ( "RedrawRequested fired before Resumed or after Suspended" ) ;
112107 return ;
113108 } ;
114109 // Start the render and then finish it.
115- start_render. send ( ( ) ) . unwrap ( ) ;
110+ start_render. send ( surface . clone ( ) ) . unwrap ( ) ;
116111 finish_render. recv ( ) . unwrap ( ) ;
117112 }
118113 Event :: WindowEvent {
0 commit comments