Fix compilation for targets that don't have AtomicU64. (#7118)

Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>
This commit is contained in:
Flávio J. Saraiva 2025-02-24 22:07:13 +00:00 committed by GitHub
parent 37419a3690
commit a26171b2a0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 80 additions and 17 deletions

View File

@ -181,6 +181,14 @@ jobs:
tier: 2
kind: no_std
# 32-bit PowerPC Linux
# Included to test support for `portable-atomic`
- name: Linux ppc32
os: ubuntu-22.04
target: powerpc-unknown-linux-gnu
tier: 2
kind: wgpu-only
name: Clippy ${{ matrix.name }}
runs-on: ${{ matrix.os }}

21
Cargo.lock generated
View File

@ -1305,7 +1305,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
dependencies = [
"libc",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]
@ -2004,7 +2004,7 @@ checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37"
dependencies = [
"hermit-abi",
"libc",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]
@ -2134,7 +2134,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
dependencies = [
"cfg-if",
"windows-targets 0.48.5",
"windows-targets 0.52.6",
]
[[package]]
@ -3043,6 +3043,12 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3"
[[package]]
name = "portable-atomic"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6"
[[package]]
name = "pp-rs"
version = "0.2.1"
@ -3336,7 +3342,7 @@ dependencies = [
"errno",
"libc",
"linux-raw-sys",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]
@ -4005,7 +4011,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69fff37da548239c3bf9e64a12193d261e8b22b660991c6fd2df057c168f435f"
dependencies = [
"cc",
"windows-targets 0.48.5",
"windows-targets 0.52.6",
]
[[package]]
@ -4507,6 +4513,7 @@ dependencies = [
"log",
"naga",
"parking_lot",
"portable-atomic",
"profiling",
"raw-window-handle 0.6.2",
"smallvec",
@ -4551,6 +4558,7 @@ dependencies = [
"naga",
"once_cell",
"parking_lot",
"portable-atomic",
"profiling",
"raw-window-handle 0.6.2",
"ron",
@ -4681,6 +4689,7 @@ dependencies = [
"once_cell",
"ordered-float",
"parking_lot",
"portable-atomic",
"profiling",
"range-alloc",
"raw-window-handle 0.5.2",
@ -4804,7 +4813,7 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [
"windows-sys 0.48.0",
"windows-sys 0.59.0",
]
[[package]]

View File

@ -135,6 +135,7 @@ pico-args = { version = "0.5.0", features = [
] }
png = "0.17.16"
pollster = "0.4"
portable-atomic = "1"
profiling = { version = "1", default-features = false }
raw-window-handle = { version = "0.6", default-features = false }
rayon = "1"

View File

@ -114,6 +114,9 @@ fragile-send-sync-non-atomic-wasm = [
## Enable using the `mach-dxcompiler-rs` crate to compile DX12 shaders.
static-dxc = ["wgpu-hal/static-dxc"]
## Enable portable atomics on platforms that do not support 64bit atomics.
portable-atomic = ["dep:portable-atomic", "wgpu-hal/portable-atomic"]
#! ### Target Conditional Features
# --------------------------------------------------------------------
# Look to wgpu-hal's Cargo.toml for explaination how these features and the wgpu-core
@ -179,5 +182,8 @@ serde = { workspace = true, features = ["default", "derive"], optional = true }
smallvec.workspace = true
thiserror.workspace = true
[target.'cfg(not(target_has_atomic = "64"))'.dependencies]
portable-atomic = { workspace = true, optional = true }
[build-dependencies]
cfg_aliases.workspace = true

View File

@ -18,5 +18,7 @@ fn main() {
all(target_vendor = "apple", feature = "vulkan-portability") // Vulkan Portability on Apple
) },
metal: { all(target_vendor = "apple", feature = "metal") },
supports_64bit_atomics: { target_has_atomic = "64" }
}
}

View File

@ -9,7 +9,7 @@ use core::{
fmt,
mem::{self, ManuallyDrop},
num::NonZeroU32,
sync::atomic::{AtomicBool, AtomicU64, Ordering},
sync::atomic::{AtomicBool, Ordering},
};
use std::sync::OnceLock;
@ -57,6 +57,11 @@ use super::{
ENTRYPOINT_FAILURE_ERROR, ZERO_BUFFER_SIZE,
};
#[cfg(supports_64bit_atomics)]
use core::sync::atomic::AtomicU64;
#[cfg(not(supports_64bit_atomics))]
use portable_atomic::AtomicU64;
/// Structure describing a logical device. Some members are internally mutable,
/// stored behind mutexes.
pub struct Device {

View File

@ -155,6 +155,7 @@ renderdoc = ["dep:libloading", "dep:renderdoc-sys", "dep:log"]
fragile-send-sync-non-atomic-wasm = [
"wgpu-types/fragile-send-sync-non-atomic-wasm",
]
portable-atomic = ["dep:portable-atomic"]
###################################
### Internal Debugging Features ###
@ -300,6 +301,9 @@ khronos-egl = { workspace = true, optional = true, features = [
# Note: it's unused by emscripten, but we keep it to have single code base in egl.rs
libloading = { workspace = true, optional = true }
[target.'cfg(not(target_has_atomic = "64"))'.dependencies]
portable-atomic = { workspace = true, optional = true }
[build-dependencies]
cfg_aliases.workspace = true

View File

@ -12,6 +12,7 @@ fn main() {
metal: { all(target_vendor = "apple", feature = "metal") },
vulkan: { all(not(target_arch = "wasm32"), feature = "vulkan") },
// ⚠️ Keep in sync with target.cfg() definition in Cargo.toml and cfg_alias in `wgpu` crate ⚠️
static_dxc: { all(target_os = "windows", feature = "static-dxc", not(target_arch = "aarch64")) }
static_dxc: { all(target_os = "windows", feature = "static-dxc", not(target_arch = "aarch64")) },
supports_64bit_atomics: { target_has_atomic = "64" }
}
}

View File

@ -317,7 +317,10 @@ pub const QUERY_SIZE: wgt::BufferAddress = 8;
pub type Label<'a> = Option<&'a str>;
pub type MemoryRange = Range<wgt::BufferAddress>;
pub type FenceValue = u64;
#[cfg(supports_64bit_atomics)]
pub type AtomicFenceValue = core::sync::atomic::AtomicU64;
#[cfg(not(supports_64bit_atomics))]
pub type AtomicFenceValue = portable_atomic::AtomicU64;
/// A callback to signal that wgpu is no longer using a resource.
#[cfg(any(gles, vulkan))]

View File

@ -1,11 +1,12 @@
#![allow(unused_variables)]
use alloc::{string::String, vec, vec::Vec};
use core::{
ptr,
sync::atomic::{AtomicU64, Ordering},
time::Duration,
};
use core::{ptr, sync::atomic::Ordering, time::Duration};
#[cfg(supports_64bit_atomics)]
use core::sync::atomic::AtomicU64;
#[cfg(not(supports_64bit_atomics))]
use portable_atomic::AtomicU64;
use crate::TlasInstance;

View File

@ -179,6 +179,7 @@ wgpu-core = { workspace = true, features = [
"raw-window-handle",
"renderdoc",
"indirect-validation",
"portable-atomic",
] }
wgpu-hal.workspace = true
@ -216,5 +217,8 @@ wgpu-hal.workspace = true
smallvec.workspace = true
[target.'cfg(not(target_has_atomic = "64"))'.dependencies]
portable-atomic.workspace = true
[build-dependencies]
cfg_aliases.workspace = true

View File

@ -16,5 +16,6 @@ fn main() {
naga: { any(feature = "naga-ir", feature = "spirv", feature = "glsl") },
// ⚠️ Keep in sync with target.cfg() definition in wgpu-hal/Cargo.toml and cfg_alias in `wgpu-hal` crate ⚠️
static_dxc: { all(target_os = "windows", feature = "static-dxc", not(target_arch = "aarch64")) },
supports_64bit_atomics: { target_has_atomic = "64" }
}
}

View File

@ -4,10 +4,12 @@
//!
//! For types (like WebGPU) that don't have such a property, we generate an identifier and use that.
use core::{
num::NonZeroU64,
sync::atomic::{AtomicU64, Ordering},
};
#[cfg(supports_64bit_atomics)]
pub use core::sync::atomic::AtomicU64;
#[cfg(not(supports_64bit_atomics))]
pub use portable_atomic::AtomicU64;
use core::{num::NonZeroU64, sync::atomic::Ordering};
static NEXT_ID: AtomicU64 = AtomicU64::new(1);

View File

@ -155,6 +155,22 @@ pub fn check_feature_dependencies(shell: Shell, arguments: Arguments) -> anyhow:
default_features: false,
search_terms: &[Search::Positive("glow")],
},
Requirement {
human_readable_name: "x86-64 does not depend on portable-atomic",
target: "x86_64-unknown-linux-gnu",
packages: &["wgpu"],
features: &[],
default_features: false,
search_terms: &[Search::Negative("portable-atomic")],
},
Requirement {
human_readable_name: "ppc32 does depend on portable-atomic",
target: "powerpc-unknown-linux-gnu",
packages: &["wgpu"],
features: &[],
default_features: false,
search_terms: &[Search::Positive("portable-atomic")],
},
];
let mut any_failures = false;