1
0
mirror of https://github.com/emilk/egui.git synced 2026-08-30 21:30:03 -04:00

Add opt-out fragile-send-sync-non-atomic-wasm feature for wgpu (#5098)

Note this will break people depending on eframe or egui-wgpu with
--no-default-features.
I don't know what to do about that to be honest.

* Closes #4914 
* [x] I have followed the instructions in the PR template

---------

Co-authored-by: Andreas Reich <r_andreas2@web.de>
This commit is contained in:
9SMTM6
2024-09-13 13:00:18 +02:00
committed by GitHub
parent f658f8b02b
commit 08f5eb30a4
6 changed files with 53 additions and 6 deletions

View File

@@ -39,6 +39,7 @@ default = [
"web_screen_reader",
"winit/default",
"x11",
"egui-wgpu?/fragile-send-sync-non-atomic-wasm",
]
## Enable platform accessibility API implementations through [AccessKit](https://accesskit.dev/).
@@ -185,7 +186,11 @@ objc2-app-kit = { version = "0.2.0", features = [
# windows:
[target.'cfg(any(target_os = "windows"))'.dependencies]
winapi = { version = "0.3.9", features = ["winuser"] }
windows-sys = { workspace = true, features = ["Win32_Foundation", "Win32_UI_Shell", "Win32_System_Com"] }
windows-sys = { workspace = true, features = [
"Win32_Foundation",
"Win32_UI_Shell",
"Win32_System_Com",
] }
# -------------------------------------------
# web:

View File

@@ -31,7 +31,7 @@ all-features = true
rustdoc-args = ["--generate-link-to-definition"]
[features]
default = []
default = ["fragile-send-sync-non-atomic-wasm"]
## Enable profiling with the [`puffin`](https://docs.rs/puffin) crate.
puffin = ["dep:puffin"]
@@ -45,6 +45,12 @@ wayland = ["winit?/wayland"]
## Enables x11 support for winit.
x11 = ["winit?/x11"]
## Make the renderer `Sync` on wasm, exploiting that by default wasm isn't multithreaded.
## It may make code easier, expecially when targeting both native and web.
## On native most wgpu objects are send and sync, on the web they are not (by nature of the WebGPU specification).
## This is not supported in [multithreaded WASM](https://gpuweb.github.io/gpuweb/explainer/#multithreading-transfer).
## Thus that usage is guarded against with compiler errors in wgpu.
fragile-send-sync-non-atomic-wasm = ["wgpu/fragile-send-sync-non-atomic-wasm"]
[dependencies]
egui = { workspace = true, default-features = false }

View File

@@ -173,6 +173,9 @@ impl RenderState {
dithering,
);
// On wasm, depending on feature flags, wgpu objects may or may not implement sync.
// It doesn't make sense to switch to Rc for that special usecase, so simply disable the lint.
#[allow(clippy::arc_with_non_send_sync)]
Ok(Self {
adapter: Arc::new(adapter),
#[cfg(not(target_arch = "wasm32"))]

View File

@@ -7,8 +7,19 @@ use epaint::{emath::NumExt, PaintCallbackInfo, Primitive, Vertex};
use wgpu::util::DeviceExt as _;
// Only implements Send + Sync on wasm32 in order to allow storing wgpu resources on the type map.
#[cfg(not(all(
target_arch = "wasm32",
not(feature = "fragile-send-sync-non-atomic-wasm"),
)))]
/// You can use this for storage when implementing [`CallbackTrait`].
pub type CallbackResources = type_map::concurrent::TypeMap;
#[cfg(all(
target_arch = "wasm32",
not(feature = "fragile-send-sync-non-atomic-wasm"),
))]
/// You can use this for storage when implementing [`CallbackTrait`].
pub type CallbackResources = type_map::TypeMap;
/// You can use this to do custom [`wgpu`] rendering in an egui app.
///
@@ -1017,6 +1028,11 @@ impl ScissorRect {
}
}
// Look at the feature flag for an explanation.
#[cfg(not(all(
target_arch = "wasm32",
not(feature = "fragile-send-sync-non-atomic-wasm"),
)))]
#[test]
fn renderer_impl_send_sync() {
fn assert_send_sync<T: Send + Sync>() {}