diff --git a/Cargo.lock b/Cargo.lock index e1410ca2074..7e8cb63849a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4863,6 +4863,7 @@ version = "30.0.0" dependencies = [ "raw-window-handle", "serde", + "static_assertions", "wgpu-core", "wgpu-core-remote-types", "wgpu-hal", diff --git a/wgpu-core-remote-types/Cargo.toml b/wgpu-core-remote-types/Cargo.toml index 19f9d2f2bb6..9e87223418e 100644 --- a/wgpu-core-remote-types/Cargo.toml +++ b/wgpu-core-remote-types/Cargo.toml @@ -25,6 +25,6 @@ targets = [ ] [dependencies] -wgpu-types = { workspace = true, features = ["serde"] } -serde = { workspace = true } hashbrown = { workspace = true } +serde = { workspace = true } +wgpu-types = { workspace = true, features = ["serde"] } diff --git a/wgpu-core-remote/Cargo.toml b/wgpu-core-remote/Cargo.toml index 964f627f8ac..fbee5cc2352 100644 --- a/wgpu-core-remote/Cargo.toml +++ b/wgpu-core-remote/Cargo.toml @@ -29,9 +29,10 @@ targets = [ serde = ["dep:serde", "wgpu-types/serde", "wgpu-core/serde"] [dependencies] +raw-window-handle.workspace = true +serde = { workspace = true, optional = true } +static_assertions = { workspace = true } wgpu-core = { workspace = true, default-features = false } +wgpu-core-remote-types.workspace = true wgpu-hal = { workspace = true, default-features = false } wgpu-types.workspace = true -wgpu-core-remote-types.workspace = true -raw-window-handle.workspace = true -serde = { workspace = true, optional = true } diff --git a/wgpu-core-remote/src/global/mod.rs b/wgpu-core-remote/src/global/mod.rs index 861238837e4..2377dd96572 100644 --- a/wgpu-core-remote/src/global/mod.rs +++ b/wgpu-core-remote/src/global/mod.rs @@ -1,6 +1,7 @@ use alloc::sync::Arc; use core::cell::RefCell; use core::fmt; +use core::marker::PhantomData; use wgpu_core::binding_model::{BindGroup, BindGroupLayout, PipelineLayout}; use wgpu_core::command::{ CommandBuffer, CommandEncoder, ComputePass, RenderBundle, RenderBundleEncoder, RenderPass, @@ -40,6 +41,7 @@ pub struct Global { pub(crate) hub: RefCell, // the instance must be dropped last pub instance: Arc, + _prevent_send_and_sync: PhantomData<*const ()>, } impl Global { @@ -51,6 +53,7 @@ impl Global { Self { instance: Instance::new(name, instance_desc, telemetry), hub: RefCell::new(Hub::new()), + _prevent_send_and_sync: PhantomData, } } @@ -58,6 +61,7 @@ impl Global { Self { instance, hub: RefCell::new(Hub::new()), + _prevent_send_and_sync: PhantomData, } } @@ -388,3 +392,7 @@ impl fmt::Debug for Global { f.debug_struct("Global").finish() } } + +// Force the Rust compiler to compute `Send + Sync` for `Global`, which can avoid `recursion_limit` +// issues in the resolver. +static_assertions::assert_not_impl_any!(Global: Send, Sync); diff --git a/wgpu-core/src/lib.rs b/wgpu-core/src/lib.rs index a76a84c3f3d..a5103ca7856 100644 --- a/wgpu-core/src/lib.rs +++ b/wgpu-core/src/lib.rs @@ -7,8 +7,6 @@ //! #![no_std] -// `-Znext-solver` requires deeper recursion limits (at least for now) to prove Send/Sync -#![recursion_limit = "256"] // When we have no backends, we end up with a lot of dead or otherwise unreachable code. #![cfg_attr( all( diff --git a/wgpu/src/lib.rs b/wgpu/src/lib.rs index 4995df68844..f0e3ac6c115 100644 --- a/wgpu/src/lib.rs +++ b/wgpu/src/lib.rs @@ -36,8 +36,6 @@ #![doc = crate::macros::doc_image!("render_coordinates.webp")] #![doc = crate::macros::doc_image!("texture_coordinates.webp")] #![no_std] -// `-Znext-solver` requires deeper recursion limits (at least for now) to prove Send/Sync -#![recursion_limit = "256"] #![cfg_attr(docsrs, feature(doc_cfg))] #![doc(html_logo_url = "https://raw.githubusercontent.com/gfx-rs/wgpu/trunk/logo.png")] #![warn(