diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 000000000..489950ee0 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,4 @@ +[build] +# As of wgpu 0.19.1, these are necessary to build for WebGPU. +rustflags = ["--cfg=web_sys_unstable_apis"] +rustdocflags = ["--cfg=web_sys_unstable_apis"] diff --git a/Cargo.lock b/Cargo.lock index 157e12452..e428d2605 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -587,10 +587,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] -name = "com-rs" -version = "0.2.1" +name = "com" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf43edc576402991846b093a7ca18a3477e0ef9c588cde84964b5d3e43016642" +checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6" +dependencies = [ + "com_macros", +] + +[[package]] +name = "com_macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5" +dependencies = [ + "com_macros_support", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "com_macros_support" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] [[package]] name = "combine" @@ -688,12 +713,12 @@ checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" [[package]] name = "d3d12" -version = "0.7.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16e44ab292b1dddfdaf7be62cfd8877df52f2f3fde5858d95bab606be259f20" +checksum = "3e3d747f100290a1ca24b752186f61f6637e1deffe3bf6320de6fcb29510a307" dependencies = [ "bitflags 2.4.2", - "libloading 0.8.1", + "libloading 0.7.4", "winapi", ] @@ -927,7 +952,7 @@ dependencies = [ "getrandom", "image", "nalgebra", - "raw-window-handle 0.5.2", + "raw-window-handle", "thiserror", "tobj", "tracing", @@ -956,18 +981,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "futures-core", - "futures-sink", - "nanorand", - "spin", -] - [[package]] name = "fnv" version = "1.0.7" @@ -1196,11 +1209,10 @@ dependencies = [ [[package]] name = "gpu-allocator" -version = "0.23.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40fe17c8a05d60c38c0a4e5a3c802f2f1ceb66b76c67d96ffb34bef0475a7fad" +checksum = "6f56f6318968d03c18e1bcf4857ff88c61157e9da8e47c5f29055d60e1228884" dependencies = [ - "backtrace", "log", "presser", "thiserror", @@ -1259,14 +1271,14 @@ dependencies = [ [[package]] name = "hassle-rs" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1397650ee315e8891a0df210707f0fc61771b0cc518c3023896064c5407cb3b0" +checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" dependencies = [ - "bitflags 1.3.2", - "com-rs", + "bitflags 2.4.2", + "com", "libc", - "libloading 0.7.4", + "libloading 0.8.1", "thiserror", "widestring", "winapi", @@ -1767,9 +1779,9 @@ dependencies = [ [[package]] name = "naga" -version = "0.14.2" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae585df4b6514cf8842ac0f1ab4992edc975892704835b549cf818dc0191249e" +checksum = "8878eb410fc90853da3908aebfe61d73d26d4437ef850b70050461f939509899" dependencies = [ "bit-set", "bitflags 2.4.2", @@ -1812,15 +1824,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" -dependencies = [ - "getrandom", -] - [[package]] name = "native-tls" version = "0.2.11" @@ -1850,8 +1853,7 @@ dependencies = [ "log", "ndk-sys", "num_enum", - "raw-window-handle 0.5.2", - "raw-window-handle 0.6.0", + "raw-window-handle", "thiserror", ] @@ -2400,12 +2402,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" -[[package]] -name = "raw-window-handle" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" - [[package]] name = "raw-window-handle" version = "0.6.0" @@ -2966,18 +2962,14 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] [[package]] name = "spirv" -version = "0.2.0+1.5.4" +version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 1.3.2", - "num-traits", + "bitflags 2.4.2", ] [[package]] @@ -3733,9 +3725,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed" dependencies = [ "js-sys", "wasm-bindgen", @@ -3753,19 +3745,19 @@ dependencies = [ [[package]] name = "wgpu" -version = "0.18.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e7d227c9f961f2061c26f4cb0fbd4df0ef37e056edd0931783599d6c94ef24" +checksum = "0bfe9a310dcf2e6b85f00c46059aaeaf4184caa8e29a1ecd4b7a704c3482332d" dependencies = [ "arrayvec", "cfg-if", - "flume", + "cfg_aliases", "js-sys", "log", "naga", "parking_lot", "profiling", - "raw-window-handle 0.5.2", + "raw-window-handle", "smallvec", "static_assertions", "wasm-bindgen", @@ -3778,19 +3770,22 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef91c1d62d1e9e81c79e600131a258edf75c9531cbdbde09c44a011a47312726" +checksum = "6b15e451d4060ada0d99a64df44e4d590213496da7c4f245572d51071e8e30ed" dependencies = [ "arrayvec", "bit-vec", "bitflags 2.4.2", + "cfg_aliases", "codespan-reporting", + "indexmap", "log", "naga", + "once_cell", "parking_lot", "profiling", - "raw-window-handle 0.5.2", + "raw-window-handle", "rustc-hash", "smallvec", "thiserror", @@ -3801,9 +3796,9 @@ dependencies = [ [[package]] name = "wgpu-hal" -version = "0.18.1" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b84ecc802da3eb67b4cf3dd9ea6fe45bbb47ef13e6c49c5c3240868a9cc6cdd9" +checksum = "e3bb47856236bfafc0bc591a925eb036ac19cd987624a447ff353e7a7e7e6f72" dependencies = [ "android_system_properties", "arrayvec", @@ -3811,6 +3806,7 @@ dependencies = [ "bit-set", "bitflags 2.4.2", "block", + "cfg_aliases", "core-graphics-types", "d3d12", "glow", @@ -3831,7 +3827,7 @@ dependencies = [ "parking_lot", "profiling", "range-alloc", - "raw-window-handle 0.5.2", + "raw-window-handle", "renderdoc-sys", "rustc-hash", "smallvec", @@ -3844,9 +3840,9 @@ dependencies = [ [[package]] name = "wgpu-types" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d5ed5f0edf0de351fe311c53304986315ce866f394a2e6df0c4b3c70774bcdd" +checksum = "895fcbeb772bfb049eb80b2d6e47f6c9af235284e9703c96fc0218a42ffd5af2" dependencies = [ "bitflags 2.4.2", "js-sys", @@ -4153,8 +4149,7 @@ dependencies = [ "once_cell", "orbclient", "percent-encoding", - "raw-window-handle 0.5.2", - "raw-window-handle 0.6.0", + "raw-window-handle", "redox_syscall 0.3.5", "rustix", "sctk-adwaita", diff --git a/crates/fj-viewer/Cargo.toml b/crates/fj-viewer/Cargo.toml index cd8a8630c..e58d200f4 100644 --- a/crates/fj-viewer/Cargo.toml +++ b/crates/fj-viewer/Cargo.toml @@ -19,7 +19,7 @@ fj-interop.workspace = true fj-math.workspace = true nalgebra = "0.32.3" tobj = "4.0.1" -raw-window-handle = "0.5.2" +raw-window-handle = "0.6.0" thiserror = "1.0.53" tracing = "0.1.40" @@ -33,7 +33,7 @@ default-features = false features = ["png", "jpeg"] [dependencies.wgpu] -version = "0.18.0" +version = "0.19.1" features = ["webgl"] # We don't depend on `getrandom` directly, but we need this to enable the `js` diff --git a/crates/fj-viewer/src/graphics/device.rs b/crates/fj-viewer/src/graphics/device.rs index 63d3bee21..e7a5b3a04 100644 --- a/crates/fj-viewer/src/graphics/device.rs +++ b/crates/fj-viewer/src/graphics/device.rs @@ -9,7 +9,7 @@ pub struct Device { impl Device { pub async fn from_preferred_adapter( instance: &wgpu::Instance, - surface: &wgpu::Surface, + surface: &wgpu::Surface<'_>, ) -> Result<(Self, wgpu::Adapter, wgpu::Features), DeviceError> { let adapter = instance .request_adapter(&wgpu::RequestAdapterOptions { @@ -30,8 +30,9 @@ impl Device { pub async fn try_from_all_adapters( instance: &wgpu::Instance, ) -> Result<(Self, wgpu::Adapter, wgpu::Features), DeviceError> { - let mut all_adapters = - instance.enumerate_adapters(wgpu::Backends::all()); + let mut all_adapters = instance + .enumerate_adapters(wgpu::Backends::all()) + .into_iter(); let result = loop { let Some(adapter) = all_adapters.next() else { @@ -67,7 +68,7 @@ impl Device { pub async fn new( adapter: &wgpu::Adapter, ) -> Result<(Self, wgpu::Features), DeviceError> { - let features = { + let required_features = { let desired_features = wgpu::Features::POLYGON_MODE_LINE; let available_features = adapter.features(); @@ -82,7 +83,7 @@ impl Device { desired_features.intersection(available_features) }; - let limits = { + let required_limits = { // This is the lowest of the available defaults. It should guarantee // that we can run pretty much everywhere. let lowest_limits = wgpu::Limits::downlevel_webgl2_defaults(); @@ -98,14 +99,14 @@ impl Device { .request_device( &wgpu::DeviceDescriptor { label: None, - features, - limits, + required_features, + required_limits, }, None, ) .await?; - Ok((Device { device, queue }, features)) + Ok((Device { device, queue }, required_features)) } } diff --git a/crates/fj-viewer/src/graphics/renderer.rs b/crates/fj-viewer/src/graphics/renderer.rs index c8755f2ab..e6c472ae9 100644 --- a/crates/fj-viewer/src/graphics/renderer.rs +++ b/crates/fj-viewer/src/graphics/renderer.rs @@ -19,7 +19,7 @@ use super::{ /// Graphics rendering state and target abstraction #[derive(Debug)] pub struct Renderer { - surface: wgpu::Surface, + surface: wgpu::Surface<'static>, device: Device, surface_config: wgpu::SurfaceConfiguration, @@ -44,7 +44,7 @@ impl Renderer { }); // This is sound, as `window` is an object to create a surface upon. - let surface = unsafe { instance.create_surface(screen.window()) }?; + let surface = instance.create_surface(screen.window())?; for adapter in instance.enumerate_adapters(wgpu::Backends::all()) { debug!("Available adapter: {:?}", adapter.get_info()); @@ -106,6 +106,7 @@ impl Renderer { width, height, present_mode: wgpu::PresentMode::AutoVsync, + desired_maximum_frame_latency: 2, // I don't understand what this option does. It was introduced with // wgpu 0.14, but we had already been using premultiplied alpha // blending before that. See the `BlendState` configuration of the diff --git a/crates/fj-viewer/src/screen.rs b/crates/fj-viewer/src/screen.rs index b4c561e94..4ca7a85a7 100644 --- a/crates/fj-viewer/src/screen.rs +++ b/crates/fj-viewer/src/screen.rs @@ -1,17 +1,19 @@ //! Types that describe aspects of the screen -use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; +use std::sync::Arc; + +use raw_window_handle::{HasDisplayHandle, HasWindowHandle}; /// Needs to be implemented by types that can serve as a screen to render to pub trait Screen { /// The window - type Window: HasRawDisplayHandle + HasRawWindowHandle; + type Window: HasDisplayHandle + HasWindowHandle + Send + Sync + 'static; /// Access the size of the screen fn size(&self) -> ScreenSize; /// Access the window - fn window(&self) -> &Self::Window; + fn window(&self) -> Arc; } /// Cursor position in normalized coordinates (-1 to +1) diff --git a/crates/fj-window/Cargo.toml b/crates/fj-window/Cargo.toml index 0997c4398..56ee9588b 100644 --- a/crates/fj-window/Cargo.toml +++ b/crates/fj-window/Cargo.toml @@ -20,7 +20,4 @@ fj-math.workspace = true fj-viewer.workspace = true futures = "0.3.30" thiserror = "1.0.53" - -[dependencies.winit] -version = "0.29.2" -features = ["rwh_05"] +winit = "0.29.2" diff --git a/crates/fj-window/src/window.rs b/crates/fj-window/src/window.rs index 736f34dd2..654fdae25 100644 --- a/crates/fj-window/src/window.rs +++ b/crates/fj-window/src/window.rs @@ -1,8 +1,12 @@ +use std::sync::Arc; + use fj_viewer::{Screen, ScreenSize}; use winit::{event_loop::EventLoop, window::WindowBuilder}; /// A window that can be used with `fj-viewer` -pub struct Window(winit::window::Window); +pub struct Window { + inner: Arc, +} impl Window { /// Create an instance of `Window` from the given `EventLoop` @@ -33,7 +37,9 @@ impl Window { .with_transparent(false) .build(event_loop)?; - Ok(Self(window)) + Ok(Self { + inner: Arc::new(window), + }) } } @@ -41,7 +47,7 @@ impl Screen for Window { type Window = winit::window::Window; fn size(&self) -> ScreenSize { - let size = self.0.inner_size(); + let size = self.inner.inner_size(); ScreenSize { width: size.width, @@ -49,8 +55,8 @@ impl Screen for Window { } } - fn window(&self) -> &winit::window::Window { - &self.0 + fn window(&self) -> Arc { + self.inner.clone() } } diff --git a/tools/cross-compiler/src/main.rs b/tools/cross-compiler/src/main.rs index 9f40dd67d..735a65c51 100644 --- a/tools/cross-compiler/src/main.rs +++ b/tools/cross-compiler/src/main.rs @@ -39,7 +39,10 @@ fn main() -> anyhow::Result<()> { .arg("--all-features") .args(["--target", target.triple]) .args(["-p", crate_]) - .env("RUSTFLAGS", "-D warnings"); + // Wee need to recreate that `web_sys` cfg here. It's already + // specified in `.cargo/config`, but the use of `RUSTFLAGS` here + // overwrites that. + .env("RUSTFLAGS", "-D warnings --cfg=web_sys_unstable_apis"); println!("Running {command:?}"); let status = command.status()?;