Skip to content

Commit 1352869

Browse files
committed
nonuniform: RuntimeArray::deref decorates index as NonUniform
1 parent a01b895 commit 1352869

File tree

1 file changed

+20
-14
lines changed

1 file changed

+20
-14
lines changed

crates/spirv-std/src/runtime_array.rs

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,18 @@ impl<T> RuntimeArray<T> {
3131
#[spirv_std_macros::gpu_only]
3232
pub unsafe fn index(&self, index: usize) -> &T {
3333
// FIXME(eddyb) `let mut result = T::default()` uses (for `asm!`), with this.
34-
let mut result_slot = core::mem::MaybeUninit::uninit();
34+
let mut result = core::mem::MaybeUninit::uninit();
3535
asm! {
36-
"%result = OpAccessChain _ {arr} {index}",
37-
"OpStore {result_slot} %result",
38-
arr = in(reg) self,
39-
index = in(reg) index,
40-
result_slot = in(reg) result_slot.as_mut_ptr(),
36+
"OpDecorate %index NonUniform",
37+
"OpDecorate %result NonUniform",
38+
"%index = OpLoad _ {index}",
39+
"%result = OpAccessChain typeof*{result} {this} %index",
40+
"OpStore {result} %result",
41+
result = in(reg) result.as_mut_ptr(),
42+
this = in(reg) self,
43+
index = in(reg) &index,
4144
}
42-
result_slot.assume_init()
45+
result.assume_init()
4346
}
4447

4548
/// Index the array, returning a mutable reference to an element. Unfortunately, because the
@@ -52,14 +55,17 @@ impl<T> RuntimeArray<T> {
5255
#[spirv_std_macros::gpu_only]
5356
pub unsafe fn index_mut(&mut self, index: usize) -> &mut T {
5457
// FIXME(eddyb) `let mut result = T::default()` uses (for `asm!`), with this.
55-
let mut result_slot = core::mem::MaybeUninit::uninit();
58+
let mut result = core::mem::MaybeUninit::uninit();
5659
asm! {
57-
"%result = OpAccessChain _ {arr} {index}",
58-
"OpStore {result_slot} %result",
59-
arr = in(reg) self,
60-
index = in(reg) index,
61-
result_slot = in(reg) result_slot.as_mut_ptr(),
60+
"OpDecorate %index NonUniform",
61+
"OpDecorate %result NonUniform",
62+
"%index = OpLoad _ {index}",
63+
"%result = OpAccessChain typeof*{result} {this} %index",
64+
"OpStore {result} %result",
65+
result = in(reg) result.as_mut_ptr(),
66+
this = in(reg) self,
67+
index = in(reg) &index,
6268
}
63-
result_slot.assume_init()
69+
result.assume_init()
6470
}
6571
}

0 commit comments

Comments
 (0)