Make wasm port work again
This cheats somewhat, using the non-robust version of the pipeline for
wasm, and blocking on native.
diff --git a/examples/with_winit/src/main.rs b/examples/with_winit/src/main.rs
index 706c3de..d3daf97 100644
--- a/examples/with_winit/src/main.rs
+++ b/examples/with_winit/src/main.rs
@@ -188,24 +188,35 @@
.surface
.get_current_texture()
.expect("failed to get surface texture");
- let fut = async {
- renderer
- .render_to_surface_async(
+ #[cfg(not(target_arch = "wasm32"))]
+ {
+ block_on_wgpu(
+ &device_handle.device,
+ renderer.render_to_surface_async(
&device_handle.device,
&device_handle.queue,
&scene,
&surface_texture,
width,
height,
- )
- .await
- .expect("failed to render to surface");
- surface_texture.present();
- };
- #[cfg(not(target_arch = "wasm32"))]
- block_on_wgpu(&device_handle.device, fut);
+ ),
+ )
+ .expect("failed to render to surface");
+ }
+ // Note: in the wasm case, we're currently not running the robust
+ // pipeline, as it requires more async wiring for the readback.
#[cfg(target_arch = "wasm32")]
- wasm_bindgen_futures::spawn_local(fut);
+ renderer
+ .render_to_surface(
+ &device_handle.device,
+ &device_handle.queue,
+ &scene,
+ &surface_texture,
+ width,
+ height,
+ )
+ .expect("failed to render to surface");
+ surface_texture.present();
device_handle.device.poll(wgpu::Maintain::Poll);
}
Event::UserEvent(event) => match event {
diff --git a/src/lib.rs b/src/lib.rs
index db2968f..7217311 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -182,7 +182,7 @@
) -> Result<()> {
let mut render = Render::new();
let encoding = scene.data();
- let recording = render.render_encoding_coarse(encoding, &self.shaders, width, height);
+ let recording = render.render_encoding_coarse(encoding, &self.shaders, width, height, true);
let target = render.out_image();
let bump_buf = render.bump_buf();
self.engine.run_recording(device, queue, &recording, &[])?;
diff --git a/src/render.rs b/src/render.rs
index 710c77b..5874dbc 100644
--- a/src/render.rs
+++ b/src/render.rs
@@ -196,9 +196,7 @@
height: u32,
) -> (Recording, ResourceProxy) {
let mut render = Render::new();
- // TODO: leaks the download of the bump buf; a good way to fix would be to conditionalize
- // that download.
- let mut recording = render.render_encoding_coarse(encoding, shaders, width, height);
+ let mut recording = render.render_encoding_coarse(encoding, shaders, width, height, false);
let out_image = render.out_image();
render.record_fine(shaders, &mut recording);
(recording, out_image.into())
@@ -223,12 +221,16 @@
}
/// Prepare a recording for the coarse rasterization phase.
+ ///
+ /// The `robust` parameter controls whether we're preparing for readback
+ /// of the atomic bump buffer, for robust dynamic memory.
pub fn render_encoding_coarse(
&mut self,
encoding: &Encoding,
shaders: &FullShaders,
width: u32,
height: u32,
+ robust: bool,
) -> Recording {
use crate::encoding::{resource::ResourceCache, PackedEncoding};
let mut recording = Recording::default();
@@ -526,7 +528,9 @@
info_bin_data_buf,
out_image,
});
- recording.download(*bump_buf.as_buf().unwrap());
+ if robust {
+ recording.download(*bump_buf.as_buf().unwrap());
+ }
recording.free_resource(bump_buf);
recording
}