@@ -4,14 +4,17 @@ use vangers::{
44 render:: { ScreenTargets , DEPTH_FORMAT } ,
55} ;
66
7- use futures:: executor:: { LocalPool , LocalSpawner } ;
7+ use futures:: executor:: { block_on , LocalPool , LocalSpawner } ;
88use log:: info;
99use winit:: {
1010 event,
1111 event_loop:: { ControlFlow , EventLoop } ,
1212 window:: { Window , WindowBuilder } ,
1313} ;
1414
15+ #[ cfg( target_arch = "wasm32" ) ]
16+ use crate :: web;
17+
1518pub trait Application {
1619 fn on_key ( & mut self , input : event:: KeyboardInput ) -> bool ;
1720 fn on_mouse_wheel ( & mut self , _delta : event:: MouseScrollDelta ) { }
@@ -53,12 +56,15 @@ pub struct HarnessOptions {
5356}
5457
5558impl Harness {
59+ #[ cfg( not( target_arch = "wasm32" ) ) ]
5660 pub fn init ( options : HarnessOptions ) -> ( Self , config:: Settings ) {
57- env_logger :: init ( ) ;
58- let mut task_pool = LocalPool :: new ( ) ;
61+ block_on ( Harness :: init_async ( options ) )
62+ }
5963
64+ pub async fn init_async ( options : HarnessOptions ) -> ( Self , config:: Settings ) {
6065 info ! ( "Loading the settings" ) ;
6166 let settings = config:: Settings :: load ( "config/settings.ron" ) ;
67+
6268 let extent = wgpu:: Extent3d {
6369 width : settings. window . size [ 0 ] ,
6470 height : settings. window . size [ 1 ] ,
@@ -76,19 +82,25 @@ impl Harness {
7682 . unwrap ( ) ;
7783 let surface = unsafe { instance. create_surface ( & window) } ;
7884
79- info ! ( "Initializing the device" ) ;
80- let adapter = task_pool
81- . run_until ( instance . request_adapter ( & wgpu:: RequestAdapterOptions {
85+ info ! ( "Initializing the device:adapter " ) ;
86+ let adapter = instance
87+ . request_adapter ( & wgpu:: RequestAdapterOptions {
8288 power_preference : wgpu:: PowerPreference :: HighPerformance ,
8389 compatible_surface : Some ( & surface) ,
8490 force_fallback_adapter : false ,
85- } ) )
86- . expect ( "Unable to initialize GPU via the selected backend." ) ;
91+ } )
92+ . await
93+ . expect ( "Unable to initialize GPU via the selected backend (adapter)." ) ;
8794
8895 let downlevel_caps = adapter. get_downlevel_properties ( ) ;
8996 let adapter_limits = adapter. limits ( ) ;
9097
98+ #[ cfg( target_arch = "wasm32" ) ]
9199 let mut limits = wgpu:: Limits :: downlevel_webgl2_defaults ( ) ;
100+
101+ #[ cfg( not( target_arch = "wasm32" ) ) ]
102+ let mut limits = wgpu:: Limits :: downlevel_defaults ( ) ;
103+
92104 if options. uses_level {
93105 let desired_height = 16 << 10 ;
94106 limits. max_texture_dimension_2d =
@@ -102,8 +114,10 @@ impl Harness {
102114 desired_height
103115 } ;
104116 }
105- let ( device, queue) = task_pool
106- . run_until ( adapter. request_device (
117+
118+ info ! ( "Initializing the device:request" ) ;
119+ let ( device, queue) = adapter
120+ . request_device (
107121 & wgpu:: DeviceDescriptor {
108122 label : None ,
109123 features : wgpu:: Features :: empty ( ) ,
@@ -114,8 +128,9 @@ impl Harness {
114128 } else {
115129 Some ( std:: path:: Path :: new ( & settings. render . wgpu_trace_path ) )
116130 } ,
117- ) )
118- . unwrap ( ) ;
131+ )
132+ . await
133+ . expect ( "Unable to initialize GPU via the selected backend (request)." ) ;
119134
120135 let config = wgpu:: SurfaceConfiguration {
121136 usage : wgpu:: TextureUsages :: RENDER_ATTACHMENT ,
@@ -141,7 +156,7 @@ impl Harness {
141156 . create_view ( & wgpu:: TextureViewDescriptor :: default ( ) ) ;
142157
143158 let harness = Harness {
144- task_pool,
159+ task_pool : LocalPool :: new ( ) ,
145160 event_loop,
146161 window,
147162 device,
@@ -158,9 +173,15 @@ impl Harness {
158173 }
159174
160175 pub fn main_loop < A : ' static + Application > ( self , mut app : A ) {
176+ #[ cfg( not( target_arch = "wasm32" ) ) ]
161177 use std:: time;
162178
179+ #[ cfg( target_arch = "wasm32" ) ]
180+ let mut last_time = web:: now ( ) ;
181+
182+ #[ cfg( not( target_arch = "wasm32" ) ) ]
163183 let mut last_time = time:: Instant :: now ( ) ;
184+
164185 let mut needs_reload = false ;
165186 let Harness {
166187 mut task_pool,
@@ -181,6 +202,9 @@ impl Harness {
181202 * control_flow = ControlFlow :: Poll ;
182203 task_pool. run_until_stalled ( ) ;
183204
205+ #[ cfg( target_arch = "wasm32" ) ]
206+ web:: bind_once ( & mut app) ;
207+
184208 match event {
185209 event:: Event :: WindowEvent {
186210 event : event:: WindowEvent :: Resized ( size) ,
@@ -241,13 +265,28 @@ impl Harness {
241265 } ,
242266 event:: Event :: MainEventsCleared => {
243267 let spawner = task_pool. spawner ( ) ;
244- let duration = time:: Instant :: now ( ) - last_time;
245- last_time += duration;
246- let delta = duration. as_secs ( ) as f32 + duration. subsec_nanos ( ) as f32 * 1.0e-9 ;
247268
248- let update_command_buffers = app. update ( & device, delta, & spawner) ;
249- if !update_command_buffers. is_empty ( ) {
250- queue. submit ( update_command_buffers) ;
269+ let delta: f32 ;
270+
271+ #[ cfg( target_arch = "wasm32" ) ]
272+ {
273+ let duration = web:: now ( ) - last_time;
274+ last_time += duration;
275+ delta = ( duration / 1000.0 ) as f32 ;
276+ }
277+
278+ #[ cfg( not( target_arch = "wasm32" ) ) ]
279+ {
280+ let duration = time:: Instant :: now ( ) - last_time;
281+ last_time += duration;
282+ delta = duration. as_secs ( ) as f32 + duration. subsec_nanos ( ) as f32 * 1.0e-9 ;
283+ }
284+
285+ if delta > 0.0 {
286+ let update_command_buffers = app. update ( & device, delta, & spawner) ;
287+ if !update_command_buffers. is_empty ( ) {
288+ queue. submit ( update_command_buffers) ;
289+ }
251290 }
252291
253292 match surface. get_current_texture ( ) {
0 commit comments