From 8bb1b080b46b68ec9f25b9a27a4f9252041495f0 Mon Sep 17 00:00:00 2001 From: Benjamin Hansen Date: Wed, 24 Apr 2024 20:29:58 -0600 Subject: [PATCH] fixed up to model loading for wasm --- code/beginner/tutorial2-surface/src/challenge.rs | 10 ++++++++++ code/beginner/tutorial2-surface/src/lib.rs | 10 ++++++++++ code/beginner/tutorial3-pipeline/src/challenge.rs | 10 ++++++++++ code/beginner/tutorial3-pipeline/src/lib.rs | 10 ++++++++++ code/beginner/tutorial4-buffer/src/challenge.rs | 10 ++++++++++ code/beginner/tutorial4-buffer/src/lib.rs | 10 ++++++++++ code/beginner/tutorial5-textures/src/challenge.rs | 10 ++++++++++ code/beginner/tutorial5-textures/src/lib.rs | 10 ++++++++++ code/beginner/tutorial6-uniforms/src/challenge.rs | 10 ++++++++++ code/beginner/tutorial6-uniforms/src/lib.rs | 10 ++++++++++ code/beginner/tutorial7-instancing/src/challenge.rs | 10 ++++++++++ code/beginner/tutorial7-instancing/src/lib.rs | 10 ++++++++++ code/beginner/tutorial8-depth/src/challenge.rs | 10 ++++++++++ code/beginner/tutorial8-depth/src/lib.rs | 10 ++++++++++ code/beginner/tutorial8-depth/src/texture.rs | 13 ++++++------- code/beginner/tutorial9-models/src/lib.rs | 7 +++++++ code/intermediate/tutorial10-lighting/src/lib.rs | 10 ++++++++++ .../intermediate/tutorial10-lighting/src/texture.rs | 6 +++--- code/intermediate/tutorial11-normals/src/lib.rs | 10 ++++++++++ code/intermediate/tutorial11-normals/src/texture.rs | 6 +++--- code/intermediate/tutorial12-camera/src/lib.rs | 3 +++ code/intermediate/tutorial12-camera/src/texture.rs | 4 ++-- code/intermediate/tutorial13-hdr/src/lib.rs | 4 ++-- code/intermediate/tutorial13-hdr/src/texture.rs | 6 +++--- code/intermediate/wip-terrain/src/lib.rs | 3 +++ code/intermediate/wip-terrain/src/texture.rs | 6 +++--- code/showcase/compute/src/main.rs | 3 +++ code/showcase/compute/src/texture.rs | 6 +++--- code/showcase/framework/src/lib.rs | 3 +++ code/showcase/mouse-picking/src/lib.rs | 3 +++ code/showcase/mouse-picking/src/texture.rs | 6 +++--- code/showcase/pong/src/render/mod.rs | 3 +++ code/showcase/threading/src/lib.rs | 3 +++ code/showcase/threading/src/texture.rs | 6 +++--- docs/beginner/tutorial2-surface/README.md | 3 +++ 35 files changed, 222 insertions(+), 32 deletions(-) diff --git a/code/beginner/tutorial2-surface/src/challenge.rs b/code/beginner/tutorial2-surface/src/challenge.rs index 61412cd0..4d0ce873 100644 --- a/code/beginner/tutorial2-surface/src/challenge.rs +++ b/code/beginner/tutorial2-surface/src/challenge.rs @@ -28,7 +28,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); @@ -178,6 +181,7 @@ async fn run() { // State::new uses async code, so we're going to wait for it to finish let mut state = State::new(&window).await; + let mut surface_configured = false; event_loop .run(move |event, control_flow| { @@ -200,9 +204,15 @@ async fn run() { } => control_flow.exit(), WindowEvent::Resized(physical_size) => { state.resize(*physical_size); + surface_configured = true; } WindowEvent::RedrawRequested => { state.window().request_redraw(); + + if !surface_configured { + return; + } + state.update(); match state.render() { Ok(_) => {} diff --git a/code/beginner/tutorial2-surface/src/lib.rs b/code/beginner/tutorial2-surface/src/lib.rs index d20f5a70..42d38ccf 100644 --- a/code/beginner/tutorial2-surface/src/lib.rs +++ b/code/beginner/tutorial2-surface/src/lib.rs @@ -29,7 +29,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); @@ -191,6 +194,7 @@ pub async fn run() { // State::new uses async code, so we're going to wait for it to finish let mut state = State::new(&window).await; + let mut surface_configured = false; event_loop .run(move |event, control_flow| { @@ -214,11 +218,17 @@ pub async fn run() { } => control_flow.exit(), WindowEvent::Resized(physical_size) => { log::info!("physical_size: {physical_size:?}"); + surface_configured = true; state.resize(*physical_size); } WindowEvent::RedrawRequested => { // This tells winit that we want another frame after this one state.window().request_redraw(); + + if !surface_configured { + return; + } + state.update(); match state.render() { Ok(_) => {} diff --git a/code/beginner/tutorial3-pipeline/src/challenge.rs b/code/beginner/tutorial3-pipeline/src/challenge.rs index 80171e15..89c64016 100644 --- a/code/beginner/tutorial3-pipeline/src/challenge.rs +++ b/code/beginner/tutorial3-pipeline/src/challenge.rs @@ -26,7 +26,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); @@ -286,6 +289,7 @@ async fn run() { // State::new uses async code, so we're going to wait for it to finish let mut state = State::new(&window).await; + let mut surface_configured = false; event_loop .run(move |event, control_flow| { @@ -307,11 +311,17 @@ async fn run() { .. } => control_flow.exit(), WindowEvent::Resized(physical_size) => { + surface_configured = true; state.resize(*physical_size); } WindowEvent::RedrawRequested => { // This tells winit that we want another frame after this one state.window().request_redraw(); + + if !surface_configured { + return; + } + state.update(); match state.render() { Ok(_) => {} diff --git a/code/beginner/tutorial3-pipeline/src/lib.rs b/code/beginner/tutorial3-pipeline/src/lib.rs index 9040c6a5..68fa9415 100644 --- a/code/beginner/tutorial3-pipeline/src/lib.rs +++ b/code/beginner/tutorial3-pipeline/src/lib.rs @@ -28,7 +28,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); @@ -248,6 +251,7 @@ pub async fn run() { // State::new uses async code, so we're going to wait for it to finish let mut state = State::new(&window).await; + let mut surface_configured = false; event_loop .run(move |event, control_flow| { @@ -269,11 +273,17 @@ pub async fn run() { .. } => control_flow.exit(), WindowEvent::Resized(physical_size) => { + surface_configured = true; state.resize(*physical_size); } WindowEvent::RedrawRequested => { // This tells winit that we want another frame after this one state.window().request_redraw(); + + if !surface_configured { + return; + } + state.update(); match state.render() { Ok(_) => {} diff --git a/code/beginner/tutorial4-buffer/src/challenge.rs b/code/beginner/tutorial4-buffer/src/challenge.rs index 635cef25..b48de4f5 100644 --- a/code/beginner/tutorial4-buffer/src/challenge.rs +++ b/code/beginner/tutorial4-buffer/src/challenge.rs @@ -89,7 +89,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); @@ -367,6 +370,7 @@ async fn run() { // State::new uses async code, so we're going to wait for it to finish let mut state = State::new(&window).await; + let mut surface_configured = false; event_loop .run(move |event, control_flow| { @@ -388,11 +392,17 @@ async fn run() { .. } => control_flow.exit(), WindowEvent::Resized(physical_size) => { + surface_configured = true; state.resize(*physical_size); } WindowEvent::RedrawRequested => { // This tells winit that we want another frame after this one state.window().request_redraw(); + + if !surface_configured { + return; + } + state.update(); match state.render() { Ok(_) => {} diff --git a/code/beginner/tutorial4-buffer/src/lib.rs b/code/beginner/tutorial4-buffer/src/lib.rs index dd17ccb1..d6645b31 100644 --- a/code/beginner/tutorial4-buffer/src/lib.rs +++ b/code/beginner/tutorial4-buffer/src/lib.rs @@ -85,7 +85,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); @@ -326,6 +329,7 @@ pub async fn run() { // State::new uses async code, so we're going to wait for it to finish let mut state = State::new(&window).await; + let mut surface_configured = false; event_loop .run(move |event, control_flow| { @@ -347,11 +351,17 @@ pub async fn run() { .. } => control_flow.exit(), WindowEvent::Resized(physical_size) => { + surface_configured = true; state.resize(*physical_size); } WindowEvent::RedrawRequested => { // This tells winit that we want another frame after this one state.window().request_redraw(); + + if !surface_configured { + return; + } + state.update(); match state.render() { Ok(_) => {} diff --git a/code/beginner/tutorial5-textures/src/challenge.rs b/code/beginner/tutorial5-textures/src/challenge.rs index 277e2478..d15f3cb2 100644 --- a/code/beginner/tutorial5-textures/src/challenge.rs +++ b/code/beginner/tutorial5-textures/src/challenge.rs @@ -91,7 +91,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); @@ -394,6 +397,7 @@ async fn run() { // State::new uses async code, so we're going to wait for it to finish let mut state = State::new(&window).await; + let mut surface_configured = false; event_loop .run(move |event, control_flow| { @@ -415,11 +419,17 @@ async fn run() { .. } => control_flow.exit(), WindowEvent::Resized(physical_size) => { + surface_configured = true; state.resize(*physical_size); } WindowEvent::RedrawRequested => { // This tells winit that we want another frame after this one state.window().request_redraw(); + + if !surface_configured { + return; + } + state.update(); match state.render() { Ok(_) => {} diff --git a/code/beginner/tutorial5-textures/src/lib.rs b/code/beginner/tutorial5-textures/src/lib.rs index bac26de2..c28b3575 100644 --- a/code/beginner/tutorial5-textures/src/lib.rs +++ b/code/beginner/tutorial5-textures/src/lib.rs @@ -91,7 +91,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); @@ -372,6 +375,7 @@ pub async fn run() { // State::new uses async code, so we're going to wait for it to finish let mut state = State::new(&window).await; + let mut surface_configured = false; event_loop .run(move |event, control_flow| { @@ -393,11 +397,17 @@ pub async fn run() { .. } => control_flow.exit(), WindowEvent::Resized(physical_size) => { + surface_configured = true; state.resize(*physical_size); } WindowEvent::RedrawRequested => { // This tells winit that we want another frame after this one state.window().request_redraw(); + + if !surface_configured { + return; + } + state.update(); match state.render() { Ok(_) => {} diff --git a/code/beginner/tutorial6-uniforms/src/challenge.rs b/code/beginner/tutorial6-uniforms/src/challenge.rs index c63e794b..d71fb468 100644 --- a/code/beginner/tutorial6-uniforms/src/challenge.rs +++ b/code/beginner/tutorial6-uniforms/src/challenge.rs @@ -241,7 +241,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); @@ -561,6 +564,7 @@ async fn run() { // State::new uses async code, so we're going to wait for it to finish let mut state = State::new(&window).await; + let mut surface_configured = false; event_loop .run(move |event, control_flow| { @@ -582,11 +586,17 @@ async fn run() { .. } => control_flow.exit(), WindowEvent::Resized(physical_size) => { + surface_configured = true; state.resize(*physical_size); } WindowEvent::RedrawRequested => { // This tells winit that we want another frame after this one state.window().request_redraw(); + + if !surface_configured { + return; + } + state.update(); match state.render() { Ok(_) => {} diff --git a/code/beginner/tutorial6-uniforms/src/lib.rs b/code/beginner/tutorial6-uniforms/src/lib.rs index 6713a4e1..bee7e8b6 100644 --- a/code/beginner/tutorial6-uniforms/src/lib.rs +++ b/code/beginner/tutorial6-uniforms/src/lib.rs @@ -241,7 +241,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); @@ -581,6 +584,7 @@ pub async fn run() { // State::new uses async code, so we're going to wait for it to finish let mut state = State::new(&window).await; + let mut surface_configured = false; event_loop .run(move |event, control_flow| { @@ -602,11 +606,17 @@ pub async fn run() { .. } => control_flow.exit(), WindowEvent::Resized(physical_size) => { + surface_configured = true; state.resize(*physical_size); } WindowEvent::RedrawRequested => { // This tells winit that we want another frame after this one state.window().request_redraw(); + + if !surface_configured { + return; + } + state.update(); match state.render() { Ok(_) => {} diff --git a/code/beginner/tutorial7-instancing/src/challenge.rs b/code/beginner/tutorial7-instancing/src/challenge.rs index c884710b..ef6ce670 100644 --- a/code/beginner/tutorial7-instancing/src/challenge.rs +++ b/code/beginner/tutorial7-instancing/src/challenge.rs @@ -295,7 +295,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); @@ -662,6 +665,7 @@ async fn run() { // State::new uses async code, so we're going to wait for it to finish let mut state = State::new(&window).await; + let mut surface_configured = false; event_loop .run(move |event, control_flow| { @@ -683,11 +687,17 @@ async fn run() { .. } => control_flow.exit(), WindowEvent::Resized(physical_size) => { + surface_configured = true; state.resize(*physical_size); } WindowEvent::RedrawRequested => { // This tells winit that we want another frame after this one state.window().request_redraw(); + + if !surface_configured { + return; + } + state.update(); match state.render() { Ok(_) => {} diff --git a/code/beginner/tutorial7-instancing/src/lib.rs b/code/beginner/tutorial7-instancing/src/lib.rs index 19ccb8ef..b5b6ba0f 100644 --- a/code/beginner/tutorial7-instancing/src/lib.rs +++ b/code/beginner/tutorial7-instancing/src/lib.rs @@ -302,7 +302,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); @@ -679,6 +682,7 @@ pub async fn run() { // State::new uses async code, so we're going to wait for it to finish let mut state = State::new(&window).await; + let mut surface_configured = false; event_loop .run(move |event, control_flow| { @@ -700,11 +704,17 @@ pub async fn run() { .. } => control_flow.exit(), WindowEvent::Resized(physical_size) => { + surface_configured = true; state.resize(*physical_size); } WindowEvent::RedrawRequested => { // This tells winit that we want another frame after this one state.window().request_redraw(); + + if !surface_configured { + return; + } + state.update(); match state.render() { Ok(_) => {} diff --git a/code/beginner/tutorial8-depth/src/challenge.rs b/code/beginner/tutorial8-depth/src/challenge.rs index b4dba857..9433717f 100644 --- a/code/beginner/tutorial8-depth/src/challenge.rs +++ b/code/beginner/tutorial8-depth/src/challenge.rs @@ -494,7 +494,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); @@ -869,6 +872,7 @@ async fn run() { // State::new uses async code, so we're going to wait for it to finish let mut state = State::new(&window).await; + let mut surface_configured = false; event_loop .run(move |event, control_flow| { @@ -890,11 +894,17 @@ async fn run() { .. } => control_flow.exit(), WindowEvent::Resized(physical_size) => { + surface_configured = true; state.resize(*physical_size); } WindowEvent::RedrawRequested => { // This tells winit that we want another frame after this one state.window().request_redraw(); + + if !surface_configured { + return; + } + state.update(); match state.render() { Ok(_) => {} diff --git a/code/beginner/tutorial8-depth/src/lib.rs b/code/beginner/tutorial8-depth/src/lib.rs index f98a2ecd..9d9bd7a7 100644 --- a/code/beginner/tutorial8-depth/src/lib.rs +++ b/code/beginner/tutorial8-depth/src/lib.rs @@ -312,7 +312,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); @@ -706,6 +709,7 @@ pub async fn run() { // State::new uses async code, so we're going to wait for it to finish let mut state = State::new(&window).await; + let mut surface_configured = false; event_loop .run(move |event, control_flow| { @@ -727,11 +731,17 @@ pub async fn run() { .. } => control_flow.exit(), WindowEvent::Resized(physical_size) => { + surface_configured = true; state.resize(*physical_size); } WindowEvent::RedrawRequested => { // This tells winit that we want another frame after this one state.window().request_redraw(); + + if !surface_configured { + return; + } + state.update(); match state.render() { Ok(_) => {} diff --git a/code/beginner/tutorial8-depth/src/texture.rs b/code/beginner/tutorial8-depth/src/texture.rs index afc8e002..6609465b 100644 --- a/code/beginner/tutorial8-depth/src/texture.rs +++ b/code/beginner/tutorial8-depth/src/texture.rs @@ -14,10 +14,9 @@ impl Texture { device: &wgpu::Device, config: &wgpu::SurfaceConfiguration, label: &str, - ) -> Self { - let size = wgpu::Extent3d { - width: config.width, - height: config.height, + ) -> Self {let size = wgpu::Extent3d { + width: config.width.max(1), + height: config.height.max(1), depth_or_array_layers: 1, }; let desc = wgpu::TextureDescriptor { @@ -58,9 +57,9 @@ impl Texture { config: &wgpu::SurfaceConfiguration, label: &str, ) -> Self { - let size = wgpu::Extent3d { - width: config.width, - height: config.height, +let size = wgpu::Extent3d { + width: config.width.max(1), + height: config.height.max(1), depth_or_array_layers: 1, }; let desc = wgpu::TextureDescriptor { diff --git a/code/beginner/tutorial9-models/src/lib.rs b/code/beginner/tutorial9-models/src/lib.rs index 19d10738..7054fabf 100644 --- a/code/beginner/tutorial9-models/src/lib.rs +++ b/code/beginner/tutorial9-models/src/lib.rs @@ -624,6 +624,7 @@ pub async fn run() { // State::new uses async code, so we're going to wait for it to finish let mut state = State::new(&window).await; + let mut surface_configured = false; event_loop .run(move |event, control_flow| { @@ -645,11 +646,17 @@ pub async fn run() { .. } => control_flow.exit(), WindowEvent::Resized(physical_size) => { + surface_configured = true; state.resize(*physical_size); } WindowEvent::RedrawRequested => { // This tells winit that we want another frame after this one state.window().request_redraw(); + + if !surface_configured { + return; + } + state.update(); match state.render() { Ok(_) => {} diff --git a/code/intermediate/tutorial10-lighting/src/lib.rs b/code/intermediate/tutorial10-lighting/src/lib.rs index 0a18501c..9ba93815 100644 --- a/code/intermediate/tutorial10-lighting/src/lib.rs +++ b/code/intermediate/tutorial10-lighting/src/lib.rs @@ -347,7 +347,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); @@ -761,6 +764,7 @@ pub async fn run() { // State::new uses async code, so we're going to wait for it to finish let mut state = State::new(&window).await; + let mut surface_configured = false; event_loop .run(move |event, control_flow| { @@ -782,11 +786,17 @@ pub async fn run() { .. } => control_flow.exit(), WindowEvent::Resized(physical_size) => { + surface_configured = true; state.resize(*physical_size); } WindowEvent::RedrawRequested => { // This tells winit that we want another frame after this one state.window().request_redraw(); + + if !surface_configured { + return; + } + state.update(); match state.render() { Ok(_) => {} diff --git a/code/intermediate/tutorial10-lighting/src/texture.rs b/code/intermediate/tutorial10-lighting/src/texture.rs index edc7669b..00bc3ac1 100644 --- a/code/intermediate/tutorial10-lighting/src/texture.rs +++ b/code/intermediate/tutorial10-lighting/src/texture.rs @@ -15,9 +15,9 @@ impl Texture { config: &wgpu::SurfaceConfiguration, label: &str, ) -> Self { - let size = wgpu::Extent3d { - width: config.width, - height: config.height, +let size = wgpu::Extent3d { + width: config.width.max(1), + height: config.height.max(1), depth_or_array_layers: 1, }; let desc = wgpu::TextureDescriptor { diff --git a/code/intermediate/tutorial11-normals/src/lib.rs b/code/intermediate/tutorial11-normals/src/lib.rs index 6b050d8e..33fd7059 100644 --- a/code/intermediate/tutorial11-normals/src/lib.rs +++ b/code/intermediate/tutorial11-normals/src/lib.rs @@ -347,7 +347,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); @@ -809,6 +812,7 @@ pub async fn run() { // State::new uses async code, so we're going to wait for it to finish let mut state = State::new(&window).await; + let mut surface_configured = false; event_loop .run(move |event, control_flow| { @@ -830,11 +834,17 @@ pub async fn run() { .. } => control_flow.exit(), WindowEvent::Resized(physical_size) => { + surface_configured = true; state.resize(*physical_size); } WindowEvent::RedrawRequested => { // This tells winit that we want another frame after this one state.window().request_redraw(); + + if !surface_configured { + return; + } + state.update(); match state.render() { Ok(_) => {} diff --git a/code/intermediate/tutorial11-normals/src/texture.rs b/code/intermediate/tutorial11-normals/src/texture.rs index 8cfc518b..fd8f5244 100644 --- a/code/intermediate/tutorial11-normals/src/texture.rs +++ b/code/intermediate/tutorial11-normals/src/texture.rs @@ -15,9 +15,9 @@ impl Texture { config: &wgpu::SurfaceConfiguration, label: &str, ) -> Self { - let size = wgpu::Extent3d { - width: config.width, - height: config.height, +let size = wgpu::Extent3d { + width: config.width.max(1), + height: config.height.max(1), depth_or_array_layers: 1, }; let desc = wgpu::TextureDescriptor { diff --git a/code/intermediate/tutorial12-camera/src/lib.rs b/code/intermediate/tutorial12-camera/src/lib.rs index 3596eed8..78634118 100644 --- a/code/intermediate/tutorial12-camera/src/lib.rs +++ b/code/intermediate/tutorial12-camera/src/lib.rs @@ -227,7 +227,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); diff --git a/code/intermediate/tutorial12-camera/src/texture.rs b/code/intermediate/tutorial12-camera/src/texture.rs index 46e187d8..5790af27 100644 --- a/code/intermediate/tutorial12-camera/src/texture.rs +++ b/code/intermediate/tutorial12-camera/src/texture.rs @@ -16,8 +16,8 @@ impl Texture { label: &str, ) -> Self { let size = wgpu::Extent3d { - width: config.width, - height: config.height, + width: config.width.max(1), + height: config.height.max(1), depth_or_array_layers: 1, }; let desc = wgpu::TextureDescriptor { diff --git a/code/intermediate/tutorial13-hdr/src/lib.rs b/code/intermediate/tutorial13-hdr/src/lib.rs index d1fa694f..d4f8e899 100644 --- a/code/intermediate/tutorial13-hdr/src/lib.rs +++ b/code/intermediate/tutorial13-hdr/src/lib.rs @@ -247,10 +247,10 @@ impl<'a> State<'a> { // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { // UPDATED + #[cfg(not(target_arch="wasm32"))] + backends: wgpu::Backends::PRIMARY, #[cfg(target_arch = "wasm32")] backends: wgpu::Backends::BROWSER_WEBGPU, - #[cfg(not(target_arch = "wasm32"))] - backends: wgpu::Backends::PRIMARY, ..Default::default() }); diff --git a/code/intermediate/tutorial13-hdr/src/texture.rs b/code/intermediate/tutorial13-hdr/src/texture.rs index 1ef186e6..c003d8c0 100644 --- a/code/intermediate/tutorial13-hdr/src/texture.rs +++ b/code/intermediate/tutorial13-hdr/src/texture.rs @@ -16,9 +16,9 @@ impl Texture { config: &wgpu::SurfaceConfiguration, label: &str, ) -> Self { - let size = wgpu::Extent3d { - width: config.width, - height: config.height, +let size = wgpu::Extent3d { + width: config.width.max(1), + height: config.height.max(1), depth_or_array_layers: 1, }; let desc = wgpu::TextureDescriptor { diff --git a/code/intermediate/wip-terrain/src/lib.rs b/code/intermediate/wip-terrain/src/lib.rs index 32ef9683..758b2dcf 100644 --- a/code/intermediate/wip-terrain/src/lib.rs +++ b/code/intermediate/wip-terrain/src/lib.rs @@ -228,7 +228,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); diff --git a/code/intermediate/wip-terrain/src/texture.rs b/code/intermediate/wip-terrain/src/texture.rs index bb91b88e..bd4acfc4 100644 --- a/code/intermediate/wip-terrain/src/texture.rs +++ b/code/intermediate/wip-terrain/src/texture.rs @@ -16,9 +16,9 @@ impl Texture { config: &wgpu::SurfaceConfiguration, label: &str, ) -> Self { - let size = wgpu::Extent3d { - width: config.width, - height: config.height, +let size = wgpu::Extent3d { + width: config.width.max(1), + height: config.height.max(1), depth_or_array_layers: 1, }; let desc = wgpu::TextureDescriptor { diff --git a/code/showcase/compute/src/main.rs b/code/showcase/compute/src/main.rs index 675e5aa8..74feac63 100644 --- a/code/showcase/compute/src/main.rs +++ b/code/showcase/compute/src/main.rs @@ -166,7 +166,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); diff --git a/code/showcase/compute/src/texture.rs b/code/showcase/compute/src/texture.rs index 239e8643..ec72c3b3 100644 --- a/code/showcase/compute/src/texture.rs +++ b/code/showcase/compute/src/texture.rs @@ -30,9 +30,9 @@ impl Texture { config: &wgpu::SurfaceConfiguration, label: &str, ) -> Self { - let size = wgpu::Extent3d { - width: config.width, - height: config.height, +let size = wgpu::Extent3d { + width: config.width.max(1), + height: config.height.max(1), depth_or_array_layers: 1, }; let desc = wgpu::TextureDescriptor { diff --git a/code/showcase/framework/src/lib.rs b/code/showcase/framework/src/lib.rs index 6d0b02d3..6bdd7b5e 100644 --- a/code/showcase/framework/src/lib.rs +++ b/code/showcase/framework/src/lib.rs @@ -36,7 +36,10 @@ impl<'a> Display<'a> { pub async fn new(window: &'a Window) -> Result, Error> { let size = window.inner_size(); let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); let surface = instance.create_surface(window).unwrap(); diff --git a/code/showcase/mouse-picking/src/lib.rs b/code/showcase/mouse-picking/src/lib.rs index 395efab0..1209a4bf 100644 --- a/code/showcase/mouse-picking/src/lib.rs +++ b/code/showcase/mouse-picking/src/lib.rs @@ -232,7 +232,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); diff --git a/code/showcase/mouse-picking/src/texture.rs b/code/showcase/mouse-picking/src/texture.rs index 46e187d8..d9bd8770 100644 --- a/code/showcase/mouse-picking/src/texture.rs +++ b/code/showcase/mouse-picking/src/texture.rs @@ -15,9 +15,9 @@ impl Texture { config: &wgpu::SurfaceConfiguration, label: &str, ) -> Self { - let size = wgpu::Extent3d { - width: config.width, - height: config.height, +let size = wgpu::Extent3d { + width: config.width.max(1), + height: config.height.max(1), depth_or_array_layers: 1, }; let desc = wgpu::TextureDescriptor { diff --git a/code/showcase/pong/src/render/mod.rs b/code/showcase/pong/src/render/mod.rs index 93d627b2..ade2e50d 100644 --- a/code/showcase/pong/src/render/mod.rs +++ b/code/showcase/pong/src/render/mod.rs @@ -41,7 +41,10 @@ impl<'a> Render<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); diff --git a/code/showcase/threading/src/lib.rs b/code/showcase/threading/src/lib.rs index 0f542c90..8230ae8f 100644 --- a/code/showcase/threading/src/lib.rs +++ b/code/showcase/threading/src/lib.rs @@ -226,7 +226,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() }); diff --git a/code/showcase/threading/src/texture.rs b/code/showcase/threading/src/texture.rs index 46e187d8..d9bd8770 100644 --- a/code/showcase/threading/src/texture.rs +++ b/code/showcase/threading/src/texture.rs @@ -15,9 +15,9 @@ impl Texture { config: &wgpu::SurfaceConfiguration, label: &str, ) -> Self { - let size = wgpu::Extent3d { - width: config.width, - height: config.height, +let size = wgpu::Extent3d { + width: config.width.max(1), + height: config.height.max(1), depth_or_array_layers: 1, }; let desc = wgpu::TextureDescriptor { diff --git a/docs/beginner/tutorial2-surface/README.md b/docs/beginner/tutorial2-surface/README.md index 36c5b6ca..86978cad 100644 --- a/docs/beginner/tutorial2-surface/README.md +++ b/docs/beginner/tutorial2-surface/README.md @@ -61,7 +61,10 @@ impl<'a> State<'a> { // The instance is a handle to our GPU // Backends::all => Vulkan + Metal + DX12 + Browser WebGPU let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + #[cfg(not(target_arch="wasm32"))] backends: wgpu::Backends::PRIMARY, + #[cfg(target_arch="wasm32")] + backends: wgpu::Backends::GL, ..Default::default() });