@@ -19,16 +19,15 @@ mod ex {
19
19
20
20
fn render_thread (
21
21
window : Arc < Window > ,
22
- surface : Arc < Mutex < Surface > > ,
23
- do_render : mpsc:: Receiver < ( ) > ,
22
+ do_render : mpsc:: Receiver < Arc < Mutex < Surface > > > ,
24
23
done : mpsc:: Sender < ( ) > ,
25
24
) {
26
25
loop {
27
26
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" ) ;
30
29
break ;
31
- }
30
+ } ;
32
31
33
32
// Perform the rendering.
34
33
let mut surface = surface. lock ( ) . unwrap ( ) ;
@@ -73,15 +72,6 @@ mod ex {
73
72
74
73
let context = softbuffer:: Context :: new ( window. clone ( ) ) . unwrap ( ) ;
75
74
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
-
85
75
// Spawn a thread to handle rendering for this specific surface. The channels will
86
76
// be closed and the thread will be stopped whenever this surface (the returned
87
77
// context below) is dropped, so that it can all be recreated again (on Android)
@@ -91,28 +81,33 @@ mod ex {
91
81
println ! ( "starting thread..." ) ;
92
82
std:: thread:: spawn ( {
93
83
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)
96
85
} ) ;
97
86
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
+ ) )
99
94
} ,
100
95
)
101
96
. with_event_handler ( |state, surface, event, elwt| {
102
- let ( window, _context) = state;
97
+ let ( window, _context, start_render , finish_render ) = state;
103
98
elwt. set_control_flow ( ControlFlow :: Wait ) ;
104
99
105
100
match event {
106
101
Event :: WindowEvent {
107
102
window_id,
108
103
event : WindowEvent :: RedrawRequested ,
109
104
} if window_id == window. id ( ) => {
110
- let Some ( ( _surface , start_render , finish_render ) ) = surface else {
105
+ let Some ( surface ) = surface else {
111
106
eprintln ! ( "RedrawRequested fired before Resumed or after Suspended" ) ;
112
107
return ;
113
108
} ;
114
109
// Start the render and then finish it.
115
- start_render. send ( ( ) ) . unwrap ( ) ;
110
+ start_render. send ( surface . clone ( ) ) . unwrap ( ) ;
116
111
finish_render. recv ( ) . unwrap ( ) ;
117
112
}
118
113
Event :: WindowEvent {
0 commit comments