@@ -3692,5 +3692,137 @@ S_packed_vec3 = struct @align(16) {
3692
3692
EXPECT_EQ (expect, str ());
3693
3693
}
3694
3694
3695
+ TEST_F (MslWriter_PackedVec3Test, AtomicOnPackedStructMember) {
3696
+ auto * s = ty.Struct (mod.symbols .New (" S" ), {
3697
+ {mod.symbols .Register (" vec" ), ty.vec3 <u32 >()},
3698
+ {mod.symbols .Register (" u" ), ty.atomic <u32 >()},
3699
+ });
3700
+
3701
+ auto * var = b.Var (" v" , ty.ptr <workgroup>(s));
3702
+ mod.root_block ->Append (var);
3703
+
3704
+ auto * func = b.Function (" foo" , ty.u32 ());
3705
+ b.Append (func->Block (), [&] { //
3706
+ auto * p = b.Access <ptr<workgroup, atomic<u32 >>>(var, 1_u);
3707
+ auto * result = b.Call <u32 >(core::BuiltinFn::kAtomicLoad , p);
3708
+ b.Return (func, result);
3709
+ });
3710
+
3711
+ auto * src = R"(
3712
+ S = struct @align(16) {
3713
+ vec:vec3<u32> @offset(0)
3714
+ u:atomic<u32> @offset(12)
3715
+ }
3716
+
3717
+ $B1: { # root
3718
+ %v:ptr<workgroup, S, read_write> = var
3719
+ }
3720
+
3721
+ %foo = func():u32 {
3722
+ $B2: {
3723
+ %3:ptr<workgroup, atomic<u32>, read_write> = access %v, 1u
3724
+ %4:u32 = atomicLoad %3
3725
+ ret %4
3726
+ }
3727
+ }
3728
+ )" ;
3729
+ EXPECT_EQ (src, str ());
3730
+
3731
+ auto * expect = R"(
3732
+ S = struct @align(16) {
3733
+ vec:vec3<u32> @offset(0)
3734
+ u:atomic<u32> @offset(12)
3735
+ }
3736
+
3737
+ S_packed_vec3 = struct @align(16) {
3738
+ vec:__packed_vec3<u32> @offset(0)
3739
+ u:atomic<u32> @offset(12)
3740
+ }
3741
+
3742
+ $B1: { # root
3743
+ %v:ptr<workgroup, S_packed_vec3, read_write> = var
3744
+ }
3745
+
3746
+ %foo = func():u32 {
3747
+ $B2: {
3748
+ %3:ptr<workgroup, atomic<u32>, read_write> = access %v, 1u
3749
+ %4:u32 = atomicLoad %3
3750
+ ret %4
3751
+ }
3752
+ }
3753
+ )" ;
3754
+
3755
+ Run (PackedVec3);
3756
+
3757
+ EXPECT_EQ (expect, str ());
3758
+ }
3759
+
3760
+ TEST_F (MslWriter_PackedVec3Test, AtomicOnPackedStructMember_ViaLet) {
3761
+ auto * s = ty.Struct (mod.symbols .New (" S" ), {
3762
+ {mod.symbols .Register (" vec" ), ty.vec3 <u32 >()},
3763
+ {mod.symbols .Register (" u" ), ty.atomic <u32 >()},
3764
+ });
3765
+
3766
+ auto * var = b.Var (" v" , ty.ptr <workgroup>(s));
3767
+ mod.root_block ->Append (var);
3768
+
3769
+ auto * func = b.Function (" foo" , ty.u32 ());
3770
+ b.Append (func->Block (), [&] { //
3771
+ auto * p = b.Let (" p" , b.Access <ptr<workgroup, atomic<u32 >>>(var, 1_u));
3772
+ auto * result = b.Call <u32 >(core::BuiltinFn::kAtomicLoad , p);
3773
+ b.Return (func, result);
3774
+ });
3775
+
3776
+ auto * src = R"(
3777
+ S = struct @align(16) {
3778
+ vec:vec3<u32> @offset(0)
3779
+ u:atomic<u32> @offset(12)
3780
+ }
3781
+
3782
+ $B1: { # root
3783
+ %v:ptr<workgroup, S, read_write> = var
3784
+ }
3785
+
3786
+ %foo = func():u32 {
3787
+ $B2: {
3788
+ %3:ptr<workgroup, atomic<u32>, read_write> = access %v, 1u
3789
+ %p:ptr<workgroup, atomic<u32>, read_write> = let %3
3790
+ %5:u32 = atomicLoad %p
3791
+ ret %5
3792
+ }
3793
+ }
3794
+ )" ;
3795
+ EXPECT_EQ (src, str ());
3796
+
3797
+ auto * expect = R"(
3798
+ S = struct @align(16) {
3799
+ vec:vec3<u32> @offset(0)
3800
+ u:atomic<u32> @offset(12)
3801
+ }
3802
+
3803
+ S_packed_vec3 = struct @align(16) {
3804
+ vec:__packed_vec3<u32> @offset(0)
3805
+ u:atomic<u32> @offset(12)
3806
+ }
3807
+
3808
+ $B1: { # root
3809
+ %v:ptr<workgroup, S_packed_vec3, read_write> = var
3810
+ }
3811
+
3812
+ %foo = func():u32 {
3813
+ $B2: {
3814
+ %3:ptr<workgroup, atomic<u32>, read_write> = access %v, 1u
3815
+ %p:ptr<workgroup, atomic<u32>, read_write> = let %3
3816
+ %5:u32 = atomicLoad %p
3817
+ ret %5
3818
+ }
3819
+ }
3820
+ )" ;
3821
+
3822
+ Run (PackedVec3);
3823
+
3824
+ EXPECT_EQ (expect, str ());
3825
+ }
3826
+
3695
3827
} // namespace
3696
3828
} // namespace tint::msl::writer::raise
0 commit comments