Skip to content

Commit 5573c57

Browse files
authored
[naga wgsl-in] Properly convert arguments to atomic operations. (#7573)
1 parent f64eae7 commit 5573c57

File tree

4 files changed

+82
-10
lines changed

4 files changed

+82
-10
lines changed

naga/src/front/wgsl/lower/mod.rs

+12-10
Original file line numberDiff line numberDiff line change
@@ -2504,15 +2504,16 @@ impl<'source, 'temp> Lowerer<'source, 'temp> {
25042504
}
25052505
"atomicLoad" => {
25062506
let mut args = ctx.prepare_args(arguments, 1, span);
2507-
let pointer = self.atomic_pointer(args.next()?, ctx)?;
2507+
let (pointer, _scalar) = self.atomic_pointer(args.next()?, ctx)?;
25082508
args.finish()?;
25092509

25102510
ir::Expression::Load { pointer }
25112511
}
25122512
"atomicStore" => {
25132513
let mut args = ctx.prepare_args(arguments, 2, span);
2514-
let pointer = self.atomic_pointer(args.next()?, ctx)?;
2515-
let value = self.expression(args.next()?, ctx)?;
2514+
let (pointer, scalar) = self.atomic_pointer(args.next()?, ctx)?;
2515+
let value =
2516+
self.expression_with_leaf_scalar(args.next()?, scalar, ctx)?;
25162517
args.finish()?;
25172518

25182519
let rctx = ctx.runtime_expression_ctx(span)?;
@@ -2526,13 +2527,14 @@ impl<'source, 'temp> Lowerer<'source, 'temp> {
25262527
"atomicCompareExchangeWeak" => {
25272528
let mut args = ctx.prepare_args(arguments, 3, span);
25282529

2529-
let pointer = self.atomic_pointer(args.next()?, ctx)?;
2530+
let (pointer, scalar) = self.atomic_pointer(args.next()?, ctx)?;
25302531

2531-
let compare = self.expression(args.next()?, ctx)?;
2532+
let compare =
2533+
self.expression_with_leaf_scalar(args.next()?, scalar, ctx)?;
25322534

25332535
let value = args.next()?;
25342536
let value_span = ctx.ast_expressions.get_span(value);
2535-
let value = self.expression(value, ctx)?;
2537+
let value = self.expression_with_leaf_scalar(value, scalar, ctx)?;
25362538

25372539
args.finish()?;
25382540

@@ -3200,13 +3202,13 @@ impl<'source, 'temp> Lowerer<'source, 'temp> {
32003202
&mut self,
32013203
expr: Handle<ast::Expression<'source>>,
32023204
ctx: &mut ExpressionContext<'source, '_, '_>,
3203-
) -> Result<'source, Handle<ir::Expression>> {
3205+
) -> Result<'source, (Handle<ir::Expression>, ir::Scalar)> {
32043206
let span = ctx.ast_expressions.get_span(expr);
32053207
let pointer = self.expression(expr, ctx)?;
32063208

32073209
match *resolve_inner!(ctx, pointer) {
32083210
ir::TypeInner::Pointer { base, .. } => match ctx.module.types[base].inner {
3209-
ir::TypeInner::Atomic { .. } => Ok(pointer),
3211+
ir::TypeInner::Atomic(scalar) => Ok((pointer, scalar)),
32103212
ref other => {
32113213
log::error!("Pointer type to {:?} passed to atomic op", other);
32123214
Err(Box::new(Error::InvalidAtomicPointer(span)))
@@ -3229,8 +3231,8 @@ impl<'source, 'temp> Lowerer<'source, 'temp> {
32293231
) -> Result<'source, Option<Handle<ir::Expression>>> {
32303232
let mut args = ctx.prepare_args(args, 2, span);
32313233

3232-
let pointer = self.atomic_pointer(args.next()?, ctx)?;
3233-
let value = self.expression(args.next()?, ctx)?;
3234+
let (pointer, scalar) = self.atomic_pointer(args.next()?, ctx)?;
3235+
let value = self.expression_with_leaf_scalar(args.next()?, scalar, ctx)?;
32343236
let value_inner = resolve_inner!(ctx, value);
32353237
args.finish()?;
32363238

Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
targets = "WGSL"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
@group(0) @binding(0)
2+
var<storage,read_write> atomic_i32: atomic<i32>;
3+
@group(0) @binding(1)
4+
var<storage,read_write> atomic_u32: atomic<u32>;
5+
6+
fn test_atomic_i32() {
7+
atomicStore(&atomic_i32, 1);
8+
_ = atomicCompareExchangeWeak(&atomic_i32, 1, 1i);
9+
_ = atomicCompareExchangeWeak(&atomic_i32, 1i, 1);
10+
11+
_ = atomicAdd(&atomic_i32, 1);
12+
_ = atomicSub(&atomic_i32, 1);
13+
_ = atomicAnd(&atomic_i32, 1);
14+
_ = atomicXor(&atomic_i32, 1);
15+
_ = atomicOr(&atomic_i32, 1);
16+
_ = atomicMin(&atomic_i32, 1);
17+
_ = atomicMax(&atomic_i32, 1);
18+
_ = atomicExchange(&atomic_i32, 1);
19+
}
20+
21+
fn test_atomic_u32() {
22+
atomicStore(&atomic_u32, 1);
23+
_ = atomicCompareExchangeWeak(&atomic_u32, 1, 1u);
24+
_ = atomicCompareExchangeWeak(&atomic_u32, 1u, 1);
25+
26+
_ = atomicAdd(&atomic_u32, 1);
27+
_ = atomicSub(&atomic_u32, 1);
28+
_ = atomicAnd(&atomic_u32, 1);
29+
_ = atomicXor(&atomic_u32, 1);
30+
_ = atomicOr(&atomic_u32, 1);
31+
_ = atomicMin(&atomic_u32, 1);
32+
_ = atomicMax(&atomic_u32, 1);
33+
_ = atomicExchange(&atomic_u32, 1);
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
@group(0) @binding(0)
2+
var<storage, read_write> atomic_i32_: atomic<i32>;
3+
@group(0) @binding(1)
4+
var<storage, read_write> atomic_u32_: atomic<u32>;
5+
6+
fn test_atomic_i32_() {
7+
atomicStore((&atomic_i32_), 1i);
8+
let _e5 = atomicCompareExchangeWeak((&atomic_i32_), 1i, 1i);
9+
let _e9 = atomicCompareExchangeWeak((&atomic_i32_), 1i, 1i);
10+
let _e12 = atomicAdd((&atomic_i32_), 1i);
11+
let _e15 = atomicSub((&atomic_i32_), 1i);
12+
let _e18 = atomicAnd((&atomic_i32_), 1i);
13+
let _e21 = atomicXor((&atomic_i32_), 1i);
14+
let _e24 = atomicOr((&atomic_i32_), 1i);
15+
let _e27 = atomicMin((&atomic_i32_), 1i);
16+
let _e30 = atomicMax((&atomic_i32_), 1i);
17+
let _e33 = atomicExchange((&atomic_i32_), 1i);
18+
return;
19+
}
20+
21+
fn test_atomic_u32_() {
22+
atomicStore((&atomic_u32_), 1u);
23+
let _e5 = atomicCompareExchangeWeak((&atomic_u32_), 1u, 1u);
24+
let _e9 = atomicCompareExchangeWeak((&atomic_u32_), 1u, 1u);
25+
let _e12 = atomicAdd((&atomic_u32_), 1u);
26+
let _e15 = atomicSub((&atomic_u32_), 1u);
27+
let _e18 = atomicAnd((&atomic_u32_), 1u);
28+
let _e21 = atomicXor((&atomic_u32_), 1u);
29+
let _e24 = atomicOr((&atomic_u32_), 1u);
30+
let _e27 = atomicMin((&atomic_u32_), 1u);
31+
let _e30 = atomicMax((&atomic_u32_), 1u);
32+
let _e33 = atomicExchange((&atomic_u32_), 1u);
33+
return;
34+
}
35+

0 commit comments

Comments
 (0)