@@ -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