From 268d7b83571ae65b7e59a6df251ecb6ac0f5a806 Mon Sep 17 00:00:00 2001 From: Antonio Maiorano Date: Fri, 24 Jun 2022 22:28:23 +0000 Subject: [PATCH] tint: Add support for atomic ops to spirv reader The following operations are supported: OpAtomicLoad OpAtomicStore OpAtomicExchange OpAtomicCompareExchange OpAtomicCompareExchangeWeak OpAtomicIIncrement OpAtomicIDecrement OpAtomicIAdd OpAtomicISub OpAtomicSMin OpAtomicUMin OpAtomicSMax OpAtomicUMax OpAtomicAnd OpAtomicOr OpAtomicXor These are not, but may be supported in the future: OpAtomicFlagTestAndSet OpAtomicFlagClear OpAtomicFMinEXT OpAtomicFMaxEXT OpAtomicFAddEXT Bug: tint:1441 Change-Id: Ifd53643b38d43664905a0dddfca609add4914670 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/94121 Kokoro: Kokoro Reviewed-by: Ben Clayton Commit-Queue: Antonio Maiorano --- src/tint/BUILD.gn | 3 + src/tint/CMakeLists.txt | 3 + src/tint/reader/spirv/function.cc | 146 +++ src/tint/reader/spirv/function.h | 7 +- src/tint/reader/spirv/parser.cc | 2 + src/tint/tint.natvis | 6 +- src/tint/transform/spirv_atomic.cc | 231 ++++ src/tint/transform/spirv_atomic.h | 84 ++ src/tint/transform/spirv_atomic_test.cc | 1022 +++++++++++++++++ .../atomicStore/array/aliased_arrays.spvasm | 88 ++ .../array/aliased_arrays.spvasm.expected.glsl | 41 + .../array/aliased_arrays.spvasm.expected.hlsl | 47 + .../array/aliased_arrays.spvasm.expected.msl | 74 ++ .../aliased_arrays.spvasm.expected.spvasm | 140 +++ .../array/aliased_arrays.spvasm.expected.wgsl | 44 + .../atomicStore/array/aliased_arrays.wgsl | 11 + .../builtins/atomicStore/array/array.spvasm | 76 ++ .../array/array.spvasm.expected.glsl | 39 + .../array/array.spvasm.expected.hlsl | 45 + .../array/array.spvasm.expected.msl | 54 + .../array/array.spvasm.expected.spvasm | 123 ++ .../array/array.spvasm.expected.wgsl | 38 + .../builtins/atomicStore/array/array.wgsl | 6 + .../builtins/atomicStore/array/arrays.spvasm | 88 ++ .../array/arrays.spvasm.expected.glsl | 41 + .../array/arrays.spvasm.expected.hlsl | 47 + .../array/arrays.spvasm.expected.msl | 74 ++ .../array/arrays.spvasm.expected.spvasm | 140 +++ .../array/arrays.spvasm.expected.wgsl | 44 + .../builtins/atomicStore/array/arrays.wgsl | 6 + .../atomicStore/struct/array_of_struct.spvasm | 91 ++ .../array_of_struct.spvasm.expected.glsl | 56 + .../array_of_struct.spvasm.expected.hlsl | 56 + .../array_of_struct.spvasm.expected.msl | 70 ++ .../array_of_struct.spvasm.expected.spvasm | 142 +++ .../array_of_struct.spvasm.expected.wgsl | 52 + .../atomicStore/struct/array_of_struct.wgsl | 12 + .../struct/flat_multiple_atomics.spvasm | 62 + ...flat_multiple_atomics.spvasm.expected.glsl | 47 + ...flat_multiple_atomics.spvasm.expected.hlsl | 50 + .../flat_multiple_atomics.spvasm.expected.msl | 49 + ...at_multiple_atomics.spvasm.expected.spvasm | 88 ++ ...flat_multiple_atomics.spvasm.expected.wgsl | 37 + .../struct/flat_multiple_atomics.wgsl | 13 + .../struct/flat_single_atomic.spvasm | 61 + .../flat_single_atomic.spvasm.expected.glsl | 46 + .../flat_single_atomic.spvasm.expected.hlsl | 46 + .../flat_single_atomic.spvasm.expected.msl | 48 + .../flat_single_atomic.spvasm.expected.spvasm | 87 ++ .../flat_single_atomic.spvasm.expected.wgsl | 36 + .../struct/flat_single_atomic.wgsl | 12 + .../builtins/atomicStore/struct/nested.spvasm | 97 ++ .../struct/nested.spvasm.expected.glsl | 90 ++ .../struct/nested.spvasm.expected.hlsl | 73 ++ .../struct/nested.spvasm.expected.msl | 92 ++ .../struct/nested.spvasm.expected.spvasm | 137 +++ .../struct/nested.spvasm.expected.wgsl | 73 ++ .../builtins/atomicStore/struct/nested.wgsl | 27 + .../atomicStore/struct/struct_of_array.spvasm | 91 ++ .../struct_of_array.spvasm.expected.glsl | 57 + .../struct_of_array.spvasm.expected.hlsl | 57 + .../struct_of_array.spvasm.expected.msl | 72 ++ .../struct_of_array.spvasm.expected.spvasm | 142 +++ .../struct_of_array.spvasm.expected.wgsl | 52 + .../atomicStore/struct/struct_of_array.wgsl | 12 + .../atomicStore/struct/via_ptr_let.spvasm | 61 + .../struct/via_ptr_let.spvasm.expected.glsl | 46 + .../struct/via_ptr_let.spvasm.expected.hlsl | 46 + .../struct/via_ptr_let.spvasm.expected.msl | 48 + .../struct/via_ptr_let.spvasm.expected.spvasm | 87 ++ .../struct/via_ptr_let.spvasm.expected.wgsl | 36 + .../atomicStore/struct/via_ptr_let.wgsl | 14 + .../literal/atomicAdd/storage_i32.spvasm | 53 + .../storage_i32.spvasm.expected.glsl | 68 ++ .../storage_i32.spvasm.expected.hlsl | 36 + .../atomicAdd/storage_i32.spvasm.expected.msl | 38 + .../storage_i32.spvasm.expected.spvasm | 66 ++ .../storage_i32.spvasm.expected.wgsl | 36 + .../literal/atomicAdd/storage_u32.spvasm | 51 + .../storage_u32.spvasm.expected.glsl | 68 ++ .../storage_u32.spvasm.expected.hlsl | 36 + .../atomicAdd/storage_u32.spvasm.expected.msl | 38 + .../storage_u32.spvasm.expected.spvasm | 64 ++ .../storage_u32.spvasm.expected.wgsl | 36 + .../literal/atomicAdd/workgroup_i32.spvasm | 53 + .../workgroup_i32.spvasm.expected.glsl | 37 + .../workgroup_i32.spvasm.expected.hlsl | 44 + .../workgroup_i32.spvasm.expected.msl | 39 + .../workgroup_i32.spvasm.expected.spvasm | 76 ++ .../workgroup_i32.spvasm.expected.wgsl | 29 + .../literal/atomicAdd/workgroup_u32.spvasm | 52 + .../workgroup_u32.spvasm.expected.glsl | 37 + .../workgroup_u32.spvasm.expected.hlsl | 44 + .../workgroup_u32.spvasm.expected.msl | 39 + .../workgroup_u32.spvasm.expected.spvasm | 74 ++ .../workgroup_u32.spvasm.expected.wgsl | 29 + .../literal/atomicAnd/storage_i32.spvasm | 53 + .../storage_i32.spvasm.expected.glsl | 68 ++ .../storage_i32.spvasm.expected.hlsl | 36 + .../atomicAnd/storage_i32.spvasm.expected.msl | 38 + .../storage_i32.spvasm.expected.spvasm | 66 ++ .../storage_i32.spvasm.expected.wgsl | 36 + .../literal/atomicAnd/storage_u32.spvasm | 51 + .../storage_u32.spvasm.expected.glsl | 68 ++ .../storage_u32.spvasm.expected.hlsl | 36 + .../atomicAnd/storage_u32.spvasm.expected.msl | 38 + .../storage_u32.spvasm.expected.spvasm | 64 ++ .../storage_u32.spvasm.expected.wgsl | 36 + .../literal/atomicAnd/workgroup_i32.spvasm | 53 + .../workgroup_i32.spvasm.expected.glsl | 37 + .../workgroup_i32.spvasm.expected.hlsl | 44 + .../workgroup_i32.spvasm.expected.msl | 39 + .../workgroup_i32.spvasm.expected.spvasm | 76 ++ .../workgroup_i32.spvasm.expected.wgsl | 29 + .../literal/atomicAnd/workgroup_u32.spvasm | 52 + .../workgroup_u32.spvasm.expected.glsl | 37 + .../workgroup_u32.spvasm.expected.hlsl | 44 + .../workgroup_u32.spvasm.expected.msl | 39 + .../workgroup_u32.spvasm.expected.spvasm | 74 ++ .../workgroup_u32.spvasm.expected.wgsl | 29 + .../storage_i32.spvasm | 62 + .../storage_i32.spvasm.expected.glsl | 102 ++ .../storage_i32.spvasm.expected.hlsl | 50 + .../storage_i32.spvasm.expected.msl | 57 + .../storage_i32.spvasm.expected.spvasm | 87 ++ .../storage_i32.spvasm.expected.wgsl | 42 + .../storage_u32.spvasm | 60 + .../storage_u32.spvasm.expected.glsl | 102 ++ .../storage_u32.spvasm.expected.hlsl | 50 + .../storage_u32.spvasm.expected.msl | 57 + .../storage_u32.spvasm.expected.spvasm | 85 ++ .../storage_u32.spvasm.expected.wgsl | 42 + .../workgroup_i32.spvasm | 63 + .../workgroup_i32.spvasm.expected.glsl | 54 + .../workgroup_i32.spvasm.expected.hlsl | 58 + .../workgroup_i32.spvasm.expected.msl | 58 + .../workgroup_i32.spvasm.expected.spvasm | 97 ++ .../workgroup_i32.spvasm.expected.wgsl | 35 + .../workgroup_u32.spvasm | 62 + .../workgroup_u32.spvasm.expected.glsl | 54 + .../workgroup_u32.spvasm.expected.hlsl | 58 + .../workgroup_u32.spvasm.expected.msl | 58 + .../workgroup_u32.spvasm.expected.spvasm | 95 ++ .../workgroup_u32.spvasm.expected.wgsl | 35 + .../literal/atomicExchange/storage_i32.spvasm | 53 + .../storage_i32.spvasm.expected.glsl | 68 ++ .../storage_i32.spvasm.expected.hlsl | 36 + .../storage_i32.spvasm.expected.msl | 38 + .../storage_i32.spvasm.expected.spvasm | 66 ++ .../storage_i32.spvasm.expected.wgsl | 36 + .../literal/atomicExchange/storage_u32.spvasm | 51 + .../storage_u32.spvasm.expected.glsl | 68 ++ .../storage_u32.spvasm.expected.hlsl | 36 + .../storage_u32.spvasm.expected.msl | 38 + .../storage_u32.spvasm.expected.spvasm | 64 ++ .../storage_u32.spvasm.expected.wgsl | 36 + .../atomicExchange/workgroup_i32.spvasm | 53 + .../workgroup_i32.spvasm.expected.glsl | 37 + .../workgroup_i32.spvasm.expected.hlsl | 44 + .../workgroup_i32.spvasm.expected.msl | 39 + .../workgroup_i32.spvasm.expected.spvasm | 76 ++ .../workgroup_i32.spvasm.expected.wgsl | 29 + .../atomicExchange/workgroup_u32.spvasm | 52 + .../workgroup_u32.spvasm.expected.glsl | 37 + .../workgroup_u32.spvasm.expected.hlsl | 44 + .../workgroup_u32.spvasm.expected.msl | 39 + .../workgroup_u32.spvasm.expected.spvasm | 74 ++ .../workgroup_u32.spvasm.expected.wgsl | 29 + .../literal/atomicLoad/storage_i32.spvasm | 52 + .../storage_i32.spvasm.expected.glsl | 68 ++ .../storage_i32.spvasm.expected.hlsl | 36 + .../storage_i32.spvasm.expected.msl | 38 + .../storage_i32.spvasm.expected.spvasm | 65 ++ .../storage_i32.spvasm.expected.wgsl | 36 + .../literal/atomicLoad/storage_u32.spvasm | 51 + .../storage_u32.spvasm.expected.glsl | 68 ++ .../storage_u32.spvasm.expected.hlsl | 36 + .../storage_u32.spvasm.expected.msl | 38 + .../storage_u32.spvasm.expected.spvasm | 64 ++ .../storage_u32.spvasm.expected.wgsl | 36 + .../literal/atomicLoad/workgroup_i32.spvasm | 52 + .../workgroup_i32.spvasm.expected.glsl | 37 + .../workgroup_i32.spvasm.expected.hlsl | 44 + .../workgroup_i32.spvasm.expected.msl | 39 + .../workgroup_i32.spvasm.expected.spvasm | 75 ++ .../workgroup_i32.spvasm.expected.wgsl | 29 + .../literal/atomicLoad/workgroup_u32.spvasm | 51 + .../workgroup_u32.spvasm.expected.glsl | 37 + .../workgroup_u32.spvasm.expected.hlsl | 44 + .../workgroup_u32.spvasm.expected.msl | 39 + .../workgroup_u32.spvasm.expected.spvasm | 73 ++ .../workgroup_u32.spvasm.expected.wgsl | 29 + .../literal/atomicMax/storage_i32.spvasm | 53 + .../storage_i32.spvasm.expected.glsl | 68 ++ .../storage_i32.spvasm.expected.hlsl | 36 + .../atomicMax/storage_i32.spvasm.expected.msl | 38 + .../storage_i32.spvasm.expected.spvasm | 66 ++ .../storage_i32.spvasm.expected.wgsl | 36 + .../literal/atomicMax/storage_u32.spvasm | 51 + .../storage_u32.spvasm.expected.glsl | 68 ++ .../storage_u32.spvasm.expected.hlsl | 36 + .../atomicMax/storage_u32.spvasm.expected.msl | 38 + .../storage_u32.spvasm.expected.spvasm | 64 ++ .../storage_u32.spvasm.expected.wgsl | 36 + .../literal/atomicMax/workgroup_i32.spvasm | 53 + .../workgroup_i32.spvasm.expected.glsl | 37 + .../workgroup_i32.spvasm.expected.hlsl | 44 + .../workgroup_i32.spvasm.expected.msl | 39 + .../workgroup_i32.spvasm.expected.spvasm | 76 ++ .../workgroup_i32.spvasm.expected.wgsl | 29 + .../literal/atomicMax/workgroup_u32.spvasm | 52 + .../workgroup_u32.spvasm.expected.glsl | 37 + .../workgroup_u32.spvasm.expected.hlsl | 44 + .../workgroup_u32.spvasm.expected.msl | 39 + .../workgroup_u32.spvasm.expected.spvasm | 74 ++ .../workgroup_u32.spvasm.expected.wgsl | 29 + .../literal/atomicMin/storage_i32.spvasm | 53 + .../storage_i32.spvasm.expected.glsl | 68 ++ .../storage_i32.spvasm.expected.hlsl | 36 + .../atomicMin/storage_i32.spvasm.expected.msl | 38 + .../storage_i32.spvasm.expected.spvasm | 66 ++ .../storage_i32.spvasm.expected.wgsl | 36 + .../literal/atomicMin/storage_u32.spvasm | 51 + .../storage_u32.spvasm.expected.glsl | 68 ++ .../storage_u32.spvasm.expected.hlsl | 36 + .../atomicMin/storage_u32.spvasm.expected.msl | 38 + .../storage_u32.spvasm.expected.spvasm | 64 ++ .../storage_u32.spvasm.expected.wgsl | 36 + .../literal/atomicMin/workgroup_i32.spvasm | 53 + .../workgroup_i32.spvasm.expected.glsl | 37 + .../workgroup_i32.spvasm.expected.hlsl | 44 + .../workgroup_i32.spvasm.expected.msl | 39 + .../workgroup_i32.spvasm.expected.spvasm | 76 ++ .../workgroup_i32.spvasm.expected.wgsl | 29 + .../literal/atomicMin/workgroup_u32.spvasm | 52 + .../workgroup_u32.spvasm.expected.glsl | 37 + .../workgroup_u32.spvasm.expected.hlsl | 44 + .../workgroup_u32.spvasm.expected.msl | 39 + .../workgroup_u32.spvasm.expected.spvasm | 74 ++ .../workgroup_u32.spvasm.expected.wgsl | 29 + .../literal/atomicOr/storage_i32.spvasm | 53 + .../atomicOr/storage_i32.spvasm.expected.glsl | 68 ++ .../atomicOr/storage_i32.spvasm.expected.hlsl | 36 + .../atomicOr/storage_i32.spvasm.expected.msl | 38 + .../storage_i32.spvasm.expected.spvasm | 66 ++ .../atomicOr/storage_i32.spvasm.expected.wgsl | 36 + .../literal/atomicOr/storage_u32.spvasm | 51 + .../atomicOr/storage_u32.spvasm.expected.glsl | 68 ++ .../atomicOr/storage_u32.spvasm.expected.hlsl | 36 + .../atomicOr/storage_u32.spvasm.expected.msl | 38 + .../storage_u32.spvasm.expected.spvasm | 64 ++ .../atomicOr/storage_u32.spvasm.expected.wgsl | 36 + .../literal/atomicOr/workgroup_i32.spvasm | 53 + .../workgroup_i32.spvasm.expected.glsl | 37 + .../workgroup_i32.spvasm.expected.hlsl | 44 + .../workgroup_i32.spvasm.expected.msl | 39 + .../workgroup_i32.spvasm.expected.spvasm | 76 ++ .../workgroup_i32.spvasm.expected.wgsl | 29 + .../literal/atomicOr/workgroup_u32.spvasm | 52 + .../workgroup_u32.spvasm.expected.glsl | 37 + .../workgroup_u32.spvasm.expected.hlsl | 44 + .../workgroup_u32.spvasm.expected.msl | 39 + .../workgroup_u32.spvasm.expected.spvasm | 74 ++ .../workgroup_u32.spvasm.expected.wgsl | 29 + .../literal/atomicStore/storage_i32.spvasm | 48 + .../storage_i32.spvasm.expected.glsl | 64 ++ .../storage_i32.spvasm.expected.hlsl | 33 + .../storage_i32.spvasm.expected.msl | 36 + .../storage_i32.spvasm.expected.spvasm | 60 + .../storage_i32.spvasm.expected.wgsl | 34 + .../literal/atomicStore/storage_u32.spvasm | 46 + .../storage_u32.spvasm.expected.glsl | 64 ++ .../storage_u32.spvasm.expected.hlsl | 33 + .../storage_u32.spvasm.expected.msl | 36 + .../storage_u32.spvasm.expected.spvasm | 58 + .../storage_u32.spvasm.expected.wgsl | 34 + .../literal/atomicStore/workgroup_i32.spvasm | 49 + .../workgroup_i32.spvasm.expected.glsl | 35 + .../workgroup_i32.spvasm.expected.hlsl | 41 + .../workgroup_i32.spvasm.expected.msl | 37 + .../workgroup_i32.spvasm.expected.spvasm | 71 ++ .../workgroup_i32.spvasm.expected.wgsl | 27 + .../literal/atomicStore/workgroup_u32.spvasm | 48 + .../workgroup_u32.spvasm.expected.glsl | 35 + .../workgroup_u32.spvasm.expected.hlsl | 41 + .../workgroup_u32.spvasm.expected.msl | 37 + .../workgroup_u32.spvasm.expected.spvasm | 69 ++ .../workgroup_u32.spvasm.expected.wgsl | 27 + .../literal/atomicSub/storage_i32.spvasm | 53 + .../storage_i32.spvasm.expected.glsl | 68 ++ .../storage_i32.spvasm.expected.hlsl | 36 + .../atomicSub/storage_i32.spvasm.expected.msl | 38 + .../storage_i32.spvasm.expected.spvasm | 66 ++ .../storage_i32.spvasm.expected.wgsl | 36 + .../literal/atomicSub/storage_u32.spvasm | 51 + .../storage_u32.spvasm.expected.glsl | 68 ++ .../storage_u32.spvasm.expected.hlsl | 36 + .../atomicSub/storage_u32.spvasm.expected.msl | 38 + .../storage_u32.spvasm.expected.spvasm | 64 ++ .../storage_u32.spvasm.expected.wgsl | 36 + .../literal/atomicSub/workgroup_i32.spvasm | 53 + .../workgroup_i32.spvasm.expected.glsl | 37 + .../workgroup_i32.spvasm.expected.hlsl | 44 + .../workgroup_i32.spvasm.expected.msl | 39 + .../workgroup_i32.spvasm.expected.spvasm | 76 ++ .../workgroup_i32.spvasm.expected.wgsl | 29 + .../literal/atomicSub/workgroup_u32.spvasm | 52 + .../workgroup_u32.spvasm.expected.glsl | 37 + .../workgroup_u32.spvasm.expected.hlsl | 44 + .../workgroup_u32.spvasm.expected.msl | 39 + .../workgroup_u32.spvasm.expected.spvasm | 74 ++ .../workgroup_u32.spvasm.expected.wgsl | 29 + .../literal/atomicXor/storage_i32.spvasm | 53 + .../storage_i32.spvasm.expected.glsl | 68 ++ .../storage_i32.spvasm.expected.hlsl | 36 + .../atomicXor/storage_i32.spvasm.expected.msl | 38 + .../storage_i32.spvasm.expected.spvasm | 66 ++ .../storage_i32.spvasm.expected.wgsl | 36 + .../literal/atomicXor/storage_u32.spvasm | 51 + .../storage_u32.spvasm.expected.glsl | 68 ++ .../storage_u32.spvasm.expected.hlsl | 36 + .../atomicXor/storage_u32.spvasm.expected.msl | 38 + .../storage_u32.spvasm.expected.spvasm | 64 ++ .../storage_u32.spvasm.expected.wgsl | 36 + .../literal/atomicXor/workgroup_i32.spvasm | 53 + .../workgroup_i32.spvasm.expected.glsl | 37 + .../workgroup_i32.spvasm.expected.hlsl | 44 + .../workgroup_i32.spvasm.expected.msl | 39 + .../workgroup_i32.spvasm.expected.spvasm | 76 ++ .../workgroup_i32.spvasm.expected.wgsl | 29 + .../literal/atomicXor/workgroup_u32.spvasm | 52 + .../workgroup_u32.spvasm.expected.glsl | 37 + .../workgroup_u32.spvasm.expected.hlsl | 44 + .../workgroup_u32.spvasm.expected.msl | 39 + .../workgroup_u32.spvasm.expected.spvasm | 74 ++ .../workgroup_u32.spvasm.expected.wgsl | 29 + .../spvAtomicDecrement/storage_i32.spvasm | 53 + .../storage_i32.spvasm.expected.glsl | 68 ++ .../storage_i32.spvasm.expected.hlsl | 36 + .../storage_i32.spvasm.expected.msl | 38 + .../storage_i32.spvasm.expected.spvasm | 66 ++ .../storage_i32.spvasm.expected.wgsl | 36 + .../spvAtomicDecrement/storage_u32.spvasm | 51 + .../storage_u32.spvasm.expected.glsl | 68 ++ .../storage_u32.spvasm.expected.hlsl | 36 + .../storage_u32.spvasm.expected.msl | 38 + .../storage_u32.spvasm.expected.spvasm | 64 ++ .../storage_u32.spvasm.expected.wgsl | 36 + .../spvAtomicDecrement/workgroup_i32.spvasm | 53 + .../workgroup_i32.spvasm.expected.glsl | 37 + .../workgroup_i32.spvasm.expected.hlsl | 44 + .../workgroup_i32.spvasm.expected.msl | 39 + .../workgroup_i32.spvasm.expected.spvasm | 76 ++ .../workgroup_i32.spvasm.expected.wgsl | 29 + .../spvAtomicDecrement/workgroup_u32.spvasm | 52 + .../workgroup_u32.spvasm.expected.glsl | 37 + .../workgroup_u32.spvasm.expected.hlsl | 44 + .../workgroup_u32.spvasm.expected.msl | 39 + .../workgroup_u32.spvasm.expected.spvasm | 74 ++ .../workgroup_u32.spvasm.expected.wgsl | 29 + .../spvAtomicIncrement/storage_i32.spvasm | 53 + .../storage_i32.spvasm.expected.glsl | 68 ++ .../storage_i32.spvasm.expected.hlsl | 36 + .../storage_i32.spvasm.expected.msl | 38 + .../storage_i32.spvasm.expected.spvasm | 66 ++ .../storage_i32.spvasm.expected.wgsl | 36 + .../spvAtomicIncrement/storage_u32.spvasm | 51 + .../storage_u32.spvasm.expected.glsl | 68 ++ .../storage_u32.spvasm.expected.hlsl | 36 + .../storage_u32.spvasm.expected.msl | 38 + .../storage_u32.spvasm.expected.spvasm | 64 ++ .../storage_u32.spvasm.expected.wgsl | 36 + .../spvAtomicIncrement/workgroup_i32.spvasm | 53 + .../workgroup_i32.spvasm.expected.glsl | 37 + .../workgroup_i32.spvasm.expected.hlsl | 44 + .../workgroup_i32.spvasm.expected.msl | 39 + .../workgroup_i32.spvasm.expected.spvasm | 76 ++ .../workgroup_i32.spvasm.expected.wgsl | 29 + .../spvAtomicIncrement/workgroup_u32.spvasm | 52 + .../workgroup_u32.spvasm.expected.glsl | 37 + .../workgroup_u32.spvasm.expected.hlsl | 44 + .../workgroup_u32.spvasm.expected.msl | 39 + .../workgroup_u32.spvasm.expected.spvasm | 74 ++ .../workgroup_u32.spvasm.expected.wgsl | 29 + .../from_gen/var/atomicAdd/storage_i32.spvasm | 57 + .../storage_i32.spvasm.expected.glsl | 72 ++ .../storage_i32.spvasm.expected.hlsl | 38 + .../atomicAdd/storage_i32.spvasm.expected.msl | 41 + .../storage_i32.spvasm.expected.spvasm | 71 ++ .../storage_i32.spvasm.expected.wgsl | 39 + .../from_gen/var/atomicAdd/storage_u32.spvasm | 55 + .../storage_u32.spvasm.expected.glsl | 72 ++ .../storage_u32.spvasm.expected.hlsl | 38 + .../atomicAdd/storage_u32.spvasm.expected.msl | 41 + .../storage_u32.spvasm.expected.spvasm | 69 ++ .../storage_u32.spvasm.expected.wgsl | 39 + .../var/atomicAdd/workgroup_i32.spvasm | 57 + .../workgroup_i32.spvasm.expected.glsl | 39 + .../workgroup_i32.spvasm.expected.hlsl | 46 + .../workgroup_i32.spvasm.expected.msl | 42 + .../workgroup_i32.spvasm.expected.spvasm | 81 ++ .../workgroup_i32.spvasm.expected.wgsl | 32 + .../var/atomicAdd/workgroup_u32.spvasm | 56 + .../workgroup_u32.spvasm.expected.glsl | 39 + .../workgroup_u32.spvasm.expected.hlsl | 46 + .../workgroup_u32.spvasm.expected.msl | 42 + .../workgroup_u32.spvasm.expected.spvasm | 79 ++ .../workgroup_u32.spvasm.expected.wgsl | 32 + .../from_gen/var/atomicAnd/storage_i32.spvasm | 57 + .../storage_i32.spvasm.expected.glsl | 72 ++ .../storage_i32.spvasm.expected.hlsl | 38 + .../atomicAnd/storage_i32.spvasm.expected.msl | 41 + .../storage_i32.spvasm.expected.spvasm | 71 ++ .../storage_i32.spvasm.expected.wgsl | 39 + .../from_gen/var/atomicAnd/storage_u32.spvasm | 55 + .../storage_u32.spvasm.expected.glsl | 72 ++ .../storage_u32.spvasm.expected.hlsl | 38 + .../atomicAnd/storage_u32.spvasm.expected.msl | 41 + .../storage_u32.spvasm.expected.spvasm | 69 ++ .../storage_u32.spvasm.expected.wgsl | 39 + .../var/atomicAnd/workgroup_i32.spvasm | 57 + .../workgroup_i32.spvasm.expected.glsl | 39 + .../workgroup_i32.spvasm.expected.hlsl | 46 + .../workgroup_i32.spvasm.expected.msl | 42 + .../workgroup_i32.spvasm.expected.spvasm | 81 ++ .../workgroup_i32.spvasm.expected.wgsl | 32 + .../var/atomicAnd/workgroup_u32.spvasm | 56 + .../workgroup_u32.spvasm.expected.glsl | 39 + .../workgroup_u32.spvasm.expected.hlsl | 46 + .../workgroup_u32.spvasm.expected.msl | 42 + .../workgroup_u32.spvasm.expected.spvasm | 79 ++ .../workgroup_u32.spvasm.expected.wgsl | 32 + .../storage_i32.spvasm | 72 ++ .../storage_i32.spvasm.expected.glsl | 112 ++ .../storage_i32.spvasm.expected.hlsl | 55 + .../storage_i32.spvasm.expected.msl | 63 + .../storage_i32.spvasm.expected.spvasm | 98 ++ .../storage_i32.spvasm.expected.wgsl | 48 + .../storage_u32.spvasm | 70 ++ .../storage_u32.spvasm.expected.glsl | 112 ++ .../storage_u32.spvasm.expected.hlsl | 55 + .../storage_u32.spvasm.expected.msl | 63 + .../storage_u32.spvasm.expected.spvasm | 96 ++ .../storage_u32.spvasm.expected.wgsl | 48 + .../workgroup_i32.spvasm | 72 ++ .../workgroup_i32.spvasm.expected.glsl | 59 + .../workgroup_i32.spvasm.expected.hlsl | 63 + .../workgroup_i32.spvasm.expected.msl | 64 ++ .../workgroup_i32.spvasm.expected.spvasm | 108 ++ .../workgroup_i32.spvasm.expected.wgsl | 41 + .../workgroup_u32.spvasm | 71 ++ .../workgroup_u32.spvasm.expected.glsl | 59 + .../workgroup_u32.spvasm.expected.hlsl | 63 + .../workgroup_u32.spvasm.expected.msl | 64 ++ .../workgroup_u32.spvasm.expected.spvasm | 106 ++ .../workgroup_u32.spvasm.expected.wgsl | 41 + .../var/atomicExchange/storage_i32.spvasm | 57 + .../storage_i32.spvasm.expected.glsl | 72 ++ .../storage_i32.spvasm.expected.hlsl | 38 + .../storage_i32.spvasm.expected.msl | 41 + .../storage_i32.spvasm.expected.spvasm | 71 ++ .../storage_i32.spvasm.expected.wgsl | 39 + .../var/atomicExchange/storage_u32.spvasm | 55 + .../storage_u32.spvasm.expected.glsl | 72 ++ .../storage_u32.spvasm.expected.hlsl | 38 + .../storage_u32.spvasm.expected.msl | 41 + .../storage_u32.spvasm.expected.spvasm | 69 ++ .../storage_u32.spvasm.expected.wgsl | 39 + .../var/atomicExchange/workgroup_i32.spvasm | 57 + .../workgroup_i32.spvasm.expected.glsl | 39 + .../workgroup_i32.spvasm.expected.hlsl | 46 + .../workgroup_i32.spvasm.expected.msl | 42 + .../workgroup_i32.spvasm.expected.spvasm | 81 ++ .../workgroup_i32.spvasm.expected.wgsl | 32 + .../var/atomicExchange/workgroup_u32.spvasm | 56 + .../workgroup_u32.spvasm.expected.glsl | 39 + .../workgroup_u32.spvasm.expected.hlsl | 46 + .../workgroup_u32.spvasm.expected.msl | 42 + .../workgroup_u32.spvasm.expected.spvasm | 79 ++ .../workgroup_u32.spvasm.expected.wgsl | 32 + .../var/atomicLoad/storage_i32.spvasm | 52 + .../storage_i32.spvasm.expected.glsl | 68 ++ .../storage_i32.spvasm.expected.hlsl | 36 + .../storage_i32.spvasm.expected.msl | 38 + .../storage_i32.spvasm.expected.spvasm | 65 ++ .../storage_i32.spvasm.expected.wgsl | 36 + .../var/atomicLoad/storage_u32.spvasm | 51 + .../storage_u32.spvasm.expected.glsl | 68 ++ .../storage_u32.spvasm.expected.hlsl | 36 + .../storage_u32.spvasm.expected.msl | 38 + .../storage_u32.spvasm.expected.spvasm | 64 ++ .../storage_u32.spvasm.expected.wgsl | 36 + .../var/atomicLoad/workgroup_i32.spvasm | 52 + .../workgroup_i32.spvasm.expected.glsl | 37 + .../workgroup_i32.spvasm.expected.hlsl | 44 + .../workgroup_i32.spvasm.expected.msl | 39 + .../workgroup_i32.spvasm.expected.spvasm | 75 ++ .../workgroup_i32.spvasm.expected.wgsl | 29 + .../var/atomicLoad/workgroup_u32.spvasm | 51 + .../workgroup_u32.spvasm.expected.glsl | 37 + .../workgroup_u32.spvasm.expected.hlsl | 44 + .../workgroup_u32.spvasm.expected.msl | 39 + .../workgroup_u32.spvasm.expected.spvasm | 73 ++ .../workgroup_u32.spvasm.expected.wgsl | 29 + .../from_gen/var/atomicMax/storage_i32.spvasm | 57 + .../storage_i32.spvasm.expected.glsl | 72 ++ .../storage_i32.spvasm.expected.hlsl | 38 + .../atomicMax/storage_i32.spvasm.expected.msl | 41 + .../storage_i32.spvasm.expected.spvasm | 71 ++ .../storage_i32.spvasm.expected.wgsl | 39 + .../from_gen/var/atomicMax/storage_u32.spvasm | 55 + .../storage_u32.spvasm.expected.glsl | 72 ++ .../storage_u32.spvasm.expected.hlsl | 38 + .../atomicMax/storage_u32.spvasm.expected.msl | 41 + .../storage_u32.spvasm.expected.spvasm | 69 ++ .../storage_u32.spvasm.expected.wgsl | 39 + .../var/atomicMax/workgroup_i32.spvasm | 57 + .../workgroup_i32.spvasm.expected.glsl | 39 + .../workgroup_i32.spvasm.expected.hlsl | 46 + .../workgroup_i32.spvasm.expected.msl | 42 + .../workgroup_i32.spvasm.expected.spvasm | 81 ++ .../workgroup_i32.spvasm.expected.wgsl | 32 + .../var/atomicMax/workgroup_u32.spvasm | 56 + .../workgroup_u32.spvasm.expected.glsl | 39 + .../workgroup_u32.spvasm.expected.hlsl | 46 + .../workgroup_u32.spvasm.expected.msl | 42 + .../workgroup_u32.spvasm.expected.spvasm | 79 ++ .../workgroup_u32.spvasm.expected.wgsl | 32 + .../from_gen/var/atomicMin/storage_i32.spvasm | 57 + .../storage_i32.spvasm.expected.glsl | 72 ++ .../storage_i32.spvasm.expected.hlsl | 38 + .../atomicMin/storage_i32.spvasm.expected.msl | 41 + .../storage_i32.spvasm.expected.spvasm | 71 ++ .../storage_i32.spvasm.expected.wgsl | 39 + .../from_gen/var/atomicMin/storage_u32.spvasm | 55 + .../storage_u32.spvasm.expected.glsl | 72 ++ .../storage_u32.spvasm.expected.hlsl | 38 + .../atomicMin/storage_u32.spvasm.expected.msl | 41 + .../storage_u32.spvasm.expected.spvasm | 69 ++ .../storage_u32.spvasm.expected.wgsl | 39 + .../var/atomicMin/workgroup_i32.spvasm | 57 + .../workgroup_i32.spvasm.expected.glsl | 39 + .../workgroup_i32.spvasm.expected.hlsl | 46 + .../workgroup_i32.spvasm.expected.msl | 42 + .../workgroup_i32.spvasm.expected.spvasm | 81 ++ .../workgroup_i32.spvasm.expected.wgsl | 32 + .../var/atomicMin/workgroup_u32.spvasm | 56 + .../workgroup_u32.spvasm.expected.glsl | 39 + .../workgroup_u32.spvasm.expected.hlsl | 46 + .../workgroup_u32.spvasm.expected.msl | 42 + .../workgroup_u32.spvasm.expected.spvasm | 79 ++ .../workgroup_u32.spvasm.expected.wgsl | 32 + .../from_gen/var/atomicOr/storage_i32.spvasm | 57 + .../atomicOr/storage_i32.spvasm.expected.glsl | 72 ++ .../atomicOr/storage_i32.spvasm.expected.hlsl | 38 + .../atomicOr/storage_i32.spvasm.expected.msl | 41 + .../storage_i32.spvasm.expected.spvasm | 71 ++ .../atomicOr/storage_i32.spvasm.expected.wgsl | 39 + .../from_gen/var/atomicOr/storage_u32.spvasm | 55 + .../atomicOr/storage_u32.spvasm.expected.glsl | 72 ++ .../atomicOr/storage_u32.spvasm.expected.hlsl | 38 + .../atomicOr/storage_u32.spvasm.expected.msl | 41 + .../storage_u32.spvasm.expected.spvasm | 69 ++ .../atomicOr/storage_u32.spvasm.expected.wgsl | 39 + .../var/atomicOr/workgroup_i32.spvasm | 57 + .../workgroup_i32.spvasm.expected.glsl | 39 + .../workgroup_i32.spvasm.expected.hlsl | 46 + .../workgroup_i32.spvasm.expected.msl | 42 + .../workgroup_i32.spvasm.expected.spvasm | 81 ++ .../workgroup_i32.spvasm.expected.wgsl | 32 + .../var/atomicOr/workgroup_u32.spvasm | 56 + .../workgroup_u32.spvasm.expected.glsl | 39 + .../workgroup_u32.spvasm.expected.hlsl | 46 + .../workgroup_u32.spvasm.expected.msl | 42 + .../workgroup_u32.spvasm.expected.spvasm | 79 ++ .../workgroup_u32.spvasm.expected.wgsl | 32 + .../var/atomicStore/storage_i32.spvasm | 54 + .../storage_i32.spvasm.expected.glsl | 68 ++ .../storage_i32.spvasm.expected.hlsl | 35 + .../storage_i32.spvasm.expected.msl | 39 + .../storage_i32.spvasm.expected.spvasm | 67 ++ .../storage_i32.spvasm.expected.wgsl | 37 + .../var/atomicStore/storage_u32.spvasm | 52 + .../storage_u32.spvasm.expected.glsl | 68 ++ .../storage_u32.spvasm.expected.hlsl | 35 + .../storage_u32.spvasm.expected.msl | 39 + .../storage_u32.spvasm.expected.spvasm | 65 ++ .../storage_u32.spvasm.expected.wgsl | 37 + .../var/atomicStore/workgroup_i32.spvasm | 54 + .../workgroup_i32.spvasm.expected.glsl | 37 + .../workgroup_i32.spvasm.expected.hlsl | 43 + .../workgroup_i32.spvasm.expected.msl | 40 + .../workgroup_i32.spvasm.expected.spvasm | 77 ++ .../workgroup_i32.spvasm.expected.wgsl | 30 + .../var/atomicStore/workgroup_u32.spvasm | 53 + .../workgroup_u32.spvasm.expected.glsl | 37 + .../workgroup_u32.spvasm.expected.hlsl | 43 + .../workgroup_u32.spvasm.expected.msl | 40 + .../workgroup_u32.spvasm.expected.spvasm | 75 ++ .../workgroup_u32.spvasm.expected.wgsl | 30 + .../from_gen/var/atomicSub/storage_i32.spvasm | 57 + .../storage_i32.spvasm.expected.glsl | 72 ++ .../storage_i32.spvasm.expected.hlsl | 38 + .../atomicSub/storage_i32.spvasm.expected.msl | 41 + .../storage_i32.spvasm.expected.spvasm | 71 ++ .../storage_i32.spvasm.expected.wgsl | 39 + .../from_gen/var/atomicSub/storage_u32.spvasm | 55 + .../storage_u32.spvasm.expected.glsl | 72 ++ .../storage_u32.spvasm.expected.hlsl | 38 + .../atomicSub/storage_u32.spvasm.expected.msl | 41 + .../storage_u32.spvasm.expected.spvasm | 69 ++ .../storage_u32.spvasm.expected.wgsl | 39 + .../var/atomicSub/workgroup_i32.spvasm | 57 + .../workgroup_i32.spvasm.expected.glsl | 39 + .../workgroup_i32.spvasm.expected.hlsl | 46 + .../workgroup_i32.spvasm.expected.msl | 42 + .../workgroup_i32.spvasm.expected.spvasm | 81 ++ .../workgroup_i32.spvasm.expected.wgsl | 32 + .../var/atomicSub/workgroup_u32.spvasm | 56 + .../workgroup_u32.spvasm.expected.glsl | 39 + .../workgroup_u32.spvasm.expected.hlsl | 46 + .../workgroup_u32.spvasm.expected.msl | 42 + .../workgroup_u32.spvasm.expected.spvasm | 79 ++ .../workgroup_u32.spvasm.expected.wgsl | 32 + .../from_gen/var/atomicXor/storage_i32.spvasm | 57 + .../storage_i32.spvasm.expected.glsl | 72 ++ .../storage_i32.spvasm.expected.hlsl | 38 + .../atomicXor/storage_i32.spvasm.expected.msl | 41 + .../storage_i32.spvasm.expected.spvasm | 71 ++ .../storage_i32.spvasm.expected.wgsl | 39 + .../from_gen/var/atomicXor/storage_u32.spvasm | 55 + .../storage_u32.spvasm.expected.glsl | 72 ++ .../storage_u32.spvasm.expected.hlsl | 38 + .../atomicXor/storage_u32.spvasm.expected.msl | 41 + .../storage_u32.spvasm.expected.spvasm | 69 ++ .../storage_u32.spvasm.expected.wgsl | 39 + .../var/atomicXor/workgroup_i32.spvasm | 57 + .../workgroup_i32.spvasm.expected.glsl | 39 + .../workgroup_i32.spvasm.expected.hlsl | 46 + .../workgroup_i32.spvasm.expected.msl | 42 + .../workgroup_i32.spvasm.expected.spvasm | 81 ++ .../workgroup_i32.spvasm.expected.wgsl | 32 + .../var/atomicXor/workgroup_u32.spvasm | 56 + .../workgroup_u32.spvasm.expected.glsl | 39 + .../workgroup_u32.spvasm.expected.hlsl | 46 + .../workgroup_u32.spvasm.expected.msl | 42 + .../workgroup_u32.spvasm.expected.spvasm | 79 ++ .../workgroup_u32.spvasm.expected.wgsl | 32 + .../var/spvAtomicDecrement/storage_i32.spvasm | 56 + .../storage_i32.spvasm.expected.glsl | 72 ++ .../storage_i32.spvasm.expected.hlsl | 38 + .../storage_i32.spvasm.expected.msl | 40 + .../storage_i32.spvasm.expected.spvasm | 70 ++ .../storage_i32.spvasm.expected.wgsl | 38 + .../var/spvAtomicDecrement/storage_u32.spvasm | 54 + .../storage_u32.spvasm.expected.glsl | 72 ++ .../storage_u32.spvasm.expected.hlsl | 38 + .../storage_u32.spvasm.expected.msl | 40 + .../storage_u32.spvasm.expected.spvasm | 68 ++ .../storage_u32.spvasm.expected.wgsl | 38 + .../spvAtomicDecrement/workgroup_i32.spvasm | 56 + .../workgroup_i32.spvasm.expected.glsl | 39 + .../workgroup_i32.spvasm.expected.hlsl | 46 + .../workgroup_i32.spvasm.expected.msl | 41 + .../workgroup_i32.spvasm.expected.spvasm | 80 ++ .../workgroup_i32.spvasm.expected.wgsl | 31 + .../spvAtomicDecrement/workgroup_u32.spvasm | 55 + .../workgroup_u32.spvasm.expected.glsl | 39 + .../workgroup_u32.spvasm.expected.hlsl | 46 + .../workgroup_u32.spvasm.expected.msl | 41 + .../workgroup_u32.spvasm.expected.spvasm | 78 ++ .../workgroup_u32.spvasm.expected.wgsl | 31 + .../var/spvAtomicIncrement/storage_i32.spvasm | 56 + .../storage_i32.spvasm.expected.glsl | 72 ++ .../storage_i32.spvasm.expected.hlsl | 38 + .../storage_i32.spvasm.expected.msl | 40 + .../storage_i32.spvasm.expected.spvasm | 70 ++ .../storage_i32.spvasm.expected.wgsl | 38 + .../var/spvAtomicIncrement/storage_u32.spvasm | 54 + .../storage_u32.spvasm.expected.glsl | 72 ++ .../storage_u32.spvasm.expected.hlsl | 38 + .../storage_u32.spvasm.expected.msl | 40 + .../storage_u32.spvasm.expected.spvasm | 68 ++ .../storage_u32.spvasm.expected.wgsl | 38 + .../spvAtomicIncrement/workgroup_i32.spvasm | 56 + .../workgroup_i32.spvasm.expected.glsl | 39 + .../workgroup_i32.spvasm.expected.hlsl | 46 + .../workgroup_i32.spvasm.expected.msl | 41 + .../workgroup_i32.spvasm.expected.spvasm | 80 ++ .../workgroup_i32.spvasm.expected.wgsl | 31 + .../spvAtomicIncrement/workgroup_u32.spvasm | 55 + .../workgroup_u32.spvasm.expected.glsl | 39 + .../workgroup_u32.spvasm.expected.hlsl | 46 + .../workgroup_u32.spvasm.expected.msl | 41 + .../workgroup_u32.spvasm.expected.spvasm | 78 ++ .../workgroup_u32.spvasm.expected.wgsl | 31 + 696 files changed, 36681 insertions(+), 6 deletions(-) create mode 100644 src/tint/transform/spirv_atomic.cc create mode 100644 src/tint/transform/spirv_atomic.h create mode 100644 src/tint/transform/spirv_atomic_test.cc create mode 100644 test/tint/builtins/atomicStore/array/aliased_arrays.spvasm create mode 100644 test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.msl create mode 100644 test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomicStore/array/aliased_arrays.wgsl create mode 100644 test/tint/builtins/atomicStore/array/array.spvasm create mode 100644 test/tint/builtins/atomicStore/array/array.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomicStore/array/array.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomicStore/array/array.spvasm.expected.msl create mode 100644 test/tint/builtins/atomicStore/array/array.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomicStore/array/array.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomicStore/array/array.wgsl create mode 100644 test/tint/builtins/atomicStore/array/arrays.spvasm create mode 100644 test/tint/builtins/atomicStore/array/arrays.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomicStore/array/arrays.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomicStore/array/arrays.spvasm.expected.msl create mode 100644 test/tint/builtins/atomicStore/array/arrays.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomicStore/array/arrays.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomicStore/array/arrays.wgsl create mode 100644 test/tint/builtins/atomicStore/struct/array_of_struct.spvasm create mode 100644 test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.msl create mode 100644 test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomicStore/struct/array_of_struct.wgsl create mode 100644 test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm create mode 100644 test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.msl create mode 100644 test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomicStore/struct/flat_multiple_atomics.wgsl create mode 100644 test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm create mode 100644 test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.msl create mode 100644 test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomicStore/struct/flat_single_atomic.wgsl create mode 100644 test/tint/builtins/atomicStore/struct/nested.spvasm create mode 100644 test/tint/builtins/atomicStore/struct/nested.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomicStore/struct/nested.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomicStore/struct/nested.spvasm.expected.msl create mode 100644 test/tint/builtins/atomicStore/struct/nested.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomicStore/struct/nested.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomicStore/struct/nested.wgsl create mode 100644 test/tint/builtins/atomicStore/struct/struct_of_array.spvasm create mode 100644 test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.msl create mode 100644 test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomicStore/struct/struct_of_array.wgsl create mode 100644 test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm create mode 100644 test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.msl create mode 100644 test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomicStore/struct/via_ptr_let.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.wgsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.glsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.hlsl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.msl create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.spvasm create mode 100644 test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.wgsl diff --git a/src/tint/BUILD.gn b/src/tint/BUILD.gn index d3303bf4ee..8108e545d0 100644 --- a/src/tint/BUILD.gn +++ b/src/tint/BUILD.gn @@ -526,6 +526,8 @@ libtint_source_set("libtint_core_all_src") { "transform/simplify_pointers.h", "transform/single_entry_point.cc", "transform/single_entry_point.h", + "transform/spirv_atomic.cc", + "transform/spirv_atomic.h", "transform/transform.cc", "transform/transform.h", "transform/unshadow.cc", @@ -1190,6 +1192,7 @@ if (tint_build_unittests) { "transform/robustness_test.cc", "transform/simplify_pointers_test.cc", "transform/single_entry_point_test.cc", + "transform/spirv_atomic_test.cc", "transform/test_helper.h", "transform/transform_test.cc", "transform/unshadow_test.cc", diff --git a/src/tint/CMakeLists.txt b/src/tint/CMakeLists.txt index 1ea1a6f3a7..3475b1bd15 100644 --- a/src/tint/CMakeLists.txt +++ b/src/tint/CMakeLists.txt @@ -450,6 +450,8 @@ set(TINT_LIB_SRCS transform/simplify_pointers.h transform/single_entry_point.cc transform/single_entry_point.h + transform/spirv_atomic.cc + transform/spirv_atomic.h transform/transform.cc transform/transform.h transform/unshadow.cc @@ -1114,6 +1116,7 @@ if(TINT_BUILD_TESTS) transform/robustness_test.cc transform/simplify_pointers_test.cc transform/single_entry_point_test.cc + transform/spirv_atomic_test.cc transform/test_helper.h transform/unshadow_test.cc transform/unwind_discard_functions_test.cc diff --git a/src/tint/reader/spirv/function.cc b/src/tint/reader/spirv/function.cc index 2a5169b620..3b333df808 100644 --- a/src/tint/reader/spirv/function.cc +++ b/src/tint/reader/spirv/function.cc @@ -36,6 +36,7 @@ #include "src/tint/sem/builtin_type.h" #include "src/tint/sem/depth_texture.h" #include "src/tint/sem/sampled_texture.h" +#include "src/tint/transform/spirv_atomic.h" // Terms: // CFG: the control flow graph of the function, where basic blocks are the @@ -500,6 +501,38 @@ bool IsSampledImageAccess(SpvOp opcode) { return false; } +// @param opcode a SPIR-V opcode +// @returns true if the given instruction is an atomic operation. +bool IsAtomicOp(SpvOp opcode) { + switch (opcode) { + case SpvOpAtomicLoad: + case SpvOpAtomicStore: + case SpvOpAtomicExchange: + case SpvOpAtomicCompareExchange: + case SpvOpAtomicCompareExchangeWeak: + case SpvOpAtomicIIncrement: + case SpvOpAtomicIDecrement: + case SpvOpAtomicIAdd: + case SpvOpAtomicISub: + case SpvOpAtomicSMin: + case SpvOpAtomicUMin: + case SpvOpAtomicSMax: + case SpvOpAtomicUMax: + case SpvOpAtomicAnd: + case SpvOpAtomicOr: + case SpvOpAtomicXor: + case SpvOpAtomicFlagTestAndSet: + case SpvOpAtomicFlagClear: + case SpvOpAtomicFMinEXT: + case SpvOpAtomicFMaxEXT: + case SpvOpAtomicFAddEXT: + return true; + default: + break; + } + return false; +} + // @param opcode a SPIR-V opcode // @returns true if the given instruction is an image sampling, gather, // or gather-compare operation. @@ -3487,6 +3520,10 @@ bool FunctionEmitter::EmitStatement(const spvtools::opt::Instruction& inst) { return EmitImageAccess(inst); } + if (IsAtomicOp(inst.opcode())) { + return EmitAtomicOp(inst); + } + switch (inst.opcode()) { case SpvOpNop: return true; @@ -5417,6 +5454,115 @@ bool FunctionEmitter::EmitImageQuery(const spvtools::opt::Instruction& inst) { return Fail() << "unhandled image query: " << inst.PrettyPrint(); } +bool FunctionEmitter::EmitAtomicOp(const spvtools::opt::Instruction& inst) { + auto emit_atomic = [&](sem::BuiltinType builtin, std::initializer_list args) { + // Split args into params and expressions + ast::ParameterList params; + params.reserve(args.size()); + ast::ExpressionList exprs; + exprs.reserve(args.size()); + size_t i = 0; + for (auto& a : args) { + params.emplace_back(builder_.Param("p" + std::to_string(i++), a.type->Build(builder_))); + exprs.emplace_back(a.expr); + } + + // Function return type + const ast::Type* ret_type = nullptr; + if (inst.type_id() != 0) { + ret_type = parser_impl_.ConvertType(inst.type_id())->Build(builder_); + } else { + ret_type = builder_.ty.void_(); + } + + // Emit stub, will be removed by transform::SpirvAtomic + auto sym = builder_.Symbols().New(std::string("stub_") + sem::str(builtin)); + auto* stub_deco = + builder_.ASTNodes().Create(builder_.ID(), builtin); + auto* stub = + create(Source{}, sym, std::move(params), ret_type, + /* body */ nullptr, + ast::AttributeList{ + stub_deco, + builder_.Disable(ast::DisabledValidation::kFunctionHasNoBody), + }, + ast::AttributeList{}); + builder_.AST().AddFunction(stub); + + // Emit call to stub, will be replaced with call to atomic builtin by transform::SpirvAtomic + auto* call = builder_.Call(Source{}, sym, exprs); + if (inst.type_id() != 0) { + auto* result_type = parser_impl_.ConvertType(inst.type_id()); + TypedExpression expr{result_type, call}; + return EmitConstDefOrWriteToHoistedVar(inst, expr); + } + AddStatement(create(call)); + + return true; + }; + + auto oper = [&](uint32_t index) -> TypedExpression { // + return MakeOperand(inst, index); + }; + + auto lit = [&](int v) -> TypedExpression { + auto* result_type = parser_impl_.ConvertType(inst.type_id()); + if (result_type->Is()) { + return TypedExpression(result_type, builder_.Expr(i32(v))); + } else if (result_type->Is()) { + return TypedExpression(result_type, builder_.Expr(u32(v))); + } + return {}; + }; + + switch (inst.opcode()) { + case SpvOpAtomicLoad: + return emit_atomic(sem::BuiltinType::kAtomicLoad, {oper(/*ptr*/ 0)}); + case SpvOpAtomicStore: + return emit_atomic(sem::BuiltinType::kAtomicStore, + {oper(/*ptr*/ 0), oper(/*value*/ 3)}); + case SpvOpAtomicExchange: + return emit_atomic(sem::BuiltinType::kAtomicExchange, + {oper(/*ptr*/ 0), oper(/*value*/ 3)}); + case SpvOpAtomicCompareExchange: + case SpvOpAtomicCompareExchangeWeak: + return emit_atomic(sem::BuiltinType::kAtomicCompareExchangeWeak, + {oper(/*ptr*/ 0), /*value*/ oper(5), /*comparator*/ oper(4)}); + case SpvOpAtomicIIncrement: + return emit_atomic(sem::BuiltinType::kAtomicAdd, {oper(/*ptr*/ 0), lit(1)}); + case SpvOpAtomicIDecrement: + return emit_atomic(sem::BuiltinType::kAtomicSub, {oper(/*ptr*/ 0), lit(1)}); + case SpvOpAtomicIAdd: + return emit_atomic(sem::BuiltinType::kAtomicAdd, {oper(/*ptr*/ 0), oper(/*value*/ 3)}); + case SpvOpAtomicISub: + return emit_atomic(sem::BuiltinType::kAtomicSub, {oper(/*ptr*/ 0), oper(/*value*/ 3)}); + case SpvOpAtomicSMin: + return emit_atomic(sem::BuiltinType::kAtomicMin, {oper(/*ptr*/ 0), oper(/*value*/ 3)}); + case SpvOpAtomicUMin: + return emit_atomic(sem::BuiltinType::kAtomicMin, {oper(/*ptr*/ 0), oper(/*value*/ 3)}); + case SpvOpAtomicSMax: + return emit_atomic(sem::BuiltinType::kAtomicMax, {oper(/*ptr*/ 0), oper(/*value*/ 3)}); + case SpvOpAtomicUMax: + return emit_atomic(sem::BuiltinType::kAtomicMax, {oper(/*ptr*/ 0), oper(/*value*/ 3)}); + case SpvOpAtomicAnd: + return emit_atomic(sem::BuiltinType::kAtomicAnd, {oper(/*ptr*/ 0), oper(/*value*/ 3)}); + case SpvOpAtomicOr: + return emit_atomic(sem::BuiltinType::kAtomicOr, {oper(/*ptr*/ 0), oper(/*value*/ 3)}); + case SpvOpAtomicXor: + return emit_atomic(sem::BuiltinType::kAtomicXor, {oper(/*ptr*/ 0), oper(/*value*/ 3)}); + case SpvOpAtomicFlagTestAndSet: + case SpvOpAtomicFlagClear: + case SpvOpAtomicFMinEXT: + case SpvOpAtomicFMaxEXT: + case SpvOpAtomicFAddEXT: + return Fail() << "unsupported atomic op: " << inst.PrettyPrint(); + + default: + break; + } + return Fail() << "unhandled atomic op: " << inst.PrettyPrint(); +} + ast::ExpressionList FunctionEmitter::MakeCoordinateOperandsForImageAccess( const spvtools::opt::Instruction& inst) { if (!parser_impl_.success()) { diff --git a/src/tint/reader/spirv/function.h b/src/tint/reader/spirv/function.h index b1c3f57ed4..ae9ef31405 100644 --- a/src/tint/reader/spirv/function.h +++ b/src/tint/reader/spirv/function.h @@ -1060,7 +1060,7 @@ class FunctionEmitter { /// Emits a texture builtin function call for a SPIR-V instruction that /// accesses an image or sampled image. /// @param inst the SPIR-V instruction - /// @returns an expression + /// @returns true on success, false on error bool EmitImageAccess(const spvtools::opt::Instruction& inst); /// Emits statements to implement a SPIR-V image query. @@ -1068,6 +1068,11 @@ class FunctionEmitter { /// @returns an expression bool EmitImageQuery(const spvtools::opt::Instruction& inst); + /// Emits statements to implement a SPIR-V atomic op. + /// @param inst the SPIR-V instruction + /// @returns true on success, false on error + bool EmitAtomicOp(const spvtools::opt::Instruction& inst); + /// Converts the given texel to match the type required for the storage /// texture with the given type. In WGSL the texel value is always provided /// as a 4-element vector, but the component type is determined by the diff --git a/src/tint/reader/spirv/parser.cc b/src/tint/reader/spirv/parser.cc index f430d94f72..ac43b9e54c 100644 --- a/src/tint/reader/spirv/parser.cc +++ b/src/tint/reader/spirv/parser.cc @@ -22,6 +22,7 @@ #include "src/tint/transform/manager.h" #include "src/tint/transform/remove_unreachable_statements.h" #include "src/tint/transform/simplify_pointers.h" +#include "src/tint/transform/spirv_atomic.h" #include "src/tint/transform/unshadow.h" namespace tint::reader::spirv { @@ -55,6 +56,7 @@ Program Parse(const std::vector& input) { manager.Add(); manager.Add(); manager.Add(); + manager.Add(); return manager.Run(&program).program; } diff --git a/src/tint/tint.natvis b/src/tint/tint.natvis index c1fd1f398e..bce3ce5ba0 100644 --- a/src/tint/tint.natvis +++ b/src/tint/tint.natvis @@ -101,11 +101,7 @@ {*variable}; - - {value} - - - + {value} diff --git a/src/tint/transform/spirv_atomic.cc b/src/tint/transform/spirv_atomic.cc new file mode 100644 index 0000000000..d820a8749d --- /dev/null +++ b/src/tint/transform/spirv_atomic.cc @@ -0,0 +1,231 @@ +// Copyright 2022 The Tint Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "src/tint/transform/spirv_atomic.h" + +#include +#include +#include +#include +#include + +#include "src/tint/program_builder.h" +#include "src/tint/sem/block_statement.h" +#include "src/tint/sem/function.h" +#include "src/tint/sem/index_accessor_expression.h" +#include "src/tint/sem/member_accessor_expression.h" +#include "src/tint/sem/reference.h" +#include "src/tint/sem/statement.h" +#include "src/tint/utils/map.h" +#include "src/tint/utils/unique_vector.h" + +TINT_INSTANTIATE_TYPEINFO(tint::transform::SpirvAtomic); +TINT_INSTANTIATE_TYPEINFO(tint::transform::SpirvAtomic::Stub); + +namespace tint::transform { + +/// Private implementation of transform +struct SpirvAtomic::State { + private: + /// A struct that has been forked because a subset of members were made atomic. + struct ForkedStruct { + Symbol name; + std::unordered_set atomic_members; + }; + + CloneContext& ctx; + ProgramBuilder& b = *ctx.dst; + std::unordered_map forked_structs; + std::unordered_set atomic_variables; + utils::UniqueVector atomic_expressions; + + public: + /// Constructor + /// @param c the clone context + explicit State(CloneContext& c) : ctx(c) {} + + /// Runs the transform + void Run() { + // Look for stub functions generated by the SPIR-V reader, which are used as placeholders + // for atomic builtin calls. + for (auto* fn : ctx.src->AST().Functions()) { + if (auto* stub = ast::GetAttribute(fn->attributes)) { + auto* sem = ctx.src->Sem().Get(fn); + + for (auto* call : sem->CallSites()) { + // The first argument is always the atomic. + // The stub passes this by value, whereas the builtin wants a pointer. + // Take the address of the atomic argument. + auto& args = call->Declaration()->args; + auto out_args = ctx.Clone(args); + out_args[0] = b.AddressOf(out_args[0]); + + // Replace all callsites of this stub to a call to the real builtin + if (stub->builtin == sem::BuiltinType::kAtomicCompareExchangeWeak) { + // atomicCompareExchangeWeak returns a struct, so insert a call to it above + // the current statement, and replace the current call with the struct's + // `old_value` member. + auto* block = call->Stmt()->Block()->Declaration(); + auto old_value = b.Symbols().New("old_value"); + auto old_value_decl = b.Decl(b.Let( + old_value, nullptr, + b.MemberAccessor(b.Call(sem::str(stub->builtin), std::move(out_args)), + b.Expr("old_value")))); + ctx.InsertBefore(block->statements, call->Stmt()->Declaration(), + old_value_decl); + ctx.Replace(call->Declaration(), b.Expr(old_value)); + } else { + ctx.Replace(call->Declaration(), + b.Call(sem::str(stub->builtin), std::move(out_args))); + } + + // Keep track of this expression. We'll need to modify the source variable / + // structure to be atomic. + atomic_expressions.add(ctx.src->Sem().Get(args[0])); + } + + // Remove the stub from the output program + ctx.Remove(ctx.src->AST().GlobalDeclarations(), fn); + } + } + + // Transform all variables and structure members that were used in atomic operations as + // atomic types. This propagates up originating expression chains. + ProcessAtomicExpressions(); + + // If we need to change structure members, then fork them. + if (!forked_structs.empty()) { + ctx.ReplaceAll([&](const ast::Struct* str) { + // Always emit the original structure. This allows unrelated usage of the structure + // to continue working. + // auto* original = ctx.CloneWithoutTransform(str); + + // Is `str` a structure we need to fork? + if (auto it = forked_structs.find(str); it != forked_structs.end()) { + const auto& forked = it->second; + + // Re-create the structure swapping in the atomic-flavoured members + std::vector members(str->members.size()); + for (size_t i = 0; i < str->members.size(); i++) { + auto* member = str->members[i]; + if (forked.atomic_members.count(i)) { + auto* type = AtomicTypeFor(ctx.src->Sem().Get(member)->Type()); + auto name = ctx.src->Symbols().NameFor(member->symbol); + members[i] = b.Member(name, type, ctx.Clone(member->attributes)); + } else { + members[i] = ctx.Clone(member); + } + } + b.Structure(forked.name, std::move(members)); + } + + // return original; + return nullptr; + }); + } + + ctx.Clone(); + } + + private: + ForkedStruct& Fork(const ast::Struct* str) { + auto& forked = forked_structs[str]; + if (!forked.name.IsValid()) { + forked.name = b.Symbols().New(ctx.src->Symbols().NameFor(str->name) + "_atomic"); + } + return forked; + } + + void ProcessAtomicExpressions() { + for (size_t i = 0; i < atomic_expressions.size(); i++) { + Switch( + atomic_expressions[i], // + [&](const sem::VariableUser* user) { + auto* v = user->Variable()->Declaration(); + if (v->type && atomic_variables.emplace(user->Variable()).second) { + ctx.Replace(v->type, AtomicTypeFor(user->Variable()->Type())); + } + if (auto* ctor = user->Variable()->Constructor()) { + atomic_expressions.add(ctor); + } + }, + [&](const sem::StructMemberAccess* access) { + // Fork the struct (the first time) and mark member(s) that need to be made + // atomic. + auto* member = access->Member(); + Fork(member->Struct()->Declaration()).atomic_members.emplace(member->Index()); + atomic_expressions.add(access->Object()); + }, + [&](const sem::IndexAccessorExpression* index) { + atomic_expressions.add(index->Object()); + }, + [&](const sem::Expression* e) { + if (auto* unary = e->Declaration()->As()) { + atomic_expressions.add(ctx.src->Sem().Get(unary->expr)); + } + }); + } + } + + const ast::Type* AtomicTypeFor(const sem::Type* ty) { + return Switch( + ty, // + [&](const sem::I32*) { return b.ty.atomic(CreateASTTypeFor(ctx, ty)); }, + [&](const sem::U32*) { return b.ty.atomic(CreateASTTypeFor(ctx, ty)); }, + [&](const sem::Struct* str) { return b.ty.type_name(Fork(str->Declaration()).name); }, + [&](const sem::Array* arr) { + return arr->IsRuntimeSized() + ? b.ty.array(AtomicTypeFor(arr->ElemType())) + : b.ty.array(AtomicTypeFor(arr->ElemType()), u32(arr->Count())); + }, + [&](const sem::Pointer* ptr) { + return b.ty.pointer(AtomicTypeFor(ptr->StoreType()), ptr->StorageClass(), + ptr->Access()); + }, + [&](const sem::Reference* ref) { return AtomicTypeFor(ref->StoreType()); }, + [&](Default) { + TINT_ICE(Transform, b.Diagnostics()) + << "unhandled type: " << ty->FriendlyName(ctx.src->Symbols()); + return nullptr; + }); + } +}; + +SpirvAtomic::SpirvAtomic() = default; +SpirvAtomic::~SpirvAtomic() = default; + +SpirvAtomic::Stub::Stub(ProgramID pid, sem::BuiltinType b) : Base(pid), builtin(b) {} +SpirvAtomic::Stub::~Stub() = default; +std::string SpirvAtomic::Stub::InternalName() const { + return "@internal(spirv-atomic " + std::string(sem::str(builtin)) + ")"; +} + +const SpirvAtomic::Stub* SpirvAtomic::Stub::Clone(CloneContext* ctx) const { + return ctx->dst->ASTNodes().Create(ctx->dst->ID(), builtin); +} + +bool SpirvAtomic::ShouldRun(const Program* program, const DataMap&) const { + for (auto* fn : program->AST().Functions()) { + if (ast::HasAttribute(fn->attributes)) { + return true; + } + } + return false; +} + +void SpirvAtomic::Run(CloneContext& ctx, const DataMap&, DataMap&) const { + State{ctx}.Run(); +} + +} // namespace tint::transform diff --git a/src/tint/transform/spirv_atomic.h b/src/tint/transform/spirv_atomic.h new file mode 100644 index 0000000000..36ac842854 --- /dev/null +++ b/src/tint/transform/spirv_atomic.h @@ -0,0 +1,84 @@ +// Copyright 2022 The Tint Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SRC_TINT_TRANSFORM_SPIRV_ATOMIC_H_ +#define SRC_TINT_TRANSFORM_SPIRV_ATOMIC_H_ + +#include + +#include "src/tint/ast/internal_attribute.h" +#include "src/tint/sem/builtin_type.h" +#include "src/tint/transform/transform.h" + +// Forward declarations +namespace tint { +class CloneContext; +} // namespace tint + +namespace tint::transform { + +/// SpirvAtomic is a transform that replaces calls to stub functions created by the SPIR-V reader +/// with calls to the WGSL atomic builtin. It also makes sure to replace variable declarations that +/// are the target of the atomic operations with an atomic declaration of the same type. For +/// structs, it creates a copy of the original struct with atomic members. +class SpirvAtomic final : public Castable { + public: + /// Constructor + SpirvAtomic(); + /// Destructor + ~SpirvAtomic() override; + + /// Stub is an attribute applied to stub SPIR-V reader generated functions that need to be + /// translated to an atomic builtin. + class Stub final : public Castable { + public: + /// @param program_id the identifier of the program that owns this node + /// @param builtin the atomic builtin this stub represents + Stub(ProgramID program_id, sem::BuiltinType builtin); + /// Destructor + ~Stub() override; + + /// @return a short description of the internal attribute which will be + /// displayed as `@internal()` + std::string InternalName() const override; + + /// Performs a deep clone of this object using the CloneContext `ctx`. + /// @param ctx the clone context + /// @return the newly cloned object + const Stub* Clone(CloneContext* ctx) const override; + + /// The type of the intrinsic + const sem::BuiltinType builtin; + }; + + /// @param program the program to inspect + /// @param data optional extra transform-specific input data + /// @returns true if this transform should be run for the given program + bool ShouldRun(const Program* program, const DataMap& data = {}) const override; + + protected: + struct State; + + /// Runs the transform using the CloneContext built for transforming a + /// program. Run() is responsible for calling Clone() on the CloneContext. + /// @param ctx the CloneContext primed with the input program and + /// ProgramBuilder + /// @param inputs optional extra transform-specific input data + /// @param outputs optional extra transform-specific output data + void Run(CloneContext& ctx, const DataMap& inputs, DataMap& outputs) const override; +}; + +} // namespace tint::transform + +#endif // SRC_TINT_TRANSFORM_SPIRV_ATOMIC_H_ diff --git a/src/tint/transform/spirv_atomic_test.cc b/src/tint/transform/spirv_atomic_test.cc new file mode 100644 index 0000000000..804193e3e2 --- /dev/null +++ b/src/tint/transform/spirv_atomic_test.cc @@ -0,0 +1,1022 @@ +// Copyright 2022 The Tint Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "src/tint/transform/spirv_atomic.h" + +#include +#include +#include +#include + +#include "src/tint/reader/wgsl/parser_impl.h" +#include "src/tint/transform/test_helper.h" + +using namespace tint::number_suffixes; // NOLINT + +namespace tint::transform { +namespace { + +class SpirvAtomicTest : public TransformTest { + public: + Output Run(std::string in) { + auto file = std::make_unique("test", std::move(in)); + auto parser = reader::wgsl::ParserImpl(file.get()); + parser.Parse(); + + auto& b = parser.builder(); + + sem::BuiltinType two_params[] = { + sem::BuiltinType::kAtomicExchange, sem::BuiltinType::kAtomicAdd, + sem::BuiltinType::kAtomicSub, sem::BuiltinType::kAtomicMin, + sem::BuiltinType::kAtomicMax, sem::BuiltinType::kAtomicAnd, + sem::BuiltinType::kAtomicOr, sem::BuiltinType::kAtomicXor, + }; + for (auto& a : two_params) { + b.Func(std::string{"stub_"} + sem::str(a) + "_u32", + { + b.Param("p0", b.ty.u32()), + b.Param("p1", b.ty.u32()), + }, + b.ty.u32(), {b.Return(0_u)}, + {b.ASTNodes().Create(b.ID(), a)}); + b.Func(std::string{"stub_"} + sem::str(a) + "_i32", + { + b.Param("p0", b.ty.i32()), + b.Param("p1", b.ty.i32()), + }, + b.ty.i32(), {b.Return(0_i)}, + {b.ASTNodes().Create(b.ID(), a)}); + } + + b.Func("stub_atomicLoad_u32", + { + b.Param("p0", b.ty.u32()), + }, + b.ty.u32(), {b.Return(0_u)}, + { + b.ASTNodes().Create(b.ID(), sem::BuiltinType::kAtomicLoad), + }); + b.Func("stub_atomicLoad_i32", + { + b.Param("p0", b.ty.i32()), + }, + b.ty.i32(), {b.Return(0_i)}, + { + b.ASTNodes().Create(b.ID(), sem::BuiltinType::kAtomicLoad), + }); + + b.Func("stub_atomicStore_u32", + { + b.Param("p0", b.ty.u32()), + b.Param("p1", b.ty.u32()), + }, + b.ty.void_(), {}, + { + b.ASTNodes().Create(b.ID(), sem::BuiltinType::kAtomicStore), + }); + b.Func("stub_atomicStore_i32", + { + b.Param("p0", b.ty.i32()), + b.Param("p1", b.ty.i32()), + }, + b.ty.void_(), {}, + { + b.ASTNodes().Create(b.ID(), sem::BuiltinType::kAtomicStore), + }); + + b.Func("stub_atomic_compare_exchange_weak_u32", + { + b.Param("p0", b.ty.u32()), + b.Param("p1", b.ty.u32()), + b.Param("p2", b.ty.u32()), + }, + b.ty.u32(), {b.Return(0_u)}, + { + b.ASTNodes().Create( + b.ID(), sem::BuiltinType::kAtomicCompareExchangeWeak), + }); + b.Func("stub_atomic_compare_exchange_weak_i32", + {b.Param("p0", b.ty.i32()), b.Param("p1", b.ty.i32()), b.Param("p2", b.ty.i32())}, + b.ty.i32(), {b.Return(0_i)}, + { + b.ASTNodes().Create( + b.ID(), sem::BuiltinType::kAtomicCompareExchangeWeak), + }); + + // Keep this pointer alive after Transform() returns + files_.emplace_back(std::move(file)); + + return TransformTest::Run(Program(std::move(b))); + } + + private: + std::vector> files_; +}; + +TEST_F(SpirvAtomicTest, ArrayOfU32) { + auto* src = R"( +var wg : array; + +fn f() { + stub_atomicStore_u32(wg[1], 1u); +} +)"; + + auto* expect = R"( +var wg : array, 4u>; + +fn f() { + atomicStore(&(wg[1]), 1u); +} +)"; + + auto got = Run(src); + + EXPECT_EQ(expect, str(got)); +} + +TEST_F(SpirvAtomicTest, ArraysOfU32) { + auto* src = R"( +var wg : array, 2>, 3>; + +fn f() { + stub_atomicStore_u32(wg[2][1][0], 1u); +} +)"; + + auto* expect = R"( +var wg : array, 1u>, 2u>, 3u>; + +fn f() { + atomicStore(&(wg[2][1][0]), 1u); +} +)"; + + auto got = Run(src); + + EXPECT_EQ(expect, str(got)); +} + +TEST_F(SpirvAtomicTest, AliasedArraysOfU32) { + auto* src = R"( +type A0 = u32; + +type A1 = array; + +type A2 = array; + +type A3 = array; + +var wg : A3; + +fn f() { + stub_atomicStore_u32(wg[2][1][0], 1u); +} +)"; + + auto* expect = R"( +type A0 = u32; + +type A1 = array; + +type A2 = array; + +type A3 = array; + +var wg : array, 1u>, 2u>, 3u>; + +fn f() { + atomicStore(&(wg[2][1][0]), 1u); +} +)"; + + auto got = Run(src); + + EXPECT_EQ(expect, str(got)); +} + +TEST_F(SpirvAtomicTest, FlatStructSingleAtomic) { + auto* src = R"( +struct S { + a : u32, +} + +var wg : S; + +fn f() { + stub_atomicStore_u32(wg.a, 1u); +} +)"; + + auto* expect = R"( +struct S_atomic { + a : atomic, +} + +struct S { + a : u32, +} + +var wg : S_atomic; + +fn f() { + atomicStore(&(wg.a), 1u); +} +)"; + + auto got = Run(src); + + EXPECT_EQ(expect, str(got)); +} + +TEST_F(SpirvAtomicTest, FlatStructMultipleAtomic) { + auto* src = R"( +struct S { + a : u32, + b : i32, +} + +var wg : S; + +fn f1() { + stub_atomicStore_u32(wg.a, 1u); +} + +fn f2() { + stub_atomicStore_i32(wg.b, 2i); +} +)"; + + auto* expect = R"( +struct S_atomic { + a : atomic, + b : atomic, +} + +struct S { + a : u32, + b : i32, +} + +var wg : S_atomic; + +fn f1() { + atomicStore(&(wg.a), 1u); +} + +fn f2() { + atomicStore(&(wg.b), 2i); +} +)"; + + auto got = Run(src); + + EXPECT_EQ(expect, str(got)); +} + +TEST_F(SpirvAtomicTest, NestedStruct) { + auto* src = R"( +struct S0 { + a : u32, + b : i32, + c : u32, +} + +struct S1 { + a : i32, + b : u32, + c : S0, +} + +struct S2 { + a : i32, + b : S1, + c : u32, +} + +var wg : S2; + +fn f() { + stub_atomicStore_u32(wg.b.c.a, 1u); +} +)"; + + auto* expect = R"( +struct S0_atomic { + a : atomic, + b : i32, + c : u32, +} + +struct S0 { + a : u32, + b : i32, + c : u32, +} + +struct S1_atomic { + a : i32, + b : u32, + c : S0_atomic, +} + +struct S1 { + a : i32, + b : u32, + c : S0, +} + +struct S2_atomic { + a : i32, + b : S1_atomic, + c : u32, +} + +struct S2 { + a : i32, + b : S1, + c : u32, +} + +var wg : S2_atomic; + +fn f() { + atomicStore(&(wg.b.c.a), 1u); +} +)"; + + auto got = Run(src); + + EXPECT_EQ(expect, str(got)); +} + +TEST_F(SpirvAtomicTest, ArrayOfStruct) { + auto* src = R"( +struct S { + a : u32, + b : i32, + c : u32, +} + +@group(0) @binding(1) var arr : array; + +fn f() { + stub_atomicStore_i32(arr[4].b, 1i); +} +)"; + + auto* expect = R"( +struct S_atomic { + a : u32, + b : atomic, + c : u32, +} + +struct S { + a : u32, + b : i32, + c : u32, +} + +@group(0) @binding(1) var arr : array; + +fn f() { + atomicStore(&(arr[4].b), 1i); +} +)"; + + auto got = Run(src); + + EXPECT_EQ(expect, str(got)); +} + +TEST_F(SpirvAtomicTest, StructOfArray) { + auto* src = R"( +struct S { + a : array, +} + +@group(0) @binding(1) var s : S; + +fn f() { + stub_atomicStore_i32(s.a[4], 1i); +} +)"; + + auto* expect = R"( +struct S_atomic { + a : array>, +} + +struct S { + a : array, +} + +@group(0) @binding(1) var s : S_atomic; + +fn f() { + atomicStore(&(s.a[4]), 1i); +} +)"; + + auto got = Run(src); + + EXPECT_EQ(expect, str(got)); +} + +TEST_F(SpirvAtomicTest, ViaPtrLet) { + auto* src = R"( +struct S { + i : i32, +} + +@group(0) @binding(1) var s : S; + +fn f() { + let p0 = &(s); + let p1 : ptr = &((*(p0)).i); + stub_atomicStore_i32(*p1, 1i); +} +)"; + + auto* expect = + R"( +struct S_atomic { + i : atomic, +} + +struct S { + i : i32, +} + +@group(0) @binding(1) var s : S_atomic; + +fn f() { + let p0 = &(s); + let p1 : ptr, read_write> = &((*(p0)).i); + atomicStore(&(*(p1)), 1i); +} +)"; + + auto got = Run(src); + + EXPECT_EQ(expect, str(got)); +} + +TEST_F(SpirvAtomicTest, StructIsolatedMixedUsage) { + auto* src = R"( +struct S { + i : i32, +} + +@group(0) @binding(1) var s : S; + +fn f() { + stub_atomicStore_i32(s.i, 1i); +} + +fn another_usage() { + var s : S; + let x : i32 = s.i; + s.i = 3i; +} +)"; + + auto* expect = + R"( +struct S_atomic { + i : atomic, +} + +struct S { + i : i32, +} + +@group(0) @binding(1) var s : S_atomic; + +fn f() { + atomicStore(&(s.i), 1i); +} + +fn another_usage() { + var s : S; + let x : i32 = s.i; + s.i = 3i; +} +)"; + + auto got = Run(src); + + EXPECT_EQ(expect, str(got)); +} + +// This sort of mixed usage isn't handled yet. Not sure if we need to just yet. +// If we don't, then the transform should give sensible diagnostics instead of producing invalid +// WGSL. +// TODO(crbug.com/tint/1595) +TEST_F(SpirvAtomicTest, DISABLED_StructComplexMixedUsage) { + auto* src = R"( +struct S { + i : i32, +} + +@group(0) @binding(1) var s : S; + +fn f() { + let x : i32 = s.i; + stub_atomicStore_i32(s.i, 1i); + s.i = 3i; +} +)"; + + auto* expect = + R"( +struct S_atomic { + i : atomic, +} + +struct S { + i : i32, +} + +@group(0) @binding(1) var s : S_atomic; + +fn f() { + let x : i32 = atomicLoad(&s.i); + stub_atomicStore_i32(s.i, 1i); + atomicStore(&(s.i), 1i); +} +)"; + + auto got = Run(src); + + EXPECT_EQ(expect, str(got)); +} + +TEST_F(SpirvAtomicTest, AtomicLoad) { + auto* src = R"( +var wg_u32 : u32; +var wg_i32 : i32; +@group(0) @binding(0) var sg_u32 : u32; +@group(0) @binding(1) var sg_i32 : i32; + +fn f() { + {let r = stub_atomicLoad_u32(wg_u32);} + {let r = stub_atomicLoad_i32(wg_i32);} + {let r = stub_atomicLoad_u32(sg_u32);} + {let r = stub_atomicLoad_i32(sg_i32);} +} +)"; + + auto* expect = + R"( +var wg_u32 : atomic; + +var wg_i32 : atomic; + +@group(0) @binding(0) var sg_u32 : atomic; + +@group(0) @binding(1) var sg_i32 : atomic; + +fn f() { + { + let r = atomicLoad(&(wg_u32)); + } + { + let r = atomicLoad(&(wg_i32)); + } + { + let r = atomicLoad(&(sg_u32)); + } + { + let r = atomicLoad(&(sg_i32)); + } +} +)"; + + auto got = Run(src); + EXPECT_EQ(expect, str(got)); +} + +TEST_F(SpirvAtomicTest, AtomicExchange) { + auto* src = R"( +var wg_u32 : u32; +var wg_i32 : i32; +@group(0) @binding(0) var sg_u32 : u32; +@group(0) @binding(1) var sg_i32 : i32; + +fn f() { + {let r = stub_atomicExchange_u32(wg_u32, 123u);} + {let r = stub_atomicExchange_i32(wg_i32, 123i);} + {let r = stub_atomicExchange_u32(sg_u32, 123u);} + {let r = stub_atomicExchange_i32(sg_i32, 123i);} +} +)"; + + auto* expect = + R"( +var wg_u32 : atomic; + +var wg_i32 : atomic; + +@group(0) @binding(0) var sg_u32 : atomic; + +@group(0) @binding(1) var sg_i32 : atomic; + +fn f() { + { + let r = atomicExchange(&(wg_u32), 123u); + } + { + let r = atomicExchange(&(wg_i32), 123i); + } + { + let r = atomicExchange(&(sg_u32), 123u); + } + { + let r = atomicExchange(&(sg_i32), 123i); + } +} +)"; + + auto got = Run(src); + EXPECT_EQ(expect, str(got)); +} + +TEST_F(SpirvAtomicTest, AtomicAdd) { + auto* src = R"( +var wg_u32 : u32; +var wg_i32 : i32; +@group(0) @binding(0) var sg_u32 : u32; +@group(0) @binding(1) var sg_i32 : i32; + +fn f() { + {let r = stub_atomicAdd_u32(wg_u32, 123u);} + {let r = stub_atomicAdd_i32(wg_i32, 123i);} + {let r = stub_atomicAdd_u32(sg_u32, 123u);} + {let r = stub_atomicAdd_i32(sg_i32, 123i);} +} +)"; + + auto* expect = + R"( +var wg_u32 : atomic; + +var wg_i32 : atomic; + +@group(0) @binding(0) var sg_u32 : atomic; + +@group(0) @binding(1) var sg_i32 : atomic; + +fn f() { + { + let r = atomicAdd(&(wg_u32), 123u); + } + { + let r = atomicAdd(&(wg_i32), 123i); + } + { + let r = atomicAdd(&(sg_u32), 123u); + } + { + let r = atomicAdd(&(sg_i32), 123i); + } +} +)"; + + auto got = Run(src); + EXPECT_EQ(expect, str(got)); +} + +TEST_F(SpirvAtomicTest, AtomicSub) { + auto* src = R"( +var wg_u32 : u32; +var wg_i32 : i32; +@group(0) @binding(0) var sg_u32 : u32; +@group(0) @binding(1) var sg_i32 : i32; + +fn f() { + {let r = stub_atomicSub_u32(wg_u32, 123u);} + {let r = stub_atomicSub_i32(wg_i32, 123i);} + {let r = stub_atomicSub_u32(sg_u32, 123u);} + {let r = stub_atomicSub_i32(sg_i32, 123i);} +} +)"; + + auto* expect = + R"( +var wg_u32 : atomic; + +var wg_i32 : atomic; + +@group(0) @binding(0) var sg_u32 : atomic; + +@group(0) @binding(1) var sg_i32 : atomic; + +fn f() { + { + let r = atomicSub(&(wg_u32), 123u); + } + { + let r = atomicSub(&(wg_i32), 123i); + } + { + let r = atomicSub(&(sg_u32), 123u); + } + { + let r = atomicSub(&(sg_i32), 123i); + } +} +)"; + + auto got = Run(src); + EXPECT_EQ(expect, str(got)); +} + +TEST_F(SpirvAtomicTest, AtomicMin) { + auto* src = R"( +var wg_u32 : u32; +var wg_i32 : i32; +@group(0) @binding(0) var sg_u32 : u32; +@group(0) @binding(1) var sg_i32 : i32; + +fn f() { + {let r = stub_atomicMin_u32(wg_u32, 123u);} + {let r = stub_atomicMin_i32(wg_i32, 123i);} + {let r = stub_atomicMin_u32(sg_u32, 123u);} + {let r = stub_atomicMin_i32(sg_i32, 123i);} +} +)"; + + auto* expect = + R"( +var wg_u32 : atomic; + +var wg_i32 : atomic; + +@group(0) @binding(0) var sg_u32 : atomic; + +@group(0) @binding(1) var sg_i32 : atomic; + +fn f() { + { + let r = atomicMin(&(wg_u32), 123u); + } + { + let r = atomicMin(&(wg_i32), 123i); + } + { + let r = atomicMin(&(sg_u32), 123u); + } + { + let r = atomicMin(&(sg_i32), 123i); + } +} +)"; + + auto got = Run(src); + EXPECT_EQ(expect, str(got)); +} + +TEST_F(SpirvAtomicTest, AtomicMax) { + auto* src = R"( +var wg_u32 : u32; +var wg_i32 : i32; +@group(0) @binding(0) var sg_u32 : u32; +@group(0) @binding(1) var sg_i32 : i32; + +fn f() { + {let r = stub_atomicMax_u32(wg_u32, 123u);} + {let r = stub_atomicMax_i32(wg_i32, 123i);} + {let r = stub_atomicMax_u32(sg_u32, 123u);} + {let r = stub_atomicMax_i32(sg_i32, 123i);} +} +)"; + + auto* expect = + R"( +var wg_u32 : atomic; + +var wg_i32 : atomic; + +@group(0) @binding(0) var sg_u32 : atomic; + +@group(0) @binding(1) var sg_i32 : atomic; + +fn f() { + { + let r = atomicMax(&(wg_u32), 123u); + } + { + let r = atomicMax(&(wg_i32), 123i); + } + { + let r = atomicMax(&(sg_u32), 123u); + } + { + let r = atomicMax(&(sg_i32), 123i); + } +} +)"; + + auto got = Run(src); + EXPECT_EQ(expect, str(got)); +} + +TEST_F(SpirvAtomicTest, AtomicAnd) { + auto* src = R"( +var wg_u32 : u32; +var wg_i32 : i32; +@group(0) @binding(0) var sg_u32 : u32; +@group(0) @binding(1) var sg_i32 : i32; + +fn f() { + {let r = stub_atomicAnd_u32(wg_u32, 123u);} + {let r = stub_atomicAnd_i32(wg_i32, 123i);} + {let r = stub_atomicAnd_u32(sg_u32, 123u);} + {let r = stub_atomicAnd_i32(sg_i32, 123i);} +} +)"; + + auto* expect = + R"( +var wg_u32 : atomic; + +var wg_i32 : atomic; + +@group(0) @binding(0) var sg_u32 : atomic; + +@group(0) @binding(1) var sg_i32 : atomic; + +fn f() { + { + let r = atomicAnd(&(wg_u32), 123u); + } + { + let r = atomicAnd(&(wg_i32), 123i); + } + { + let r = atomicAnd(&(sg_u32), 123u); + } + { + let r = atomicAnd(&(sg_i32), 123i); + } +} +)"; + + auto got = Run(src); + EXPECT_EQ(expect, str(got)); +} + +TEST_F(SpirvAtomicTest, AtomicOr) { + auto* src = R"( +var wg_u32 : u32; +var wg_i32 : i32; +@group(0) @binding(0) var sg_u32 : u32; +@group(0) @binding(1) var sg_i32 : i32; + +fn f() { + {let r = stub_atomicOr_u32(wg_u32, 123u);} + {let r = stub_atomicOr_i32(wg_i32, 123i);} + {let r = stub_atomicOr_u32(sg_u32, 123u);} + {let r = stub_atomicOr_i32(sg_i32, 123i);} +} +)"; + + auto* expect = + R"( +var wg_u32 : atomic; + +var wg_i32 : atomic; + +@group(0) @binding(0) var sg_u32 : atomic; + +@group(0) @binding(1) var sg_i32 : atomic; + +fn f() { + { + let r = atomicOr(&(wg_u32), 123u); + } + { + let r = atomicOr(&(wg_i32), 123i); + } + { + let r = atomicOr(&(sg_u32), 123u); + } + { + let r = atomicOr(&(sg_i32), 123i); + } +} +)"; + + auto got = Run(src); + EXPECT_EQ(expect, str(got)); +} + +TEST_F(SpirvAtomicTest, AtomicXor) { + auto* src = R"( +var wg_u32 : u32; +var wg_i32 : i32; +@group(0) @binding(0) var sg_u32 : u32; +@group(0) @binding(1) var sg_i32 : i32; + +fn f() { + {let r = stub_atomicXor_u32(wg_u32, 123u);} + {let r = stub_atomicXor_i32(wg_i32, 123i);} + {let r = stub_atomicXor_u32(sg_u32, 123u);} + {let r = stub_atomicXor_i32(sg_i32, 123i);} +} +)"; + + auto* expect = + R"( +var wg_u32 : atomic; + +var wg_i32 : atomic; + +@group(0) @binding(0) var sg_u32 : atomic; + +@group(0) @binding(1) var sg_i32 : atomic; + +fn f() { + { + let r = atomicXor(&(wg_u32), 123u); + } + { + let r = atomicXor(&(wg_i32), 123i); + } + { + let r = atomicXor(&(sg_u32), 123u); + } + { + let r = atomicXor(&(sg_i32), 123i); + } +} +)"; + + auto got = Run(src); + EXPECT_EQ(expect, str(got)); +} + +TEST_F(SpirvAtomicTest, AtomicCompareExchangeWeak) { + auto* src = R"( +var wg_u32 : u32; +var wg_i32 : i32; +@group(0) @binding(0) var sg_u32 : u32; +@group(0) @binding(1) var sg_i32 : i32; + +fn f() { + {let r = stub_atomic_compare_exchange_weak_u32(wg_u32, 123u, 456u);} + {let r = stub_atomic_compare_exchange_weak_i32(wg_i32, 123i, 456i);} + {let r = stub_atomic_compare_exchange_weak_u32(sg_u32, 123u, 456u);} + {let r = stub_atomic_compare_exchange_weak_i32(sg_i32, 123i, 456i);} +} +)"; + + auto* expect = + R"( +var wg_u32 : atomic; + +var wg_i32 : atomic; + +@group(0) @binding(0) var sg_u32 : atomic; + +@group(0) @binding(1) var sg_i32 : atomic; + +fn f() { + { + let old_value = atomicCompareExchangeWeak(&(wg_u32), 123u, 456u).old_value; + let r = old_value; + } + { + let old_value_2 = atomicCompareExchangeWeak(&(wg_i32), 123i, 456i).old_value; + let r = old_value_2; + } + { + let old_value_1 = atomicCompareExchangeWeak(&(sg_u32), 123u, 456u).old_value; + let r = old_value_1; + } + { + let old_value_3 = atomicCompareExchangeWeak(&(sg_i32), 123i, 456i).old_value; + let r = old_value_3; + } +} +)"; + + auto got = Run(src); + EXPECT_EQ(expect, str(got)); +} + +} // namespace +} // namespace tint::transform diff --git a/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm b/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm new file mode 100644 index 0000000000..0dbd964435 --- /dev/null +++ b/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm @@ -0,0 +1,88 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 58 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %wg "wg" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %idx "idx" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + OpDecorate %_arr_uint_uint_1 ArrayStride 4 + OpDecorate %_arr__arr_uint_uint_1_uint_2 ArrayStride 4 + OpDecorate %_arr__arr__arr_uint_uint_1_uint_2_uint_3 ArrayStride 8 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %uint_1 = OpConstant %uint 1 +%_arr_uint_uint_1 = OpTypeArray %uint %uint_1 + %uint_2 = OpConstant %uint 2 +%_arr__arr_uint_uint_1_uint_2 = OpTypeArray %_arr_uint_uint_1 %uint_2 + %uint_3 = OpConstant %uint 3 +%_arr__arr__arr_uint_uint_1_uint_2_uint_3 = OpTypeArray %_arr__arr_uint_uint_1_uint_2 %uint_3 +%_ptr_Workgroup__arr__arr__arr_uint_uint_1_uint_2_uint_3 = OpTypePointer Workgroup %_arr__arr__arr_uint_uint_1_uint_2_uint_3 + %wg = OpVariable %_ptr_Workgroup__arr__arr__arr_uint_uint_1_uint_2_uint_3 Workgroup + %void = OpTypeVoid + %12 = OpTypeFunction %void %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %19 = OpConstantNull %uint + %uint_6 = OpConstant %uint 6 + %bool = OpTypeBool + %uint_0 = OpConstant %uint 0 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %uint_264 = OpConstant %uint 264 + %int = OpTypeInt 32 1 + %int_2 = OpConstant %int 2 + %int_1 = OpConstant %int 1 + %51 = OpConstantNull %int + %53 = OpTypeFunction %void +%compute_main_inner = OpFunction %void None %12 +%local_invocation_index = OpFunctionParameter %uint + %16 = OpLabel + %idx = OpVariable %_ptr_Function_uint Function %19 + OpStore %idx %local_invocation_index + OpBranch %20 + %20 = OpLabel + OpLoopMerge %21 %22 None + OpBranch %23 + %23 = OpLabel + %25 = OpLoad %uint %idx + %27 = OpULessThan %bool %25 %uint_6 + %24 = OpLogicalNot %bool %27 + OpSelectionMerge %29 None + OpBranchConditional %24 %30 %29 + %30 = OpLabel + OpBranch %21 + %29 = OpLabel + %31 = OpLoad %uint %idx + %32 = OpUDiv %uint %31 %uint_2 + %33 = OpLoad %uint %idx + %34 = OpUMod %uint %33 %uint_2 + %35 = OpLoad %uint %idx + %36 = OpUMod %uint %35 %uint_1 + %41 = OpAccessChain %_ptr_Workgroup_uint %wg %32 %34 %36 + OpAtomicStore %41 %uint_2 %uint_0 %19 + OpBranch %22 + %22 = OpLabel + %42 = OpLoad %uint %idx + %43 = OpIAdd %uint %42 %uint_1 + OpStore %idx %43 + OpBranch %20 + %21 = OpLabel + OpControlBarrier %uint_2 %uint_2 %uint_264 + %52 = OpAccessChain %_ptr_Workgroup_uint %wg %int_2 %int_1 %51 + OpAtomicStore %52 %uint_2 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %53 + %55 = OpLabel + %57 = OpLoad %uint %local_invocation_index_1 + %56 = OpFunctionCall %void %compute_main_inner %57 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.glsl b/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.glsl new file mode 100644 index 0000000000..4cdd505b1a --- /dev/null +++ b/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.glsl @@ -0,0 +1,41 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint wg[3][2][1]; +void compute_main_inner(uint local_invocation_index) { + uint idx = 0u; + idx = local_invocation_index; + { + for(; !(!((idx < 6u))); idx = (idx + 1u)) { + atomicExchange(wg[(idx / 2u)][(idx % 2u)][(idx % 1u)], 0u); + } + } + barrier(); + atomicExchange(wg[2][1][0], 1u); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 6u); idx_1 = (idx_1 + 1u)) { + uint i = (idx_1 / 2u); + uint i_1 = (idx_1 % 2u); + uint i_2 = (idx_1 % 1u); + atomicExchange(wg[i][i_1][i_2], 0u); + } + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.hlsl b/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.hlsl new file mode 100644 index 0000000000..16f5d2e59f --- /dev/null +++ b/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.hlsl @@ -0,0 +1,47 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint wg[3][2][1]; + +void compute_main_inner(uint local_invocation_index) { + uint idx = 0u; + idx = local_invocation_index; + { + [loop] for(; !(!((idx < 6u))); idx = (idx + 1u)) { + uint atomic_result = 0u; + InterlockedExchange(wg[(idx / 2u)][(idx % 2u)][(idx % 1u)], 0u, atomic_result); + } + } + GroupMemoryBarrierWithGroupSync(); + uint atomic_result_1 = 0u; + InterlockedExchange(wg[2][1][0], 1u, atomic_result_1); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + [loop] for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 6u); idx_1 = (idx_1 + 1u)) { + const uint i = (idx_1 / 2u); + const uint i_1 = (idx_1 % 2u); + const uint i_2 = (idx_1 % 1u); + uint atomic_result_2 = 0u; + InterlockedExchange(wg[i][i_1][i_2], 0u, atomic_result_2); + } + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.msl b/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.msl new file mode 100644 index 0000000000..896696e8b0 --- /dev/null +++ b/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.msl @@ -0,0 +1,74 @@ +#include + +using namespace metal; +struct tint_array_wrapper { + uint arr[1]; +}; + +struct tint_array_wrapper_1 { + tint_array_wrapper arr[2]; +}; + +struct tint_array_wrapper_2 { + tint_array_wrapper_1 arr[3]; +}; + +struct tint_array_wrapper_5 { + atomic_uint arr[1]; +}; + +struct tint_array_wrapper_4 { + tint_array_wrapper_5 arr[2]; +}; + +struct tint_array_wrapper_3 { + tint_array_wrapper_4 arr[3]; +}; + +void compute_main_inner(uint local_invocation_index, threadgroup tint_array_wrapper_3* const tint_symbol) { + uint idx = 0u; + idx = local_invocation_index; + while (true) { + uint const x_25 = idx; + if (!((x_25 < 6u))) { + break; + } + uint const x_31 = idx; + uint const x_33 = idx; + uint const x_35 = idx; + atomic_store_explicit(&((*(tint_symbol)).arr[(x_31 / 2u)].arr[(x_33 % 2u)].arr[(x_35 % 1u)]), 0u, memory_order_relaxed); + { + uint const x_42 = idx; + idx = (x_42 + 1u); + } + } + threadgroup_barrier(mem_flags::mem_threadgroup); + atomic_store_explicit(&((*(tint_symbol)).arr[2].arr[1].arr[0]), 1u, memory_order_relaxed); + return; +} + +void compute_main_1(thread uint* const tint_symbol_1, threadgroup tint_array_wrapper_3* const tint_symbol_2) { + uint const x_57 = *(tint_symbol_1); + compute_main_inner(x_57, tint_symbol_2); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup tint_array_wrapper_3* const tint_symbol_3, thread uint* const tint_symbol_4) { + for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 6u); idx_1 = (idx_1 + 1u)) { + uint const i = (idx_1 / 2u); + uint const i_1 = (idx_1 % 2u); + uint const i_2 = (idx_1 % 1u); + atomic_store_explicit(&((*(tint_symbol_3)).arr[i].arr[i_1].arr[i_2]), 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_4) = local_invocation_index_1_param; + compute_main_1(tint_symbol_4, tint_symbol_3); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup tint_array_wrapper_3 tint_symbol_5; + thread uint tint_symbol_6 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_5), &(tint_symbol_6)); + return; +} + diff --git a/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.spvasm b/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.spvasm new file mode 100644 index 0000000000..8091c97689 --- /dev/null +++ b/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.spvasm @@ -0,0 +1,140 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 90 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %wg "wg" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %idx "idx" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %idx_1 "idx_1" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + OpDecorate %_arr_uint_uint_1 ArrayStride 4 + OpDecorate %_arr__arr_uint_uint_1_uint_2 ArrayStride 4 + OpDecorate %_arr__arr__arr_uint_uint_1_uint_2_uint_3 ArrayStride 8 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %uint_1 = OpConstant %uint 1 +%_arr_uint_uint_1 = OpTypeArray %uint %uint_1 + %uint_2 = OpConstant %uint 2 +%_arr__arr_uint_uint_1_uint_2 = OpTypeArray %_arr_uint_uint_1 %uint_2 + %uint_3 = OpConstant %uint 3 +%_arr__arr__arr_uint_uint_1_uint_2_uint_3 = OpTypeArray %_arr__arr_uint_uint_1_uint_2 %uint_3 +%_ptr_Workgroup__arr__arr__arr_uint_uint_1_uint_2_uint_3 = OpTypePointer Workgroup %_arr__arr__arr_uint_uint_1_uint_2_uint_3 + %wg = OpVariable %_ptr_Workgroup__arr__arr__arr_uint_uint_1_uint_2_uint_3 Workgroup + %void = OpTypeVoid + %15 = OpTypeFunction %void %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_6 = OpConstant %uint 6 + %bool = OpTypeBool + %uint_0 = OpConstant %uint 0 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %uint_264 = OpConstant %uint 264 + %int = OpTypeInt 32 1 + %int_2 = OpConstant %int 2 + %int_1 = OpConstant %int 1 + %53 = OpConstantNull %int + %55 = OpTypeFunction %void +%compute_main_inner = OpFunction %void None %15 +%local_invocation_index = OpFunctionParameter %uint + %19 = OpLabel + %idx = OpVariable %_ptr_Function_uint Function %6 + OpStore %idx %6 + OpStore %idx %local_invocation_index + OpBranch %22 + %22 = OpLabel + OpLoopMerge %23 %24 None + OpBranch %25 + %25 = OpLabel + %26 = OpLoad %uint %idx + %29 = OpULessThan %bool %26 %uint_6 + %27 = OpLogicalNot %bool %29 + OpSelectionMerge %31 None + OpBranchConditional %27 %32 %31 + %32 = OpLabel + OpBranch %23 + %31 = OpLabel + %33 = OpLoad %uint %idx + %34 = OpLoad %uint %idx + %35 = OpLoad %uint %idx + %39 = OpUDiv %uint %33 %uint_2 + %40 = OpUMod %uint %34 %uint_2 + %41 = OpUMod %uint %35 %uint_1 + %43 = OpAccessChain %_ptr_Workgroup_uint %wg %39 %40 %41 + OpAtomicStore %43 %uint_2 %uint_0 %6 + OpBranch %24 + %24 = OpLabel + %44 = OpLoad %uint %idx + %45 = OpIAdd %uint %44 %uint_1 + OpStore %idx %45 + OpBranch %22 + %23 = OpLabel + OpControlBarrier %uint_2 %uint_2 %uint_264 + %54 = OpAccessChain %_ptr_Workgroup_uint %wg %int_2 %int_1 %53 + OpAtomicStore %54 %uint_2 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %55 + %57 = OpLabel + %58 = OpLoad %uint %local_invocation_index_1 + %59 = OpFunctionCall %void %compute_main_inner %58 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %15 +%local_invocation_index_1_param = OpFunctionParameter %uint + %62 = OpLabel + %idx_1 = OpVariable %_ptr_Function_uint Function %6 + OpStore %idx_1 %local_invocation_index_1_param + OpBranch %64 + %64 = OpLabel + OpLoopMerge %65 %66 None + OpBranch %67 + %67 = OpLabel + %69 = OpLoad %uint %idx_1 + %70 = OpULessThan %bool %69 %uint_6 + %68 = OpLogicalNot %bool %70 + OpSelectionMerge %71 None + OpBranchConditional %68 %72 %71 + %72 = OpLabel + OpBranch %65 + %71 = OpLabel + %73 = OpLoad %uint %idx_1 + %74 = OpUDiv %uint %73 %uint_2 + %75 = OpLoad %uint %idx_1 + %76 = OpUMod %uint %75 %uint_2 + %77 = OpLoad %uint %idx_1 + %78 = OpUMod %uint %77 %uint_1 + %81 = OpAccessChain %_ptr_Workgroup_uint %wg %74 %76 %78 + OpAtomicStore %81 %uint_2 %uint_0 %6 + OpBranch %66 + %66 = OpLabel + %82 = OpLoad %uint %idx_1 + %83 = OpIAdd %uint %82 %uint_1 + OpStore %idx_1 %83 + OpBranch %64 + %65 = OpLabel + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %85 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %55 + %87 = OpLabel + %89 = OpLoad %uint %local_invocation_index_1_param_1 + %88 = OpFunctionCall %void %compute_main_inner_1 %89 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.wgsl b/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.wgsl new file mode 100644 index 0000000000..2b2b74112c --- /dev/null +++ b/test/tint/builtins/atomicStore/array/aliased_arrays.spvasm.expected.wgsl @@ -0,0 +1,44 @@ +type Arr = array; + +type Arr_1 = array; + +type Arr_2 = array; + +var local_invocation_index_1 : u32; + +var wg : array, 1u>, 2u>, 3u>; + +fn compute_main_inner(local_invocation_index : u32) { + var idx : u32 = 0u; + idx = local_invocation_index; + loop { + let x_25 : u32 = idx; + if (!((x_25 < 6u))) { + break; + } + let x_31 : u32 = idx; + let x_33 : u32 = idx; + let x_35 : u32 = idx; + atomicStore(&(wg[(x_31 / 2u)][(x_33 % 2u)][(x_35 % 1u)]), 0u); + + continuing { + let x_42 : u32 = idx; + idx = (x_42 + 1u); + } + } + workgroupBarrier(); + atomicStore(&(wg[2i][1i][0i]), 1u); + return; +} + +fn compute_main_1() { + let x_57 : u32 = local_invocation_index_1; + compute_main_inner(x_57); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomicStore/array/aliased_arrays.wgsl b/test/tint/builtins/atomicStore/array/aliased_arrays.wgsl new file mode 100644 index 0000000000..0f6f01eafe --- /dev/null +++ b/test/tint/builtins/atomicStore/array/aliased_arrays.wgsl @@ -0,0 +1,11 @@ +type A0 = atomic; +type A1 = array; +type A2 = array; +type A3 = array; + +var wg : A3; + +@compute @workgroup_size(1) +fn compute_main() { + atomicStore(&wg[2][1][0], 1u); +} diff --git a/test/tint/builtins/atomicStore/array/array.spvasm b/test/tint/builtins/atomicStore/array/array.spvasm new file mode 100644 index 0000000000..f41ddf706c --- /dev/null +++ b/test/tint/builtins/atomicStore/array/array.spvasm @@ -0,0 +1,76 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 48 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %wg "wg" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %idx "idx" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + OpDecorate %_arr_uint_uint_4 ArrayStride 4 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %uint_4 = OpConstant %uint 4 +%_arr_uint_uint_4 = OpTypeArray %uint %uint_4 +%_ptr_Workgroup__arr_uint_uint_4 = OpTypePointer Workgroup %_arr_uint_uint_4 + %wg = OpVariable %_ptr_Workgroup__arr_uint_uint_4 Workgroup + %void = OpTypeVoid + %8 = OpTypeFunction %void %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %15 = OpConstantNull %uint + %bool = OpTypeBool + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %uint_1 = OpConstant %uint 1 + %uint_264 = OpConstant %uint 264 + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 + %43 = OpTypeFunction %void +%compute_main_inner = OpFunction %void None %8 +%local_invocation_index = OpFunctionParameter %uint + %12 = OpLabel + %idx = OpVariable %_ptr_Function_uint Function %15 + OpStore %idx %local_invocation_index + OpBranch %16 + %16 = OpLabel + OpLoopMerge %17 %18 None + OpBranch %19 + %19 = OpLabel + %21 = OpLoad %uint %idx + %22 = OpULessThan %bool %21 %uint_4 + %20 = OpLogicalNot %bool %22 + OpSelectionMerge %24 None + OpBranchConditional %20 %25 %24 + %25 = OpLabel + OpBranch %17 + %24 = OpLabel + %26 = OpLoad %uint %idx + %32 = OpAccessChain %_ptr_Workgroup_uint %wg %26 + OpAtomicStore %32 %uint_2 %uint_0 %15 + OpBranch %18 + %18 = OpLabel + %33 = OpLoad %uint %idx + %35 = OpIAdd %uint %33 %uint_1 + OpStore %idx %35 + OpBranch %16 + %17 = OpLabel + OpControlBarrier %uint_2 %uint_2 %uint_264 + %42 = OpAccessChain %_ptr_Workgroup_uint %wg %int_1 + OpAtomicStore %42 %uint_2 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %43 + %45 = OpLabel + %47 = OpLoad %uint %local_invocation_index_1 + %46 = OpFunctionCall %void %compute_main_inner %47 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomicStore/array/array.spvasm.expected.glsl b/test/tint/builtins/atomicStore/array/array.spvasm.expected.glsl new file mode 100644 index 0000000000..a8c2193462 --- /dev/null +++ b/test/tint/builtins/atomicStore/array/array.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint wg[4]; +void compute_main_inner(uint local_invocation_index) { + uint idx = 0u; + idx = local_invocation_index; + { + for(; !(!((idx < 4u))); idx = (idx + 1u)) { + atomicExchange(wg[idx], 0u); + } + } + barrier(); + atomicExchange(wg[1], 1u); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 4u); idx_1 = (idx_1 + 1u)) { + uint i = idx_1; + atomicExchange(wg[i], 0u); + } + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomicStore/array/array.spvasm.expected.hlsl b/test/tint/builtins/atomicStore/array/array.spvasm.expected.hlsl new file mode 100644 index 0000000000..76ff7252cb --- /dev/null +++ b/test/tint/builtins/atomicStore/array/array.spvasm.expected.hlsl @@ -0,0 +1,45 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint wg[4]; + +void compute_main_inner(uint local_invocation_index) { + uint idx = 0u; + idx = local_invocation_index; + { + [loop] for(; !(!((idx < 4u))); idx = (idx + 1u)) { + uint atomic_result = 0u; + InterlockedExchange(wg[idx], 0u, atomic_result); + } + } + GroupMemoryBarrierWithGroupSync(); + uint atomic_result_1 = 0u; + InterlockedExchange(wg[1], 1u, atomic_result_1); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + [loop] for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 4u); idx_1 = (idx_1 + 1u)) { + const uint i = idx_1; + uint atomic_result_2 = 0u; + InterlockedExchange(wg[i], 0u, atomic_result_2); + } + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomicStore/array/array.spvasm.expected.msl b/test/tint/builtins/atomicStore/array/array.spvasm.expected.msl new file mode 100644 index 0000000000..d2ab1ecebf --- /dev/null +++ b/test/tint/builtins/atomicStore/array/array.spvasm.expected.msl @@ -0,0 +1,54 @@ +#include + +using namespace metal; +struct tint_array_wrapper { + uint arr[4]; +}; + +struct tint_array_wrapper_1 { + atomic_uint arr[4]; +}; + +void compute_main_inner(uint local_invocation_index, threadgroup tint_array_wrapper_1* const tint_symbol) { + uint idx = 0u; + idx = local_invocation_index; + while (true) { + uint const x_21 = idx; + if (!((x_21 < 4u))) { + break; + } + uint const x_26 = idx; + atomic_store_explicit(&((*(tint_symbol)).arr[x_26]), 0u, memory_order_relaxed); + { + uint const x_33 = idx; + idx = (x_33 + 1u); + } + } + threadgroup_barrier(mem_flags::mem_threadgroup); + atomic_store_explicit(&((*(tint_symbol)).arr[1]), 1u, memory_order_relaxed); + return; +} + +void compute_main_1(thread uint* const tint_symbol_1, threadgroup tint_array_wrapper_1* const tint_symbol_2) { + uint const x_47 = *(tint_symbol_1); + compute_main_inner(x_47, tint_symbol_2); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup tint_array_wrapper_1* const tint_symbol_3, thread uint* const tint_symbol_4) { + for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 4u); idx_1 = (idx_1 + 1u)) { + uint const i = idx_1; + atomic_store_explicit(&((*(tint_symbol_3)).arr[i]), 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_4) = local_invocation_index_1_param; + compute_main_1(tint_symbol_4, tint_symbol_3); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup tint_array_wrapper_1 tint_symbol_5; + thread uint tint_symbol_6 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_5), &(tint_symbol_6)); + return; +} + diff --git a/test/tint/builtins/atomicStore/array/array.spvasm.expected.spvasm b/test/tint/builtins/atomicStore/array/array.spvasm.expected.spvasm new file mode 100644 index 0000000000..e15c3dbc1a --- /dev/null +++ b/test/tint/builtins/atomicStore/array/array.spvasm.expected.spvasm @@ -0,0 +1,123 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 75 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %wg "wg" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %idx "idx" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %idx_1 "idx_1" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + OpDecorate %_arr_uint_uint_4 ArrayStride 4 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %uint_4 = OpConstant %uint 4 +%_arr_uint_uint_4 = OpTypeArray %uint %uint_4 +%_ptr_Workgroup__arr_uint_uint_4 = OpTypePointer Workgroup %_arr_uint_uint_4 + %wg = OpVariable %_ptr_Workgroup__arr_uint_uint_4 Workgroup + %void = OpTypeVoid + %11 = OpTypeFunction %void %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %bool = OpTypeBool + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %uint_1 = OpConstant %uint 1 + %uint_264 = OpConstant %uint 264 + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 + %45 = OpTypeFunction %void +%compute_main_inner = OpFunction %void None %11 +%local_invocation_index = OpFunctionParameter %uint + %15 = OpLabel + %idx = OpVariable %_ptr_Function_uint Function %6 + OpStore %idx %6 + OpStore %idx %local_invocation_index + OpBranch %18 + %18 = OpLabel + OpLoopMerge %19 %20 None + OpBranch %21 + %21 = OpLabel + %22 = OpLoad %uint %idx + %24 = OpULessThan %bool %22 %uint_4 + %23 = OpLogicalNot %bool %24 + OpSelectionMerge %26 None + OpBranchConditional %23 %27 %26 + %27 = OpLabel + OpBranch %19 + %26 = OpLabel + %28 = OpLoad %uint %idx + %34 = OpAccessChain %_ptr_Workgroup_uint %wg %28 + OpAtomicStore %34 %uint_2 %uint_0 %6 + OpBranch %20 + %20 = OpLabel + %35 = OpLoad %uint %idx + %37 = OpIAdd %uint %35 %uint_1 + OpStore %idx %37 + OpBranch %18 + %19 = OpLabel + OpControlBarrier %uint_2 %uint_2 %uint_264 + %44 = OpAccessChain %_ptr_Workgroup_uint %wg %int_1 + OpAtomicStore %44 %uint_2 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %45 + %47 = OpLabel + %48 = OpLoad %uint %local_invocation_index_1 + %49 = OpFunctionCall %void %compute_main_inner %48 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %11 +%local_invocation_index_1_param = OpFunctionParameter %uint + %52 = OpLabel + %idx_1 = OpVariable %_ptr_Function_uint Function %6 + OpStore %idx_1 %local_invocation_index_1_param + OpBranch %54 + %54 = OpLabel + OpLoopMerge %55 %56 None + OpBranch %57 + %57 = OpLabel + %59 = OpLoad %uint %idx_1 + %60 = OpULessThan %bool %59 %uint_4 + %58 = OpLogicalNot %bool %60 + OpSelectionMerge %61 None + OpBranchConditional %58 %62 %61 + %62 = OpLabel + OpBranch %55 + %61 = OpLabel + %63 = OpLoad %uint %idx_1 + %66 = OpAccessChain %_ptr_Workgroup_uint %wg %63 + OpAtomicStore %66 %uint_2 %uint_0 %6 + OpBranch %56 + %56 = OpLabel + %67 = OpLoad %uint %idx_1 + %68 = OpIAdd %uint %67 %uint_1 + OpStore %idx_1 %68 + OpBranch %54 + %55 = OpLabel + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %70 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %45 + %72 = OpLabel + %74 = OpLoad %uint %local_invocation_index_1_param_1 + %73 = OpFunctionCall %void %compute_main_inner_1 %74 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomicStore/array/array.spvasm.expected.wgsl b/test/tint/builtins/atomicStore/array/array.spvasm.expected.wgsl new file mode 100644 index 0000000000..c5971736e2 --- /dev/null +++ b/test/tint/builtins/atomicStore/array/array.spvasm.expected.wgsl @@ -0,0 +1,38 @@ +type Arr = array; + +var local_invocation_index_1 : u32; + +var wg : array, 4u>; + +fn compute_main_inner(local_invocation_index : u32) { + var idx : u32 = 0u; + idx = local_invocation_index; + loop { + let x_21 : u32 = idx; + if (!((x_21 < 4u))) { + break; + } + let x_26 : u32 = idx; + atomicStore(&(wg[x_26]), 0u); + + continuing { + let x_33 : u32 = idx; + idx = (x_33 + 1u); + } + } + workgroupBarrier(); + atomicStore(&(wg[1i]), 1u); + return; +} + +fn compute_main_1() { + let x_47 : u32 = local_invocation_index_1; + compute_main_inner(x_47); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomicStore/array/array.wgsl b/test/tint/builtins/atomicStore/array/array.wgsl new file mode 100644 index 0000000000..430207a34c --- /dev/null +++ b/test/tint/builtins/atomicStore/array/array.wgsl @@ -0,0 +1,6 @@ +var wg : array, 4>; + +@compute @workgroup_size(1) +fn compute_main() { + atomicStore(&wg[1], 1u); +} diff --git a/test/tint/builtins/atomicStore/array/arrays.spvasm b/test/tint/builtins/atomicStore/array/arrays.spvasm new file mode 100644 index 0000000000..0dbd964435 --- /dev/null +++ b/test/tint/builtins/atomicStore/array/arrays.spvasm @@ -0,0 +1,88 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 58 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %wg "wg" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %idx "idx" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + OpDecorate %_arr_uint_uint_1 ArrayStride 4 + OpDecorate %_arr__arr_uint_uint_1_uint_2 ArrayStride 4 + OpDecorate %_arr__arr__arr_uint_uint_1_uint_2_uint_3 ArrayStride 8 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %uint_1 = OpConstant %uint 1 +%_arr_uint_uint_1 = OpTypeArray %uint %uint_1 + %uint_2 = OpConstant %uint 2 +%_arr__arr_uint_uint_1_uint_2 = OpTypeArray %_arr_uint_uint_1 %uint_2 + %uint_3 = OpConstant %uint 3 +%_arr__arr__arr_uint_uint_1_uint_2_uint_3 = OpTypeArray %_arr__arr_uint_uint_1_uint_2 %uint_3 +%_ptr_Workgroup__arr__arr__arr_uint_uint_1_uint_2_uint_3 = OpTypePointer Workgroup %_arr__arr__arr_uint_uint_1_uint_2_uint_3 + %wg = OpVariable %_ptr_Workgroup__arr__arr__arr_uint_uint_1_uint_2_uint_3 Workgroup + %void = OpTypeVoid + %12 = OpTypeFunction %void %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %19 = OpConstantNull %uint + %uint_6 = OpConstant %uint 6 + %bool = OpTypeBool + %uint_0 = OpConstant %uint 0 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %uint_264 = OpConstant %uint 264 + %int = OpTypeInt 32 1 + %int_2 = OpConstant %int 2 + %int_1 = OpConstant %int 1 + %51 = OpConstantNull %int + %53 = OpTypeFunction %void +%compute_main_inner = OpFunction %void None %12 +%local_invocation_index = OpFunctionParameter %uint + %16 = OpLabel + %idx = OpVariable %_ptr_Function_uint Function %19 + OpStore %idx %local_invocation_index + OpBranch %20 + %20 = OpLabel + OpLoopMerge %21 %22 None + OpBranch %23 + %23 = OpLabel + %25 = OpLoad %uint %idx + %27 = OpULessThan %bool %25 %uint_6 + %24 = OpLogicalNot %bool %27 + OpSelectionMerge %29 None + OpBranchConditional %24 %30 %29 + %30 = OpLabel + OpBranch %21 + %29 = OpLabel + %31 = OpLoad %uint %idx + %32 = OpUDiv %uint %31 %uint_2 + %33 = OpLoad %uint %idx + %34 = OpUMod %uint %33 %uint_2 + %35 = OpLoad %uint %idx + %36 = OpUMod %uint %35 %uint_1 + %41 = OpAccessChain %_ptr_Workgroup_uint %wg %32 %34 %36 + OpAtomicStore %41 %uint_2 %uint_0 %19 + OpBranch %22 + %22 = OpLabel + %42 = OpLoad %uint %idx + %43 = OpIAdd %uint %42 %uint_1 + OpStore %idx %43 + OpBranch %20 + %21 = OpLabel + OpControlBarrier %uint_2 %uint_2 %uint_264 + %52 = OpAccessChain %_ptr_Workgroup_uint %wg %int_2 %int_1 %51 + OpAtomicStore %52 %uint_2 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %53 + %55 = OpLabel + %57 = OpLoad %uint %local_invocation_index_1 + %56 = OpFunctionCall %void %compute_main_inner %57 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.glsl b/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.glsl new file mode 100644 index 0000000000..4cdd505b1a --- /dev/null +++ b/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.glsl @@ -0,0 +1,41 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint wg[3][2][1]; +void compute_main_inner(uint local_invocation_index) { + uint idx = 0u; + idx = local_invocation_index; + { + for(; !(!((idx < 6u))); idx = (idx + 1u)) { + atomicExchange(wg[(idx / 2u)][(idx % 2u)][(idx % 1u)], 0u); + } + } + barrier(); + atomicExchange(wg[2][1][0], 1u); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 6u); idx_1 = (idx_1 + 1u)) { + uint i = (idx_1 / 2u); + uint i_1 = (idx_1 % 2u); + uint i_2 = (idx_1 % 1u); + atomicExchange(wg[i][i_1][i_2], 0u); + } + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.hlsl b/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.hlsl new file mode 100644 index 0000000000..16f5d2e59f --- /dev/null +++ b/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.hlsl @@ -0,0 +1,47 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint wg[3][2][1]; + +void compute_main_inner(uint local_invocation_index) { + uint idx = 0u; + idx = local_invocation_index; + { + [loop] for(; !(!((idx < 6u))); idx = (idx + 1u)) { + uint atomic_result = 0u; + InterlockedExchange(wg[(idx / 2u)][(idx % 2u)][(idx % 1u)], 0u, atomic_result); + } + } + GroupMemoryBarrierWithGroupSync(); + uint atomic_result_1 = 0u; + InterlockedExchange(wg[2][1][0], 1u, atomic_result_1); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + [loop] for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 6u); idx_1 = (idx_1 + 1u)) { + const uint i = (idx_1 / 2u); + const uint i_1 = (idx_1 % 2u); + const uint i_2 = (idx_1 % 1u); + uint atomic_result_2 = 0u; + InterlockedExchange(wg[i][i_1][i_2], 0u, atomic_result_2); + } + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.msl b/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.msl new file mode 100644 index 0000000000..896696e8b0 --- /dev/null +++ b/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.msl @@ -0,0 +1,74 @@ +#include + +using namespace metal; +struct tint_array_wrapper { + uint arr[1]; +}; + +struct tint_array_wrapper_1 { + tint_array_wrapper arr[2]; +}; + +struct tint_array_wrapper_2 { + tint_array_wrapper_1 arr[3]; +}; + +struct tint_array_wrapper_5 { + atomic_uint arr[1]; +}; + +struct tint_array_wrapper_4 { + tint_array_wrapper_5 arr[2]; +}; + +struct tint_array_wrapper_3 { + tint_array_wrapper_4 arr[3]; +}; + +void compute_main_inner(uint local_invocation_index, threadgroup tint_array_wrapper_3* const tint_symbol) { + uint idx = 0u; + idx = local_invocation_index; + while (true) { + uint const x_25 = idx; + if (!((x_25 < 6u))) { + break; + } + uint const x_31 = idx; + uint const x_33 = idx; + uint const x_35 = idx; + atomic_store_explicit(&((*(tint_symbol)).arr[(x_31 / 2u)].arr[(x_33 % 2u)].arr[(x_35 % 1u)]), 0u, memory_order_relaxed); + { + uint const x_42 = idx; + idx = (x_42 + 1u); + } + } + threadgroup_barrier(mem_flags::mem_threadgroup); + atomic_store_explicit(&((*(tint_symbol)).arr[2].arr[1].arr[0]), 1u, memory_order_relaxed); + return; +} + +void compute_main_1(thread uint* const tint_symbol_1, threadgroup tint_array_wrapper_3* const tint_symbol_2) { + uint const x_57 = *(tint_symbol_1); + compute_main_inner(x_57, tint_symbol_2); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup tint_array_wrapper_3* const tint_symbol_3, thread uint* const tint_symbol_4) { + for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 6u); idx_1 = (idx_1 + 1u)) { + uint const i = (idx_1 / 2u); + uint const i_1 = (idx_1 % 2u); + uint const i_2 = (idx_1 % 1u); + atomic_store_explicit(&((*(tint_symbol_3)).arr[i].arr[i_1].arr[i_2]), 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_4) = local_invocation_index_1_param; + compute_main_1(tint_symbol_4, tint_symbol_3); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup tint_array_wrapper_3 tint_symbol_5; + thread uint tint_symbol_6 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_5), &(tint_symbol_6)); + return; +} + diff --git a/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.spvasm b/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.spvasm new file mode 100644 index 0000000000..8091c97689 --- /dev/null +++ b/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.spvasm @@ -0,0 +1,140 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 90 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %wg "wg" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %idx "idx" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %idx_1 "idx_1" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + OpDecorate %_arr_uint_uint_1 ArrayStride 4 + OpDecorate %_arr__arr_uint_uint_1_uint_2 ArrayStride 4 + OpDecorate %_arr__arr__arr_uint_uint_1_uint_2_uint_3 ArrayStride 8 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %uint_1 = OpConstant %uint 1 +%_arr_uint_uint_1 = OpTypeArray %uint %uint_1 + %uint_2 = OpConstant %uint 2 +%_arr__arr_uint_uint_1_uint_2 = OpTypeArray %_arr_uint_uint_1 %uint_2 + %uint_3 = OpConstant %uint 3 +%_arr__arr__arr_uint_uint_1_uint_2_uint_3 = OpTypeArray %_arr__arr_uint_uint_1_uint_2 %uint_3 +%_ptr_Workgroup__arr__arr__arr_uint_uint_1_uint_2_uint_3 = OpTypePointer Workgroup %_arr__arr__arr_uint_uint_1_uint_2_uint_3 + %wg = OpVariable %_ptr_Workgroup__arr__arr__arr_uint_uint_1_uint_2_uint_3 Workgroup + %void = OpTypeVoid + %15 = OpTypeFunction %void %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_6 = OpConstant %uint 6 + %bool = OpTypeBool + %uint_0 = OpConstant %uint 0 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %uint_264 = OpConstant %uint 264 + %int = OpTypeInt 32 1 + %int_2 = OpConstant %int 2 + %int_1 = OpConstant %int 1 + %53 = OpConstantNull %int + %55 = OpTypeFunction %void +%compute_main_inner = OpFunction %void None %15 +%local_invocation_index = OpFunctionParameter %uint + %19 = OpLabel + %idx = OpVariable %_ptr_Function_uint Function %6 + OpStore %idx %6 + OpStore %idx %local_invocation_index + OpBranch %22 + %22 = OpLabel + OpLoopMerge %23 %24 None + OpBranch %25 + %25 = OpLabel + %26 = OpLoad %uint %idx + %29 = OpULessThan %bool %26 %uint_6 + %27 = OpLogicalNot %bool %29 + OpSelectionMerge %31 None + OpBranchConditional %27 %32 %31 + %32 = OpLabel + OpBranch %23 + %31 = OpLabel + %33 = OpLoad %uint %idx + %34 = OpLoad %uint %idx + %35 = OpLoad %uint %idx + %39 = OpUDiv %uint %33 %uint_2 + %40 = OpUMod %uint %34 %uint_2 + %41 = OpUMod %uint %35 %uint_1 + %43 = OpAccessChain %_ptr_Workgroup_uint %wg %39 %40 %41 + OpAtomicStore %43 %uint_2 %uint_0 %6 + OpBranch %24 + %24 = OpLabel + %44 = OpLoad %uint %idx + %45 = OpIAdd %uint %44 %uint_1 + OpStore %idx %45 + OpBranch %22 + %23 = OpLabel + OpControlBarrier %uint_2 %uint_2 %uint_264 + %54 = OpAccessChain %_ptr_Workgroup_uint %wg %int_2 %int_1 %53 + OpAtomicStore %54 %uint_2 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %55 + %57 = OpLabel + %58 = OpLoad %uint %local_invocation_index_1 + %59 = OpFunctionCall %void %compute_main_inner %58 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %15 +%local_invocation_index_1_param = OpFunctionParameter %uint + %62 = OpLabel + %idx_1 = OpVariable %_ptr_Function_uint Function %6 + OpStore %idx_1 %local_invocation_index_1_param + OpBranch %64 + %64 = OpLabel + OpLoopMerge %65 %66 None + OpBranch %67 + %67 = OpLabel + %69 = OpLoad %uint %idx_1 + %70 = OpULessThan %bool %69 %uint_6 + %68 = OpLogicalNot %bool %70 + OpSelectionMerge %71 None + OpBranchConditional %68 %72 %71 + %72 = OpLabel + OpBranch %65 + %71 = OpLabel + %73 = OpLoad %uint %idx_1 + %74 = OpUDiv %uint %73 %uint_2 + %75 = OpLoad %uint %idx_1 + %76 = OpUMod %uint %75 %uint_2 + %77 = OpLoad %uint %idx_1 + %78 = OpUMod %uint %77 %uint_1 + %81 = OpAccessChain %_ptr_Workgroup_uint %wg %74 %76 %78 + OpAtomicStore %81 %uint_2 %uint_0 %6 + OpBranch %66 + %66 = OpLabel + %82 = OpLoad %uint %idx_1 + %83 = OpIAdd %uint %82 %uint_1 + OpStore %idx_1 %83 + OpBranch %64 + %65 = OpLabel + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %85 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %55 + %87 = OpLabel + %89 = OpLoad %uint %local_invocation_index_1_param_1 + %88 = OpFunctionCall %void %compute_main_inner_1 %89 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.wgsl b/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.wgsl new file mode 100644 index 0000000000..2b2b74112c --- /dev/null +++ b/test/tint/builtins/atomicStore/array/arrays.spvasm.expected.wgsl @@ -0,0 +1,44 @@ +type Arr = array; + +type Arr_1 = array; + +type Arr_2 = array; + +var local_invocation_index_1 : u32; + +var wg : array, 1u>, 2u>, 3u>; + +fn compute_main_inner(local_invocation_index : u32) { + var idx : u32 = 0u; + idx = local_invocation_index; + loop { + let x_25 : u32 = idx; + if (!((x_25 < 6u))) { + break; + } + let x_31 : u32 = idx; + let x_33 : u32 = idx; + let x_35 : u32 = idx; + atomicStore(&(wg[(x_31 / 2u)][(x_33 % 2u)][(x_35 % 1u)]), 0u); + + continuing { + let x_42 : u32 = idx; + idx = (x_42 + 1u); + } + } + workgroupBarrier(); + atomicStore(&(wg[2i][1i][0i]), 1u); + return; +} + +fn compute_main_1() { + let x_57 : u32 = local_invocation_index_1; + compute_main_inner(x_57); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomicStore/array/arrays.wgsl b/test/tint/builtins/atomicStore/array/arrays.wgsl new file mode 100644 index 0000000000..3415c58630 --- /dev/null +++ b/test/tint/builtins/atomicStore/array/arrays.wgsl @@ -0,0 +1,6 @@ +var wg : array, 1>, 2>, 3>; + +@compute @workgroup_size(1) +fn compute_main() { + atomicStore(&wg[2][1][0], 1u); +} diff --git a/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm b/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm new file mode 100644 index 0000000000..b9e0fed8f4 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm @@ -0,0 +1,91 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 54 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %S "S" + OpMemberName %S 0 "x" + OpMemberName %S 1 "a" + OpMemberName %S 2 "y" + OpName %wg "wg" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %idx "idx" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %S 0 Offset 0 + OpMemberDecorate %S 1 Offset 4 + OpMemberDecorate %S 2 Offset 8 + OpDecorate %_arr_S_uint_10 ArrayStride 12 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 + %S = OpTypeStruct %int %uint %uint + %uint_10 = OpConstant %uint 10 +%_arr_S_uint_10 = OpTypeArray %S %uint_10 +%_ptr_Workgroup__arr_S_uint_10 = OpTypePointer Workgroup %_arr_S_uint_10 + %wg = OpVariable %_ptr_Workgroup__arr_S_uint_10 Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint + %bool = OpTypeBool + %uint_0 = OpConstant %uint 0 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %32 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 + %uint_1 = OpConstant %uint 1 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint +%_ptr_Workgroup_uint_0 = OpTypePointer Workgroup %uint + %uint_264 = OpConstant %uint 264 + %int_4 = OpConstant %int 4 + %49 = OpTypeFunction %void +%compute_main_inner = OpFunction %void None %10 +%local_invocation_index = OpFunctionParameter %uint + %14 = OpLabel + %idx = OpVariable %_ptr_Function_uint Function %17 + OpStore %idx %local_invocation_index + OpBranch %18 + %18 = OpLabel + OpLoopMerge %19 %20 None + OpBranch %21 + %21 = OpLabel + %23 = OpLoad %uint %idx + %24 = OpULessThan %bool %23 %uint_10 + %22 = OpLogicalNot %bool %24 + OpSelectionMerge %26 None + OpBranchConditional %22 %27 %26 + %27 = OpLabel + OpBranch %19 + %26 = OpLabel + %28 = OpLoad %uint %idx + %31 = OpAccessChain %_ptr_Workgroup_int %wg %28 %uint_0 + OpStore %31 %32 + %38 = OpAccessChain %_ptr_Workgroup_uint %wg %28 %uint_1 + OpAtomicStore %38 %uint_2 %uint_0 %17 + %40 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %28 %uint_2 + OpStore %40 %17 + OpBranch %20 + %20 = OpLabel + %41 = OpLoad %uint %idx + %42 = OpIAdd %uint %41 %uint_1 + OpStore %idx %42 + OpBranch %18 + %19 = OpLabel + OpControlBarrier %uint_2 %uint_2 %uint_264 + %48 = OpAccessChain %_ptr_Workgroup_uint %wg %int_4 %uint_1 + OpAtomicStore %48 %uint_2 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %49 + %51 = OpLabel + %53 = OpLoad %uint %local_invocation_index_1 + %52 = OpFunctionCall %void %compute_main_inner %53 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.glsl b/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.glsl new file mode 100644 index 0000000000..4f23cb92d7 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.glsl @@ -0,0 +1,56 @@ +#version 310 es + +struct S_atomic { + int x; + uint a; + uint y; +}; + +struct S { + int x; + uint a; + uint y; +}; + +uint local_invocation_index_1 = 0u; +shared S_atomic wg[10]; +void compute_main_inner(uint local_invocation_index) { + uint idx = 0u; + idx = local_invocation_index; + { + for(; !(!((idx < 10u))); idx = (idx + 1u)) { + uint x_28 = idx; + wg[x_28].x = 0; + atomicExchange(wg[x_28].a, 0u); + wg[x_28].y = 0u; + } + } + barrier(); + atomicExchange(wg[4].a, 1u); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 10u); idx_1 = (idx_1 + 1u)) { + uint i = idx_1; + wg[i].x = 0; + atomicExchange(wg[i].a, 0u); + wg[i].y = 0u; + } + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.hlsl b/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.hlsl new file mode 100644 index 0000000000..9d31dd1592 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.hlsl @@ -0,0 +1,56 @@ +struct S_atomic { + int x; + uint a; + uint y; +}; + +static uint local_invocation_index_1 = 0u; +groupshared S_atomic wg[10]; + +void compute_main_inner(uint local_invocation_index) { + uint idx = 0u; + idx = local_invocation_index; + { + [loop] for(; !(!((idx < 10u))); idx = (idx + 1u)) { + const uint x_28 = idx; + wg[x_28].x = 0; + uint atomic_result = 0u; + InterlockedExchange(wg[x_28].a, 0u, atomic_result); + wg[x_28].y = 0u; + } + } + GroupMemoryBarrierWithGroupSync(); + uint atomic_result_1 = 0u; + InterlockedExchange(wg[4].a, 1u, atomic_result_1); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + [loop] for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 10u); idx_1 = (idx_1 + 1u)) { + const uint i = idx_1; + wg[i].x = 0; + uint atomic_result_2 = 0u; + InterlockedExchange(wg[i].a, 0u, atomic_result_2); + wg[i].y = 0u; + } + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.msl b/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.msl new file mode 100644 index 0000000000..5360fda067 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.msl @@ -0,0 +1,70 @@ +#include + +using namespace metal; +struct S_atomic { + int x; + atomic_uint a; + uint y; +}; + +struct S { + int x; + uint a; + uint y; +}; + +struct tint_array_wrapper { + S arr[10]; +}; + +struct tint_array_wrapper_1 { + S_atomic arr[10]; +}; + +void compute_main_inner(uint local_invocation_index, threadgroup tint_array_wrapper_1* const tint_symbol) { + uint idx = 0u; + idx = local_invocation_index; + while (true) { + uint const x_23 = idx; + if (!((x_23 < 10u))) { + break; + } + uint const x_28 = idx; + (*(tint_symbol)).arr[x_28].x = 0; + atomic_store_explicit(&((*(tint_symbol)).arr[x_28].a), 0u, memory_order_relaxed); + (*(tint_symbol)).arr[x_28].y = 0u; + { + uint const x_41 = idx; + idx = (x_41 + 1u); + } + } + threadgroup_barrier(mem_flags::mem_threadgroup); + atomic_store_explicit(&((*(tint_symbol)).arr[4].a), 1u, memory_order_relaxed); + return; +} + +void compute_main_1(thread uint* const tint_symbol_1, threadgroup tint_array_wrapper_1* const tint_symbol_2) { + uint const x_53 = *(tint_symbol_1); + compute_main_inner(x_53, tint_symbol_2); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup tint_array_wrapper_1* const tint_symbol_3, thread uint* const tint_symbol_4) { + for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 10u); idx_1 = (idx_1 + 1u)) { + uint const i = idx_1; + (*(tint_symbol_3)).arr[i].x = 0; + atomic_store_explicit(&((*(tint_symbol_3)).arr[i].a), 0u, memory_order_relaxed); + (*(tint_symbol_3)).arr[i].y = 0u; + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_4) = local_invocation_index_1_param; + compute_main_1(tint_symbol_4, tint_symbol_3); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup tint_array_wrapper_1 tint_symbol_5; + thread uint tint_symbol_6 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_5), &(tint_symbol_6)); + return; +} + diff --git a/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.spvasm b/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.spvasm new file mode 100644 index 0000000000..b25f900d0e --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.spvasm @@ -0,0 +1,142 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 83 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %S_atomic "S_atomic" + OpMemberName %S_atomic 0 "x" + OpMemberName %S_atomic 1 "a" + OpMemberName %S_atomic 2 "y" + OpName %wg "wg" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %idx "idx" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %idx_1 "idx_1" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %S_atomic 0 Offset 0 + OpMemberDecorate %S_atomic 1 Offset 4 + OpMemberDecorate %S_atomic 2 Offset 8 + OpDecorate %_arr_S_atomic_uint_10 ArrayStride 12 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 + %S_atomic = OpTypeStruct %int %uint %uint + %uint_10 = OpConstant %uint 10 +%_arr_S_atomic_uint_10 = OpTypeArray %S_atomic %uint_10 +%_ptr_Workgroup__arr_S_atomic_uint_10 = OpTypePointer Workgroup %_arr_S_atomic_uint_10 + %wg = OpVariable %_ptr_Workgroup__arr_S_atomic_uint_10 Workgroup + %void = OpTypeVoid + %13 = OpTypeFunction %void %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %bool = OpTypeBool + %uint_0 = OpConstant %uint 0 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %34 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 + %uint_1 = OpConstant %uint 1 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint +%_ptr_Workgroup_uint_0 = OpTypePointer Workgroup %uint + %uint_264 = OpConstant %uint 264 + %int_4 = OpConstant %int 4 + %51 = OpTypeFunction %void +%compute_main_inner = OpFunction %void None %13 +%local_invocation_index = OpFunctionParameter %uint + %17 = OpLabel + %idx = OpVariable %_ptr_Function_uint Function %6 + OpStore %idx %6 + OpStore %idx %local_invocation_index + OpBranch %20 + %20 = OpLabel + OpLoopMerge %21 %22 None + OpBranch %23 + %23 = OpLabel + %24 = OpLoad %uint %idx + %26 = OpULessThan %bool %24 %uint_10 + %25 = OpLogicalNot %bool %26 + OpSelectionMerge %28 None + OpBranchConditional %25 %29 %28 + %29 = OpLabel + OpBranch %21 + %28 = OpLabel + %30 = OpLoad %uint %idx + %33 = OpAccessChain %_ptr_Workgroup_int %wg %30 %uint_0 + OpStore %33 %34 + %40 = OpAccessChain %_ptr_Workgroup_uint %wg %30 %uint_1 + OpAtomicStore %40 %uint_2 %uint_0 %6 + %42 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %30 %uint_2 + OpStore %42 %6 + OpBranch %22 + %22 = OpLabel + %43 = OpLoad %uint %idx + %44 = OpIAdd %uint %43 %uint_1 + OpStore %idx %44 + OpBranch %20 + %21 = OpLabel + OpControlBarrier %uint_2 %uint_2 %uint_264 + %50 = OpAccessChain %_ptr_Workgroup_uint %wg %int_4 %uint_1 + OpAtomicStore %50 %uint_2 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %51 + %53 = OpLabel + %54 = OpLoad %uint %local_invocation_index_1 + %55 = OpFunctionCall %void %compute_main_inner %54 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %13 +%local_invocation_index_1_param = OpFunctionParameter %uint + %58 = OpLabel + %idx_1 = OpVariable %_ptr_Function_uint Function %6 + OpStore %idx_1 %local_invocation_index_1_param + OpBranch %60 + %60 = OpLabel + OpLoopMerge %61 %62 None + OpBranch %63 + %63 = OpLabel + %65 = OpLoad %uint %idx_1 + %66 = OpULessThan %bool %65 %uint_10 + %64 = OpLogicalNot %bool %66 + OpSelectionMerge %67 None + OpBranchConditional %64 %68 %67 + %68 = OpLabel + OpBranch %61 + %67 = OpLabel + %69 = OpLoad %uint %idx_1 + %70 = OpAccessChain %_ptr_Workgroup_int %wg %69 %uint_0 + OpStore %70 %34 + %73 = OpAccessChain %_ptr_Workgroup_uint %wg %69 %uint_1 + OpAtomicStore %73 %uint_2 %uint_0 %6 + %74 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %69 %uint_2 + OpStore %74 %6 + OpBranch %62 + %62 = OpLabel + %75 = OpLoad %uint %idx_1 + %76 = OpIAdd %uint %75 %uint_1 + OpStore %idx_1 %76 + OpBranch %60 + %61 = OpLabel + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %78 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %51 + %80 = OpLabel + %82 = OpLoad %uint %local_invocation_index_1_param_1 + %81 = OpFunctionCall %void %compute_main_inner_1 %82 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.wgsl b/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.wgsl new file mode 100644 index 0000000000..de42f484ca --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/array_of_struct.spvasm.expected.wgsl @@ -0,0 +1,52 @@ +struct S_atomic { + x : i32, + a : atomic, + y : u32, +} + +struct S { + x : i32, + a : u32, + y : u32, +} + +type Arr = array; + +var local_invocation_index_1 : u32; + +var wg : array; + +fn compute_main_inner(local_invocation_index : u32) { + var idx : u32 = 0u; + idx = local_invocation_index; + loop { + let x_23 : u32 = idx; + if (!((x_23 < 10u))) { + break; + } + let x_28 : u32 = idx; + wg[x_28].x = 0i; + atomicStore(&(wg[x_28].a), 0u); + wg[x_28].y = 0u; + + continuing { + let x_41 : u32 = idx; + idx = (x_41 + 1u); + } + } + workgroupBarrier(); + atomicStore(&(wg[4i].a), 1u); + return; +} + +fn compute_main_1() { + let x_53 : u32 = local_invocation_index_1; + compute_main_inner(x_53); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomicStore/struct/array_of_struct.wgsl b/test/tint/builtins/atomicStore/struct/array_of_struct.wgsl new file mode 100644 index 0000000000..d49a3fd542 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/array_of_struct.wgsl @@ -0,0 +1,12 @@ +struct S { + x : i32, + a : atomic, + y : u32, +}; + +var wg : array; + +@compute @workgroup_size(1) +fn compute_main() { + atomicStore(&wg[4].a, 1u); +} diff --git a/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm b/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm new file mode 100644 index 0000000000..f61269c96a --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm @@ -0,0 +1,62 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 40 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %S "S" + OpMemberName %S 0 "x" + OpMemberName %S 1 "a" + OpMemberName %S 2 "b" + OpName %wg "wg" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %S 0 Offset 0 + OpMemberDecorate %S 1 Offset 4 + OpMemberDecorate %S 2 Offset 8 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 + %S = OpTypeStruct %int %uint %uint +%_ptr_Workgroup_S = OpTypePointer Workgroup %S + %wg = OpVariable %_ptr_Workgroup_S Workgroup + %void = OpTypeVoid + %8 = OpTypeFunction %void %uint + %uint_0 = OpConstant %uint 0 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %16 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 + %uint_1 = OpConstant %uint 1 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %23 = OpConstantNull %uint + %uint_264 = OpConstant %uint 264 + %35 = OpTypeFunction %void +%compute_main_inner = OpFunction %void None %8 +%local_invocation_index = OpFunctionParameter %uint + %12 = OpLabel + %15 = OpAccessChain %_ptr_Workgroup_int %wg %uint_0 + OpStore %15 %16 + %22 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_1 + OpAtomicStore %22 %uint_2 %uint_0 %23 + %26 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_2 + OpAtomicStore %26 %uint_2 %uint_0 %23 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %31 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_1 + OpAtomicStore %31 %uint_2 %uint_0 %uint_1 + %34 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_2 + OpAtomicStore %34 %uint_2 %uint_0 %uint_2 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %35 + %37 = OpLabel + %39 = OpLoad %uint %local_invocation_index_1 + %38 = OpFunctionCall %void %compute_main_inner %39 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.glsl b/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.glsl new file mode 100644 index 0000000000..4d0836e37c --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.glsl @@ -0,0 +1,47 @@ +#version 310 es + +struct S_atomic { + int x; + uint a; + uint b; +}; + +struct S { + int x; + uint a; + uint b; +}; + +uint local_invocation_index_1 = 0u; +shared S_atomic wg; +void compute_main_inner(uint local_invocation_index) { + wg.x = 0; + atomicExchange(wg.a, 0u); + atomicExchange(wg.b, 0u); + barrier(); + atomicExchange(wg.a, 1u); + atomicExchange(wg.b, 2u); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + wg.x = 0; + atomicExchange(wg.a, 0u); + atomicExchange(wg.b, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.hlsl b/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.hlsl new file mode 100644 index 0000000000..cb340f21e8 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.hlsl @@ -0,0 +1,50 @@ +struct S_atomic { + int x; + uint a; + uint b; +}; + +static uint local_invocation_index_1 = 0u; +groupshared S_atomic wg; + +void compute_main_inner(uint local_invocation_index) { + wg.x = 0; + uint atomic_result = 0u; + InterlockedExchange(wg.a, 0u, atomic_result); + uint atomic_result_1 = 0u; + InterlockedExchange(wg.b, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + uint atomic_result_2 = 0u; + InterlockedExchange(wg.a, 1u, atomic_result_2); + uint atomic_result_3 = 0u; + InterlockedExchange(wg.b, 2u, atomic_result_3); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + wg.x = 0; + uint atomic_result_4 = 0u; + InterlockedExchange(wg.a, 0u, atomic_result_4); + uint atomic_result_5 = 0u; + InterlockedExchange(wg.b, 0u, atomic_result_5); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.msl b/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.msl new file mode 100644 index 0000000000..4e1363de46 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.msl @@ -0,0 +1,49 @@ +#include + +using namespace metal; +struct S_atomic { + int x; + atomic_uint a; + atomic_uint b; +}; + +struct S { + int x; + uint a; + uint b; +}; + +void compute_main_inner(uint local_invocation_index, threadgroup S_atomic* const tint_symbol) { + (*(tint_symbol)).x = 0; + atomic_store_explicit(&((*(tint_symbol)).a), 0u, memory_order_relaxed); + atomic_store_explicit(&((*(tint_symbol)).b), 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomic_store_explicit(&((*(tint_symbol)).a), 1u, memory_order_relaxed); + atomic_store_explicit(&((*(tint_symbol)).b), 2u, memory_order_relaxed); + return; +} + +void compute_main_1(thread uint* const tint_symbol_1, threadgroup S_atomic* const tint_symbol_2) { + uint const x_39 = *(tint_symbol_1); + compute_main_inner(x_39, tint_symbol_2); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup S_atomic* const tint_symbol_3, thread uint* const tint_symbol_4) { + { + (*(tint_symbol_3)).x = 0; + atomic_store_explicit(&((*(tint_symbol_3)).a), 0u, memory_order_relaxed); + atomic_store_explicit(&((*(tint_symbol_3)).b), 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_4) = local_invocation_index_1_param; + compute_main_1(tint_symbol_4, tint_symbol_3); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup S_atomic tint_symbol_5; + thread uint tint_symbol_6 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_5), &(tint_symbol_6)); + return; +} + diff --git a/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.spvasm b/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.spvasm new file mode 100644 index 0000000000..5ee475d00d --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.spvasm @@ -0,0 +1,88 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 58 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %S_atomic "S_atomic" + OpMemberName %S_atomic 0 "x" + OpMemberName %S_atomic 1 "a" + OpMemberName %S_atomic 2 "b" + OpName %wg "wg" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %S_atomic 0 Offset 0 + OpMemberDecorate %S_atomic 1 Offset 4 + OpMemberDecorate %S_atomic 2 Offset 8 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 + %S_atomic = OpTypeStruct %int %uint %uint +%_ptr_Workgroup_S_atomic = OpTypePointer Workgroup %S_atomic + %wg = OpVariable %_ptr_Workgroup_S_atomic Workgroup + %void = OpTypeVoid + %11 = OpTypeFunction %void %uint + %uint_0 = OpConstant %uint 0 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %19 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 + %uint_1 = OpConstant %uint 1 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %uint_264 = OpConstant %uint 264 + %37 = OpTypeFunction %void +%compute_main_inner = OpFunction %void None %11 +%local_invocation_index = OpFunctionParameter %uint + %15 = OpLabel + %18 = OpAccessChain %_ptr_Workgroup_int %wg %uint_0 + OpStore %18 %19 + %25 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_1 + OpAtomicStore %25 %uint_2 %uint_0 %6 + %28 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_2 + OpAtomicStore %28 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %33 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_1 + OpAtomicStore %33 %uint_2 %uint_0 %uint_1 + %36 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_2 + OpAtomicStore %36 %uint_2 %uint_0 %uint_2 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %37 + %39 = OpLabel + %40 = OpLoad %uint %local_invocation_index_1 + %41 = OpFunctionCall %void %compute_main_inner %40 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %11 +%local_invocation_index_1_param = OpFunctionParameter %uint + %44 = OpLabel + %45 = OpAccessChain %_ptr_Workgroup_int %wg %uint_0 + OpStore %45 %19 + %48 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_1 + OpAtomicStore %48 %uint_2 %uint_0 %6 + %51 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_2 + OpAtomicStore %51 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %53 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %37 + %55 = OpLabel + %57 = OpLoad %uint %local_invocation_index_1_param_1 + %56 = OpFunctionCall %void %compute_main_inner_1 %57 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.wgsl b/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.wgsl new file mode 100644 index 0000000000..20d066a906 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.spvasm.expected.wgsl @@ -0,0 +1,37 @@ +struct S_atomic { + x : i32, + a : atomic, + b : atomic, +} + +struct S { + x : i32, + a : u32, + b : u32, +} + +var local_invocation_index_1 : u32; + +var wg : S_atomic; + +fn compute_main_inner(local_invocation_index : u32) { + wg.x = 0i; + atomicStore(&(wg.a), 0u); + atomicStore(&(wg.b), 0u); + workgroupBarrier(); + atomicStore(&(wg.a), 1u); + atomicStore(&(wg.b), 2u); + return; +} + +fn compute_main_1() { + let x_39 : u32 = local_invocation_index_1; + compute_main_inner(x_39); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.wgsl b/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.wgsl new file mode 100644 index 0000000000..b055a8f314 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/flat_multiple_atomics.wgsl @@ -0,0 +1,13 @@ +struct S { + x : i32, + a : atomic, + b : atomic, +}; + +var wg: S; + +@compute @workgroup_size(1) +fn compute_main() { + atomicStore(&wg.a, 1u); + atomicStore(&wg.b, 2u); +} diff --git a/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm b/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm new file mode 100644 index 0000000000..acad988c5f --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm @@ -0,0 +1,61 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 36 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %S "S" + OpMemberName %S 0 "x" + OpMemberName %S 1 "a" + OpMemberName %S 2 "y" + OpName %wg "wg" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %S 0 Offset 0 + OpMemberDecorate %S 1 Offset 4 + OpMemberDecorate %S 2 Offset 8 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 + %S = OpTypeStruct %int %uint %uint +%_ptr_Workgroup_S = OpTypePointer Workgroup %S + %wg = OpVariable %_ptr_Workgroup_S Workgroup + %void = OpTypeVoid + %8 = OpTypeFunction %void %uint + %uint_0 = OpConstant %uint 0 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %16 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 + %uint_1 = OpConstant %uint 1 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %23 = OpConstantNull %uint +%_ptr_Workgroup_uint_0 = OpTypePointer Workgroup %uint + %uint_264 = OpConstant %uint 264 + %31 = OpTypeFunction %void +%compute_main_inner = OpFunction %void None %8 +%local_invocation_index = OpFunctionParameter %uint + %12 = OpLabel + %15 = OpAccessChain %_ptr_Workgroup_int %wg %uint_0 + OpStore %15 %16 + %22 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_1 + OpAtomicStore %22 %uint_2 %uint_0 %23 + %25 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %uint_2 + OpStore %25 %23 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_1 + OpAtomicStore %30 %uint_2 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %31 + %33 = OpLabel + %35 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %35 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.glsl b/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.glsl new file mode 100644 index 0000000000..2b03ef6772 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.glsl @@ -0,0 +1,46 @@ +#version 310 es + +struct S_atomic { + int x; + uint a; + uint y; +}; + +struct S { + int x; + uint a; + uint y; +}; + +uint local_invocation_index_1 = 0u; +shared S_atomic wg; +void compute_main_inner(uint local_invocation_index) { + wg.x = 0; + atomicExchange(wg.a, 0u); + wg.y = 0u; + barrier(); + atomicExchange(wg.a, 1u); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + wg.x = 0; + atomicExchange(wg.a, 0u); + wg.y = 0u; + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.hlsl b/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.hlsl new file mode 100644 index 0000000000..403d1fb811 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +struct S_atomic { + int x; + uint a; + uint y; +}; + +static uint local_invocation_index_1 = 0u; +groupshared S_atomic wg; + +void compute_main_inner(uint local_invocation_index) { + wg.x = 0; + uint atomic_result = 0u; + InterlockedExchange(wg.a, 0u, atomic_result); + wg.y = 0u; + GroupMemoryBarrierWithGroupSync(); + uint atomic_result_1 = 0u; + InterlockedExchange(wg.a, 1u, atomic_result_1); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + wg.x = 0; + uint atomic_result_2 = 0u; + InterlockedExchange(wg.a, 0u, atomic_result_2); + wg.y = 0u; + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.msl b/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.msl new file mode 100644 index 0000000000..524820aff7 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.msl @@ -0,0 +1,48 @@ +#include + +using namespace metal; +struct S_atomic { + int x; + atomic_uint a; + uint y; +}; + +struct S { + int x; + uint a; + uint y; +}; + +void compute_main_inner(uint local_invocation_index, threadgroup S_atomic* const tint_symbol) { + (*(tint_symbol)).x = 0; + atomic_store_explicit(&((*(tint_symbol)).a), 0u, memory_order_relaxed); + (*(tint_symbol)).y = 0u; + threadgroup_barrier(mem_flags::mem_threadgroup); + atomic_store_explicit(&((*(tint_symbol)).a), 1u, memory_order_relaxed); + return; +} + +void compute_main_1(thread uint* const tint_symbol_1, threadgroup S_atomic* const tint_symbol_2) { + uint const x_35 = *(tint_symbol_1); + compute_main_inner(x_35, tint_symbol_2); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup S_atomic* const tint_symbol_3, thread uint* const tint_symbol_4) { + { + (*(tint_symbol_3)).x = 0; + atomic_store_explicit(&((*(tint_symbol_3)).a), 0u, memory_order_relaxed); + (*(tint_symbol_3)).y = 0u; + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_4) = local_invocation_index_1_param; + compute_main_1(tint_symbol_4, tint_symbol_3); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup S_atomic tint_symbol_5; + thread uint tint_symbol_6 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_5), &(tint_symbol_6)); + return; +} + diff --git a/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.spvasm b/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.spvasm new file mode 100644 index 0000000000..35d0d2b420 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.spvasm @@ -0,0 +1,87 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 52 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %S_atomic "S_atomic" + OpMemberName %S_atomic 0 "x" + OpMemberName %S_atomic 1 "a" + OpMemberName %S_atomic 2 "y" + OpName %wg "wg" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %S_atomic 0 Offset 0 + OpMemberDecorate %S_atomic 1 Offset 4 + OpMemberDecorate %S_atomic 2 Offset 8 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 + %S_atomic = OpTypeStruct %int %uint %uint +%_ptr_Workgroup_S_atomic = OpTypePointer Workgroup %S_atomic + %wg = OpVariable %_ptr_Workgroup_S_atomic Workgroup + %void = OpTypeVoid + %11 = OpTypeFunction %void %uint + %uint_0 = OpConstant %uint 0 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %19 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 + %uint_1 = OpConstant %uint 1 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint +%_ptr_Workgroup_uint_0 = OpTypePointer Workgroup %uint + %uint_264 = OpConstant %uint 264 + %33 = OpTypeFunction %void +%compute_main_inner = OpFunction %void None %11 +%local_invocation_index = OpFunctionParameter %uint + %15 = OpLabel + %18 = OpAccessChain %_ptr_Workgroup_int %wg %uint_0 + OpStore %18 %19 + %25 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_1 + OpAtomicStore %25 %uint_2 %uint_0 %6 + %27 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %uint_2 + OpStore %27 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %32 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_1 + OpAtomicStore %32 %uint_2 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %33 + %35 = OpLabel + %36 = OpLoad %uint %local_invocation_index_1 + %37 = OpFunctionCall %void %compute_main_inner %36 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %11 +%local_invocation_index_1_param = OpFunctionParameter %uint + %40 = OpLabel + %41 = OpAccessChain %_ptr_Workgroup_int %wg %uint_0 + OpStore %41 %19 + %44 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_1 + OpAtomicStore %44 %uint_2 %uint_0 %6 + %45 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %uint_2 + OpStore %45 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %47 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %33 + %49 = OpLabel + %51 = OpLoad %uint %local_invocation_index_1_param_1 + %50 = OpFunctionCall %void %compute_main_inner_1 %51 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.wgsl b/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.wgsl new file mode 100644 index 0000000000..2d90f56850 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/flat_single_atomic.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct S_atomic { + x : i32, + a : atomic, + y : u32, +} + +struct S { + x : i32, + a : u32, + y : u32, +} + +var local_invocation_index_1 : u32; + +var wg : S_atomic; + +fn compute_main_inner(local_invocation_index : u32) { + wg.x = 0i; + atomicStore(&(wg.a), 0u); + wg.y = 0u; + workgroupBarrier(); + atomicStore(&(wg.a), 1u); + return; +} + +fn compute_main_1() { + let x_35 : u32 = local_invocation_index_1; + compute_main_inner(x_35); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomicStore/struct/flat_single_atomic.wgsl b/test/tint/builtins/atomicStore/struct/flat_single_atomic.wgsl new file mode 100644 index 0000000000..e997e8749e --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/flat_single_atomic.wgsl @@ -0,0 +1,12 @@ +struct S { + x : i32, + a : atomic, + y : u32, +}; + +var wg: S; + +@compute @workgroup_size(1) +fn compute_main() { + atomicStore(&wg.a, 1u); +} diff --git a/test/tint/builtins/atomicStore/struct/nested.spvasm b/test/tint/builtins/atomicStore/struct/nested.spvasm new file mode 100644 index 0000000000..a8aaff3d02 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/nested.spvasm @@ -0,0 +1,97 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 45 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %S2 "S2" + OpMemberName %S2 0 "x" + OpMemberName %S2 1 "y" + OpMemberName %S2 2 "z" + OpMemberName %S2 3 "a" + OpName %S1 "S1" + OpMemberName %S1 0 "x" + OpMemberName %S1 1 "a" + OpName %S0 "S0" + OpMemberName %S0 0 "x" + OpMemberName %S0 1 "a" + OpMemberName %S0 2 "y" + OpMemberName %S0 3 "z" + OpMemberName %S1 2 "y" + OpMemberName %S1 3 "z" + OpName %wg "wg" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %S2 0 Offset 0 + OpMemberDecorate %S2 1 Offset 4 + OpMemberDecorate %S2 2 Offset 8 + OpMemberDecorate %S2 3 Offset 12 + OpMemberDecorate %S1 0 Offset 0 + OpMemberDecorate %S1 1 Offset 4 + OpMemberDecorate %S0 0 Offset 0 + OpMemberDecorate %S0 1 Offset 4 + OpMemberDecorate %S0 2 Offset 8 + OpMemberDecorate %S0 3 Offset 12 + OpMemberDecorate %S1 2 Offset 20 + OpMemberDecorate %S1 3 Offset 24 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 + %S0 = OpTypeStruct %int %uint %int %int + %S1 = OpTypeStruct %int %S0 %int %int + %S2 = OpTypeStruct %int %int %int %S1 +%_ptr_Workgroup_S2 = OpTypePointer Workgroup %S2 + %wg = OpVariable %_ptr_Workgroup_S2 Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void %uint + %uint_0 = OpConstant %uint 0 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %18 = OpConstantNull %int + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_3 = OpConstant %uint 3 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %30 = OpConstantNull %uint + %uint_264 = OpConstant %uint 264 + %40 = OpTypeFunction %void +%compute_main_inner = OpFunction %void None %10 +%local_invocation_index = OpFunctionParameter %uint + %14 = OpLabel + %17 = OpAccessChain %_ptr_Workgroup_int %wg %uint_0 + OpStore %17 %18 + %20 = OpAccessChain %_ptr_Workgroup_int %wg %uint_1 + OpStore %20 %18 + %22 = OpAccessChain %_ptr_Workgroup_int %wg %uint_2 + OpStore %22 %18 + %24 = OpAccessChain %_ptr_Workgroup_int %wg %uint_3 %uint_0 + OpStore %24 %18 + %25 = OpAccessChain %_ptr_Workgroup_int %wg %uint_3 %uint_1 %uint_0 + OpStore %25 %18 + %29 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_3 %uint_1 %uint_1 + OpAtomicStore %29 %uint_2 %uint_0 %30 + %31 = OpAccessChain %_ptr_Workgroup_int %wg %uint_3 %uint_1 %uint_2 + OpStore %31 %18 + %32 = OpAccessChain %_ptr_Workgroup_int %wg %uint_3 %uint_1 %uint_3 + OpStore %32 %18 + %33 = OpAccessChain %_ptr_Workgroup_int %wg %uint_3 %uint_2 + OpStore %33 %18 + %34 = OpAccessChain %_ptr_Workgroup_int %wg %uint_3 %uint_3 + OpStore %34 %18 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %39 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_3 %uint_1 %uint_1 + OpAtomicStore %39 %uint_2 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %40 + %42 = OpLabel + %44 = OpLoad %uint %local_invocation_index_1 + %43 = OpFunctionCall %void %compute_main_inner %44 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomicStore/struct/nested.spvasm.expected.glsl b/test/tint/builtins/atomicStore/struct/nested.spvasm.expected.glsl new file mode 100644 index 0000000000..1d63b30d48 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/nested.spvasm.expected.glsl @@ -0,0 +1,90 @@ +#version 310 es + +struct S0_atomic { + int x; + uint a; + int y; + int z; +}; + +struct S0 { + int x; + uint a; + int y; + int z; +}; + +struct S1_atomic { + int x; + S0_atomic a; + int y; + int z; +}; + +struct S1 { + int x; + S0 a; + int y; + int z; +}; + +struct S2_atomic { + int x; + int y; + int z; + S1_atomic a; +}; + +struct S2 { + int x; + int y; + int z; + S1 a; +}; + +uint local_invocation_index_1 = 0u; +shared S2_atomic wg; +void compute_main_inner(uint local_invocation_index) { + wg.x = 0; + wg.y = 0; + wg.z = 0; + wg.a.x = 0; + wg.a.a.x = 0; + atomicExchange(wg.a.a.a, 0u); + wg.a.a.y = 0; + wg.a.a.z = 0; + wg.a.y = 0; + wg.a.z = 0; + barrier(); + atomicExchange(wg.a.a.a, 1u); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + wg.x = 0; + wg.y = 0; + wg.z = 0; + wg.a.x = 0; + wg.a.a.x = 0; + atomicExchange(wg.a.a.a, 0u); + wg.a.a.y = 0; + wg.a.a.z = 0; + wg.a.y = 0; + wg.a.z = 0; + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomicStore/struct/nested.spvasm.expected.hlsl b/test/tint/builtins/atomicStore/struct/nested.spvasm.expected.hlsl new file mode 100644 index 0000000000..4449c42258 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/nested.spvasm.expected.hlsl @@ -0,0 +1,73 @@ +struct S0_atomic { + int x; + uint a; + int y; + int z; +}; +struct S1_atomic { + int x; + S0_atomic a; + int y; + int z; +}; +struct S2_atomic { + int x; + int y; + int z; + S1_atomic a; +}; + +static uint local_invocation_index_1 = 0u; +groupshared S2_atomic wg; + +void compute_main_inner(uint local_invocation_index) { + wg.x = 0; + wg.y = 0; + wg.z = 0; + wg.a.x = 0; + wg.a.a.x = 0; + uint atomic_result = 0u; + InterlockedExchange(wg.a.a.a, 0u, atomic_result); + wg.a.a.y = 0; + wg.a.a.z = 0; + wg.a.y = 0; + wg.a.z = 0; + GroupMemoryBarrierWithGroupSync(); + uint atomic_result_1 = 0u; + InterlockedExchange(wg.a.a.a, 1u, atomic_result_1); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + wg.x = 0; + wg.y = 0; + wg.z = 0; + wg.a.x = 0; + wg.a.a.x = 0; + uint atomic_result_2 = 0u; + InterlockedExchange(wg.a.a.a, 0u, atomic_result_2); + wg.a.a.y = 0; + wg.a.a.z = 0; + wg.a.y = 0; + wg.a.z = 0; + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomicStore/struct/nested.spvasm.expected.msl b/test/tint/builtins/atomicStore/struct/nested.spvasm.expected.msl new file mode 100644 index 0000000000..1ed439c62f --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/nested.spvasm.expected.msl @@ -0,0 +1,92 @@ +#include + +using namespace metal; +struct S0_atomic { + int x; + atomic_uint a; + int y; + int z; +}; + +struct S0 { + int x; + uint a; + int y; + int z; +}; + +struct S1_atomic { + int x; + S0_atomic a; + int y; + int z; +}; + +struct S1 { + int x; + S0 a; + int y; + int z; +}; + +struct S2_atomic { + int x; + int y; + int z; + S1_atomic a; +}; + +struct S2 { + int x; + int y; + int z; + S1 a; +}; + +void compute_main_inner(uint local_invocation_index, threadgroup S2_atomic* const tint_symbol) { + (*(tint_symbol)).x = 0; + (*(tint_symbol)).y = 0; + (*(tint_symbol)).z = 0; + (*(tint_symbol)).a.x = 0; + (*(tint_symbol)).a.a.x = 0; + atomic_store_explicit(&((*(tint_symbol)).a.a.a), 0u, memory_order_relaxed); + (*(tint_symbol)).a.a.y = 0; + (*(tint_symbol)).a.a.z = 0; + (*(tint_symbol)).a.y = 0; + (*(tint_symbol)).a.z = 0; + threadgroup_barrier(mem_flags::mem_threadgroup); + atomic_store_explicit(&((*(tint_symbol)).a.a.a), 1u, memory_order_relaxed); + return; +} + +void compute_main_1(thread uint* const tint_symbol_1, threadgroup S2_atomic* const tint_symbol_2) { + uint const x_44 = *(tint_symbol_1); + compute_main_inner(x_44, tint_symbol_2); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup S2_atomic* const tint_symbol_3, thread uint* const tint_symbol_4) { + { + (*(tint_symbol_3)).x = 0; + (*(tint_symbol_3)).y = 0; + (*(tint_symbol_3)).z = 0; + (*(tint_symbol_3)).a.x = 0; + (*(tint_symbol_3)).a.a.x = 0; + atomic_store_explicit(&((*(tint_symbol_3)).a.a.a), 0u, memory_order_relaxed); + (*(tint_symbol_3)).a.a.y = 0; + (*(tint_symbol_3)).a.a.z = 0; + (*(tint_symbol_3)).a.y = 0; + (*(tint_symbol_3)).a.z = 0; + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_4) = local_invocation_index_1_param; + compute_main_1(tint_symbol_4, tint_symbol_3); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup S2_atomic tint_symbol_5; + thread uint tint_symbol_6 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_5), &(tint_symbol_6)); + return; +} + diff --git a/test/tint/builtins/atomicStore/struct/nested.spvasm.expected.spvasm b/test/tint/builtins/atomicStore/struct/nested.spvasm.expected.spvasm new file mode 100644 index 0000000000..9f756f397e --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/nested.spvasm.expected.spvasm @@ -0,0 +1,137 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 68 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %S2_atomic "S2_atomic" + OpMemberName %S2_atomic 0 "x" + OpMemberName %S2_atomic 1 "y" + OpMemberName %S2_atomic 2 "z" + OpMemberName %S2_atomic 3 "a" + OpName %S1_atomic "S1_atomic" + OpMemberName %S1_atomic 0 "x" + OpMemberName %S1_atomic 1 "a" + OpName %S0_atomic "S0_atomic" + OpMemberName %S0_atomic 0 "x" + OpMemberName %S0_atomic 1 "a" + OpMemberName %S0_atomic 2 "y" + OpMemberName %S0_atomic 3 "z" + OpMemberName %S1_atomic 2 "y" + OpMemberName %S1_atomic 3 "z" + OpName %wg "wg" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %S2_atomic 0 Offset 0 + OpMemberDecorate %S2_atomic 1 Offset 4 + OpMemberDecorate %S2_atomic 2 Offset 8 + OpMemberDecorate %S2_atomic 3 Offset 12 + OpMemberDecorate %S1_atomic 0 Offset 0 + OpMemberDecorate %S1_atomic 1 Offset 4 + OpMemberDecorate %S0_atomic 0 Offset 0 + OpMemberDecorate %S0_atomic 1 Offset 4 + OpMemberDecorate %S0_atomic 2 Offset 8 + OpMemberDecorate %S0_atomic 3 Offset 12 + OpMemberDecorate %S1_atomic 2 Offset 20 + OpMemberDecorate %S1_atomic 3 Offset 24 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 + %S0_atomic = OpTypeStruct %int %uint %int %int + %S1_atomic = OpTypeStruct %int %S0_atomic %int %int + %S2_atomic = OpTypeStruct %int %int %int %S1_atomic +%_ptr_Workgroup_S2_atomic = OpTypePointer Workgroup %S2_atomic + %wg = OpVariable %_ptr_Workgroup_S2_atomic Workgroup + %void = OpTypeVoid + %13 = OpTypeFunction %void %uint + %uint_0 = OpConstant %uint 0 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %21 = OpConstantNull %int + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_3 = OpConstant %uint 3 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %uint_264 = OpConstant %uint 264 + %42 = OpTypeFunction %void +%compute_main_inner = OpFunction %void None %13 +%local_invocation_index = OpFunctionParameter %uint + %17 = OpLabel + %20 = OpAccessChain %_ptr_Workgroup_int %wg %uint_0 + OpStore %20 %21 + %23 = OpAccessChain %_ptr_Workgroup_int %wg %uint_1 + OpStore %23 %21 + %25 = OpAccessChain %_ptr_Workgroup_int %wg %uint_2 + OpStore %25 %21 + %27 = OpAccessChain %_ptr_Workgroup_int %wg %uint_3 %uint_0 + OpStore %27 %21 + %28 = OpAccessChain %_ptr_Workgroup_int %wg %uint_3 %uint_1 %uint_0 + OpStore %28 %21 + %32 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_3 %uint_1 %uint_1 + OpAtomicStore %32 %uint_2 %uint_0 %6 + %33 = OpAccessChain %_ptr_Workgroup_int %wg %uint_3 %uint_1 %uint_2 + OpStore %33 %21 + %34 = OpAccessChain %_ptr_Workgroup_int %wg %uint_3 %uint_1 %uint_3 + OpStore %34 %21 + %35 = OpAccessChain %_ptr_Workgroup_int %wg %uint_3 %uint_2 + OpStore %35 %21 + %36 = OpAccessChain %_ptr_Workgroup_int %wg %uint_3 %uint_3 + OpStore %36 %21 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %41 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_3 %uint_1 %uint_1 + OpAtomicStore %41 %uint_2 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %42 + %44 = OpLabel + %45 = OpLoad %uint %local_invocation_index_1 + %46 = OpFunctionCall %void %compute_main_inner %45 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %13 +%local_invocation_index_1_param = OpFunctionParameter %uint + %49 = OpLabel + %50 = OpAccessChain %_ptr_Workgroup_int %wg %uint_0 + OpStore %50 %21 + %51 = OpAccessChain %_ptr_Workgroup_int %wg %uint_1 + OpStore %51 %21 + %52 = OpAccessChain %_ptr_Workgroup_int %wg %uint_2 + OpStore %52 %21 + %53 = OpAccessChain %_ptr_Workgroup_int %wg %uint_3 %uint_0 + OpStore %53 %21 + %54 = OpAccessChain %_ptr_Workgroup_int %wg %uint_3 %uint_1 %uint_0 + OpStore %54 %21 + %57 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_3 %uint_1 %uint_1 + OpAtomicStore %57 %uint_2 %uint_0 %6 + %58 = OpAccessChain %_ptr_Workgroup_int %wg %uint_3 %uint_1 %uint_2 + OpStore %58 %21 + %59 = OpAccessChain %_ptr_Workgroup_int %wg %uint_3 %uint_1 %uint_3 + OpStore %59 %21 + %60 = OpAccessChain %_ptr_Workgroup_int %wg %uint_3 %uint_2 + OpStore %60 %21 + %61 = OpAccessChain %_ptr_Workgroup_int %wg %uint_3 %uint_3 + OpStore %61 %21 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %63 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %42 + %65 = OpLabel + %67 = OpLoad %uint %local_invocation_index_1_param_1 + %66 = OpFunctionCall %void %compute_main_inner_1 %67 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomicStore/struct/nested.spvasm.expected.wgsl b/test/tint/builtins/atomicStore/struct/nested.spvasm.expected.wgsl new file mode 100644 index 0000000000..7f3c3b3d60 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/nested.spvasm.expected.wgsl @@ -0,0 +1,73 @@ +struct S0_atomic { + x : i32, + a : atomic, + y : i32, + z : i32, +} + +struct S0 { + x : i32, + a : u32, + y : i32, + z : i32, +} + +struct S1_atomic { + x : i32, + a : S0_atomic, + y : i32, + z : i32, +} + +struct S1 { + x : i32, + a : S0, + y : i32, + z : i32, +} + +struct S2_atomic { + x : i32, + y : i32, + z : i32, + a : S1_atomic, +} + +struct S2 { + x : i32, + y : i32, + z : i32, + a : S1, +} + +var local_invocation_index_1 : u32; + +var wg : S2_atomic; + +fn compute_main_inner(local_invocation_index : u32) { + wg.x = 0i; + wg.y = 0i; + wg.z = 0i; + wg.a.x = 0i; + wg.a.a.x = 0i; + atomicStore(&(wg.a.a.a), 0u); + wg.a.a.y = 0i; + wg.a.a.z = 0i; + wg.a.y = 0i; + wg.a.z = 0i; + workgroupBarrier(); + atomicStore(&(wg.a.a.a), 1u); + return; +} + +fn compute_main_1() { + let x_44 : u32 = local_invocation_index_1; + compute_main_inner(x_44); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomicStore/struct/nested.wgsl b/test/tint/builtins/atomicStore/struct/nested.wgsl new file mode 100644 index 0000000000..e6b0abe90c --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/nested.wgsl @@ -0,0 +1,27 @@ +struct S0 { + x : i32, + a : atomic, + y : i32, + z : i32, +}; + +struct S1 { + x : i32, + a : S0, + y : i32, + z : i32, +}; + +struct S2 { + x : i32, + y : i32, + z : i32, + a : S1, +}; + +var wg: S2; + +@compute @workgroup_size(1) +fn compute_main() { + atomicStore(&wg.a.a.a, 1u); +} diff --git a/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm b/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm new file mode 100644 index 0000000000..9d06d130a0 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm @@ -0,0 +1,91 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 54 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %S "S" + OpMemberName %S 0 "x" + OpMemberName %S 1 "a" + OpMemberName %S 2 "y" + OpName %wg "wg" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %idx "idx" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %S 0 Offset 0 + OpMemberDecorate %S 1 Offset 4 + OpDecorate %_arr_uint_uint_10 ArrayStride 4 + OpMemberDecorate %S 2 Offset 44 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 + %uint_10 = OpConstant %uint 10 +%_arr_uint_uint_10 = OpTypeArray %uint %uint_10 + %S = OpTypeStruct %int %_arr_uint_uint_10 %uint +%_ptr_Workgroup_S = OpTypePointer Workgroup %S + %wg = OpVariable %_ptr_Workgroup_S Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void %uint + %uint_0 = OpConstant %uint 0 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %18 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %22 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %bool = OpTypeBool + %uint_1 = OpConstant %uint 1 +%_ptr_Workgroup_uint_0 = OpTypePointer Workgroup %uint + %uint_264 = OpConstant %uint 264 + %int_4 = OpConstant %int 4 + %49 = OpTypeFunction %void +%compute_main_inner = OpFunction %void None %10 +%local_invocation_index = OpFunctionParameter %uint + %14 = OpLabel + %idx = OpVariable %_ptr_Function_uint Function %22 + %17 = OpAccessChain %_ptr_Workgroup_int %wg %uint_0 + OpStore %17 %18 + %21 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_2 + OpStore %21 %22 + OpStore %idx %local_invocation_index + OpBranch %25 + %25 = OpLabel + OpLoopMerge %26 %27 None + OpBranch %28 + %28 = OpLabel + %30 = OpLoad %uint %idx + %31 = OpULessThan %bool %30 %uint_10 + %29 = OpLogicalNot %bool %31 + OpSelectionMerge %33 None + OpBranchConditional %29 %34 %33 + %34 = OpLabel + OpBranch %26 + %33 = OpLabel + %35 = OpLoad %uint %idx + %40 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %uint_1 %35 + OpAtomicStore %40 %uint_2 %uint_0 %22 + OpBranch %27 + %27 = OpLabel + %41 = OpLoad %uint %idx + %42 = OpIAdd %uint %41 %uint_1 + OpStore %idx %42 + OpBranch %25 + %26 = OpLabel + OpControlBarrier %uint_2 %uint_2 %uint_264 + %48 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %uint_1 %int_4 + OpAtomicStore %48 %uint_2 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %49 + %51 = OpLabel + %53 = OpLoad %uint %local_invocation_index_1 + %52 = OpFunctionCall %void %compute_main_inner %53 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.glsl b/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.glsl new file mode 100644 index 0000000000..0a37b132c8 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.glsl @@ -0,0 +1,57 @@ +#version 310 es + +struct S_atomic { + int x; + uint a[10]; + uint y; +}; + +struct S { + int x; + uint a[10]; + uint y; +}; + +uint local_invocation_index_1 = 0u; +shared S_atomic wg; +void compute_main_inner(uint local_invocation_index) { + uint idx = 0u; + wg.x = 0; + wg.y = 0u; + idx = local_invocation_index; + { + for(; !(!((idx < 10u))); idx = (idx + 1u)) { + atomicExchange(wg.a[idx], 0u); + } + } + barrier(); + atomicExchange(wg.a[4], 1u); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + wg.x = 0; + wg.y = 0u; + } + { + for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 10u); idx_1 = (idx_1 + 1u)) { + uint i = idx_1; + atomicExchange(wg.a[i], 0u); + } + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.hlsl b/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.hlsl new file mode 100644 index 0000000000..beb2810121 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.hlsl @@ -0,0 +1,57 @@ +struct S_atomic { + int x; + uint a[10]; + uint y; +}; + +static uint local_invocation_index_1 = 0u; +groupshared S_atomic wg; + +void compute_main_inner(uint local_invocation_index) { + uint idx = 0u; + wg.x = 0; + wg.y = 0u; + idx = local_invocation_index; + { + [loop] for(; !(!((idx < 10u))); idx = (idx + 1u)) { + uint atomic_result = 0u; + InterlockedExchange(wg.a[idx], 0u, atomic_result); + } + } + GroupMemoryBarrierWithGroupSync(); + uint atomic_result_1 = 0u; + InterlockedExchange(wg.a[4], 1u, atomic_result_1); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + wg.x = 0; + wg.y = 0u; + } + { + [loop] for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 10u); idx_1 = (idx_1 + 1u)) { + const uint i = idx_1; + uint atomic_result_2 = 0u; + InterlockedExchange(wg.a[i], 0u, atomic_result_2); + } + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.msl b/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.msl new file mode 100644 index 0000000000..089c01164e --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.msl @@ -0,0 +1,72 @@ +#include + +using namespace metal; +struct tint_array_wrapper { + uint arr[10]; +}; + +struct tint_array_wrapper_1 { + atomic_uint arr[10]; +}; + +struct S_atomic { + int x; + tint_array_wrapper_1 a; + uint y; +}; + +struct S { + int x; + tint_array_wrapper a; + uint y; +}; + +void compute_main_inner(uint local_invocation_index, threadgroup S_atomic* const tint_symbol) { + uint idx = 0u; + (*(tint_symbol)).x = 0; + (*(tint_symbol)).y = 0u; + idx = local_invocation_index; + while (true) { + uint const x_30 = idx; + if (!((x_30 < 10u))) { + break; + } + uint const x_35 = idx; + atomic_store_explicit(&((*(tint_symbol)).a.arr[x_35]), 0u, memory_order_relaxed); + { + uint const x_41 = idx; + idx = (x_41 + 1u); + } + } + threadgroup_barrier(mem_flags::mem_threadgroup); + atomic_store_explicit(&((*(tint_symbol)).a.arr[4]), 1u, memory_order_relaxed); + return; +} + +void compute_main_1(thread uint* const tint_symbol_1, threadgroup S_atomic* const tint_symbol_2) { + uint const x_53 = *(tint_symbol_1); + compute_main_inner(x_53, tint_symbol_2); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup S_atomic* const tint_symbol_3, thread uint* const tint_symbol_4) { + { + (*(tint_symbol_3)).x = 0; + (*(tint_symbol_3)).y = 0u; + } + for(uint idx_1 = local_invocation_index_1_param; (idx_1 < 10u); idx_1 = (idx_1 + 1u)) { + uint const i = idx_1; + atomic_store_explicit(&((*(tint_symbol_3)).a.arr[i]), 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_4) = local_invocation_index_1_param; + compute_main_1(tint_symbol_4, tint_symbol_3); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup S_atomic tint_symbol_5; + thread uint tint_symbol_6 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_5), &(tint_symbol_6)); + return; +} + diff --git a/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.spvasm b/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.spvasm new file mode 100644 index 0000000000..d7743741fc --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.spvasm @@ -0,0 +1,142 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 83 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %S_atomic "S_atomic" + OpMemberName %S_atomic 0 "x" + OpMemberName %S_atomic 1 "a" + OpMemberName %S_atomic 2 "y" + OpName %wg "wg" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %idx "idx" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %idx_1 "idx_1" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %S_atomic 0 Offset 0 + OpMemberDecorate %S_atomic 1 Offset 4 + OpDecorate %_arr_uint_uint_10 ArrayStride 4 + OpMemberDecorate %S_atomic 2 Offset 44 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 + %uint_10 = OpConstant %uint 10 +%_arr_uint_uint_10 = OpTypeArray %uint %uint_10 + %S_atomic = OpTypeStruct %int %_arr_uint_uint_10 %uint +%_ptr_Workgroup_S_atomic = OpTypePointer Workgroup %S_atomic + %wg = OpVariable %_ptr_Workgroup_S_atomic Workgroup + %void = OpTypeVoid + %13 = OpTypeFunction %void %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_0 = OpConstant %uint 0 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %23 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %bool = OpTypeBool + %uint_1 = OpConstant %uint 1 +%_ptr_Workgroup_uint_0 = OpTypePointer Workgroup %uint + %uint_264 = OpConstant %uint 264 + %int_4 = OpConstant %int 4 + %51 = OpTypeFunction %void +%compute_main_inner = OpFunction %void None %13 +%local_invocation_index = OpFunctionParameter %uint + %17 = OpLabel + %idx = OpVariable %_ptr_Function_uint Function %6 + OpStore %idx %6 + %22 = OpAccessChain %_ptr_Workgroup_int %wg %uint_0 + OpStore %22 %23 + %26 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_2 + OpStore %26 %6 + OpStore %idx %local_invocation_index + OpBranch %27 + %27 = OpLabel + OpLoopMerge %28 %29 None + OpBranch %30 + %30 = OpLabel + %31 = OpLoad %uint %idx + %33 = OpULessThan %bool %31 %uint_10 + %32 = OpLogicalNot %bool %33 + OpSelectionMerge %35 None + OpBranchConditional %32 %36 %35 + %36 = OpLabel + OpBranch %28 + %35 = OpLabel + %37 = OpLoad %uint %idx + %42 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %uint_1 %37 + OpAtomicStore %42 %uint_2 %uint_0 %6 + OpBranch %29 + %29 = OpLabel + %43 = OpLoad %uint %idx + %44 = OpIAdd %uint %43 %uint_1 + OpStore %idx %44 + OpBranch %27 + %28 = OpLabel + OpControlBarrier %uint_2 %uint_2 %uint_264 + %50 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %uint_1 %int_4 + OpAtomicStore %50 %uint_2 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %51 + %53 = OpLabel + %54 = OpLoad %uint %local_invocation_index_1 + %55 = OpFunctionCall %void %compute_main_inner %54 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %13 +%local_invocation_index_1_param = OpFunctionParameter %uint + %58 = OpLabel + %idx_1 = OpVariable %_ptr_Function_uint Function %6 + %59 = OpAccessChain %_ptr_Workgroup_int %wg %uint_0 + OpStore %59 %23 + %60 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_2 + OpStore %60 %6 + OpStore %idx_1 %local_invocation_index_1_param + OpBranch %62 + %62 = OpLabel + OpLoopMerge %63 %64 None + OpBranch %65 + %65 = OpLabel + %67 = OpLoad %uint %idx_1 + %68 = OpULessThan %bool %67 %uint_10 + %66 = OpLogicalNot %bool %68 + OpSelectionMerge %69 None + OpBranchConditional %66 %70 %69 + %70 = OpLabel + OpBranch %63 + %69 = OpLabel + %71 = OpLoad %uint %idx_1 + %74 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %uint_1 %71 + OpAtomicStore %74 %uint_2 %uint_0 %6 + OpBranch %64 + %64 = OpLabel + %75 = OpLoad %uint %idx_1 + %76 = OpIAdd %uint %75 %uint_1 + OpStore %idx_1 %76 + OpBranch %62 + %63 = OpLabel + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %78 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %51 + %80 = OpLabel + %82 = OpLoad %uint %local_invocation_index_1_param_1 + %81 = OpFunctionCall %void %compute_main_inner_1 %82 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.wgsl b/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.wgsl new file mode 100644 index 0000000000..f82a9ff493 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/struct_of_array.spvasm.expected.wgsl @@ -0,0 +1,52 @@ +type Arr = array; + +struct S_atomic { + x : i32, + a : array, 10u>, + y : u32, +} + +struct S { + x : i32, + a : Arr, + y : u32, +} + +var local_invocation_index_1 : u32; + +var wg : S_atomic; + +fn compute_main_inner(local_invocation_index : u32) { + var idx : u32 = 0u; + wg.x = 0i; + wg.y = 0u; + idx = local_invocation_index; + loop { + let x_30 : u32 = idx; + if (!((x_30 < 10u))) { + break; + } + let x_35 : u32 = idx; + atomicStore(&(wg.a[x_35]), 0u); + + continuing { + let x_41 : u32 = idx; + idx = (x_41 + 1u); + } + } + workgroupBarrier(); + atomicStore(&(wg.a[4i]), 1u); + return; +} + +fn compute_main_1() { + let x_53 : u32 = local_invocation_index_1; + compute_main_inner(x_53); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomicStore/struct/struct_of_array.wgsl b/test/tint/builtins/atomicStore/struct/struct_of_array.wgsl new file mode 100644 index 0000000000..ada3ef5456 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/struct_of_array.wgsl @@ -0,0 +1,12 @@ +struct S { + x : i32, + a : array, 10>, + y : u32, +}; + +var wg : S; + +@compute @workgroup_size(1) +fn compute_main() { + atomicStore(&wg.a[4], 1u); +} diff --git a/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm b/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm new file mode 100644 index 0000000000..acad988c5f --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm @@ -0,0 +1,61 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 36 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %S "S" + OpMemberName %S 0 "x" + OpMemberName %S 1 "a" + OpMemberName %S 2 "y" + OpName %wg "wg" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %S 0 Offset 0 + OpMemberDecorate %S 1 Offset 4 + OpMemberDecorate %S 2 Offset 8 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 + %S = OpTypeStruct %int %uint %uint +%_ptr_Workgroup_S = OpTypePointer Workgroup %S + %wg = OpVariable %_ptr_Workgroup_S Workgroup + %void = OpTypeVoid + %8 = OpTypeFunction %void %uint + %uint_0 = OpConstant %uint 0 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %16 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 + %uint_1 = OpConstant %uint 1 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %23 = OpConstantNull %uint +%_ptr_Workgroup_uint_0 = OpTypePointer Workgroup %uint + %uint_264 = OpConstant %uint 264 + %31 = OpTypeFunction %void +%compute_main_inner = OpFunction %void None %8 +%local_invocation_index = OpFunctionParameter %uint + %12 = OpLabel + %15 = OpAccessChain %_ptr_Workgroup_int %wg %uint_0 + OpStore %15 %16 + %22 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_1 + OpAtomicStore %22 %uint_2 %uint_0 %23 + %25 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %uint_2 + OpStore %25 %23 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_1 + OpAtomicStore %30 %uint_2 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %31 + %33 = OpLabel + %35 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %35 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.glsl b/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.glsl new file mode 100644 index 0000000000..2b03ef6772 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.glsl @@ -0,0 +1,46 @@ +#version 310 es + +struct S_atomic { + int x; + uint a; + uint y; +}; + +struct S { + int x; + uint a; + uint y; +}; + +uint local_invocation_index_1 = 0u; +shared S_atomic wg; +void compute_main_inner(uint local_invocation_index) { + wg.x = 0; + atomicExchange(wg.a, 0u); + wg.y = 0u; + barrier(); + atomicExchange(wg.a, 1u); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + wg.x = 0; + atomicExchange(wg.a, 0u); + wg.y = 0u; + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.hlsl b/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.hlsl new file mode 100644 index 0000000000..403d1fb811 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +struct S_atomic { + int x; + uint a; + uint y; +}; + +static uint local_invocation_index_1 = 0u; +groupshared S_atomic wg; + +void compute_main_inner(uint local_invocation_index) { + wg.x = 0; + uint atomic_result = 0u; + InterlockedExchange(wg.a, 0u, atomic_result); + wg.y = 0u; + GroupMemoryBarrierWithGroupSync(); + uint atomic_result_1 = 0u; + InterlockedExchange(wg.a, 1u, atomic_result_1); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + wg.x = 0; + uint atomic_result_2 = 0u; + InterlockedExchange(wg.a, 0u, atomic_result_2); + wg.y = 0u; + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.msl b/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.msl new file mode 100644 index 0000000000..524820aff7 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.msl @@ -0,0 +1,48 @@ +#include + +using namespace metal; +struct S_atomic { + int x; + atomic_uint a; + uint y; +}; + +struct S { + int x; + uint a; + uint y; +}; + +void compute_main_inner(uint local_invocation_index, threadgroup S_atomic* const tint_symbol) { + (*(tint_symbol)).x = 0; + atomic_store_explicit(&((*(tint_symbol)).a), 0u, memory_order_relaxed); + (*(tint_symbol)).y = 0u; + threadgroup_barrier(mem_flags::mem_threadgroup); + atomic_store_explicit(&((*(tint_symbol)).a), 1u, memory_order_relaxed); + return; +} + +void compute_main_1(thread uint* const tint_symbol_1, threadgroup S_atomic* const tint_symbol_2) { + uint const x_35 = *(tint_symbol_1); + compute_main_inner(x_35, tint_symbol_2); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup S_atomic* const tint_symbol_3, thread uint* const tint_symbol_4) { + { + (*(tint_symbol_3)).x = 0; + atomic_store_explicit(&((*(tint_symbol_3)).a), 0u, memory_order_relaxed); + (*(tint_symbol_3)).y = 0u; + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_4) = local_invocation_index_1_param; + compute_main_1(tint_symbol_4, tint_symbol_3); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup S_atomic tint_symbol_5; + thread uint tint_symbol_6 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_5), &(tint_symbol_6)); + return; +} + diff --git a/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.spvasm b/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.spvasm new file mode 100644 index 0000000000..35d0d2b420 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.spvasm @@ -0,0 +1,87 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 52 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %S_atomic "S_atomic" + OpMemberName %S_atomic 0 "x" + OpMemberName %S_atomic 1 "a" + OpMemberName %S_atomic 2 "y" + OpName %wg "wg" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %S_atomic 0 Offset 0 + OpMemberDecorate %S_atomic 1 Offset 4 + OpMemberDecorate %S_atomic 2 Offset 8 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 + %S_atomic = OpTypeStruct %int %uint %uint +%_ptr_Workgroup_S_atomic = OpTypePointer Workgroup %S_atomic + %wg = OpVariable %_ptr_Workgroup_S_atomic Workgroup + %void = OpTypeVoid + %11 = OpTypeFunction %void %uint + %uint_0 = OpConstant %uint 0 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %19 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 + %uint_1 = OpConstant %uint 1 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint +%_ptr_Workgroup_uint_0 = OpTypePointer Workgroup %uint + %uint_264 = OpConstant %uint 264 + %33 = OpTypeFunction %void +%compute_main_inner = OpFunction %void None %11 +%local_invocation_index = OpFunctionParameter %uint + %15 = OpLabel + %18 = OpAccessChain %_ptr_Workgroup_int %wg %uint_0 + OpStore %18 %19 + %25 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_1 + OpAtomicStore %25 %uint_2 %uint_0 %6 + %27 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %uint_2 + OpStore %27 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %32 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_1 + OpAtomicStore %32 %uint_2 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %33 + %35 = OpLabel + %36 = OpLoad %uint %local_invocation_index_1 + %37 = OpFunctionCall %void %compute_main_inner %36 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %11 +%local_invocation_index_1_param = OpFunctionParameter %uint + %40 = OpLabel + %41 = OpAccessChain %_ptr_Workgroup_int %wg %uint_0 + OpStore %41 %19 + %44 = OpAccessChain %_ptr_Workgroup_uint %wg %uint_1 + OpAtomicStore %44 %uint_2 %uint_0 %6 + %45 = OpAccessChain %_ptr_Workgroup_uint_0 %wg %uint_2 + OpStore %45 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %47 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %33 + %49 = OpLabel + %51 = OpLoad %uint %local_invocation_index_1_param_1 + %50 = OpFunctionCall %void %compute_main_inner_1 %51 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.wgsl b/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.wgsl new file mode 100644 index 0000000000..2d90f56850 --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/via_ptr_let.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct S_atomic { + x : i32, + a : atomic, + y : u32, +} + +struct S { + x : i32, + a : u32, + y : u32, +} + +var local_invocation_index_1 : u32; + +var wg : S_atomic; + +fn compute_main_inner(local_invocation_index : u32) { + wg.x = 0i; + atomicStore(&(wg.a), 0u); + wg.y = 0u; + workgroupBarrier(); + atomicStore(&(wg.a), 1u); + return; +} + +fn compute_main_1() { + let x_35 : u32 = local_invocation_index_1; + compute_main_inner(x_35); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomicStore/struct/via_ptr_let.wgsl b/test/tint/builtins/atomicStore/struct/via_ptr_let.wgsl new file mode 100644 index 0000000000..64eeb6509e --- /dev/null +++ b/test/tint/builtins/atomicStore/struct/via_ptr_let.wgsl @@ -0,0 +1,14 @@ +struct S { + x : i32, + a : atomic, + y : u32, +}; + +var wg : S; + +@compute @workgroup_size(1) +fn compute_main() { + let p0 = &wg; + let p1 = &((*p0).a); + atomicStore(p1, 1u); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm new file mode 100644 index 0000000000..11672382dd --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_d32fe4 "atomicAdd_d32fe4" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %19 = OpConstantNull %int +%atomicAdd_d32fe4 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %19 + %15 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %9 = OpAtomicIAdd %int %15 %uint_1 %uint_0 %int_1 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..875dc0857f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicAdd_d32fe4() { + int res = 0; + int x_9 = atomicAdd(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicAdd_d32fe4(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicAdd_d32fe4() { + int res = 0; + int x_9 = atomicAdd(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void compute_main_1() { + atomicAdd_d32fe4(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..358487bedc --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicAdd(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedAdd(offset, value, original_value); + return original_value; +} + + +void atomicAdd_d32fe4() { + int res = 0; + const int x_9 = tint_atomicAdd(sb_rw, 0u, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicAdd_d32fe4(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicAdd_d32fe4(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..64027ff549 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicAdd_d32fe4(device SB_RW_atomic* const tint_symbol) { + int res = 0; + int const x_9 = atomic_fetch_add_explicit(&((*(tint_symbol)).arg_0), 1, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicAdd_d32fe4(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicAdd_d32fe4(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..13f287aef1 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,66 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_d32fe4 "atomicAdd_d32fe4" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%atomicAdd_d32fe4 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %res %9 + %18 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %12 = OpAtomicIAdd %int %18 %uint_1 %uint_0 %int_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %27 = OpLabel + %28 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %30 = OpLabel + %31 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..cfc64fbba6 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicAdd_d32fe4() { + var res : i32 = 0i; + let x_9 : i32 = atomicAdd(&(sb_rw.arg_0), 1i); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicAdd_d32fe4(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicAdd_d32fe4(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm new file mode 100644 index 0000000000..399663595f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm @@ -0,0 +1,51 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 24 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_8a199a "atomicAdd_8a199a" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint +%atomicAdd_8a199a = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %14 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %9 = OpAtomicIAdd %uint %14 %uint_1 %uint_0 %uint_1 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..48a073514d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicAdd_8a199a() { + uint res = 0u; + uint x_9 = atomicAdd(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicAdd_8a199a(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicAdd_8a199a() { + uint res = 0u; + uint x_9 = atomicAdd(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void compute_main_1() { + atomicAdd_8a199a(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..bdc43b0733 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicAdd(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedAdd(offset, value, original_value); + return original_value; +} + + +void atomicAdd_8a199a() { + uint res = 0u; + const uint x_9 = tint_atomicAdd(sb_rw, 0u, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicAdd_8a199a(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicAdd_8a199a(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..fa2343bc6a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicAdd_8a199a(device SB_RW_atomic* const tint_symbol) { + uint res = 0u; + uint const x_9 = atomic_fetch_add_explicit(&((*(tint_symbol)).arg_0), 1u, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicAdd_8a199a(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicAdd_8a199a(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..e1bf1e996e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,64 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 30 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_8a199a "atomicAdd_8a199a" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicAdd_8a199a = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %res %9 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %12 = OpAtomicIAdd %uint %17 %uint_1 %uint_0 %uint_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %25 = OpLabel + %26 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %28 = OpLabel + %29 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..b5d5856764 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicAdd_8a199a() { + var res : u32 = 0u; + let x_9 : u32 = atomicAdd(&(sb_rw.arg_0), 1u); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicAdd_8a199a(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicAdd_8a199a(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm new file mode 100644 index 0000000000..d8903dcfc7 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_794055 "atomicAdd_794055" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %18 = OpConstantNull %int + %19 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_794055 = OpFunction %void None %7 + %10 = OpLabel + %res = OpVariable %_ptr_Function_int Function %18 + %11 = OpAtomicIAdd %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %11 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %19 +%local_invocation_index = OpFunctionParameter %uint + %22 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %18 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %27 = OpFunctionCall %void %atomicAdd_794055 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %29 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %30 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..b745861ae2 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicAdd_794055() { + int res = 0; + int x_11 = atomicAdd(arg_0, 1); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicAdd_794055(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..ccdf1ad871 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicAdd_794055() { + int res = 0; + int atomic_result = 0; + InterlockedAdd(arg_0, 1, atomic_result); + const int x_11 = atomic_result; + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicAdd_794055(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..62639d7b4a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicAdd_794055(threadgroup atomic_int* const tint_symbol) { + int res = 0; + int const x_11 = atomic_fetch_add_explicit(tint_symbol, 1, memory_order_relaxed); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicAdd_794055(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_31 = *(tint_symbol_2); + compute_main_inner(x_31, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..3dc0a5d301 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,76 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 46 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_794055 "atomicAdd_794055" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 + %22 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_794055 = OpFunction %void None %10 + %13 = OpLabel + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %res %14 + %17 = OpAtomicIAdd %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %17 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %22 +%local_invocation_index = OpFunctionParameter %uint + %25 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpFunctionCall %void %atomicAdd_794055 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %32 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %22 +%local_invocation_index_1_param = OpFunctionParameter %uint + %37 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %41 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %43 = OpLabel + %45 = OpLoad %uint %local_invocation_index_1_param_1 + %44 = OpFunctionCall %void %compute_main_inner_1 %45 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..723a1135af --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicAdd_794055() { + var res : i32 = 0i; + let x_11 : i32 = atomicAdd(&(arg_0), 1i); + res = x_11; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicAdd_794055(); + return; +} + +fn compute_main_1() { + let x_31 : u32 = local_invocation_index_1; + compute_main_inner(x_31); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm new file mode 100644 index 0000000000..110fb42f3d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm @@ -0,0 +1,52 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 31 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_d5db1d "atomicAdd_d5db1d" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint + %18 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_d5db1d = OpFunction %void None %6 + %9 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %10 = OpAtomicIAdd %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %10 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %18 +%local_invocation_index = OpFunctionParameter %uint + %21 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %17 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %26 = OpFunctionCall %void %atomicAdd_d5db1d + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %28 = OpLabel + %30 = OpLoad %uint %local_invocation_index_1 + %29 = OpFunctionCall %void %compute_main_inner %30 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..97c0c6f4d8 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicAdd_d5db1d() { + uint res = 0u; + uint x_10 = atomicAdd(arg_0, 1u); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicAdd_d5db1d(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..c36ae576b3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicAdd_d5db1d() { + uint res = 0u; + uint atomic_result = 0u; + InterlockedAdd(arg_0, 1u, atomic_result); + const uint x_10 = atomic_result; + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicAdd_d5db1d(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..04a890a74c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicAdd_d5db1d(threadgroup atomic_uint* const tint_symbol) { + uint res = 0u; + uint const x_10 = atomic_fetch_add_explicit(tint_symbol, 1u, memory_order_relaxed); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicAdd_d5db1d(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_30 = *(tint_symbol_2); + compute_main_inner(x_30, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..5daee6404f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,74 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 44 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_d5db1d "atomicAdd_d5db1d" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_d5db1d = OpFunction %void None %9 + %12 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %res %6 + %15 = OpAtomicIAdd %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicAdd_d5db1d + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %30 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %20 +%local_invocation_index_1_param = OpFunctionParameter %uint + %35 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %39 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %41 = OpLabel + %43 = OpLoad %uint %local_invocation_index_1_param_1 + %42 = OpFunctionCall %void %compute_main_inner_1 %43 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..61d34ccb7b --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAdd/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicAdd_d5db1d() { + var res : u32 = 0u; + let x_10 : u32 = atomicAdd(&(arg_0), 1u); + res = x_10; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicAdd_d5db1d(); + return; +} + +fn compute_main_1() { + let x_30 : u32 = local_invocation_index_1; + compute_main_inner(x_30); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm new file mode 100644 index 0000000000..ee4f5dc18f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAnd_152966 "atomicAnd_152966" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %19 = OpConstantNull %int +%atomicAnd_152966 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %19 + %15 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %9 = OpAtomicAnd %int %15 %uint_1 %uint_0 %int_1 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicAnd_152966 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicAnd_152966 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..28adfe0175 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicAnd_152966() { + int res = 0; + int x_9 = atomicAnd(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicAnd_152966(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicAnd_152966() { + int res = 0; + int x_9 = atomicAnd(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void compute_main_1() { + atomicAnd_152966(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..0cc23ee686 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicAnd(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedAnd(offset, value, original_value); + return original_value; +} + + +void atomicAnd_152966() { + int res = 0; + const int x_9 = tint_atomicAnd(sb_rw, 0u, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicAnd_152966(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicAnd_152966(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..919a4e12d5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicAnd_152966(device SB_RW_atomic* const tint_symbol) { + int res = 0; + int const x_9 = atomic_fetch_and_explicit(&((*(tint_symbol)).arg_0), 1, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicAnd_152966(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicAnd_152966(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..0c6eb12ea0 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,66 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAnd_152966 "atomicAnd_152966" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%atomicAnd_152966 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %res %9 + %18 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %12 = OpAtomicAnd %int %18 %uint_1 %uint_0 %int_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicAnd_152966 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %27 = OpLabel + %28 = OpFunctionCall %void %atomicAnd_152966 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %30 = OpLabel + %31 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..c76ec1b616 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicAnd_152966() { + var res : i32 = 0i; + let x_9 : i32 = atomicAnd(&(sb_rw.arg_0), 1i); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicAnd_152966(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicAnd_152966(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm new file mode 100644 index 0000000000..e45402c051 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm @@ -0,0 +1,51 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 24 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAnd_85a8d9 "atomicAnd_85a8d9" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint +%atomicAnd_85a8d9 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %14 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %9 = OpAtomicAnd %uint %14 %uint_1 %uint_0 %uint_1 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicAnd_85a8d9 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %atomicAnd_85a8d9 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..6d879c1d3a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicAnd_85a8d9() { + uint res = 0u; + uint x_9 = atomicAnd(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicAnd_85a8d9(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicAnd_85a8d9() { + uint res = 0u; + uint x_9 = atomicAnd(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void compute_main_1() { + atomicAnd_85a8d9(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..897165d2a2 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicAnd(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedAnd(offset, value, original_value); + return original_value; +} + + +void atomicAnd_85a8d9() { + uint res = 0u; + const uint x_9 = tint_atomicAnd(sb_rw, 0u, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicAnd_85a8d9(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicAnd_85a8d9(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..2589380d01 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicAnd_85a8d9(device SB_RW_atomic* const tint_symbol) { + uint res = 0u; + uint const x_9 = atomic_fetch_and_explicit(&((*(tint_symbol)).arg_0), 1u, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicAnd_85a8d9(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicAnd_85a8d9(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..25da8d5d1c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,64 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 30 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAnd_85a8d9 "atomicAnd_85a8d9" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicAnd_85a8d9 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %res %9 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %12 = OpAtomicAnd %uint %17 %uint_1 %uint_0 %uint_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicAnd_85a8d9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %25 = OpLabel + %26 = OpFunctionCall %void %atomicAnd_85a8d9 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %28 = OpLabel + %29 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..2f8f4591c5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicAnd_85a8d9() { + var res : u32 = 0u; + let x_9 : u32 = atomicAnd(&(sb_rw.arg_0), 1u); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicAnd_85a8d9(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicAnd_85a8d9(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm new file mode 100644 index 0000000000..696d2a3a41 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAnd_45a819 "atomicAnd_45a819" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %18 = OpConstantNull %int + %19 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAnd_45a819 = OpFunction %void None %7 + %10 = OpLabel + %res = OpVariable %_ptr_Function_int Function %18 + %11 = OpAtomicAnd %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %11 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %19 +%local_invocation_index = OpFunctionParameter %uint + %22 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %18 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %27 = OpFunctionCall %void %atomicAnd_45a819 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %29 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %30 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..f914b2fc53 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicAnd_45a819() { + int res = 0; + int x_11 = atomicAnd(arg_0, 1); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicAnd_45a819(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..2e8671392c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicAnd_45a819() { + int res = 0; + int atomic_result = 0; + InterlockedAnd(arg_0, 1, atomic_result); + const int x_11 = atomic_result; + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicAnd_45a819(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..ee4b602e3f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicAnd_45a819(threadgroup atomic_int* const tint_symbol) { + int res = 0; + int const x_11 = atomic_fetch_and_explicit(tint_symbol, 1, memory_order_relaxed); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicAnd_45a819(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_31 = *(tint_symbol_2); + compute_main_inner(x_31, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..b7e9939338 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,76 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 46 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAnd_45a819 "atomicAnd_45a819" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 + %22 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAnd_45a819 = OpFunction %void None %10 + %13 = OpLabel + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %res %14 + %17 = OpAtomicAnd %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %17 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %22 +%local_invocation_index = OpFunctionParameter %uint + %25 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpFunctionCall %void %atomicAnd_45a819 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %32 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %22 +%local_invocation_index_1_param = OpFunctionParameter %uint + %37 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %41 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %43 = OpLabel + %45 = OpLoad %uint %local_invocation_index_1_param_1 + %44 = OpFunctionCall %void %compute_main_inner_1 %45 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..9369271687 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicAnd_45a819() { + var res : i32 = 0i; + let x_11 : i32 = atomicAnd(&(arg_0), 1i); + res = x_11; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicAnd_45a819(); + return; +} + +fn compute_main_1() { + let x_31 : u32 = local_invocation_index_1; + compute_main_inner(x_31); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm new file mode 100644 index 0000000000..3d205d2f64 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm @@ -0,0 +1,52 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 31 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAnd_34edd3 "atomicAnd_34edd3" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint + %18 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAnd_34edd3 = OpFunction %void None %6 + %9 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %10 = OpAtomicAnd %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %10 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %18 +%local_invocation_index = OpFunctionParameter %uint + %21 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %17 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %26 = OpFunctionCall %void %atomicAnd_34edd3 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %28 = OpLabel + %30 = OpLoad %uint %local_invocation_index_1 + %29 = OpFunctionCall %void %compute_main_inner %30 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..92c68d7e52 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicAnd_34edd3() { + uint res = 0u; + uint x_10 = atomicAnd(arg_0, 1u); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicAnd_34edd3(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..fb9b51677b --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicAnd_34edd3() { + uint res = 0u; + uint atomic_result = 0u; + InterlockedAnd(arg_0, 1u, atomic_result); + const uint x_10 = atomic_result; + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicAnd_34edd3(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..ffc5ace33c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicAnd_34edd3(threadgroup atomic_uint* const tint_symbol) { + uint res = 0u; + uint const x_10 = atomic_fetch_and_explicit(tint_symbol, 1u, memory_order_relaxed); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicAnd_34edd3(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_30 = *(tint_symbol_2); + compute_main_inner(x_30, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..02a5b899e1 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,74 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 44 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAnd_34edd3 "atomicAnd_34edd3" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAnd_34edd3 = OpFunction %void None %9 + %12 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %res %6 + %15 = OpAtomicAnd %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicAnd_34edd3 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %30 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %20 +%local_invocation_index_1_param = OpFunctionParameter %uint + %35 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %39 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %41 = OpLabel + %43 = OpLoad %uint %local_invocation_index_1_param_1 + %42 = OpFunctionCall %void %compute_main_inner_1 %43 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..ee27cf61cc --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicAnd/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicAnd_34edd3() { + var res : u32 = 0u; + let x_10 : u32 = atomicAnd(&(arg_0), 1u); + res = x_10; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicAnd_34edd3(); + return; +} + +fn compute_main_1() { + let x_30 : u32 = local_invocation_index_1; + compute_main_inner(x_30); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm new file mode 100644 index 0000000000..454abb1a57 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm @@ -0,0 +1,62 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 30 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicCompareExchangeWeak_1bd40a "atomicCompareExchangeWeak_1bd40a" + OpName %__atomic_compare_exchange_resulti32 "__atomic_compare_exchange_resulti32" + OpMemberName %__atomic_compare_exchange_resulti32 0 "old_value" + OpMemberName %__atomic_compare_exchange_resulti32 1 "exchanged" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + OpMemberDecorate %__atomic_compare_exchange_resulti32 0 Offset 0 + OpMemberDecorate %__atomic_compare_exchange_resulti32 1 Offset 4 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %bool = OpTypeBool +%__atomic_compare_exchange_resulti32 = OpTypeStruct %int %bool + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%_ptr_Function___atomic_compare_exchange_resulti32 = OpTypePointer Function %__atomic_compare_exchange_resulti32 + %23 = OpConstantNull %__atomic_compare_exchange_resulti32 +%atomicCompareExchangeWeak_1bd40a = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function___atomic_compare_exchange_resulti32 Function %23 + %17 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %19 = OpAtomicCompareExchange %int %17 %uint_1 %uint_0 %uint_0 %int_1 %int_1 + %20 = OpIEqual %bool %19 %int_1 + %9 = OpCompositeConstruct %__atomic_compare_exchange_resulti32 %19 %20 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %25 = OpLabel + %26 = OpFunctionCall %void %atomicCompareExchangeWeak_1bd40a + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %28 = OpLabel + %29 = OpFunctionCall %void %atomicCompareExchangeWeak_1bd40a + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..b46c227b77 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.glsl @@ -0,0 +1,102 @@ +#version 310 es +precision mediump float; + +struct atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +struct x__atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicCompareExchangeWeak_1bd40a() { + x__atomic_compare_exchange_resulti32 res = x__atomic_compare_exchange_resulti32(0, false); + atomic_compare_exchange_resulti32 atomic_compare_result; + atomic_compare_result.old_value = atomicCompSwap(sb_rw.arg_0, 1, 1); + atomic_compare_result.exchanged = atomic_compare_result.old_value == 1; + atomic_compare_exchange_resulti32 tint_symbol = atomic_compare_result; + int old_value_1 = tint_symbol.old_value; + int x_19 = old_value_1; + x__atomic_compare_exchange_resulti32 tint_symbol_1 = x__atomic_compare_exchange_resulti32(x_19, (x_19 == 1)); + res = tint_symbol_1; + return; +} + +void fragment_main_1() { + atomicCompareExchangeWeak_1bd40a(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +struct x__atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicCompareExchangeWeak_1bd40a() { + x__atomic_compare_exchange_resulti32 res = x__atomic_compare_exchange_resulti32(0, false); + atomic_compare_exchange_resulti32 atomic_compare_result; + atomic_compare_result.old_value = atomicCompSwap(sb_rw.arg_0, 1, 1); + atomic_compare_result.exchanged = atomic_compare_result.old_value == 1; + atomic_compare_exchange_resulti32 tint_symbol = atomic_compare_result; + int old_value_1 = tint_symbol.old_value; + int x_19 = old_value_1; + x__atomic_compare_exchange_resulti32 tint_symbol_1 = x__atomic_compare_exchange_resulti32(x_19, (x_19 == 1)); + res = tint_symbol_1; + return; +} + +void compute_main_1() { + atomicCompareExchangeWeak_1bd40a(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..a385d05db2 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,50 @@ +struct x__atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + +RWByteAddressBuffer sb_rw : register(u0, space0); + +struct atomic_compare_exchange_weak_ret_type { + int old_value; + bool exchanged; +}; + +atomic_compare_exchange_weak_ret_type tint_atomicCompareExchangeWeak(RWByteAddressBuffer buffer, uint offset, int compare, int value) { + atomic_compare_exchange_weak_ret_type result=(atomic_compare_exchange_weak_ret_type)0; + buffer.InterlockedCompareExchange(offset, compare, value, result.old_value); + result.exchanged = result.old_value == compare; + return result; +} + + +void atomicCompareExchangeWeak_1bd40a() { + x__atomic_compare_exchange_resulti32 res = {0, false}; + const atomic_compare_exchange_weak_ret_type tint_symbol = tint_atomicCompareExchangeWeak(sb_rw, 0u, 1, 1); + const int old_value_1 = tint_symbol.old_value; + const int x_19 = old_value_1; + const x__atomic_compare_exchange_resulti32 tint_symbol_1 = {x_19, (x_19 == 1)}; + res = tint_symbol_1; + return; +} + +void fragment_main_1() { + atomicCompareExchangeWeak_1bd40a(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicCompareExchangeWeak_1bd40a(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..3961fdd1f0 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.msl @@ -0,0 +1,57 @@ +#include + +using namespace metal; + +struct atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; +atomic_compare_exchange_resulti32 atomicCompareExchangeWeak_1(device atomic_int* atomic, int compare, int value) { + int old_value = compare; + bool exchanged = atomic_compare_exchange_weak_explicit(atomic, &old_value, value, memory_order_relaxed, memory_order_relaxed); + return {old_value, exchanged}; +} + +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +struct x__atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + +void atomicCompareExchangeWeak_1bd40a(device SB_RW_atomic* const tint_symbol_2) { + x__atomic_compare_exchange_resulti32 res = {.old_value=0, .exchanged=false}; + atomic_compare_exchange_resulti32 const tint_symbol = atomicCompareExchangeWeak_1(&((*(tint_symbol_2)).arg_0), 1, 1); + int const old_value_1 = tint_symbol.old_value; + int const x_19 = old_value_1; + x__atomic_compare_exchange_resulti32 const tint_symbol_1 = {.old_value=x_19, .exchanged=(x_19 == 1)}; + res = tint_symbol_1; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicCompareExchangeWeak_1bd40a(tint_symbol_3); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + fragment_main_1(tint_symbol_4); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_5) { + atomicCompareExchangeWeak_1bd40a(tint_symbol_5); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_6 [[buffer(0)]]) { + compute_main_1(tint_symbol_6); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..97cc672baa --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,87 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 43 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicCompareExchangeWeak_1bd40a "atomicCompareExchangeWeak_1bd40a" + OpName %x__atomic_compare_exchange_resulti32 "x__atomic_compare_exchange_resulti32" + OpMemberName %x__atomic_compare_exchange_resulti32 0 "old_value" + OpMemberName %x__atomic_compare_exchange_resulti32 1 "exchanged" + OpName %res "res" + OpName %__atomic_compare_exchange_resulti32 "__atomic_compare_exchange_resulti32" + OpMemberName %__atomic_compare_exchange_resulti32 0 "old_value" + OpMemberName %__atomic_compare_exchange_resulti32 1 "exchanged" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + OpMemberDecorate %x__atomic_compare_exchange_resulti32 0 Offset 0 + OpMemberDecorate %x__atomic_compare_exchange_resulti32 1 Offset 4 + OpMemberDecorate %__atomic_compare_exchange_resulti32 0 Offset 0 + OpMemberDecorate %__atomic_compare_exchange_resulti32 1 Offset 4 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %bool = OpTypeBool +%x__atomic_compare_exchange_resulti32 = OpTypeStruct %int %bool + %11 = OpConstantNull %int + %12 = OpConstantNull %bool + %13 = OpConstantComposite %x__atomic_compare_exchange_resulti32 %11 %12 +%_ptr_Function_x__atomic_compare_exchange_resulti32 = OpTypePointer Function %x__atomic_compare_exchange_resulti32 + %16 = OpConstantNull %x__atomic_compare_exchange_resulti32 +%__atomic_compare_exchange_resulti32 = OpTypeStruct %int %bool + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%atomicCompareExchangeWeak_1bd40a = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_x__atomic_compare_exchange_resulti32 Function %16 + OpStore %res %13 + %24 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %26 = OpAtomicCompareExchange %int %24 %uint_1 %uint_0 %uint_0 %int_1 %int_1 + %27 = OpIEqual %bool %26 %int_1 + %17 = OpCompositeConstruct %__atomic_compare_exchange_resulti32 %26 %27 + %28 = OpCompositeExtract %int %17 0 + %29 = OpIEqual %bool %28 %int_1 + %30 = OpCompositeConstruct %x__atomic_compare_exchange_resulti32 %28 %29 + OpStore %res %30 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %32 = OpLabel + %33 = OpFunctionCall %void %atomicCompareExchangeWeak_1bd40a + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %35 = OpLabel + %36 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %38 = OpLabel + %39 = OpFunctionCall %void %atomicCompareExchangeWeak_1bd40a + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %41 = OpLabel + %42 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..cf8754d81a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,42 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +struct x__atomic_compare_exchange_resulti32 { + old_value : i32, + exchanged : bool, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicCompareExchangeWeak_1bd40a() { + var res : x__atomic_compare_exchange_resulti32 = x__atomic_compare_exchange_resulti32(0i, false); + let old_value_1 = atomicCompareExchangeWeak(&(sb_rw.arg_0), 1i, 1i).old_value; + let x_19 : i32 = old_value_1; + res = x__atomic_compare_exchange_resulti32(x_19, (x_19 == 1i)); + return; +} + +fn fragment_main_1() { + atomicCompareExchangeWeak_1bd40a(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicCompareExchangeWeak_1bd40a(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm new file mode 100644 index 0000000000..09e83a0ae1 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm @@ -0,0 +1,60 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 28 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicCompareExchangeWeak_63d8e6 "atomicCompareExchangeWeak_63d8e6" + OpName %__atomic_compare_exchange_resultu32 "__atomic_compare_exchange_resultu32" + OpMemberName %__atomic_compare_exchange_resultu32 0 "old_value" + OpMemberName %__atomic_compare_exchange_resultu32 1 "exchanged" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + OpMemberDecorate %__atomic_compare_exchange_resultu32 0 Offset 0 + OpMemberDecorate %__atomic_compare_exchange_resultu32 1 Offset 4 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %bool = OpTypeBool +%__atomic_compare_exchange_resultu32 = OpTypeStruct %uint %bool + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%_ptr_Function___atomic_compare_exchange_resultu32 = OpTypePointer Function %__atomic_compare_exchange_resultu32 + %21 = OpConstantNull %__atomic_compare_exchange_resultu32 +%atomicCompareExchangeWeak_63d8e6 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function___atomic_compare_exchange_resultu32 Function %21 + %16 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %17 = OpAtomicCompareExchange %uint %16 %uint_1 %uint_0 %uint_0 %uint_1 %uint_1 + %18 = OpIEqual %bool %17 %uint_1 + %9 = OpCompositeConstruct %__atomic_compare_exchange_resultu32 %17 %18 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicCompareExchangeWeak_63d8e6 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %atomicCompareExchangeWeak_63d8e6 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..385735d724 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.glsl @@ -0,0 +1,102 @@ +#version 310 es +precision mediump float; + +struct atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +struct x__atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicCompareExchangeWeak_63d8e6() { + x__atomic_compare_exchange_resultu32 res = x__atomic_compare_exchange_resultu32(0u, false); + atomic_compare_exchange_resultu32 atomic_compare_result; + atomic_compare_result.old_value = atomicCompSwap(sb_rw.arg_0, 1u, 1u); + atomic_compare_result.exchanged = atomic_compare_result.old_value == 1u; + atomic_compare_exchange_resultu32 tint_symbol = atomic_compare_result; + uint old_value_1 = tint_symbol.old_value; + uint x_17 = old_value_1; + x__atomic_compare_exchange_resultu32 tint_symbol_1 = x__atomic_compare_exchange_resultu32(x_17, (x_17 == 1u)); + res = tint_symbol_1; + return; +} + +void fragment_main_1() { + atomicCompareExchangeWeak_63d8e6(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +struct x__atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicCompareExchangeWeak_63d8e6() { + x__atomic_compare_exchange_resultu32 res = x__atomic_compare_exchange_resultu32(0u, false); + atomic_compare_exchange_resultu32 atomic_compare_result; + atomic_compare_result.old_value = atomicCompSwap(sb_rw.arg_0, 1u, 1u); + atomic_compare_result.exchanged = atomic_compare_result.old_value == 1u; + atomic_compare_exchange_resultu32 tint_symbol = atomic_compare_result; + uint old_value_1 = tint_symbol.old_value; + uint x_17 = old_value_1; + x__atomic_compare_exchange_resultu32 tint_symbol_1 = x__atomic_compare_exchange_resultu32(x_17, (x_17 == 1u)); + res = tint_symbol_1; + return; +} + +void compute_main_1() { + atomicCompareExchangeWeak_63d8e6(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..c36984d494 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,50 @@ +struct x__atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + +RWByteAddressBuffer sb_rw : register(u0, space0); + +struct atomic_compare_exchange_weak_ret_type { + uint old_value; + bool exchanged; +}; + +atomic_compare_exchange_weak_ret_type tint_atomicCompareExchangeWeak(RWByteAddressBuffer buffer, uint offset, uint compare, uint value) { + atomic_compare_exchange_weak_ret_type result=(atomic_compare_exchange_weak_ret_type)0; + buffer.InterlockedCompareExchange(offset, compare, value, result.old_value); + result.exchanged = result.old_value == compare; + return result; +} + + +void atomicCompareExchangeWeak_63d8e6() { + x__atomic_compare_exchange_resultu32 res = {0u, false}; + const atomic_compare_exchange_weak_ret_type tint_symbol = tint_atomicCompareExchangeWeak(sb_rw, 0u, 1u, 1u); + const uint old_value_1 = tint_symbol.old_value; + const uint x_17 = old_value_1; + const x__atomic_compare_exchange_resultu32 tint_symbol_1 = {x_17, (x_17 == 1u)}; + res = tint_symbol_1; + return; +} + +void fragment_main_1() { + atomicCompareExchangeWeak_63d8e6(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicCompareExchangeWeak_63d8e6(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..b06f2f9d9d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.msl @@ -0,0 +1,57 @@ +#include + +using namespace metal; + +struct atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; +atomic_compare_exchange_resultu32 atomicCompareExchangeWeak_1(device atomic_uint* atomic, uint compare, uint value) { + uint old_value = compare; + bool exchanged = atomic_compare_exchange_weak_explicit(atomic, &old_value, value, memory_order_relaxed, memory_order_relaxed); + return {old_value, exchanged}; +} + +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +struct x__atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + +void atomicCompareExchangeWeak_63d8e6(device SB_RW_atomic* const tint_symbol_2) { + x__atomic_compare_exchange_resultu32 res = {.old_value=0u, .exchanged=false}; + atomic_compare_exchange_resultu32 const tint_symbol = atomicCompareExchangeWeak_1(&((*(tint_symbol_2)).arg_0), 1u, 1u); + uint const old_value_1 = tint_symbol.old_value; + uint const x_17 = old_value_1; + x__atomic_compare_exchange_resultu32 const tint_symbol_1 = {.old_value=x_17, .exchanged=(x_17 == 1u)}; + res = tint_symbol_1; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicCompareExchangeWeak_63d8e6(tint_symbol_3); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + fragment_main_1(tint_symbol_4); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_5) { + atomicCompareExchangeWeak_63d8e6(tint_symbol_5); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_6 [[buffer(0)]]) { + compute_main_1(tint_symbol_6); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..bb4e8436b1 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,85 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 41 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicCompareExchangeWeak_63d8e6 "atomicCompareExchangeWeak_63d8e6" + OpName %x__atomic_compare_exchange_resultu32 "x__atomic_compare_exchange_resultu32" + OpMemberName %x__atomic_compare_exchange_resultu32 0 "old_value" + OpMemberName %x__atomic_compare_exchange_resultu32 1 "exchanged" + OpName %res "res" + OpName %__atomic_compare_exchange_resultu32 "__atomic_compare_exchange_resultu32" + OpMemberName %__atomic_compare_exchange_resultu32 0 "old_value" + OpMemberName %__atomic_compare_exchange_resultu32 1 "exchanged" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + OpMemberDecorate %x__atomic_compare_exchange_resultu32 0 Offset 0 + OpMemberDecorate %x__atomic_compare_exchange_resultu32 1 Offset 4 + OpMemberDecorate %__atomic_compare_exchange_resultu32 0 Offset 0 + OpMemberDecorate %__atomic_compare_exchange_resultu32 1 Offset 4 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %bool = OpTypeBool +%x__atomic_compare_exchange_resultu32 = OpTypeStruct %uint %bool + %11 = OpConstantNull %uint + %12 = OpConstantNull %bool + %13 = OpConstantComposite %x__atomic_compare_exchange_resultu32 %11 %12 +%_ptr_Function_x__atomic_compare_exchange_resultu32 = OpTypePointer Function %x__atomic_compare_exchange_resultu32 + %16 = OpConstantNull %x__atomic_compare_exchange_resultu32 +%__atomic_compare_exchange_resultu32 = OpTypeStruct %uint %bool + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicCompareExchangeWeak_63d8e6 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_x__atomic_compare_exchange_resultu32 Function %16 + OpStore %res %13 + %23 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %24 = OpAtomicCompareExchange %uint %23 %uint_1 %uint_0 %uint_0 %uint_1 %uint_1 + %25 = OpIEqual %bool %24 %uint_1 + %17 = OpCompositeConstruct %__atomic_compare_exchange_resultu32 %24 %25 + %26 = OpCompositeExtract %uint %17 0 + %27 = OpIEqual %bool %26 %uint_1 + %28 = OpCompositeConstruct %x__atomic_compare_exchange_resultu32 %26 %27 + OpStore %res %28 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %30 = OpLabel + %31 = OpFunctionCall %void %atomicCompareExchangeWeak_63d8e6 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %33 = OpLabel + %34 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %36 = OpLabel + %37 = OpFunctionCall %void %atomicCompareExchangeWeak_63d8e6 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %39 = OpLabel + %40 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..4382a2338c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,42 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +struct x__atomic_compare_exchange_resultu32 { + old_value : u32, + exchanged : bool, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicCompareExchangeWeak_63d8e6() { + var res : x__atomic_compare_exchange_resultu32 = x__atomic_compare_exchange_resultu32(0u, false); + let old_value_1 = atomicCompareExchangeWeak(&(sb_rw.arg_0), 1u, 1u).old_value; + let x_17 : u32 = old_value_1; + res = x__atomic_compare_exchange_resultu32(x_17, (x_17 == 1u)); + return; +} + +fn fragment_main_1() { + atomicCompareExchangeWeak_63d8e6(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicCompareExchangeWeak_63d8e6(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm new file mode 100644 index 0000000000..a0f338c664 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm @@ -0,0 +1,63 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 37 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicCompareExchangeWeak_e88938 "atomicCompareExchangeWeak_e88938" + OpName %__atomic_compare_exchange_resulti32 "__atomic_compare_exchange_resulti32" + OpMemberName %__atomic_compare_exchange_resulti32 0 "old_value" + OpMemberName %__atomic_compare_exchange_resulti32 1 "exchanged" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %__atomic_compare_exchange_resulti32 0 Offset 0 + OpMemberDecorate %__atomic_compare_exchange_resulti32 1 Offset 4 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %bool = OpTypeBool +%__atomic_compare_exchange_resulti32 = OpTypeStruct %int %bool + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 +%_ptr_Function___atomic_compare_exchange_resulti32 = OpTypePointer Function %__atomic_compare_exchange_resulti32 + %22 = OpConstantNull %__atomic_compare_exchange_resulti32 + %23 = OpTypeFunction %void %uint + %29 = OpConstantNull %int + %uint_264 = OpConstant %uint 264 +%atomicCompareExchangeWeak_e88938 = OpFunction %void None %7 + %10 = OpLabel + %res = OpVariable %_ptr_Function___atomic_compare_exchange_resulti32 Function %22 + %18 = OpAtomicCompareExchange %int %arg_0 %uint_2 %uint_0 %uint_0 %int_1 %int_1 + %19 = OpIEqual %bool %18 %int_1 + %11 = OpCompositeConstruct %__atomic_compare_exchange_resulti32 %18 %19 + OpStore %res %11 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %23 +%local_invocation_index = OpFunctionParameter %uint + %26 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %29 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %32 = OpFunctionCall %void %atomicCompareExchangeWeak_e88938 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %34 = OpLabel + %36 = OpLoad %uint %local_invocation_index_1 + %35 = OpFunctionCall %void %compute_main_inner %36 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..6ccd038883 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,54 @@ +#version 310 es + +struct atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + + +struct x__atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicCompareExchangeWeak_e88938() { + x__atomic_compare_exchange_resulti32 res = x__atomic_compare_exchange_resulti32(0, false); + atomic_compare_exchange_resulti32 atomic_compare_result; + atomic_compare_result.old_value = atomicCompSwap(arg_0, 1, 1); + atomic_compare_result.exchanged = atomic_compare_result.old_value == 1; + atomic_compare_exchange_resulti32 tint_symbol = atomic_compare_result; + int old_value_1 = tint_symbol.old_value; + int x_18 = old_value_1; + x__atomic_compare_exchange_resulti32 tint_symbol_1 = x__atomic_compare_exchange_resulti32(x_18, (x_18 == 1)); + res = tint_symbol_1; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicCompareExchangeWeak_e88938(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..03640ddc23 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,58 @@ +struct atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; +struct x__atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicCompareExchangeWeak_e88938() { + x__atomic_compare_exchange_resulti32 res = {0, false}; + atomic_compare_exchange_resulti32 atomic_result = (atomic_compare_exchange_resulti32)0; + int atomic_compare_value = 1; + InterlockedCompareExchange(arg_0, atomic_compare_value, 1, atomic_result.old_value); + atomic_result.exchanged = atomic_result.old_value == atomic_compare_value; + const atomic_compare_exchange_resulti32 tint_symbol_2 = atomic_result; + const int old_value_1 = tint_symbol_2.old_value; + const int x_18 = old_value_1; + const x__atomic_compare_exchange_resulti32 tint_symbol_3 = {x_18, (x_18 == 1)}; + res = tint_symbol_3; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicCompareExchangeWeak_e88938(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..4cfcd1c115 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,58 @@ +#include + +using namespace metal; + +struct atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; +atomic_compare_exchange_resulti32 atomicCompareExchangeWeak_1(threadgroup atomic_int* atomic, int compare, int value) { + int old_value = compare; + bool exchanged = atomic_compare_exchange_weak_explicit(atomic, &old_value, value, memory_order_relaxed, memory_order_relaxed); + return {old_value, exchanged}; +} + +struct x__atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + +void atomicCompareExchangeWeak_e88938(threadgroup atomic_int* const tint_symbol_2) { + x__atomic_compare_exchange_resulti32 res = {.old_value=0, .exchanged=false}; + atomic_compare_exchange_resulti32 const tint_symbol = atomicCompareExchangeWeak_1(tint_symbol_2, 1, 1); + int const old_value_1 = tint_symbol.old_value; + int const x_18 = old_value_1; + x__atomic_compare_exchange_resulti32 const tint_symbol_1 = {.old_value=x_18, .exchanged=(x_18 == 1)}; + res = tint_symbol_1; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_3) { + atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicCompareExchangeWeak_e88938(tint_symbol_3); + return; +} + +void compute_main_1(thread uint* const tint_symbol_4, threadgroup atomic_int* const tint_symbol_5) { + uint const x_36 = *(tint_symbol_4); + compute_main_inner(x_36, tint_symbol_5); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_6, thread uint* const tint_symbol_7) { + { + atomic_store_explicit(tint_symbol_6, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_7) = local_invocation_index_1_param; + compute_main_1(tint_symbol_7, tint_symbol_6); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_8; + thread uint tint_symbol_9 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_8), &(tint_symbol_9)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..a9201f54ad --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,97 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 57 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicCompareExchangeWeak_e88938 "atomicCompareExchangeWeak_e88938" + OpName %x__atomic_compare_exchange_resulti32 "x__atomic_compare_exchange_resulti32" + OpMemberName %x__atomic_compare_exchange_resulti32 0 "old_value" + OpMemberName %x__atomic_compare_exchange_resulti32 1 "exchanged" + OpName %res "res" + OpName %__atomic_compare_exchange_resulti32 "__atomic_compare_exchange_resulti32" + OpMemberName %__atomic_compare_exchange_resulti32 0 "old_value" + OpMemberName %__atomic_compare_exchange_resulti32 1 "exchanged" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %x__atomic_compare_exchange_resulti32 0 Offset 0 + OpMemberDecorate %x__atomic_compare_exchange_resulti32 1 Offset 4 + OpMemberDecorate %__atomic_compare_exchange_resulti32 0 Offset 0 + OpMemberDecorate %__atomic_compare_exchange_resulti32 1 Offset 4 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %bool = OpTypeBool +%x__atomic_compare_exchange_resulti32 = OpTypeStruct %int %bool + %16 = OpConstantNull %int + %17 = OpConstantNull %bool + %18 = OpConstantComposite %x__atomic_compare_exchange_resulti32 %16 %17 +%_ptr_Function_x__atomic_compare_exchange_resulti32 = OpTypePointer Function %x__atomic_compare_exchange_resulti32 + %21 = OpConstantNull %x__atomic_compare_exchange_resulti32 +%__atomic_compare_exchange_resulti32 = OpTypeStruct %int %bool + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 + %33 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicCompareExchangeWeak_e88938 = OpFunction %void None %10 + %13 = OpLabel + %res = OpVariable %_ptr_Function_x__atomic_compare_exchange_resulti32 Function %21 + OpStore %res %18 + %28 = OpAtomicCompareExchange %int %arg_0 %uint_2 %uint_0 %uint_0 %int_1 %int_1 + %29 = OpIEqual %bool %28 %int_1 + %22 = OpCompositeConstruct %__atomic_compare_exchange_resulti32 %28 %29 + %30 = OpCompositeExtract %int %22 0 + %31 = OpIEqual %bool %30 %int_1 + %32 = OpCompositeConstruct %x__atomic_compare_exchange_resulti32 %30 %31 + OpStore %res %32 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %33 +%local_invocation_index = OpFunctionParameter %uint + %36 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %16 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %41 = OpFunctionCall %void %atomicCompareExchangeWeak_e88938 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %43 = OpLabel + %44 = OpLoad %uint %local_invocation_index_1 + %45 = OpFunctionCall %void %compute_main_inner %44 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %33 +%local_invocation_index_1_param = OpFunctionParameter %uint + %48 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %16 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %52 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %54 = OpLabel + %56 = OpLoad %uint %local_invocation_index_1_param_1 + %55 = OpFunctionCall %void %compute_main_inner_1 %56 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..349dccfe6a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,35 @@ +struct x__atomic_compare_exchange_resulti32 { + old_value : i32, + exchanged : bool, +} + +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicCompareExchangeWeak_e88938() { + var res : x__atomic_compare_exchange_resulti32 = x__atomic_compare_exchange_resulti32(0i, false); + let old_value_1 = atomicCompareExchangeWeak(&(arg_0), 1i, 1i).old_value; + let x_18 : i32 = old_value_1; + res = x__atomic_compare_exchange_resulti32(x_18, (x_18 == 1i)); + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicCompareExchangeWeak_e88938(); + return; +} + +fn compute_main_1() { + let x_36 : u32 = local_invocation_index_1; + compute_main_inner(x_36); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm new file mode 100644 index 0000000000..826498596a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm @@ -0,0 +1,62 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 36 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicCompareExchangeWeak_83580d "atomicCompareExchangeWeak_83580d" + OpName %__atomic_compare_exchange_resultu32 "__atomic_compare_exchange_resultu32" + OpMemberName %__atomic_compare_exchange_resultu32 0 "old_value" + OpMemberName %__atomic_compare_exchange_resultu32 1 "exchanged" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %__atomic_compare_exchange_resultu32 0 Offset 0 + OpMemberDecorate %__atomic_compare_exchange_resultu32 1 Offset 4 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %bool = OpTypeBool +%__atomic_compare_exchange_resultu32 = OpTypeStruct %uint %bool + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 +%_ptr_Function___atomic_compare_exchange_resultu32 = OpTypePointer Function %__atomic_compare_exchange_resultu32 + %21 = OpConstantNull %__atomic_compare_exchange_resultu32 + %22 = OpTypeFunction %void %uint + %28 = OpConstantNull %uint + %uint_264 = OpConstant %uint 264 +%atomicCompareExchangeWeak_83580d = OpFunction %void None %6 + %9 = OpLabel + %res = OpVariable %_ptr_Function___atomic_compare_exchange_resultu32 Function %21 + %17 = OpAtomicCompareExchange %uint %arg_0 %uint_2 %uint_0 %uint_0 %uint_1 %uint_1 + %18 = OpIEqual %bool %17 %uint_1 + %10 = OpCompositeConstruct %__atomic_compare_exchange_resultu32 %17 %18 + OpStore %res %10 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %22 +%local_invocation_index = OpFunctionParameter %uint + %25 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %28 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %31 = OpFunctionCall %void %atomicCompareExchangeWeak_83580d + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %33 = OpLabel + %35 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %35 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..7bd1617e29 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,54 @@ +#version 310 es + +struct atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + + +struct x__atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicCompareExchangeWeak_83580d() { + x__atomic_compare_exchange_resultu32 res = x__atomic_compare_exchange_resultu32(0u, false); + atomic_compare_exchange_resultu32 atomic_compare_result; + atomic_compare_result.old_value = atomicCompSwap(arg_0, 1u, 1u); + atomic_compare_result.exchanged = atomic_compare_result.old_value == 1u; + atomic_compare_exchange_resultu32 tint_symbol = atomic_compare_result; + uint old_value_1 = tint_symbol.old_value; + uint x_17 = old_value_1; + x__atomic_compare_exchange_resultu32 tint_symbol_1 = x__atomic_compare_exchange_resultu32(x_17, (x_17 == 1u)); + res = tint_symbol_1; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicCompareExchangeWeak_83580d(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..1c61811dea --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,58 @@ +struct atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; +struct x__atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicCompareExchangeWeak_83580d() { + x__atomic_compare_exchange_resultu32 res = {0u, false}; + atomic_compare_exchange_resultu32 atomic_result = (atomic_compare_exchange_resultu32)0; + uint atomic_compare_value = 1u; + InterlockedCompareExchange(arg_0, atomic_compare_value, 1u, atomic_result.old_value); + atomic_result.exchanged = atomic_result.old_value == atomic_compare_value; + const atomic_compare_exchange_resultu32 tint_symbol_2 = atomic_result; + const uint old_value_1 = tint_symbol_2.old_value; + const uint x_17 = old_value_1; + const x__atomic_compare_exchange_resultu32 tint_symbol_3 = {x_17, (x_17 == 1u)}; + res = tint_symbol_3; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicCompareExchangeWeak_83580d(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..0f6a268221 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,58 @@ +#include + +using namespace metal; + +struct atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; +atomic_compare_exchange_resultu32 atomicCompareExchangeWeak_1(threadgroup atomic_uint* atomic, uint compare, uint value) { + uint old_value = compare; + bool exchanged = atomic_compare_exchange_weak_explicit(atomic, &old_value, value, memory_order_relaxed, memory_order_relaxed); + return {old_value, exchanged}; +} + +struct x__atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + +void atomicCompareExchangeWeak_83580d(threadgroup atomic_uint* const tint_symbol_2) { + x__atomic_compare_exchange_resultu32 res = {.old_value=0u, .exchanged=false}; + atomic_compare_exchange_resultu32 const tint_symbol = atomicCompareExchangeWeak_1(tint_symbol_2, 1u, 1u); + uint const old_value_1 = tint_symbol.old_value; + uint const x_17 = old_value_1; + x__atomic_compare_exchange_resultu32 const tint_symbol_1 = {.old_value=x_17, .exchanged=(x_17 == 1u)}; + res = tint_symbol_1; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_3) { + atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicCompareExchangeWeak_83580d(tint_symbol_3); + return; +} + +void compute_main_1(thread uint* const tint_symbol_4, threadgroup atomic_uint* const tint_symbol_5) { + uint const x_35 = *(tint_symbol_4); + compute_main_inner(x_35, tint_symbol_5); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_6, thread uint* const tint_symbol_7) { + { + atomic_store_explicit(tint_symbol_6, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_7) = local_invocation_index_1_param; + compute_main_1(tint_symbol_7, tint_symbol_6); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_8; + thread uint tint_symbol_9 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_8), &(tint_symbol_9)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..26382e3a20 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,95 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 55 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicCompareExchangeWeak_83580d "atomicCompareExchangeWeak_83580d" + OpName %x__atomic_compare_exchange_resultu32 "x__atomic_compare_exchange_resultu32" + OpMemberName %x__atomic_compare_exchange_resultu32 0 "old_value" + OpMemberName %x__atomic_compare_exchange_resultu32 1 "exchanged" + OpName %res "res" + OpName %__atomic_compare_exchange_resultu32 "__atomic_compare_exchange_resultu32" + OpMemberName %__atomic_compare_exchange_resultu32 0 "old_value" + OpMemberName %__atomic_compare_exchange_resultu32 1 "exchanged" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %x__atomic_compare_exchange_resultu32 0 Offset 0 + OpMemberDecorate %x__atomic_compare_exchange_resultu32 1 Offset 4 + OpMemberDecorate %__atomic_compare_exchange_resultu32 0 Offset 0 + OpMemberDecorate %__atomic_compare_exchange_resultu32 1 Offset 4 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void + %bool = OpTypeBool +%x__atomic_compare_exchange_resultu32 = OpTypeStruct %uint %bool + %15 = OpConstantNull %bool + %16 = OpConstantComposite %x__atomic_compare_exchange_resultu32 %6 %15 +%_ptr_Function_x__atomic_compare_exchange_resultu32 = OpTypePointer Function %x__atomic_compare_exchange_resultu32 + %19 = OpConstantNull %x__atomic_compare_exchange_resultu32 +%__atomic_compare_exchange_resultu32 = OpTypeStruct %uint %bool + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 + %31 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicCompareExchangeWeak_83580d = OpFunction %void None %9 + %12 = OpLabel + %res = OpVariable %_ptr_Function_x__atomic_compare_exchange_resultu32 Function %19 + OpStore %res %16 + %26 = OpAtomicCompareExchange %uint %arg_0 %uint_2 %uint_0 %uint_0 %uint_1 %uint_1 + %27 = OpIEqual %bool %26 %uint_1 + %20 = OpCompositeConstruct %__atomic_compare_exchange_resultu32 %26 %27 + %28 = OpCompositeExtract %uint %20 0 + %29 = OpIEqual %bool %28 %uint_1 + %30 = OpCompositeConstruct %x__atomic_compare_exchange_resultu32 %28 %29 + OpStore %res %30 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %31 +%local_invocation_index = OpFunctionParameter %uint + %34 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %39 = OpFunctionCall %void %atomicCompareExchangeWeak_83580d + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %41 = OpLabel + %42 = OpLoad %uint %local_invocation_index_1 + %43 = OpFunctionCall %void %compute_main_inner %42 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %31 +%local_invocation_index_1_param = OpFunctionParameter %uint + %46 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %50 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %52 = OpLabel + %54 = OpLoad %uint %local_invocation_index_1_param_1 + %53 = OpFunctionCall %void %compute_main_inner_1 %54 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..9c897f96b9 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,35 @@ +struct x__atomic_compare_exchange_resultu32 { + old_value : u32, + exchanged : bool, +} + +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicCompareExchangeWeak_83580d() { + var res : x__atomic_compare_exchange_resultu32 = x__atomic_compare_exchange_resultu32(0u, false); + let old_value_1 = atomicCompareExchangeWeak(&(arg_0), 1u, 1u).old_value; + let x_17 : u32 = old_value_1; + res = x__atomic_compare_exchange_resultu32(x_17, (x_17 == 1u)); + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicCompareExchangeWeak_83580d(); + return; +} + +fn compute_main_1() { + let x_35 : u32 = local_invocation_index_1; + compute_main_inner(x_35); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm new file mode 100644 index 0000000000..c4f71e9285 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicExchange_f2e22f "atomicExchange_f2e22f" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %19 = OpConstantNull %int +%atomicExchange_f2e22f = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %19 + %15 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %9 = OpAtomicExchange %int %15 %uint_1 %uint_0 %int_1 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicExchange_f2e22f + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicExchange_f2e22f + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..4fdae2725f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicExchange_f2e22f() { + int res = 0; + int x_9 = atomicExchange(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicExchange_f2e22f(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicExchange_f2e22f() { + int res = 0; + int x_9 = atomicExchange(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void compute_main_1() { + atomicExchange_f2e22f(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..deffe11da8 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicExchange(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedExchange(offset, value, original_value); + return original_value; +} + + +void atomicExchange_f2e22f() { + int res = 0; + const int x_9 = tint_atomicExchange(sb_rw, 0u, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicExchange_f2e22f(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicExchange_f2e22f(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..cbd9391ad0 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicExchange_f2e22f(device SB_RW_atomic* const tint_symbol) { + int res = 0; + int const x_9 = atomic_exchange_explicit(&((*(tint_symbol)).arg_0), 1, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicExchange_f2e22f(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicExchange_f2e22f(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..10fd286e8a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,66 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicExchange_f2e22f "atomicExchange_f2e22f" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%atomicExchange_f2e22f = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %res %9 + %18 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %12 = OpAtomicExchange %int %18 %uint_1 %uint_0 %int_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicExchange_f2e22f + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %27 = OpLabel + %28 = OpFunctionCall %void %atomicExchange_f2e22f + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %30 = OpLabel + %31 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..625f2c3a43 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicExchange_f2e22f() { + var res : i32 = 0i; + let x_9 : i32 = atomicExchange(&(sb_rw.arg_0), 1i); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicExchange_f2e22f(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicExchange_f2e22f(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm new file mode 100644 index 0000000000..bdd9e1de57 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm @@ -0,0 +1,51 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 24 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicExchange_d59712 "atomicExchange_d59712" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint +%atomicExchange_d59712 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %14 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %9 = OpAtomicExchange %uint %14 %uint_1 %uint_0 %uint_1 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicExchange_d59712 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %atomicExchange_d59712 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..57f02915fa --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicExchange_d59712() { + uint res = 0u; + uint x_9 = atomicExchange(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicExchange_d59712(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicExchange_d59712() { + uint res = 0u; + uint x_9 = atomicExchange(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void compute_main_1() { + atomicExchange_d59712(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..7b20c963fd --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicExchange(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedExchange(offset, value, original_value); + return original_value; +} + + +void atomicExchange_d59712() { + uint res = 0u; + const uint x_9 = tint_atomicExchange(sb_rw, 0u, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicExchange_d59712(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicExchange_d59712(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..06d01b5a36 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicExchange_d59712(device SB_RW_atomic* const tint_symbol) { + uint res = 0u; + uint const x_9 = atomic_exchange_explicit(&((*(tint_symbol)).arg_0), 1u, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicExchange_d59712(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicExchange_d59712(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..d282cbfdfd --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,64 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 30 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicExchange_d59712 "atomicExchange_d59712" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicExchange_d59712 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %res %9 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %12 = OpAtomicExchange %uint %17 %uint_1 %uint_0 %uint_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicExchange_d59712 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %25 = OpLabel + %26 = OpFunctionCall %void %atomicExchange_d59712 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %28 = OpLabel + %29 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..e80aa80578 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicExchange_d59712() { + var res : u32 = 0u; + let x_9 : u32 = atomicExchange(&(sb_rw.arg_0), 1u); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicExchange_d59712(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicExchange_d59712(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm new file mode 100644 index 0000000000..b541d6b05e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicExchange_e114ba "atomicExchange_e114ba" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %18 = OpConstantNull %int + %19 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicExchange_e114ba = OpFunction %void None %7 + %10 = OpLabel + %res = OpVariable %_ptr_Function_int Function %18 + %11 = OpAtomicExchange %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %11 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %19 +%local_invocation_index = OpFunctionParameter %uint + %22 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %18 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %27 = OpFunctionCall %void %atomicExchange_e114ba + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %29 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %30 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..3775b8f79c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicExchange_e114ba() { + int res = 0; + int x_11 = atomicExchange(arg_0, 1); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicExchange_e114ba(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..b994cfefdb --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicExchange_e114ba() { + int res = 0; + int atomic_result = 0; + InterlockedExchange(arg_0, 1, atomic_result); + const int x_11 = atomic_result; + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicExchange_e114ba(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..7126a8a502 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicExchange_e114ba(threadgroup atomic_int* const tint_symbol) { + int res = 0; + int const x_11 = atomic_exchange_explicit(tint_symbol, 1, memory_order_relaxed); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicExchange_e114ba(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_31 = *(tint_symbol_2); + compute_main_inner(x_31, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..bb829c958f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,76 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 46 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicExchange_e114ba "atomicExchange_e114ba" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 + %22 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicExchange_e114ba = OpFunction %void None %10 + %13 = OpLabel + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %res %14 + %17 = OpAtomicExchange %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %17 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %22 +%local_invocation_index = OpFunctionParameter %uint + %25 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpFunctionCall %void %atomicExchange_e114ba + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %32 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %22 +%local_invocation_index_1_param = OpFunctionParameter %uint + %37 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %41 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %43 = OpLabel + %45 = OpLoad %uint %local_invocation_index_1_param_1 + %44 = OpFunctionCall %void %compute_main_inner_1 %45 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..4e35c0e9bf --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicExchange_e114ba() { + var res : i32 = 0i; + let x_11 : i32 = atomicExchange(&(arg_0), 1i); + res = x_11; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicExchange_e114ba(); + return; +} + +fn compute_main_1() { + let x_31 : u32 = local_invocation_index_1; + compute_main_inner(x_31); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm new file mode 100644 index 0000000000..23dbf0273e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm @@ -0,0 +1,52 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 31 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicExchange_0a5dca "atomicExchange_0a5dca" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint + %18 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicExchange_0a5dca = OpFunction %void None %6 + %9 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %10 = OpAtomicExchange %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %10 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %18 +%local_invocation_index = OpFunctionParameter %uint + %21 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %17 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %26 = OpFunctionCall %void %atomicExchange_0a5dca + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %28 = OpLabel + %30 = OpLoad %uint %local_invocation_index_1 + %29 = OpFunctionCall %void %compute_main_inner %30 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..7bfe69fc9c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicExchange_0a5dca() { + uint res = 0u; + uint x_10 = atomicExchange(arg_0, 1u); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicExchange_0a5dca(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..926f18e3bd --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicExchange_0a5dca() { + uint res = 0u; + uint atomic_result = 0u; + InterlockedExchange(arg_0, 1u, atomic_result); + const uint x_10 = atomic_result; + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicExchange_0a5dca(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..4027c03177 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicExchange_0a5dca(threadgroup atomic_uint* const tint_symbol) { + uint res = 0u; + uint const x_10 = atomic_exchange_explicit(tint_symbol, 1u, memory_order_relaxed); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicExchange_0a5dca(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_30 = *(tint_symbol_2); + compute_main_inner(x_30, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..0aca328ff6 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,74 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 44 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicExchange_0a5dca "atomicExchange_0a5dca" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicExchange_0a5dca = OpFunction %void None %9 + %12 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %res %6 + %15 = OpAtomicExchange %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicExchange_0a5dca + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %30 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %20 +%local_invocation_index_1_param = OpFunctionParameter %uint + %35 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %39 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %41 = OpLabel + %43 = OpLoad %uint %local_invocation_index_1_param_1 + %42 = OpFunctionCall %void %compute_main_inner_1 %43 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..fb71c6d299 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicExchange/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicExchange_0a5dca() { + var res : u32 = 0u; + let x_10 : u32 = atomicExchange(&(arg_0), 1u); + res = x_10; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicExchange_0a5dca(); + return; +} + +fn compute_main_1() { + let x_30 : u32 = local_invocation_index_1; + compute_main_inner(x_30); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm new file mode 100644 index 0000000000..d961ea5c86 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm @@ -0,0 +1,52 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 25 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicLoad_0806ad "atomicLoad_0806ad" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%_ptr_Function_int = OpTypePointer Function %int + %18 = OpConstantNull %int +%atomicLoad_0806ad = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %18 + %15 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %9 = OpAtomicLoad %int %15 %uint_1 %uint_0 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %20 = OpLabel + %21 = OpFunctionCall %void %atomicLoad_0806ad + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicLoad_0806ad + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..d034197209 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicLoad_0806ad() { + int res = 0; + int x_9 = atomicOr(sb_rw.arg_0, 0); + res = x_9; + return; +} + +void fragment_main_1() { + atomicLoad_0806ad(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicLoad_0806ad() { + int res = 0; + int x_9 = atomicOr(sb_rw.arg_0, 0); + res = x_9; + return; +} + +void compute_main_1() { + atomicLoad_0806ad(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..8ce9cf2f39 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicLoad(RWByteAddressBuffer buffer, uint offset) { + int value = 0; + buffer.InterlockedOr(offset, 0, value); + return value; +} + + +void atomicLoad_0806ad() { + int res = 0; + const int x_9 = tint_atomicLoad(sb_rw, 0u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicLoad_0806ad(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicLoad_0806ad(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..1ea07a1c38 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicLoad_0806ad(device SB_RW_atomic* const tint_symbol) { + int res = 0; + int const x_9 = atomic_load_explicit(&((*(tint_symbol)).arg_0), memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicLoad_0806ad(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicLoad_0806ad(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..40034c7744 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,65 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 31 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicLoad_0806ad "atomicLoad_0806ad" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicLoad_0806ad = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %res %9 + %18 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %12 = OpAtomicLoad %int %18 %uint_1 %uint_0 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %20 = OpLabel + %21 = OpFunctionCall %void %atomicLoad_0806ad + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %atomicLoad_0806ad + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %29 = OpLabel + %30 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..b13dbfb432 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicLoad_0806ad() { + var res : i32 = 0i; + let x_9 : i32 = atomicLoad(&(sb_rw.arg_0)); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicLoad_0806ad(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicLoad_0806ad(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm new file mode 100644 index 0000000000..776c62c09f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm @@ -0,0 +1,51 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 24 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicLoad_fe6cc3 "atomicLoad_fe6cc3" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint +%atomicLoad_fe6cc3 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %14 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %9 = OpAtomicLoad %uint %14 %uint_1 %uint_0 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicLoad_fe6cc3 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %atomicLoad_fe6cc3 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..cebe232998 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicLoad_fe6cc3() { + uint res = 0u; + uint x_9 = atomicOr(sb_rw.arg_0, 0u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicLoad_fe6cc3(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicLoad_fe6cc3() { + uint res = 0u; + uint x_9 = atomicOr(sb_rw.arg_0, 0u); + res = x_9; + return; +} + +void compute_main_1() { + atomicLoad_fe6cc3(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..454ed3cf18 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicLoad(RWByteAddressBuffer buffer, uint offset) { + uint value = 0; + buffer.InterlockedOr(offset, 0, value); + return value; +} + + +void atomicLoad_fe6cc3() { + uint res = 0u; + const uint x_9 = tint_atomicLoad(sb_rw, 0u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicLoad_fe6cc3(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicLoad_fe6cc3(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..a6cce2757a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicLoad_fe6cc3(device SB_RW_atomic* const tint_symbol) { + uint res = 0u; + uint const x_9 = atomic_load_explicit(&((*(tint_symbol)).arg_0), memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicLoad_fe6cc3(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicLoad_fe6cc3(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..e12b47bae3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,64 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 30 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicLoad_fe6cc3 "atomicLoad_fe6cc3" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicLoad_fe6cc3 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %res %9 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %12 = OpAtomicLoad %uint %17 %uint_1 %uint_0 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicLoad_fe6cc3 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %25 = OpLabel + %26 = OpFunctionCall %void %atomicLoad_fe6cc3 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %28 = OpLabel + %29 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..b03da62e6d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicLoad_fe6cc3() { + var res : u32 = 0u; + let x_9 : u32 = atomicLoad(&(sb_rw.arg_0)); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicLoad_fe6cc3(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicLoad_fe6cc3(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm new file mode 100644 index 0000000000..b996359601 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm @@ -0,0 +1,52 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 31 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicLoad_afcc03 "atomicLoad_afcc03" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 +%_ptr_Function_int = OpTypePointer Function %int + %17 = OpConstantNull %int + %18 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicLoad_afcc03 = OpFunction %void None %7 + %10 = OpLabel + %res = OpVariable %_ptr_Function_int Function %17 + %11 = OpAtomicLoad %int %arg_0 %uint_2 %uint_0 + OpStore %res %11 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %18 +%local_invocation_index = OpFunctionParameter %uint + %21 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %17 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %26 = OpFunctionCall %void %atomicLoad_afcc03 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %28 = OpLabel + %30 = OpLoad %uint %local_invocation_index_1 + %29 = OpFunctionCall %void %compute_main_inner %30 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..e0c158b430 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicLoad_afcc03() { + int res = 0; + int x_11 = atomicOr(arg_0, 0); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicLoad_afcc03(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..1593c13612 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicLoad_afcc03() { + int res = 0; + int atomic_result = 0; + InterlockedOr(arg_0, 0, atomic_result); + const int x_11 = atomic_result; + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicLoad_afcc03(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..8f6ee408a4 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicLoad_afcc03(threadgroup atomic_int* const tint_symbol) { + int res = 0; + int const x_11 = atomic_load_explicit(tint_symbol, memory_order_relaxed); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicLoad_afcc03(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_30 = *(tint_symbol_2); + compute_main_inner(x_30, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..829b8487e3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,75 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 45 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicLoad_afcc03 "atomicLoad_afcc03" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %21 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicLoad_afcc03 = OpFunction %void None %10 + %13 = OpLabel + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %res %14 + %17 = OpAtomicLoad %int %arg_0 %uint_2 %uint_0 + OpStore %res %17 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %21 +%local_invocation_index = OpFunctionParameter %uint + %24 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %29 = OpFunctionCall %void %atomicLoad_afcc03 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %31 = OpLabel + %32 = OpLoad %uint %local_invocation_index_1 + %33 = OpFunctionCall %void %compute_main_inner %32 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %21 +%local_invocation_index_1_param = OpFunctionParameter %uint + %36 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %40 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %42 = OpLabel + %44 = OpLoad %uint %local_invocation_index_1_param_1 + %43 = OpFunctionCall %void %compute_main_inner_1 %44 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..af0c057346 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicLoad_afcc03() { + var res : i32 = 0i; + let x_11 : i32 = atomicLoad(&(arg_0)); + res = x_11; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicLoad_afcc03(); + return; +} + +fn compute_main_1() { + let x_30 : u32 = local_invocation_index_1; + compute_main_inner(x_30); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm new file mode 100644 index 0000000000..20eeca7ef5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm @@ -0,0 +1,51 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 30 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicLoad_361bf1 "atomicLoad_361bf1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 +%_ptr_Function_uint = OpTypePointer Function %uint + %16 = OpConstantNull %uint + %17 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicLoad_361bf1 = OpFunction %void None %6 + %9 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %16 + %10 = OpAtomicLoad %uint %arg_0 %uint_2 %uint_0 + OpStore %res %10 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %17 +%local_invocation_index = OpFunctionParameter %uint + %20 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %16 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %25 = OpFunctionCall %void %atomicLoad_361bf1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %27 = OpLabel + %29 = OpLoad %uint %local_invocation_index_1 + %28 = OpFunctionCall %void %compute_main_inner %29 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..8bd40a675c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicLoad_361bf1() { + uint res = 0u; + uint x_10 = atomicOr(arg_0, 0u); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicLoad_361bf1(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..803eadd060 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicLoad_361bf1() { + uint res = 0u; + uint atomic_result = 0u; + InterlockedOr(arg_0, 0, atomic_result); + const uint x_10 = atomic_result; + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicLoad_361bf1(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..d7fcb6e569 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicLoad_361bf1(threadgroup atomic_uint* const tint_symbol) { + uint res = 0u; + uint const x_10 = atomic_load_explicit(tint_symbol, memory_order_relaxed); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicLoad_361bf1(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_29 = *(tint_symbol_2); + compute_main_inner(x_29, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..7a075badba --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,73 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 43 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicLoad_361bf1 "atomicLoad_361bf1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %19 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicLoad_361bf1 = OpFunction %void None %9 + %12 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %res %6 + %15 = OpAtomicLoad %uint %arg_0 %uint_2 %uint_0 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %19 +%local_invocation_index = OpFunctionParameter %uint + %22 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %27 = OpFunctionCall %void %atomicLoad_361bf1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %29 = OpLabel + %30 = OpLoad %uint %local_invocation_index_1 + %31 = OpFunctionCall %void %compute_main_inner %30 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %19 +%local_invocation_index_1_param = OpFunctionParameter %uint + %34 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %38 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %40 = OpLabel + %42 = OpLoad %uint %local_invocation_index_1_param_1 + %41 = OpFunctionCall %void %compute_main_inner_1 %42 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..f132c6fa83 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicLoad/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicLoad_361bf1() { + var res : u32 = 0u; + let x_10 : u32 = atomicLoad(&(arg_0)); + res = x_10; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicLoad_361bf1(); + return; +} + +fn compute_main_1() { + let x_29 : u32 = local_invocation_index_1; + compute_main_inner(x_29); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm new file mode 100644 index 0000000000..82be997072 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicMax_92aa72 "atomicMax_92aa72" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %19 = OpConstantNull %int +%atomicMax_92aa72 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %19 + %15 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %9 = OpAtomicSMax %int %15 %uint_1 %uint_0 %int_1 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicMax_92aa72 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicMax_92aa72 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..63418486d6 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicMax_92aa72() { + int res = 0; + int x_9 = atomicMax(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicMax_92aa72(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicMax_92aa72() { + int res = 0; + int x_9 = atomicMax(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void compute_main_1() { + atomicMax_92aa72(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..4fd3948e88 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicMax(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedMax(offset, value, original_value); + return original_value; +} + + +void atomicMax_92aa72() { + int res = 0; + const int x_9 = tint_atomicMax(sb_rw, 0u, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicMax_92aa72(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicMax_92aa72(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..39a434ce30 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicMax_92aa72(device SB_RW_atomic* const tint_symbol) { + int res = 0; + int const x_9 = atomic_fetch_max_explicit(&((*(tint_symbol)).arg_0), 1, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicMax_92aa72(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicMax_92aa72(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..34dd4c3704 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,66 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicMax_92aa72 "atomicMax_92aa72" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%atomicMax_92aa72 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %res %9 + %18 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %12 = OpAtomicSMax %int %18 %uint_1 %uint_0 %int_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicMax_92aa72 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %27 = OpLabel + %28 = OpFunctionCall %void %atomicMax_92aa72 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %30 = OpLabel + %31 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..ae52315047 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicMax_92aa72() { + var res : i32 = 0i; + let x_9 : i32 = atomicMax(&(sb_rw.arg_0), 1i); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicMax_92aa72(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicMax_92aa72(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm new file mode 100644 index 0000000000..7fb135e806 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm @@ -0,0 +1,51 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 24 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicMax_51b9be "atomicMax_51b9be" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint +%atomicMax_51b9be = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %14 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %9 = OpAtomicUMax %uint %14 %uint_1 %uint_0 %uint_1 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicMax_51b9be + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %atomicMax_51b9be + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..08dd962ca5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicMax_51b9be() { + uint res = 0u; + uint x_9 = atomicMax(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicMax_51b9be(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicMax_51b9be() { + uint res = 0u; + uint x_9 = atomicMax(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void compute_main_1() { + atomicMax_51b9be(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..9934904856 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicMax(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedMax(offset, value, original_value); + return original_value; +} + + +void atomicMax_51b9be() { + uint res = 0u; + const uint x_9 = tint_atomicMax(sb_rw, 0u, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicMax_51b9be(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicMax_51b9be(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..bc40d81b93 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicMax_51b9be(device SB_RW_atomic* const tint_symbol) { + uint res = 0u; + uint const x_9 = atomic_fetch_max_explicit(&((*(tint_symbol)).arg_0), 1u, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicMax_51b9be(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicMax_51b9be(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..be00498bd0 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,64 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 30 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicMax_51b9be "atomicMax_51b9be" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicMax_51b9be = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %res %9 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %12 = OpAtomicUMax %uint %17 %uint_1 %uint_0 %uint_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicMax_51b9be + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %25 = OpLabel + %26 = OpFunctionCall %void %atomicMax_51b9be + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %28 = OpLabel + %29 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..9b20062782 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicMax_51b9be() { + var res : u32 = 0u; + let x_9 : u32 = atomicMax(&(sb_rw.arg_0), 1u); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicMax_51b9be(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicMax_51b9be(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm new file mode 100644 index 0000000000..62355e0b45 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicMax_a89cc3 "atomicMax_a89cc3" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %18 = OpConstantNull %int + %19 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicMax_a89cc3 = OpFunction %void None %7 + %10 = OpLabel + %res = OpVariable %_ptr_Function_int Function %18 + %11 = OpAtomicSMax %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %11 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %19 +%local_invocation_index = OpFunctionParameter %uint + %22 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %18 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %27 = OpFunctionCall %void %atomicMax_a89cc3 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %29 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %30 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..44e03cfcff --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicMax_a89cc3() { + int res = 0; + int x_11 = atomicMax(arg_0, 1); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicMax_a89cc3(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..bdcfb2a5e7 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicMax_a89cc3() { + int res = 0; + int atomic_result = 0; + InterlockedMax(arg_0, 1, atomic_result); + const int x_11 = atomic_result; + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicMax_a89cc3(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..94213828a6 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicMax_a89cc3(threadgroup atomic_int* const tint_symbol) { + int res = 0; + int const x_11 = atomic_fetch_max_explicit(tint_symbol, 1, memory_order_relaxed); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicMax_a89cc3(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_31 = *(tint_symbol_2); + compute_main_inner(x_31, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..0360ae68ae --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,76 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 46 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicMax_a89cc3 "atomicMax_a89cc3" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 + %22 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicMax_a89cc3 = OpFunction %void None %10 + %13 = OpLabel + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %res %14 + %17 = OpAtomicSMax %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %17 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %22 +%local_invocation_index = OpFunctionParameter %uint + %25 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpFunctionCall %void %atomicMax_a89cc3 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %32 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %22 +%local_invocation_index_1_param = OpFunctionParameter %uint + %37 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %41 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %43 = OpLabel + %45 = OpLoad %uint %local_invocation_index_1_param_1 + %44 = OpFunctionCall %void %compute_main_inner_1 %45 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..0c3e2a8cbe --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicMax_a89cc3() { + var res : i32 = 0i; + let x_11 : i32 = atomicMax(&(arg_0), 1i); + res = x_11; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicMax_a89cc3(); + return; +} + +fn compute_main_1() { + let x_31 : u32 = local_invocation_index_1; + compute_main_inner(x_31); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm new file mode 100644 index 0000000000..2636c66b27 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm @@ -0,0 +1,52 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 31 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicMax_beccfc "atomicMax_beccfc" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint + %18 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicMax_beccfc = OpFunction %void None %6 + %9 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %10 = OpAtomicUMax %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %10 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %18 +%local_invocation_index = OpFunctionParameter %uint + %21 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %17 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %26 = OpFunctionCall %void %atomicMax_beccfc + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %28 = OpLabel + %30 = OpLoad %uint %local_invocation_index_1 + %29 = OpFunctionCall %void %compute_main_inner %30 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..dc7354cd96 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicMax_beccfc() { + uint res = 0u; + uint x_10 = atomicMax(arg_0, 1u); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicMax_beccfc(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..9c405cb1d5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicMax_beccfc() { + uint res = 0u; + uint atomic_result = 0u; + InterlockedMax(arg_0, 1u, atomic_result); + const uint x_10 = atomic_result; + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicMax_beccfc(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..200a901d1c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicMax_beccfc(threadgroup atomic_uint* const tint_symbol) { + uint res = 0u; + uint const x_10 = atomic_fetch_max_explicit(tint_symbol, 1u, memory_order_relaxed); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicMax_beccfc(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_30 = *(tint_symbol_2); + compute_main_inner(x_30, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..7f01c87162 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,74 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 44 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicMax_beccfc "atomicMax_beccfc" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicMax_beccfc = OpFunction %void None %9 + %12 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %res %6 + %15 = OpAtomicUMax %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicMax_beccfc + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %30 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %20 +%local_invocation_index_1_param = OpFunctionParameter %uint + %35 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %39 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %41 = OpLabel + %43 = OpLoad %uint %local_invocation_index_1_param_1 + %42 = OpFunctionCall %void %compute_main_inner_1 %43 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..39ee5df379 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMax/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicMax_beccfc() { + var res : u32 = 0u; + let x_10 : u32 = atomicMax(&(arg_0), 1u); + res = x_10; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicMax_beccfc(); + return; +} + +fn compute_main_1() { + let x_30 : u32 = local_invocation_index_1; + compute_main_inner(x_30); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm new file mode 100644 index 0000000000..660547b5d5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicMin_8e38dc "atomicMin_8e38dc" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %19 = OpConstantNull %int +%atomicMin_8e38dc = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %19 + %15 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %9 = OpAtomicSMin %int %15 %uint_1 %uint_0 %int_1 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicMin_8e38dc + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicMin_8e38dc + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..021d201cf7 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicMin_8e38dc() { + int res = 0; + int x_9 = atomicMin(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicMin_8e38dc(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicMin_8e38dc() { + int res = 0; + int x_9 = atomicMin(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void compute_main_1() { + atomicMin_8e38dc(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..efe6471b38 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicMin(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedMin(offset, value, original_value); + return original_value; +} + + +void atomicMin_8e38dc() { + int res = 0; + const int x_9 = tint_atomicMin(sb_rw, 0u, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicMin_8e38dc(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicMin_8e38dc(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..efe7671038 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicMin_8e38dc(device SB_RW_atomic* const tint_symbol) { + int res = 0; + int const x_9 = atomic_fetch_min_explicit(&((*(tint_symbol)).arg_0), 1, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicMin_8e38dc(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicMin_8e38dc(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..42e5312df3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,66 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicMin_8e38dc "atomicMin_8e38dc" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%atomicMin_8e38dc = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %res %9 + %18 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %12 = OpAtomicSMin %int %18 %uint_1 %uint_0 %int_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicMin_8e38dc + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %27 = OpLabel + %28 = OpFunctionCall %void %atomicMin_8e38dc + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %30 = OpLabel + %31 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..667b13a4a2 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicMin_8e38dc() { + var res : i32 = 0i; + let x_9 : i32 = atomicMin(&(sb_rw.arg_0), 1i); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicMin_8e38dc(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicMin_8e38dc(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm new file mode 100644 index 0000000000..0ed9315fd9 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm @@ -0,0 +1,51 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 24 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicMin_c67a74 "atomicMin_c67a74" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint +%atomicMin_c67a74 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %14 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %9 = OpAtomicUMin %uint %14 %uint_1 %uint_0 %uint_1 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicMin_c67a74 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %atomicMin_c67a74 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..66cb35135d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicMin_c67a74() { + uint res = 0u; + uint x_9 = atomicMin(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicMin_c67a74(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicMin_c67a74() { + uint res = 0u; + uint x_9 = atomicMin(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void compute_main_1() { + atomicMin_c67a74(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..1bb4ca033e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicMin(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedMin(offset, value, original_value); + return original_value; +} + + +void atomicMin_c67a74() { + uint res = 0u; + const uint x_9 = tint_atomicMin(sb_rw, 0u, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicMin_c67a74(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicMin_c67a74(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..e03cf33e0c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicMin_c67a74(device SB_RW_atomic* const tint_symbol) { + uint res = 0u; + uint const x_9 = atomic_fetch_min_explicit(&((*(tint_symbol)).arg_0), 1u, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicMin_c67a74(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicMin_c67a74(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..c1fc0dcbf5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,64 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 30 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicMin_c67a74 "atomicMin_c67a74" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicMin_c67a74 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %res %9 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %12 = OpAtomicUMin %uint %17 %uint_1 %uint_0 %uint_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicMin_c67a74 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %25 = OpLabel + %26 = OpFunctionCall %void %atomicMin_c67a74 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %28 = OpLabel + %29 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..62f9e6aec6 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicMin_c67a74() { + var res : u32 = 0u; + let x_9 : u32 = atomicMin(&(sb_rw.arg_0), 1u); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicMin_c67a74(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicMin_c67a74(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm new file mode 100644 index 0000000000..dfe5a35d90 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicMin_278235 "atomicMin_278235" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %18 = OpConstantNull %int + %19 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicMin_278235 = OpFunction %void None %7 + %10 = OpLabel + %res = OpVariable %_ptr_Function_int Function %18 + %11 = OpAtomicSMin %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %11 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %19 +%local_invocation_index = OpFunctionParameter %uint + %22 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %18 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %27 = OpFunctionCall %void %atomicMin_278235 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %29 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %30 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..f8151e377e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicMin_278235() { + int res = 0; + int x_11 = atomicMin(arg_0, 1); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicMin_278235(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..72197d7811 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicMin_278235() { + int res = 0; + int atomic_result = 0; + InterlockedMin(arg_0, 1, atomic_result); + const int x_11 = atomic_result; + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicMin_278235(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..3c4bd987dc --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicMin_278235(threadgroup atomic_int* const tint_symbol) { + int res = 0; + int const x_11 = atomic_fetch_min_explicit(tint_symbol, 1, memory_order_relaxed); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicMin_278235(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_31 = *(tint_symbol_2); + compute_main_inner(x_31, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..cea2249304 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,76 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 46 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicMin_278235 "atomicMin_278235" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 + %22 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicMin_278235 = OpFunction %void None %10 + %13 = OpLabel + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %res %14 + %17 = OpAtomicSMin %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %17 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %22 +%local_invocation_index = OpFunctionParameter %uint + %25 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpFunctionCall %void %atomicMin_278235 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %32 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %22 +%local_invocation_index_1_param = OpFunctionParameter %uint + %37 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %41 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %43 = OpLabel + %45 = OpLoad %uint %local_invocation_index_1_param_1 + %44 = OpFunctionCall %void %compute_main_inner_1 %45 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..5ddda3e92d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicMin_278235() { + var res : i32 = 0i; + let x_11 : i32 = atomicMin(&(arg_0), 1i); + res = x_11; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicMin_278235(); + return; +} + +fn compute_main_1() { + let x_31 : u32 = local_invocation_index_1; + compute_main_inner(x_31); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm new file mode 100644 index 0000000000..de92bee074 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm @@ -0,0 +1,52 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 31 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicMin_69d383 "atomicMin_69d383" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint + %18 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicMin_69d383 = OpFunction %void None %6 + %9 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %10 = OpAtomicUMin %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %10 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %18 +%local_invocation_index = OpFunctionParameter %uint + %21 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %17 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %26 = OpFunctionCall %void %atomicMin_69d383 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %28 = OpLabel + %30 = OpLoad %uint %local_invocation_index_1 + %29 = OpFunctionCall %void %compute_main_inner %30 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..466b141a8b --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicMin_69d383() { + uint res = 0u; + uint x_10 = atomicMin(arg_0, 1u); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicMin_69d383(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..f91f02a22c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicMin_69d383() { + uint res = 0u; + uint atomic_result = 0u; + InterlockedMin(arg_0, 1u, atomic_result); + const uint x_10 = atomic_result; + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicMin_69d383(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..226629f477 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicMin_69d383(threadgroup atomic_uint* const tint_symbol) { + uint res = 0u; + uint const x_10 = atomic_fetch_min_explicit(tint_symbol, 1u, memory_order_relaxed); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicMin_69d383(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_30 = *(tint_symbol_2); + compute_main_inner(x_30, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..475d1ce488 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,74 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 44 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicMin_69d383 "atomicMin_69d383" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicMin_69d383 = OpFunction %void None %9 + %12 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %res %6 + %15 = OpAtomicUMin %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicMin_69d383 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %30 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %20 +%local_invocation_index_1_param = OpFunctionParameter %uint + %35 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %39 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %41 = OpLabel + %43 = OpLoad %uint %local_invocation_index_1_param_1 + %42 = OpFunctionCall %void %compute_main_inner_1 %43 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..8f37c6bbcb --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicMin/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicMin_69d383() { + var res : u32 = 0u; + let x_10 : u32 = atomicMin(&(arg_0), 1u); + res = x_10; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicMin_69d383(); + return; +} + +fn compute_main_1() { + let x_30 : u32 = local_invocation_index_1; + compute_main_inner(x_30); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm new file mode 100644 index 0000000000..1bf00f2122 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicOr_8d96a0 "atomicOr_8d96a0" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %19 = OpConstantNull %int +%atomicOr_8d96a0 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %19 + %15 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %9 = OpAtomicOr %int %15 %uint_1 %uint_0 %int_1 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicOr_8d96a0 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicOr_8d96a0 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..b9557e323c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicOr_8d96a0() { + int res = 0; + int x_9 = atomicOr(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicOr_8d96a0(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicOr_8d96a0() { + int res = 0; + int x_9 = atomicOr(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void compute_main_1() { + atomicOr_8d96a0(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..f9e84d9887 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicOr(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedOr(offset, value, original_value); + return original_value; +} + + +void atomicOr_8d96a0() { + int res = 0; + const int x_9 = tint_atomicOr(sb_rw, 0u, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicOr_8d96a0(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicOr_8d96a0(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..2a66f9fab4 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicOr_8d96a0(device SB_RW_atomic* const tint_symbol) { + int res = 0; + int const x_9 = atomic_fetch_or_explicit(&((*(tint_symbol)).arg_0), 1, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicOr_8d96a0(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicOr_8d96a0(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..a971056f77 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,66 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicOr_8d96a0 "atomicOr_8d96a0" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%atomicOr_8d96a0 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %res %9 + %18 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %12 = OpAtomicOr %int %18 %uint_1 %uint_0 %int_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicOr_8d96a0 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %27 = OpLabel + %28 = OpFunctionCall %void %atomicOr_8d96a0 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %30 = OpLabel + %31 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..bd4a06b184 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicOr_8d96a0() { + var res : i32 = 0i; + let x_9 : i32 = atomicOr(&(sb_rw.arg_0), 1i); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicOr_8d96a0(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicOr_8d96a0(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm new file mode 100644 index 0000000000..4778bc871a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm @@ -0,0 +1,51 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 24 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicOr_5e95d4 "atomicOr_5e95d4" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint +%atomicOr_5e95d4 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %14 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %9 = OpAtomicOr %uint %14 %uint_1 %uint_0 %uint_1 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicOr_5e95d4 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %atomicOr_5e95d4 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..5ad5f61f9f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicOr_5e95d4() { + uint res = 0u; + uint x_9 = atomicOr(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicOr_5e95d4(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicOr_5e95d4() { + uint res = 0u; + uint x_9 = atomicOr(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void compute_main_1() { + atomicOr_5e95d4(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..b0ac7e6e1c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicOr(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedOr(offset, value, original_value); + return original_value; +} + + +void atomicOr_5e95d4() { + uint res = 0u; + const uint x_9 = tint_atomicOr(sb_rw, 0u, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicOr_5e95d4(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicOr_5e95d4(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..e47c2dbe17 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicOr_5e95d4(device SB_RW_atomic* const tint_symbol) { + uint res = 0u; + uint const x_9 = atomic_fetch_or_explicit(&((*(tint_symbol)).arg_0), 1u, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicOr_5e95d4(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicOr_5e95d4(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..a46ca1d0c6 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,64 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 30 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicOr_5e95d4 "atomicOr_5e95d4" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicOr_5e95d4 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %res %9 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %12 = OpAtomicOr %uint %17 %uint_1 %uint_0 %uint_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicOr_5e95d4 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %25 = OpLabel + %26 = OpFunctionCall %void %atomicOr_5e95d4 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %28 = OpLabel + %29 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..4f5bf4c62d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicOr_5e95d4() { + var res : u32 = 0u; + let x_9 : u32 = atomicOr(&(sb_rw.arg_0), 1u); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicOr_5e95d4(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicOr_5e95d4(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm new file mode 100644 index 0000000000..cd14aa9656 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicOr_d09248 "atomicOr_d09248" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %18 = OpConstantNull %int + %19 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicOr_d09248 = OpFunction %void None %7 + %10 = OpLabel + %res = OpVariable %_ptr_Function_int Function %18 + %11 = OpAtomicOr %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %11 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %19 +%local_invocation_index = OpFunctionParameter %uint + %22 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %18 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %27 = OpFunctionCall %void %atomicOr_d09248 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %29 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %30 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..4fdf33826d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicOr_d09248() { + int res = 0; + int x_11 = atomicOr(arg_0, 1); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicOr_d09248(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..9f15c6c6ef --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicOr_d09248() { + int res = 0; + int atomic_result = 0; + InterlockedOr(arg_0, 1, atomic_result); + const int x_11 = atomic_result; + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicOr_d09248(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..74c1a5852e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicOr_d09248(threadgroup atomic_int* const tint_symbol) { + int res = 0; + int const x_11 = atomic_fetch_or_explicit(tint_symbol, 1, memory_order_relaxed); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicOr_d09248(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_31 = *(tint_symbol_2); + compute_main_inner(x_31, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..9ef589330b --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,76 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 46 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicOr_d09248 "atomicOr_d09248" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 + %22 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicOr_d09248 = OpFunction %void None %10 + %13 = OpLabel + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %res %14 + %17 = OpAtomicOr %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %17 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %22 +%local_invocation_index = OpFunctionParameter %uint + %25 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpFunctionCall %void %atomicOr_d09248 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %32 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %22 +%local_invocation_index_1_param = OpFunctionParameter %uint + %37 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %41 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %43 = OpLabel + %45 = OpLoad %uint %local_invocation_index_1_param_1 + %44 = OpFunctionCall %void %compute_main_inner_1 %45 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..5563b2bee9 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicOr_d09248() { + var res : i32 = 0i; + let x_11 : i32 = atomicOr(&(arg_0), 1i); + res = x_11; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicOr_d09248(); + return; +} + +fn compute_main_1() { + let x_31 : u32 = local_invocation_index_1; + compute_main_inner(x_31); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm new file mode 100644 index 0000000000..1b9dc279ab --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm @@ -0,0 +1,52 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 31 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicOr_5e3d61 "atomicOr_5e3d61" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint + %18 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicOr_5e3d61 = OpFunction %void None %6 + %9 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %10 = OpAtomicOr %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %10 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %18 +%local_invocation_index = OpFunctionParameter %uint + %21 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %17 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %26 = OpFunctionCall %void %atomicOr_5e3d61 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %28 = OpLabel + %30 = OpLoad %uint %local_invocation_index_1 + %29 = OpFunctionCall %void %compute_main_inner %30 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..e9191a7878 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicOr_5e3d61() { + uint res = 0u; + uint x_10 = atomicOr(arg_0, 1u); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicOr_5e3d61(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..22393c18c5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicOr_5e3d61() { + uint res = 0u; + uint atomic_result = 0u; + InterlockedOr(arg_0, 1u, atomic_result); + const uint x_10 = atomic_result; + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicOr_5e3d61(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..2513fa7e93 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicOr_5e3d61(threadgroup atomic_uint* const tint_symbol) { + uint res = 0u; + uint const x_10 = atomic_fetch_or_explicit(tint_symbol, 1u, memory_order_relaxed); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicOr_5e3d61(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_30 = *(tint_symbol_2); + compute_main_inner(x_30, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..ad9af507a7 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,74 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 44 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicOr_5e3d61 "atomicOr_5e3d61" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicOr_5e3d61 = OpFunction %void None %9 + %12 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %res %6 + %15 = OpAtomicOr %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicOr_5e3d61 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %30 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %20 +%local_invocation_index_1_param = OpFunctionParameter %uint + %35 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %39 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %41 = OpLabel + %43 = OpLoad %uint %local_invocation_index_1_param_1 + %42 = OpFunctionCall %void %compute_main_inner_1 %43 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..2e9093ea4a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicOr/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicOr_5e3d61() { + var res : u32 = 0u; + let x_10 : u32 = atomicOr(&(arg_0), 1u); + res = x_10; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicOr_5e3d61(); + return; +} + +fn compute_main_1() { + let x_30 : u32 = local_invocation_index_1; + compute_main_inner(x_30); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm new file mode 100644 index 0000000000..a4714333c3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm @@ -0,0 +1,48 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 23 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicStore_d1e9a6 "atomicStore_d1e9a6" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%atomicStore_d1e9a6 = OpFunction %void None %5 + %8 = OpLabel + %15 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + OpAtomicStore %15 %uint_1 %uint_0 %int_1 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %18 = OpLabel + %19 = OpFunctionCall %void %atomicStore_d1e9a6 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicStore_d1e9a6 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..24fc51ed53 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.glsl @@ -0,0 +1,64 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicStore_d1e9a6() { + atomicExchange(sb_rw.arg_0, 1); + return; +} + +void fragment_main_1() { + atomicStore_d1e9a6(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicStore_d1e9a6() { + atomicExchange(sb_rw.arg_0, 1); + return; +} + +void compute_main_1() { + atomicStore_d1e9a6(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..5ef62c96de --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,33 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +void tint_atomicStore(RWByteAddressBuffer buffer, uint offset, int value) { + int ignored; + buffer.InterlockedExchange(offset, value, ignored); +} + + +void atomicStore_d1e9a6() { + tint_atomicStore(sb_rw, 0u, 1); + return; +} + +void fragment_main_1() { + atomicStore_d1e9a6(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicStore_d1e9a6(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..03e234a47f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.msl @@ -0,0 +1,36 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicStore_d1e9a6(device SB_RW_atomic* const tint_symbol) { + atomic_store_explicit(&((*(tint_symbol)).arg_0), 1, memory_order_relaxed); + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicStore_d1e9a6(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicStore_d1e9a6(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..cabaea35a0 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,60 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 29 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicStore_d1e9a6 "atomicStore_d1e9a6" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%atomicStore_d1e9a6 = OpFunction %void None %5 + %8 = OpLabel + %15 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + OpAtomicStore %15 %uint_1 %uint_0 %int_1 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %18 = OpLabel + %19 = OpFunctionCall %void %atomicStore_d1e9a6 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicStore_d1e9a6 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %27 = OpLabel + %28 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..eaf478bdaf --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,34 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicStore_d1e9a6() { + atomicStore(&(sb_rw.arg_0), 1i); + return; +} + +fn fragment_main_1() { + atomicStore_d1e9a6(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicStore_d1e9a6(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm new file mode 100644 index 0000000000..97adea0c19 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm @@ -0,0 +1,46 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 21 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicStore_cdc29e "atomicStore_cdc29e" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicStore_cdc29e = OpFunction %void None %5 + %8 = OpLabel + %14 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + OpAtomicStore %14 %uint_1 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %16 = OpLabel + %17 = OpFunctionCall %void %atomicStore_cdc29e + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicStore_cdc29e + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..e9c81a233d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.glsl @@ -0,0 +1,64 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicStore_cdc29e() { + atomicExchange(sb_rw.arg_0, 1u); + return; +} + +void fragment_main_1() { + atomicStore_cdc29e(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicStore_cdc29e() { + atomicExchange(sb_rw.arg_0, 1u); + return; +} + +void compute_main_1() { + atomicStore_cdc29e(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..259c472a39 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,33 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +void tint_atomicStore(RWByteAddressBuffer buffer, uint offset, uint value) { + uint ignored; + buffer.InterlockedExchange(offset, value, ignored); +} + + +void atomicStore_cdc29e() { + tint_atomicStore(sb_rw, 0u, 1u); + return; +} + +void fragment_main_1() { + atomicStore_cdc29e(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicStore_cdc29e(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..cc29ffd067 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.msl @@ -0,0 +1,36 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicStore_cdc29e(device SB_RW_atomic* const tint_symbol) { + atomic_store_explicit(&((*(tint_symbol)).arg_0), 1u, memory_order_relaxed); + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicStore_cdc29e(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicStore_cdc29e(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..bcda0e7f9b --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,58 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 27 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicStore_cdc29e "atomicStore_cdc29e" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicStore_cdc29e = OpFunction %void None %5 + %8 = OpLabel + %14 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + OpAtomicStore %14 %uint_1 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %16 = OpLabel + %17 = OpFunctionCall %void %atomicStore_cdc29e + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %atomicStore_cdc29e + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %25 = OpLabel + %26 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..93b7fff109 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,34 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicStore_cdc29e() { + atomicStore(&(sb_rw.arg_0), 1u); + return; +} + +fn fragment_main_1() { + atomicStore_cdc29e(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicStore_cdc29e(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm new file mode 100644 index 0000000000..a08c2e8563 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm @@ -0,0 +1,49 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 30 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicStore_8bea94 "atomicStore_8bea94" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 + %16 = OpTypeFunction %void %uint + %22 = OpConstantNull %int + %uint_264 = OpConstant %uint 264 +%atomicStore_8bea94 = OpFunction %void None %7 + %10 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %int_1 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %16 +%local_invocation_index = OpFunctionParameter %uint + %19 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %22 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %25 = OpFunctionCall %void %atomicStore_8bea94 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %27 = OpLabel + %29 = OpLoad %uint %local_invocation_index_1 + %28 = OpFunctionCall %void %compute_main_inner %29 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..cc9e431098 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,35 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicStore_8bea94() { + atomicExchange(arg_0, 1); + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicStore_8bea94(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..c2dbd19e89 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,41 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicStore_8bea94() { + int atomic_result = 0; + InterlockedExchange(arg_0, 1, atomic_result); + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicStore_8bea94(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..78e73c54b5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,37 @@ +#include + +using namespace metal; +void atomicStore_8bea94(threadgroup atomic_int* const tint_symbol) { + atomic_store_explicit(tint_symbol, 1, memory_order_relaxed); + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicStore_8bea94(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_29 = *(tint_symbol_2); + compute_main_inner(x_29, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..319461d46c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,71 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 44 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicStore_8bea94 "atomicStore_8bea94" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 + %19 = OpTypeFunction %void %uint + %25 = OpConstantNull %int + %uint_264 = OpConstant %uint 264 +%atomicStore_8bea94 = OpFunction %void None %10 + %13 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %int_1 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %19 +%local_invocation_index = OpFunctionParameter %uint + %22 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %25 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicStore_8bea94 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %30 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %19 +%local_invocation_index_1_param = OpFunctionParameter %uint + %35 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %25 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %39 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %41 = OpLabel + %43 = OpLoad %uint %local_invocation_index_1_param_1 + %42 = OpFunctionCall %void %compute_main_inner_1 %43 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..800c8fd231 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,27 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicStore_8bea94() { + atomicStore(&(arg_0), 1i); + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicStore_8bea94(); + return; +} + +fn compute_main_1() { + let x_29 : u32 = local_invocation_index_1; + compute_main_inner(x_29); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm new file mode 100644 index 0000000000..59738ef83f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm @@ -0,0 +1,48 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 29 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicStore_726882 "atomicStore_726882" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 + %15 = OpTypeFunction %void %uint + %21 = OpConstantNull %uint + %uint_264 = OpConstant %uint 264 +%atomicStore_726882 = OpFunction %void None %6 + %9 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %15 +%local_invocation_index = OpFunctionParameter %uint + %18 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %21 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %24 = OpFunctionCall %void %atomicStore_726882 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %26 = OpLabel + %28 = OpLoad %uint %local_invocation_index_1 + %27 = OpFunctionCall %void %compute_main_inner %28 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..678f189b27 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,35 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicStore_726882() { + atomicExchange(arg_0, 1u); + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicStore_726882(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..309c7dfb36 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,41 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicStore_726882() { + uint atomic_result = 0u; + InterlockedExchange(arg_0, 1u, atomic_result); + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicStore_726882(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..1a458eb853 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,37 @@ +#include + +using namespace metal; +void atomicStore_726882(threadgroup atomic_uint* const tint_symbol) { + atomic_store_explicit(tint_symbol, 1u, memory_order_relaxed); + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicStore_726882(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_28 = *(tint_symbol_2); + compute_main_inner(x_28, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..6f8e362750 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,69 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 42 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicStore_726882 "atomicStore_726882" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 + %18 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicStore_726882 = OpFunction %void None %9 + %12 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %uint_1 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %18 +%local_invocation_index = OpFunctionParameter %uint + %21 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %26 = OpFunctionCall %void %atomicStore_726882 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %28 = OpLabel + %29 = OpLoad %uint %local_invocation_index_1 + %30 = OpFunctionCall %void %compute_main_inner %29 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %18 +%local_invocation_index_1_param = OpFunctionParameter %uint + %33 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %37 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %39 = OpLabel + %41 = OpLoad %uint %local_invocation_index_1_param_1 + %40 = OpFunctionCall %void %compute_main_inner_1 %41 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..b90d965f68 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicStore/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,27 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicStore_726882() { + atomicStore(&(arg_0), 1u); + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicStore_726882(); + return; +} + +fn compute_main_1() { + let x_28 : u32 = local_invocation_index_1; + compute_main_inner(x_28); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm new file mode 100644 index 0000000000..f4b9264241 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicSub_051100 "atomicSub_051100" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %19 = OpConstantNull %int +%atomicSub_051100 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %19 + %15 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %9 = OpAtomicISub %int %15 %uint_1 %uint_0 %int_1 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicSub_051100 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicSub_051100 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..8f573dffe3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicSub_051100() { + int res = 0; + int x_9 = atomicAdd(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicSub_051100(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicSub_051100() { + int res = 0; + int x_9 = atomicAdd(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void compute_main_1() { + atomicSub_051100(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..3624845ca0 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicSub(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedAdd(offset, -value, original_value); + return original_value; +} + + +void atomicSub_051100() { + int res = 0; + const int x_9 = tint_atomicSub(sb_rw, 0u, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicSub_051100(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicSub_051100(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..4696114e18 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicSub_051100(device SB_RW_atomic* const tint_symbol) { + int res = 0; + int const x_9 = atomic_fetch_sub_explicit(&((*(tint_symbol)).arg_0), 1, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicSub_051100(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicSub_051100(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..9ada74b558 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,66 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicSub_051100 "atomicSub_051100" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%atomicSub_051100 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %res %9 + %18 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %12 = OpAtomicISub %int %18 %uint_1 %uint_0 %int_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicSub_051100 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %27 = OpLabel + %28 = OpFunctionCall %void %atomicSub_051100 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %30 = OpLabel + %31 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..3fde6a5333 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicSub_051100() { + var res : i32 = 0i; + let x_9 : i32 = atomicSub(&(sb_rw.arg_0), 1i); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicSub_051100(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicSub_051100(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm new file mode 100644 index 0000000000..b7cd92d87a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm @@ -0,0 +1,51 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 24 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicSub_15bfc9 "atomicSub_15bfc9" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint +%atomicSub_15bfc9 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %14 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %9 = OpAtomicISub %uint %14 %uint_1 %uint_0 %uint_1 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicSub_15bfc9 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %atomicSub_15bfc9 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..e462c21374 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicSub_15bfc9() { + uint res = 0u; + uint x_9 = atomicAdd(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicSub_15bfc9(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicSub_15bfc9() { + uint res = 0u; + uint x_9 = atomicAdd(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void compute_main_1() { + atomicSub_15bfc9(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..1bcbe098b8 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicSub(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedAdd(offset, -value, original_value); + return original_value; +} + + +void atomicSub_15bfc9() { + uint res = 0u; + const uint x_9 = tint_atomicSub(sb_rw, 0u, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicSub_15bfc9(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicSub_15bfc9(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..4cd9ce2dcf --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicSub_15bfc9(device SB_RW_atomic* const tint_symbol) { + uint res = 0u; + uint const x_9 = atomic_fetch_sub_explicit(&((*(tint_symbol)).arg_0), 1u, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicSub_15bfc9(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicSub_15bfc9(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..885f7035b1 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,64 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 30 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicSub_15bfc9 "atomicSub_15bfc9" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicSub_15bfc9 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %res %9 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %12 = OpAtomicISub %uint %17 %uint_1 %uint_0 %uint_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicSub_15bfc9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %25 = OpLabel + %26 = OpFunctionCall %void %atomicSub_15bfc9 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %28 = OpLabel + %29 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..23ba9fe3a2 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicSub_15bfc9() { + var res : u32 = 0u; + let x_9 : u32 = atomicSub(&(sb_rw.arg_0), 1u); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicSub_15bfc9(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicSub_15bfc9(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm new file mode 100644 index 0000000000..f0471bef79 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicSub_77883a "atomicSub_77883a" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %18 = OpConstantNull %int + %19 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicSub_77883a = OpFunction %void None %7 + %10 = OpLabel + %res = OpVariable %_ptr_Function_int Function %18 + %11 = OpAtomicISub %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %11 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %19 +%local_invocation_index = OpFunctionParameter %uint + %22 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %18 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %27 = OpFunctionCall %void %atomicSub_77883a + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %29 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %30 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..0583afc433 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicSub_77883a() { + int res = 0; + int x_11 = atomicAdd(arg_0, 1); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicSub_77883a(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..75a1b4a688 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicSub_77883a() { + int res = 0; + int atomic_result = 0; + InterlockedAdd(arg_0, -1, atomic_result); + const int x_11 = atomic_result; + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicSub_77883a(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..86f5de20a3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicSub_77883a(threadgroup atomic_int* const tint_symbol) { + int res = 0; + int const x_11 = atomic_fetch_sub_explicit(tint_symbol, 1, memory_order_relaxed); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicSub_77883a(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_31 = *(tint_symbol_2); + compute_main_inner(x_31, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..820d0ae31f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,76 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 46 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicSub_77883a "atomicSub_77883a" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 + %22 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicSub_77883a = OpFunction %void None %10 + %13 = OpLabel + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %res %14 + %17 = OpAtomicISub %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %17 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %22 +%local_invocation_index = OpFunctionParameter %uint + %25 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpFunctionCall %void %atomicSub_77883a + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %32 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %22 +%local_invocation_index_1_param = OpFunctionParameter %uint + %37 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %41 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %43 = OpLabel + %45 = OpLoad %uint %local_invocation_index_1_param_1 + %44 = OpFunctionCall %void %compute_main_inner_1 %45 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..56079fe943 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicSub_77883a() { + var res : i32 = 0i; + let x_11 : i32 = atomicSub(&(arg_0), 1i); + res = x_11; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicSub_77883a(); + return; +} + +fn compute_main_1() { + let x_31 : u32 = local_invocation_index_1; + compute_main_inner(x_31); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm new file mode 100644 index 0000000000..0412631633 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm @@ -0,0 +1,52 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 31 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicSub_0d26c2 "atomicSub_0d26c2" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint + %18 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicSub_0d26c2 = OpFunction %void None %6 + %9 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %10 = OpAtomicISub %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %10 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %18 +%local_invocation_index = OpFunctionParameter %uint + %21 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %17 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %26 = OpFunctionCall %void %atomicSub_0d26c2 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %28 = OpLabel + %30 = OpLoad %uint %local_invocation_index_1 + %29 = OpFunctionCall %void %compute_main_inner %30 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..49553d08db --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicSub_0d26c2() { + uint res = 0u; + uint x_10 = atomicAdd(arg_0, 1u); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicSub_0d26c2(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..e6f8372332 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicSub_0d26c2() { + uint res = 0u; + uint atomic_result = 0u; + InterlockedAdd(arg_0, -1u, atomic_result); + const uint x_10 = atomic_result; + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicSub_0d26c2(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..91e3b4bdc5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicSub_0d26c2(threadgroup atomic_uint* const tint_symbol) { + uint res = 0u; + uint const x_10 = atomic_fetch_sub_explicit(tint_symbol, 1u, memory_order_relaxed); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicSub_0d26c2(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_30 = *(tint_symbol_2); + compute_main_inner(x_30, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..c42f0b9bac --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,74 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 44 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicSub_0d26c2 "atomicSub_0d26c2" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicSub_0d26c2 = OpFunction %void None %9 + %12 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %res %6 + %15 = OpAtomicISub %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicSub_0d26c2 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %30 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %20 +%local_invocation_index_1_param = OpFunctionParameter %uint + %35 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %39 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %41 = OpLabel + %43 = OpLoad %uint %local_invocation_index_1_param_1 + %42 = OpFunctionCall %void %compute_main_inner_1 %43 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..2b69af66f5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicSub/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicSub_0d26c2() { + var res : u32 = 0u; + let x_10 : u32 = atomicSub(&(arg_0), 1u); + res = x_10; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicSub_0d26c2(); + return; +} + +fn compute_main_1() { + let x_30 : u32 = local_invocation_index_1; + compute_main_inner(x_30); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm new file mode 100644 index 0000000000..98ac9c2b98 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicXor_c1b78c "atomicXor_c1b78c" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %19 = OpConstantNull %int +%atomicXor_c1b78c = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %19 + %15 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %9 = OpAtomicXor %int %15 %uint_1 %uint_0 %int_1 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicXor_c1b78c + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicXor_c1b78c + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..cc05c2842d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicXor_c1b78c() { + int res = 0; + int x_9 = atomicXor(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicXor_c1b78c(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicXor_c1b78c() { + int res = 0; + int x_9 = atomicXor(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void compute_main_1() { + atomicXor_c1b78c(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..605a4d7cdb --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicXor(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedXor(offset, value, original_value); + return original_value; +} + + +void atomicXor_c1b78c() { + int res = 0; + const int x_9 = tint_atomicXor(sb_rw, 0u, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicXor_c1b78c(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicXor_c1b78c(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..fbde7607d0 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicXor_c1b78c(device SB_RW_atomic* const tint_symbol) { + int res = 0; + int const x_9 = atomic_fetch_xor_explicit(&((*(tint_symbol)).arg_0), 1, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicXor_c1b78c(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicXor_c1b78c(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..1302c1abc7 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,66 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicXor_c1b78c "atomicXor_c1b78c" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%atomicXor_c1b78c = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %res %9 + %18 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %12 = OpAtomicXor %int %18 %uint_1 %uint_0 %int_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicXor_c1b78c + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %27 = OpLabel + %28 = OpFunctionCall %void %atomicXor_c1b78c + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %30 = OpLabel + %31 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..7992f58e4c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicXor_c1b78c() { + var res : i32 = 0i; + let x_9 : i32 = atomicXor(&(sb_rw.arg_0), 1i); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicXor_c1b78c(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicXor_c1b78c(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm new file mode 100644 index 0000000000..8b4ef2178f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm @@ -0,0 +1,51 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 24 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicXor_54510e "atomicXor_54510e" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint +%atomicXor_54510e = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %14 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %9 = OpAtomicXor %uint %14 %uint_1 %uint_0 %uint_1 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicXor_54510e + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %atomicXor_54510e + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..2893791023 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicXor_54510e() { + uint res = 0u; + uint x_9 = atomicXor(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicXor_54510e(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicXor_54510e() { + uint res = 0u; + uint x_9 = atomicXor(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void compute_main_1() { + atomicXor_54510e(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..3c2aad77ac --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicXor(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedXor(offset, value, original_value); + return original_value; +} + + +void atomicXor_54510e() { + uint res = 0u; + const uint x_9 = tint_atomicXor(sb_rw, 0u, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicXor_54510e(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicXor_54510e(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..dd37adc4f1 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicXor_54510e(device SB_RW_atomic* const tint_symbol) { + uint res = 0u; + uint const x_9 = atomic_fetch_xor_explicit(&((*(tint_symbol)).arg_0), 1u, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicXor_54510e(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicXor_54510e(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..1fb9bcc141 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,64 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 30 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicXor_54510e "atomicXor_54510e" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicXor_54510e = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %res %9 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %12 = OpAtomicXor %uint %17 %uint_1 %uint_0 %uint_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicXor_54510e + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %25 = OpLabel + %26 = OpFunctionCall %void %atomicXor_54510e + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %28 = OpLabel + %29 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..7fbc313591 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicXor_54510e() { + var res : u32 = 0u; + let x_9 : u32 = atomicXor(&(sb_rw.arg_0), 1u); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicXor_54510e(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicXor_54510e(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm new file mode 100644 index 0000000000..4e729e26a4 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicXor_75dc95 "atomicXor_75dc95" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %18 = OpConstantNull %int + %19 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicXor_75dc95 = OpFunction %void None %7 + %10 = OpLabel + %res = OpVariable %_ptr_Function_int Function %18 + %11 = OpAtomicXor %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %11 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %19 +%local_invocation_index = OpFunctionParameter %uint + %22 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %18 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %27 = OpFunctionCall %void %atomicXor_75dc95 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %29 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %30 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..b260d4d2c0 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicXor_75dc95() { + int res = 0; + int x_11 = atomicXor(arg_0, 1); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicXor_75dc95(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..5ffbd31c46 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicXor_75dc95() { + int res = 0; + int atomic_result = 0; + InterlockedXor(arg_0, 1, atomic_result); + const int x_11 = atomic_result; + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicXor_75dc95(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..b5c2e2c54b --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicXor_75dc95(threadgroup atomic_int* const tint_symbol) { + int res = 0; + int const x_11 = atomic_fetch_xor_explicit(tint_symbol, 1, memory_order_relaxed); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicXor_75dc95(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_31 = *(tint_symbol_2); + compute_main_inner(x_31, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..542376de1a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,76 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 46 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicXor_75dc95 "atomicXor_75dc95" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 + %22 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicXor_75dc95 = OpFunction %void None %10 + %13 = OpLabel + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %res %14 + %17 = OpAtomicXor %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %17 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %22 +%local_invocation_index = OpFunctionParameter %uint + %25 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpFunctionCall %void %atomicXor_75dc95 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %32 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %22 +%local_invocation_index_1_param = OpFunctionParameter %uint + %37 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %41 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %43 = OpLabel + %45 = OpLoad %uint %local_invocation_index_1_param_1 + %44 = OpFunctionCall %void %compute_main_inner_1 %45 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..f14ac31618 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicXor_75dc95() { + var res : i32 = 0i; + let x_11 : i32 = atomicXor(&(arg_0), 1i); + res = x_11; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicXor_75dc95(); + return; +} + +fn compute_main_1() { + let x_31 : u32 = local_invocation_index_1; + compute_main_inner(x_31); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm new file mode 100644 index 0000000000..a683557b8d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm @@ -0,0 +1,52 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 31 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicXor_c8e6be "atomicXor_c8e6be" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint + %18 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicXor_c8e6be = OpFunction %void None %6 + %9 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %10 = OpAtomicXor %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %10 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %18 +%local_invocation_index = OpFunctionParameter %uint + %21 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %17 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %26 = OpFunctionCall %void %atomicXor_c8e6be + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %28 = OpLabel + %30 = OpLoad %uint %local_invocation_index_1 + %29 = OpFunctionCall %void %compute_main_inner %30 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..a15719aef4 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicXor_c8e6be() { + uint res = 0u; + uint x_10 = atomicXor(arg_0, 1u); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicXor_c8e6be(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..8296d8674e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicXor_c8e6be() { + uint res = 0u; + uint atomic_result = 0u; + InterlockedXor(arg_0, 1u, atomic_result); + const uint x_10 = atomic_result; + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicXor_c8e6be(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..6993e95c04 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicXor_c8e6be(threadgroup atomic_uint* const tint_symbol) { + uint res = 0u; + uint const x_10 = atomic_fetch_xor_explicit(tint_symbol, 1u, memory_order_relaxed); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicXor_c8e6be(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_30 = *(tint_symbol_2); + compute_main_inner(x_30, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..4f19634fbf --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,74 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 44 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicXor_c8e6be "atomicXor_c8e6be" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicXor_c8e6be = OpFunction %void None %9 + %12 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %res %6 + %15 = OpAtomicXor %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicXor_c8e6be + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %30 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %20 +%local_invocation_index_1_param = OpFunctionParameter %uint + %35 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %39 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %41 = OpLabel + %43 = OpLoad %uint %local_invocation_index_1_param_1 + %42 = OpFunctionCall %void %compute_main_inner_1 %43 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..53f7436cb6 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/atomicXor/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicXor_c8e6be() { + var res : u32 = 0u; + let x_10 : u32 = atomicXor(&(arg_0), 1u); + res = x_10; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicXor_c8e6be(); + return; +} + +fn compute_main_1() { + let x_30 : u32 = local_invocation_index_1; + compute_main_inner(x_30); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm new file mode 100644 index 0000000000..fe8b450a47 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_d32fe4 "atomicAdd_d32fe4" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %19 = OpConstantNull %int +%atomicAdd_d32fe4 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %19 + %15 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %9 = OpAtomicIDecrement %int %15 %uint_1 %uint_0 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..875dc0857f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicAdd_d32fe4() { + int res = 0; + int x_9 = atomicAdd(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicAdd_d32fe4(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicAdd_d32fe4() { + int res = 0; + int x_9 = atomicAdd(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void compute_main_1() { + atomicAdd_d32fe4(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..ab2b1ee161 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicSub(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedAdd(offset, -value, original_value); + return original_value; +} + + +void atomicAdd_d32fe4() { + int res = 0; + const int x_9 = tint_atomicSub(sb_rw, 0u, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicAdd_d32fe4(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicAdd_d32fe4(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..8a042c1451 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicAdd_d32fe4(device SB_RW_atomic* const tint_symbol) { + int res = 0; + int const x_9 = atomic_fetch_sub_explicit(&((*(tint_symbol)).arg_0), 1, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicAdd_d32fe4(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicAdd_d32fe4(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..97fa9d7095 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,66 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_d32fe4 "atomicAdd_d32fe4" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%atomicAdd_d32fe4 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %res %9 + %18 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %12 = OpAtomicISub %int %18 %uint_1 %uint_0 %int_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %27 = OpLabel + %28 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %30 = OpLabel + %31 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..e048762b51 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicAdd_d32fe4() { + var res : i32 = 0i; + let x_9 : i32 = atomicSub(&(sb_rw.arg_0), 1i); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicAdd_d32fe4(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicAdd_d32fe4(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm new file mode 100644 index 0000000000..519752672a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm @@ -0,0 +1,51 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 24 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_8a199a "atomicAdd_8a199a" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint +%atomicAdd_8a199a = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %14 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %9 = OpAtomicIDecrement %uint %14 %uint_1 %uint_0 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..48a073514d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicAdd_8a199a() { + uint res = 0u; + uint x_9 = atomicAdd(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicAdd_8a199a(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicAdd_8a199a() { + uint res = 0u; + uint x_9 = atomicAdd(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void compute_main_1() { + atomicAdd_8a199a(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..6f0bb19b4c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicSub(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedAdd(offset, -value, original_value); + return original_value; +} + + +void atomicAdd_8a199a() { + uint res = 0u; + const uint x_9 = tint_atomicSub(sb_rw, 0u, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicAdd_8a199a(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicAdd_8a199a(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..adfd3c79e5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicAdd_8a199a(device SB_RW_atomic* const tint_symbol) { + uint res = 0u; + uint const x_9 = atomic_fetch_sub_explicit(&((*(tint_symbol)).arg_0), 1u, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicAdd_8a199a(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicAdd_8a199a(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..4ea9dce7fc --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,64 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 30 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_8a199a "atomicAdd_8a199a" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicAdd_8a199a = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %res %9 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %12 = OpAtomicISub %uint %17 %uint_1 %uint_0 %uint_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %25 = OpLabel + %26 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %28 = OpLabel + %29 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..d22b2aaa0f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicAdd_8a199a() { + var res : u32 = 0u; + let x_9 : u32 = atomicSub(&(sb_rw.arg_0), 1u); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicAdd_8a199a(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicAdd_8a199a(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm new file mode 100644 index 0000000000..eb2f8592f3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_794055 "atomicAdd_794055" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %18 = OpConstantNull %int + %19 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_794055 = OpFunction %void None %7 + %10 = OpLabel + %res = OpVariable %_ptr_Function_int Function %18 + %11 = OpAtomicIDecrement %int %arg_0 %uint_2 %uint_0 + OpStore %res %11 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %19 +%local_invocation_index = OpFunctionParameter %uint + %22 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %18 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %27 = OpFunctionCall %void %atomicAdd_794055 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %29 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %30 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..b745861ae2 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicAdd_794055() { + int res = 0; + int x_11 = atomicAdd(arg_0, 1); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicAdd_794055(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..09f225c0a7 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicAdd_794055() { + int res = 0; + int atomic_result = 0; + InterlockedAdd(arg_0, -1, atomic_result); + const int x_11 = atomic_result; + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicAdd_794055(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..e7d19e9d5e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicAdd_794055(threadgroup atomic_int* const tint_symbol) { + int res = 0; + int const x_11 = atomic_fetch_sub_explicit(tint_symbol, 1, memory_order_relaxed); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicAdd_794055(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_31 = *(tint_symbol_2); + compute_main_inner(x_31, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..32bc60e2a6 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,76 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 46 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_794055 "atomicAdd_794055" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 + %22 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_794055 = OpFunction %void None %10 + %13 = OpLabel + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %res %14 + %17 = OpAtomicISub %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %17 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %22 +%local_invocation_index = OpFunctionParameter %uint + %25 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpFunctionCall %void %atomicAdd_794055 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %32 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %22 +%local_invocation_index_1_param = OpFunctionParameter %uint + %37 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %41 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %43 = OpLabel + %45 = OpLoad %uint %local_invocation_index_1_param_1 + %44 = OpFunctionCall %void %compute_main_inner_1 %45 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..6050ff2687 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicAdd_794055() { + var res : i32 = 0i; + let x_11 : i32 = atomicSub(&(arg_0), 1i); + res = x_11; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicAdd_794055(); + return; +} + +fn compute_main_1() { + let x_31 : u32 = local_invocation_index_1; + compute_main_inner(x_31); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm new file mode 100644 index 0000000000..8c3ebfce64 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm @@ -0,0 +1,52 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 31 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_d5db1d "atomicAdd_d5db1d" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint + %18 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_d5db1d = OpFunction %void None %6 + %9 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %10 = OpAtomicIDecrement %uint %arg_0 %uint_2 %uint_0 + OpStore %res %10 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %18 +%local_invocation_index = OpFunctionParameter %uint + %21 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %17 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %26 = OpFunctionCall %void %atomicAdd_d5db1d + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %28 = OpLabel + %30 = OpLoad %uint %local_invocation_index_1 + %29 = OpFunctionCall %void %compute_main_inner %30 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..97c0c6f4d8 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicAdd_d5db1d() { + uint res = 0u; + uint x_10 = atomicAdd(arg_0, 1u); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicAdd_d5db1d(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..33bfa081d7 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicAdd_d5db1d() { + uint res = 0u; + uint atomic_result = 0u; + InterlockedAdd(arg_0, -1u, atomic_result); + const uint x_10 = atomic_result; + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicAdd_d5db1d(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..bd63c56854 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicAdd_d5db1d(threadgroup atomic_uint* const tint_symbol) { + uint res = 0u; + uint const x_10 = atomic_fetch_sub_explicit(tint_symbol, 1u, memory_order_relaxed); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicAdd_d5db1d(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_30 = *(tint_symbol_2); + compute_main_inner(x_30, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..c50dbaef6a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,74 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 44 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_d5db1d "atomicAdd_d5db1d" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_d5db1d = OpFunction %void None %9 + %12 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %res %6 + %15 = OpAtomicISub %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicAdd_d5db1d + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %30 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %20 +%local_invocation_index_1_param = OpFunctionParameter %uint + %35 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %39 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %41 = OpLabel + %43 = OpLoad %uint %local_invocation_index_1_param_1 + %42 = OpFunctionCall %void %compute_main_inner_1 %43 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..f7f5447422 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicDecrement/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicAdd_d5db1d() { + var res : u32 = 0u; + let x_10 : u32 = atomicSub(&(arg_0), 1u); + res = x_10; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicAdd_d5db1d(); + return; +} + +fn compute_main_1() { + let x_30 : u32 = local_invocation_index_1; + compute_main_inner(x_30); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm new file mode 100644 index 0000000000..efd1d3a4f4 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_d32fe4 "atomicAdd_d32fe4" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %19 = OpConstantNull %int +%atomicAdd_d32fe4 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %19 + %15 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %9 = OpAtomicIIncrement %int %15 %uint_1 %uint_0 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..875dc0857f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicAdd_d32fe4() { + int res = 0; + int x_9 = atomicAdd(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicAdd_d32fe4(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicAdd_d32fe4() { + int res = 0; + int x_9 = atomicAdd(sb_rw.arg_0, 1); + res = x_9; + return; +} + +void compute_main_1() { + atomicAdd_d32fe4(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..358487bedc --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicAdd(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedAdd(offset, value, original_value); + return original_value; +} + + +void atomicAdd_d32fe4() { + int res = 0; + const int x_9 = tint_atomicAdd(sb_rw, 0u, 1); + res = x_9; + return; +} + +void fragment_main_1() { + atomicAdd_d32fe4(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicAdd_d32fe4(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..64027ff549 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicAdd_d32fe4(device SB_RW_atomic* const tint_symbol) { + int res = 0; + int const x_9 = atomic_fetch_add_explicit(&((*(tint_symbol)).arg_0), 1, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicAdd_d32fe4(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicAdd_d32fe4(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..13f287aef1 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,66 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_d32fe4 "atomicAdd_d32fe4" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int + %int_1 = OpConstant %int 1 +%atomicAdd_d32fe4 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %res %9 + %18 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %12 = OpAtomicIAdd %int %18 %uint_1 %uint_0 %int_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %27 = OpLabel + %28 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %30 = OpLabel + %31 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..cfc64fbba6 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicAdd_d32fe4() { + var res : i32 = 0i; + let x_9 : i32 = atomicAdd(&(sb_rw.arg_0), 1i); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicAdd_d32fe4(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicAdd_d32fe4(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm new file mode 100644 index 0000000000..a805c5081f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm @@ -0,0 +1,51 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 24 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_8a199a "atomicAdd_8a199a" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint +%atomicAdd_8a199a = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %14 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %9 = OpAtomicIIncrement %uint %14 %uint_1 %uint_0 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..48a073514d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicAdd_8a199a() { + uint res = 0u; + uint x_9 = atomicAdd(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicAdd_8a199a(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicAdd_8a199a() { + uint res = 0u; + uint x_9 = atomicAdd(sb_rw.arg_0, 1u); + res = x_9; + return; +} + +void compute_main_1() { + atomicAdd_8a199a(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..bdc43b0733 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicAdd(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedAdd(offset, value, original_value); + return original_value; +} + + +void atomicAdd_8a199a() { + uint res = 0u; + const uint x_9 = tint_atomicAdd(sb_rw, 0u, 1u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicAdd_8a199a(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicAdd_8a199a(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..fa2343bc6a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicAdd_8a199a(device SB_RW_atomic* const tint_symbol) { + uint res = 0u; + uint const x_9 = atomic_fetch_add_explicit(&((*(tint_symbol)).arg_0), 1u, memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicAdd_8a199a(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicAdd_8a199a(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..e1bf1e996e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,64 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 30 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_8a199a "atomicAdd_8a199a" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicAdd_8a199a = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %res %9 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %12 = OpAtomicIAdd %uint %17 %uint_1 %uint_0 %uint_1 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %25 = OpLabel + %26 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %28 = OpLabel + %29 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..b5d5856764 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicAdd_8a199a() { + var res : u32 = 0u; + let x_9 : u32 = atomicAdd(&(sb_rw.arg_0), 1u); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicAdd_8a199a(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicAdd_8a199a(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm new file mode 100644 index 0000000000..255bfe1e47 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_794055 "atomicAdd_794055" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %18 = OpConstantNull %int + %19 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_794055 = OpFunction %void None %7 + %10 = OpLabel + %res = OpVariable %_ptr_Function_int Function %18 + %11 = OpAtomicIIncrement %int %arg_0 %uint_2 %uint_0 + OpStore %res %11 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %19 +%local_invocation_index = OpFunctionParameter %uint + %22 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %18 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %27 = OpFunctionCall %void %atomicAdd_794055 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %29 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %30 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..b745861ae2 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicAdd_794055() { + int res = 0; + int x_11 = atomicAdd(arg_0, 1); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicAdd_794055(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..ccdf1ad871 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicAdd_794055() { + int res = 0; + int atomic_result = 0; + InterlockedAdd(arg_0, 1, atomic_result); + const int x_11 = atomic_result; + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicAdd_794055(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..62639d7b4a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicAdd_794055(threadgroup atomic_int* const tint_symbol) { + int res = 0; + int const x_11 = atomic_fetch_add_explicit(tint_symbol, 1, memory_order_relaxed); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicAdd_794055(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_31 = *(tint_symbol_2); + compute_main_inner(x_31, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..3dc0a5d301 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,76 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 46 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_794055 "atomicAdd_794055" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %int_1 = OpConstant %int 1 + %22 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_794055 = OpFunction %void None %10 + %13 = OpLabel + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %res %14 + %17 = OpAtomicIAdd %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %17 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %22 +%local_invocation_index = OpFunctionParameter %uint + %25 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpFunctionCall %void %atomicAdd_794055 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %32 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %22 +%local_invocation_index_1_param = OpFunctionParameter %uint + %37 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %41 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %43 = OpLabel + %45 = OpLoad %uint %local_invocation_index_1_param_1 + %44 = OpFunctionCall %void %compute_main_inner_1 %45 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..723a1135af --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicAdd_794055() { + var res : i32 = 0i; + let x_11 : i32 = atomicAdd(&(arg_0), 1i); + res = x_11; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicAdd_794055(); + return; +} + +fn compute_main_1() { + let x_31 : u32 = local_invocation_index_1; + compute_main_inner(x_31); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm new file mode 100644 index 0000000000..c26936dcb2 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm @@ -0,0 +1,52 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 31 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_d5db1d "atomicAdd_d5db1d" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint + %18 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_d5db1d = OpFunction %void None %6 + %9 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %10 = OpAtomicIIncrement %uint %arg_0 %uint_2 %uint_0 + OpStore %res %10 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %18 +%local_invocation_index = OpFunctionParameter %uint + %21 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %17 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %26 = OpFunctionCall %void %atomicAdd_d5db1d + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %28 = OpLabel + %30 = OpLoad %uint %local_invocation_index_1 + %29 = OpFunctionCall %void %compute_main_inner %30 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..97c0c6f4d8 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicAdd_d5db1d() { + uint res = 0u; + uint x_10 = atomicAdd(arg_0, 1u); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicAdd_d5db1d(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..c36ae576b3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicAdd_d5db1d() { + uint res = 0u; + uint atomic_result = 0u; + InterlockedAdd(arg_0, 1u, atomic_result); + const uint x_10 = atomic_result; + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicAdd_d5db1d(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..04a890a74c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicAdd_d5db1d(threadgroup atomic_uint* const tint_symbol) { + uint res = 0u; + uint const x_10 = atomic_fetch_add_explicit(tint_symbol, 1u, memory_order_relaxed); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicAdd_d5db1d(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_30 = *(tint_symbol_2); + compute_main_inner(x_30, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..5daee6404f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,74 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 44 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_d5db1d "atomicAdd_d5db1d" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %uint_1 = OpConstant %uint 1 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_d5db1d = OpFunction %void None %9 + %12 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %res %6 + %15 = OpAtomicIAdd %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicAdd_d5db1d + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %30 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %20 +%local_invocation_index_1_param = OpFunctionParameter %uint + %35 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %39 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %41 = OpLabel + %43 = OpLoad %uint %local_invocation_index_1_param_1 + %42 = OpFunctionCall %void %compute_main_inner_1 %43 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..61d34ccb7b --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/literal/spvAtomicIncrement/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicAdd_d5db1d() { + var res : u32 = 0u; + let x_10 : u32 = atomicAdd(&(arg_0), 1u); + res = x_10; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicAdd_d5db1d(); + return; +} + +fn compute_main_1() { + let x_30 : u32 = local_invocation_index_1; + compute_main_inner(x_30); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm new file mode 100644 index 0000000000..2fd0e19721 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm @@ -0,0 +1,57 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 28 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_d32fe4 "atomicAdd_d32fe4" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %12 = OpConstantNull %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicAdd_d32fe4 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %12 + %res = OpVariable %_ptr_Function_int Function %12 + OpStore %arg_1 %int_1 + %19 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %20 = OpLoad %int %arg_1 + %13 = OpAtomicIAdd %int %19 %uint_1 %uint_0 %20 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..bd9f7f8bc3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicAdd_d32fe4() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicAdd(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicAdd_d32fe4(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicAdd_d32fe4() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicAdd(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void compute_main_1() { + atomicAdd_d32fe4(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..1b338c9e52 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicAdd(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedAdd(offset, value, original_value); + return original_value; +} + + +void atomicAdd_d32fe4() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + const int x_13 = tint_atomicAdd(sb_rw, 0u, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicAdd_d32fe4(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicAdd_d32fe4(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..3106affe24 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicAdd_d32fe4(device SB_RW_atomic* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_20 = arg_1; + int const x_13 = atomic_fetch_add_explicit(&((*(tint_symbol)).arg_0), x_20, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicAdd_d32fe4(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicAdd_d32fe4(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..c38ab553f1 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,71 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_d32fe4 "atomicAdd_d32fe4" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicAdd_d32fe4 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %9 + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %int_1 + %14 = OpLoad %int %arg_1 + %21 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %15 = OpAtomicIAdd %int %21 %uint_1 %uint_0 %14 + OpStore %res %15 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %29 = OpLabel + %30 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %32 = OpLabel + %33 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..ea83a0587c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,39 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicAdd_d32fe4() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_20 : i32 = arg_1; + let x_13 : i32 = atomicAdd(&(sb_rw.arg_0), x_20); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicAdd_d32fe4(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicAdd_d32fe4(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm new file mode 100644 index 0000000000..98d9690d34 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm @@ -0,0 +1,55 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_8a199a "atomicAdd_8a199a" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %12 = OpConstantNull %uint + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicAdd_8a199a = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %12 + %res = OpVariable %_ptr_Function_uint Function %12 + OpStore %arg_1 %uint_1 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %18 = OpLoad %uint %arg_1 + %13 = OpAtomicIAdd %uint %17 %uint_1 %uint_0 %18 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..5c1a1b00f9 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicAdd_8a199a() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicAdd(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicAdd_8a199a(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicAdd_8a199a() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicAdd(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void compute_main_1() { + atomicAdd_8a199a(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..845d1f7ec7 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicAdd(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedAdd(offset, value, original_value); + return original_value; +} + + +void atomicAdd_8a199a() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + const uint x_13 = tint_atomicAdd(sb_rw, 0u, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicAdd_8a199a(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicAdd_8a199a(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..da05cfb2c5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicAdd_8a199a(device SB_RW_atomic* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_18 = arg_1; + uint const x_13 = atomic_fetch_add_explicit(&((*(tint_symbol)).arg_0), x_18, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicAdd_8a199a(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicAdd_8a199a(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..d015d498c5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,69 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_8a199a "atomicAdd_8a199a" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicAdd_8a199a = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %9 + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %uint_1 + %14 = OpLoad %uint %arg_1 + %19 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %15 = OpAtomicIAdd %uint %19 %uint_1 %uint_0 %14 + OpStore %res %15 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %27 = OpLabel + %28 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %30 = OpLabel + %31 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..887a79869b --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,39 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicAdd_8a199a() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_18 : u32 = arg_1; + let x_13 : u32 = atomicAdd(&(sb_rw.arg_0), x_18); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicAdd_8a199a(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicAdd_8a199a(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm new file mode 100644 index 0000000000..9a311f18c4 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm @@ -0,0 +1,57 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_794055 "atomicAdd_794055" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %14 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %21 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_794055 = OpFunction %void None %7 + %10 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %int_1 + %19 = OpLoad %int %arg_1 + %15 = OpAtomicIAdd %int %arg_0 %uint_2 %uint_0 %19 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %21 +%local_invocation_index = OpFunctionParameter %uint + %24 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %29 = OpFunctionCall %void %atomicAdd_794055 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %31 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..89a45772b7 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicAdd_794055() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_15 = atomicAdd(arg_0, arg_1); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicAdd_794055(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..0cfd69649d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicAdd_794055() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int atomic_result = 0; + InterlockedAdd(arg_0, arg_1, atomic_result); + const int x_15 = atomic_result; + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicAdd_794055(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..b30df095e1 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,42 @@ +#include + +using namespace metal; +void atomicAdd_794055(threadgroup atomic_int* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_19 = arg_1; + int const x_15 = atomic_fetch_add_explicit(tint_symbol, x_19, memory_order_relaxed); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicAdd_794055(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_33 = *(tint_symbol_2); + compute_main_inner(x_33, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..3d67dcfcfc --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,81 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 48 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_794055 "atomicAdd_794055" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %24 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_794055 = OpFunction %void None %10 + %13 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %14 + OpStore %res %14 + OpStore %arg_1 %int_1 + %19 = OpLoad %int %arg_1 + %20 = OpAtomicIAdd %int %arg_0 %uint_2 %uint_0 %19 + OpStore %res %20 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %24 +%local_invocation_index = OpFunctionParameter %uint + %27 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %32 = OpFunctionCall %void %atomicAdd_794055 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %34 = OpLabel + %35 = OpLoad %uint %local_invocation_index_1 + %36 = OpFunctionCall %void %compute_main_inner %35 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %24 +%local_invocation_index_1_param = OpFunctionParameter %uint + %39 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %43 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %45 = OpLabel + %47 = OpLoad %uint %local_invocation_index_1_param_1 + %46 = OpFunctionCall %void %compute_main_inner_1 %47 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..27e52764a1 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,32 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicAdd_794055() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_19 : i32 = arg_1; + let x_15 : i32 = atomicAdd(&(arg_0), x_19); + res = x_15; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicAdd_794055(); + return; +} + +fn compute_main_1() { + let x_33 : u32 = local_invocation_index_1; + compute_main_inner(x_33); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm new file mode 100644 index 0000000000..7ab1e8d2e3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm @@ -0,0 +1,56 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 33 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_d5db1d "atomicAdd_d5db1d" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %13 = OpConstantNull %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_d5db1d = OpFunction %void None %6 + %9 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %13 + %res = OpVariable %_ptr_Function_uint Function %13 + OpStore %arg_1 %uint_1 + %18 = OpLoad %uint %arg_1 + %14 = OpAtomicIAdd %uint %arg_0 %uint_2 %uint_0 %18 + OpStore %res %14 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %13 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicAdd_d5db1d + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %30 = OpLabel + %32 = OpLoad %uint %local_invocation_index_1 + %31 = OpFunctionCall %void %compute_main_inner %32 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..07177c98cd --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicAdd_d5db1d() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_14 = atomicAdd(arg_0, arg_1); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicAdd_d5db1d(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..380a1a5ee1 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicAdd_d5db1d() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint atomic_result = 0u; + InterlockedAdd(arg_0, arg_1, atomic_result); + const uint x_14 = atomic_result; + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicAdd_d5db1d(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..29c6f4b3ca --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,42 @@ +#include + +using namespace metal; +void atomicAdd_d5db1d(threadgroup atomic_uint* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_18 = arg_1; + uint const x_14 = atomic_fetch_add_explicit(tint_symbol, x_18, memory_order_relaxed); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicAdd_d5db1d(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_32 = *(tint_symbol_2); + compute_main_inner(x_32, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..1cab36f0a8 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,79 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 46 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_d5db1d "atomicAdd_d5db1d" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %22 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_d5db1d = OpFunction %void None %9 + %12 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %6 + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %arg_1 %6 + OpStore %res %6 + OpStore %arg_1 %uint_1 + %17 = OpLoad %uint %arg_1 + %18 = OpAtomicIAdd %uint %arg_0 %uint_2 %uint_0 %17 + OpStore %res %18 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %22 +%local_invocation_index = OpFunctionParameter %uint + %25 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpFunctionCall %void %atomicAdd_d5db1d + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %32 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %22 +%local_invocation_index_1_param = OpFunctionParameter %uint + %37 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %41 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %43 = OpLabel + %45 = OpLoad %uint %local_invocation_index_1_param_1 + %44 = OpFunctionCall %void %compute_main_inner_1 %45 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..1ef7a33d6a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAdd/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,32 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicAdd_d5db1d() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_18 : u32 = arg_1; + let x_14 : u32 = atomicAdd(&(arg_0), x_18); + res = x_14; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicAdd_d5db1d(); + return; +} + +fn compute_main_1() { + let x_32 : u32 = local_invocation_index_1; + compute_main_inner(x_32); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm new file mode 100644 index 0000000000..18408ba002 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm @@ -0,0 +1,57 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 28 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAnd_152966 "atomicAnd_152966" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %12 = OpConstantNull %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicAnd_152966 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %12 + %res = OpVariable %_ptr_Function_int Function %12 + OpStore %arg_1 %int_1 + %19 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %20 = OpLoad %int %arg_1 + %13 = OpAtomicAnd %int %19 %uint_1 %uint_0 %20 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicAnd_152966 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %atomicAnd_152966 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..ea9ff84284 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicAnd_152966() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicAnd(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicAnd_152966(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicAnd_152966() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicAnd(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void compute_main_1() { + atomicAnd_152966(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..ea4a0f8293 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicAnd(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedAnd(offset, value, original_value); + return original_value; +} + + +void atomicAnd_152966() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + const int x_13 = tint_atomicAnd(sb_rw, 0u, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicAnd_152966(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicAnd_152966(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..a9960d6742 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicAnd_152966(device SB_RW_atomic* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_20 = arg_1; + int const x_13 = atomic_fetch_and_explicit(&((*(tint_symbol)).arg_0), x_20, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicAnd_152966(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicAnd_152966(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..3257d23881 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,71 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAnd_152966 "atomicAnd_152966" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicAnd_152966 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %9 + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %int_1 + %14 = OpLoad %int %arg_1 + %21 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %15 = OpAtomicAnd %int %21 %uint_1 %uint_0 %14 + OpStore %res %15 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicAnd_152966 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %29 = OpLabel + %30 = OpFunctionCall %void %atomicAnd_152966 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %32 = OpLabel + %33 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..bdc601ddf2 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,39 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicAnd_152966() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_20 : i32 = arg_1; + let x_13 : i32 = atomicAnd(&(sb_rw.arg_0), x_20); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicAnd_152966(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicAnd_152966(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm new file mode 100644 index 0000000000..d8c4b78793 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm @@ -0,0 +1,55 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAnd_85a8d9 "atomicAnd_85a8d9" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %12 = OpConstantNull %uint + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicAnd_85a8d9 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %12 + %res = OpVariable %_ptr_Function_uint Function %12 + OpStore %arg_1 %uint_1 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %18 = OpLoad %uint %arg_1 + %13 = OpAtomicAnd %uint %17 %uint_1 %uint_0 %18 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicAnd_85a8d9 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicAnd_85a8d9 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..e3abb2a2af --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicAnd_85a8d9() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicAnd(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicAnd_85a8d9(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicAnd_85a8d9() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicAnd(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void compute_main_1() { + atomicAnd_85a8d9(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..44c8b7d84c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicAnd(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedAnd(offset, value, original_value); + return original_value; +} + + +void atomicAnd_85a8d9() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + const uint x_13 = tint_atomicAnd(sb_rw, 0u, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicAnd_85a8d9(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicAnd_85a8d9(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..798abe6580 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicAnd_85a8d9(device SB_RW_atomic* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_18 = arg_1; + uint const x_13 = atomic_fetch_and_explicit(&((*(tint_symbol)).arg_0), x_18, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicAnd_85a8d9(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicAnd_85a8d9(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..668f193c41 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,69 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAnd_85a8d9 "atomicAnd_85a8d9" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicAnd_85a8d9 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %9 + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %uint_1 + %14 = OpLoad %uint %arg_1 + %19 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %15 = OpAtomicAnd %uint %19 %uint_1 %uint_0 %14 + OpStore %res %15 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicAnd_85a8d9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %27 = OpLabel + %28 = OpFunctionCall %void %atomicAnd_85a8d9 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %30 = OpLabel + %31 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..4bf4b48b8e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,39 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicAnd_85a8d9() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_18 : u32 = arg_1; + let x_13 : u32 = atomicAnd(&(sb_rw.arg_0), x_18); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicAnd_85a8d9(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicAnd_85a8d9(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm new file mode 100644 index 0000000000..e0c9a7e2f3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm @@ -0,0 +1,57 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAnd_45a819 "atomicAnd_45a819" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %14 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %21 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAnd_45a819 = OpFunction %void None %7 + %10 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %int_1 + %19 = OpLoad %int %arg_1 + %15 = OpAtomicAnd %int %arg_0 %uint_2 %uint_0 %19 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %21 +%local_invocation_index = OpFunctionParameter %uint + %24 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %29 = OpFunctionCall %void %atomicAnd_45a819 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %31 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..cc74ce65b6 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicAnd_45a819() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_15 = atomicAnd(arg_0, arg_1); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicAnd_45a819(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..cd9a7b7725 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicAnd_45a819() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int atomic_result = 0; + InterlockedAnd(arg_0, arg_1, atomic_result); + const int x_15 = atomic_result; + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicAnd_45a819(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..962a96cce8 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,42 @@ +#include + +using namespace metal; +void atomicAnd_45a819(threadgroup atomic_int* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_19 = arg_1; + int const x_15 = atomic_fetch_and_explicit(tint_symbol, x_19, memory_order_relaxed); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicAnd_45a819(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_33 = *(tint_symbol_2); + compute_main_inner(x_33, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..598acf25ac --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,81 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 48 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAnd_45a819 "atomicAnd_45a819" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %24 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAnd_45a819 = OpFunction %void None %10 + %13 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %14 + OpStore %res %14 + OpStore %arg_1 %int_1 + %19 = OpLoad %int %arg_1 + %20 = OpAtomicAnd %int %arg_0 %uint_2 %uint_0 %19 + OpStore %res %20 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %24 +%local_invocation_index = OpFunctionParameter %uint + %27 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %32 = OpFunctionCall %void %atomicAnd_45a819 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %34 = OpLabel + %35 = OpLoad %uint %local_invocation_index_1 + %36 = OpFunctionCall %void %compute_main_inner %35 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %24 +%local_invocation_index_1_param = OpFunctionParameter %uint + %39 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %43 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %45 = OpLabel + %47 = OpLoad %uint %local_invocation_index_1_param_1 + %46 = OpFunctionCall %void %compute_main_inner_1 %47 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..d757c09185 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,32 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicAnd_45a819() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_19 : i32 = arg_1; + let x_15 : i32 = atomicAnd(&(arg_0), x_19); + res = x_15; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicAnd_45a819(); + return; +} + +fn compute_main_1() { + let x_33 : u32 = local_invocation_index_1; + compute_main_inner(x_33); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm new file mode 100644 index 0000000000..e6e94c1a3a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm @@ -0,0 +1,56 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 33 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAnd_34edd3 "atomicAnd_34edd3" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %13 = OpConstantNull %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAnd_34edd3 = OpFunction %void None %6 + %9 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %13 + %res = OpVariable %_ptr_Function_uint Function %13 + OpStore %arg_1 %uint_1 + %18 = OpLoad %uint %arg_1 + %14 = OpAtomicAnd %uint %arg_0 %uint_2 %uint_0 %18 + OpStore %res %14 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %13 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicAnd_34edd3 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %30 = OpLabel + %32 = OpLoad %uint %local_invocation_index_1 + %31 = OpFunctionCall %void %compute_main_inner %32 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..39b8c3e506 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicAnd_34edd3() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_14 = atomicAnd(arg_0, arg_1); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicAnd_34edd3(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..37f4feec49 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicAnd_34edd3() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint atomic_result = 0u; + InterlockedAnd(arg_0, arg_1, atomic_result); + const uint x_14 = atomic_result; + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicAnd_34edd3(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..d1624058bc --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,42 @@ +#include + +using namespace metal; +void atomicAnd_34edd3(threadgroup atomic_uint* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_18 = arg_1; + uint const x_14 = atomic_fetch_and_explicit(tint_symbol, x_18, memory_order_relaxed); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicAnd_34edd3(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_32 = *(tint_symbol_2); + compute_main_inner(x_32, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..0eeed44ead --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,79 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 46 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAnd_34edd3 "atomicAnd_34edd3" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %22 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAnd_34edd3 = OpFunction %void None %9 + %12 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %6 + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %arg_1 %6 + OpStore %res %6 + OpStore %arg_1 %uint_1 + %17 = OpLoad %uint %arg_1 + %18 = OpAtomicAnd %uint %arg_0 %uint_2 %uint_0 %17 + OpStore %res %18 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %22 +%local_invocation_index = OpFunctionParameter %uint + %25 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpFunctionCall %void %atomicAnd_34edd3 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %32 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %22 +%local_invocation_index_1_param = OpFunctionParameter %uint + %37 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %41 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %43 = OpLabel + %45 = OpLoad %uint %local_invocation_index_1_param_1 + %44 = OpFunctionCall %void %compute_main_inner_1 %45 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..dba5360f3a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicAnd/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,32 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicAnd_34edd3() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_18 : u32 = arg_1; + let x_14 : u32 = atomicAnd(&(arg_0), x_18); + res = x_14; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicAnd_34edd3(); + return; +} + +fn compute_main_1() { + let x_32 : u32 = local_invocation_index_1; + compute_main_inner(x_32); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm new file mode 100644 index 0000000000..0999969646 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm @@ -0,0 +1,72 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 36 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicCompareExchangeWeak_1bd40a "atomicCompareExchangeWeak_1bd40a" + OpName %arg_1 "arg_1" + OpName %arg_2 "arg_2" + OpName %__atomic_compare_exchange_resulti32 "__atomic_compare_exchange_resulti32" + OpMemberName %__atomic_compare_exchange_resulti32 0 "old_value" + OpMemberName %__atomic_compare_exchange_resulti32 1 "exchanged" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + OpMemberDecorate %__atomic_compare_exchange_resulti32 0 Offset 0 + OpMemberDecorate %__atomic_compare_exchange_resulti32 1 Offset 4 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %12 = OpConstantNull %int + %bool = OpTypeBool +%__atomic_compare_exchange_resulti32 = OpTypeStruct %int %bool + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%_ptr_Function___atomic_compare_exchange_resulti32 = OpTypePointer Function %__atomic_compare_exchange_resulti32 + %29 = OpConstantNull %__atomic_compare_exchange_resulti32 +%atomicCompareExchangeWeak_1bd40a = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %12 + %arg_2 = OpVariable %_ptr_Function_int Function %12 + %res = OpVariable %_ptr_Function___atomic_compare_exchange_resulti32 Function %29 + OpStore %arg_1 %int_1 + OpStore %arg_2 %int_1 + %22 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %23 = OpLoad %int %arg_2 + %24 = OpLoad %int %arg_1 + %25 = OpAtomicCompareExchange %int %22 %uint_1 %uint_0 %uint_0 %23 %24 + %26 = OpIEqual %bool %25 %23 + %14 = OpCompositeConstruct %__atomic_compare_exchange_resulti32 %25 %26 + OpStore %res %14 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %31 = OpLabel + %32 = OpFunctionCall %void %atomicCompareExchangeWeak_1bd40a + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %34 = OpLabel + %35 = OpFunctionCall %void %atomicCompareExchangeWeak_1bd40a + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..286017ba33 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.glsl @@ -0,0 +1,112 @@ +#version 310 es +precision mediump float; + +struct atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +struct x__atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicCompareExchangeWeak_1bd40a() { + int arg_1 = 0; + int arg_2 = 0; + x__atomic_compare_exchange_resulti32 res = x__atomic_compare_exchange_resulti32(0, false); + arg_1 = 1; + arg_2 = 1; + int x_23 = arg_2; + atomic_compare_exchange_resulti32 atomic_compare_result; + atomic_compare_result.old_value = atomicCompSwap(sb_rw.arg_0, arg_1, x_23); + atomic_compare_result.exchanged = atomic_compare_result.old_value == arg_1; + atomic_compare_exchange_resulti32 tint_symbol = atomic_compare_result; + int old_value_1 = tint_symbol.old_value; + int x_25 = old_value_1; + x__atomic_compare_exchange_resulti32 tint_symbol_1 = x__atomic_compare_exchange_resulti32(x_25, (x_25 == x_23)); + res = tint_symbol_1; + return; +} + +void fragment_main_1() { + atomicCompareExchangeWeak_1bd40a(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +struct x__atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicCompareExchangeWeak_1bd40a() { + int arg_1 = 0; + int arg_2 = 0; + x__atomic_compare_exchange_resulti32 res = x__atomic_compare_exchange_resulti32(0, false); + arg_1 = 1; + arg_2 = 1; + int x_23 = arg_2; + atomic_compare_exchange_resulti32 atomic_compare_result; + atomic_compare_result.old_value = atomicCompSwap(sb_rw.arg_0, arg_1, x_23); + atomic_compare_result.exchanged = atomic_compare_result.old_value == arg_1; + atomic_compare_exchange_resulti32 tint_symbol = atomic_compare_result; + int old_value_1 = tint_symbol.old_value; + int x_25 = old_value_1; + x__atomic_compare_exchange_resulti32 tint_symbol_1 = x__atomic_compare_exchange_resulti32(x_25, (x_25 == x_23)); + res = tint_symbol_1; + return; +} + +void compute_main_1() { + atomicCompareExchangeWeak_1bd40a(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..b121c665b5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,55 @@ +struct x__atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + +RWByteAddressBuffer sb_rw : register(u0, space0); + +struct atomic_compare_exchange_weak_ret_type { + int old_value; + bool exchanged; +}; + +atomic_compare_exchange_weak_ret_type tint_atomicCompareExchangeWeak(RWByteAddressBuffer buffer, uint offset, int compare, int value) { + atomic_compare_exchange_weak_ret_type result=(atomic_compare_exchange_weak_ret_type)0; + buffer.InterlockedCompareExchange(offset, compare, value, result.old_value); + result.exchanged = result.old_value == compare; + return result; +} + + +void atomicCompareExchangeWeak_1bd40a() { + int arg_1 = 0; + int arg_2 = 0; + x__atomic_compare_exchange_resulti32 res = {0, false}; + arg_1 = 1; + arg_2 = 1; + const int x_23 = arg_2; + const atomic_compare_exchange_weak_ret_type tint_symbol = tint_atomicCompareExchangeWeak(sb_rw, 0u, arg_1, x_23); + const int old_value_1 = tint_symbol.old_value; + const int x_25 = old_value_1; + const x__atomic_compare_exchange_resulti32 tint_symbol_1 = {x_25, (x_25 == x_23)}; + res = tint_symbol_1; + return; +} + +void fragment_main_1() { + atomicCompareExchangeWeak_1bd40a(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicCompareExchangeWeak_1bd40a(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..fa2d372922 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.msl @@ -0,0 +1,63 @@ +#include + +using namespace metal; + +struct atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; +atomic_compare_exchange_resulti32 atomicCompareExchangeWeak_1(device atomic_int* atomic, int compare, int value) { + int old_value = compare; + bool exchanged = atomic_compare_exchange_weak_explicit(atomic, &old_value, value, memory_order_relaxed, memory_order_relaxed); + return {old_value, exchanged}; +} + +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +struct x__atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + +void atomicCompareExchangeWeak_1bd40a(device SB_RW_atomic* const tint_symbol_2) { + int arg_1 = 0; + int arg_2 = 0; + x__atomic_compare_exchange_resulti32 res = {.old_value=0, .exchanged=false}; + arg_1 = 1; + arg_2 = 1; + int const x_23 = arg_2; + int const x_24 = arg_1; + atomic_compare_exchange_resulti32 const tint_symbol = atomicCompareExchangeWeak_1(&((*(tint_symbol_2)).arg_0), x_24, x_23); + int const old_value_1 = tint_symbol.old_value; + int const x_25 = old_value_1; + x__atomic_compare_exchange_resulti32 const tint_symbol_1 = {.old_value=x_25, .exchanged=(x_25 == x_23)}; + res = tint_symbol_1; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicCompareExchangeWeak_1bd40a(tint_symbol_3); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + fragment_main_1(tint_symbol_4); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_5) { + atomicCompareExchangeWeak_1bd40a(tint_symbol_5); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_6 [[buffer(0)]]) { + compute_main_1(tint_symbol_6); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..dde3fc2f9c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,98 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 48 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicCompareExchangeWeak_1bd40a "atomicCompareExchangeWeak_1bd40a" + OpName %arg_1 "arg_1" + OpName %arg_2 "arg_2" + OpName %x__atomic_compare_exchange_resulti32 "x__atomic_compare_exchange_resulti32" + OpMemberName %x__atomic_compare_exchange_resulti32 0 "old_value" + OpMemberName %x__atomic_compare_exchange_resulti32 1 "exchanged" + OpName %res "res" + OpName %__atomic_compare_exchange_resulti32 "__atomic_compare_exchange_resulti32" + OpMemberName %__atomic_compare_exchange_resulti32 0 "old_value" + OpMemberName %__atomic_compare_exchange_resulti32 1 "exchanged" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + OpMemberDecorate %x__atomic_compare_exchange_resulti32 0 Offset 0 + OpMemberDecorate %x__atomic_compare_exchange_resulti32 1 Offset 4 + OpMemberDecorate %__atomic_compare_exchange_resulti32 0 Offset 0 + OpMemberDecorate %__atomic_compare_exchange_resulti32 1 Offset 4 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %bool = OpTypeBool +%x__atomic_compare_exchange_resulti32 = OpTypeStruct %int %bool + %15 = OpConstantNull %bool + %16 = OpConstantComposite %x__atomic_compare_exchange_resulti32 %9 %15 +%_ptr_Function_x__atomic_compare_exchange_resulti32 = OpTypePointer Function %x__atomic_compare_exchange_resulti32 + %19 = OpConstantNull %x__atomic_compare_exchange_resulti32 + %int_1 = OpConstant %int 1 +%__atomic_compare_exchange_resulti32 = OpTypeStruct %int %bool + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicCompareExchangeWeak_1bd40a = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %9 + %arg_2 = OpVariable %_ptr_Function_int Function %9 + %res = OpVariable %_ptr_Function_x__atomic_compare_exchange_resulti32 Function %19 + OpStore %arg_1 %9 + OpStore %arg_2 %9 + OpStore %res %16 + OpStore %arg_1 %int_1 + OpStore %arg_2 %int_1 + %21 = OpLoad %int %arg_2 + %22 = OpLoad %int %arg_1 + %30 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %31 = OpAtomicCompareExchange %int %30 %uint_1 %uint_0 %uint_0 %21 %22 + %32 = OpIEqual %bool %31 %21 + %23 = OpCompositeConstruct %__atomic_compare_exchange_resulti32 %31 %32 + %33 = OpCompositeExtract %int %23 0 + %34 = OpIEqual %bool %33 %21 + %35 = OpCompositeConstruct %x__atomic_compare_exchange_resulti32 %33 %34 + OpStore %res %35 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %37 = OpLabel + %38 = OpFunctionCall %void %atomicCompareExchangeWeak_1bd40a + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %40 = OpLabel + %41 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %43 = OpLabel + %44 = OpFunctionCall %void %atomicCompareExchangeWeak_1bd40a + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %46 = OpLabel + %47 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..84a3a29fd5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,48 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +struct x__atomic_compare_exchange_resulti32 { + old_value : i32, + exchanged : bool, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicCompareExchangeWeak_1bd40a() { + var arg_1 : i32 = 0i; + var arg_2 : i32 = 0i; + var res : x__atomic_compare_exchange_resulti32 = x__atomic_compare_exchange_resulti32(0i, false); + arg_1 = 1i; + arg_2 = 1i; + let x_23 : i32 = arg_2; + let x_24 : i32 = arg_1; + let old_value_1 = atomicCompareExchangeWeak(&(sb_rw.arg_0), x_24, x_23).old_value; + let x_25 : i32 = old_value_1; + res = x__atomic_compare_exchange_resulti32(x_25, (x_25 == x_23)); + return; +} + +fn fragment_main_1() { + atomicCompareExchangeWeak_1bd40a(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicCompareExchangeWeak_1bd40a(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm new file mode 100644 index 0000000000..3723643514 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm @@ -0,0 +1,70 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicCompareExchangeWeak_63d8e6 "atomicCompareExchangeWeak_63d8e6" + OpName %arg_1 "arg_1" + OpName %arg_2 "arg_2" + OpName %__atomic_compare_exchange_resultu32 "__atomic_compare_exchange_resultu32" + OpMemberName %__atomic_compare_exchange_resultu32 0 "old_value" + OpMemberName %__atomic_compare_exchange_resultu32 1 "exchanged" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + OpMemberDecorate %__atomic_compare_exchange_resultu32 0 Offset 0 + OpMemberDecorate %__atomic_compare_exchange_resultu32 1 Offset 4 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %12 = OpConstantNull %uint + %bool = OpTypeBool +%__atomic_compare_exchange_resultu32 = OpTypeStruct %uint %bool + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%_ptr_Function___atomic_compare_exchange_resultu32 = OpTypePointer Function %__atomic_compare_exchange_resultu32 + %27 = OpConstantNull %__atomic_compare_exchange_resultu32 +%atomicCompareExchangeWeak_63d8e6 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %12 + %arg_2 = OpVariable %_ptr_Function_uint Function %12 + %res = OpVariable %_ptr_Function___atomic_compare_exchange_resultu32 Function %27 + OpStore %arg_1 %uint_1 + OpStore %arg_2 %uint_1 + %20 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %21 = OpLoad %uint %arg_2 + %22 = OpLoad %uint %arg_1 + %23 = OpAtomicCompareExchange %uint %20 %uint_1 %uint_0 %uint_0 %21 %22 + %24 = OpIEqual %bool %23 %21 + %14 = OpCompositeConstruct %__atomic_compare_exchange_resultu32 %23 %24 + OpStore %res %14 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %29 = OpLabel + %30 = OpFunctionCall %void %atomicCompareExchangeWeak_63d8e6 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %32 = OpLabel + %33 = OpFunctionCall %void %atomicCompareExchangeWeak_63d8e6 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..ec3e6e1996 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.glsl @@ -0,0 +1,112 @@ +#version 310 es +precision mediump float; + +struct atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +struct x__atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicCompareExchangeWeak_63d8e6() { + uint arg_1 = 0u; + uint arg_2 = 0u; + x__atomic_compare_exchange_resultu32 res = x__atomic_compare_exchange_resultu32(0u, false); + arg_1 = 1u; + arg_2 = 1u; + uint x_21 = arg_2; + atomic_compare_exchange_resultu32 atomic_compare_result; + atomic_compare_result.old_value = atomicCompSwap(sb_rw.arg_0, arg_1, x_21); + atomic_compare_result.exchanged = atomic_compare_result.old_value == arg_1; + atomic_compare_exchange_resultu32 tint_symbol = atomic_compare_result; + uint old_value_1 = tint_symbol.old_value; + uint x_23 = old_value_1; + x__atomic_compare_exchange_resultu32 tint_symbol_1 = x__atomic_compare_exchange_resultu32(x_23, (x_23 == x_21)); + res = tint_symbol_1; + return; +} + +void fragment_main_1() { + atomicCompareExchangeWeak_63d8e6(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +struct x__atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicCompareExchangeWeak_63d8e6() { + uint arg_1 = 0u; + uint arg_2 = 0u; + x__atomic_compare_exchange_resultu32 res = x__atomic_compare_exchange_resultu32(0u, false); + arg_1 = 1u; + arg_2 = 1u; + uint x_21 = arg_2; + atomic_compare_exchange_resultu32 atomic_compare_result; + atomic_compare_result.old_value = atomicCompSwap(sb_rw.arg_0, arg_1, x_21); + atomic_compare_result.exchanged = atomic_compare_result.old_value == arg_1; + atomic_compare_exchange_resultu32 tint_symbol = atomic_compare_result; + uint old_value_1 = tint_symbol.old_value; + uint x_23 = old_value_1; + x__atomic_compare_exchange_resultu32 tint_symbol_1 = x__atomic_compare_exchange_resultu32(x_23, (x_23 == x_21)); + res = tint_symbol_1; + return; +} + +void compute_main_1() { + atomicCompareExchangeWeak_63d8e6(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..7a9c9719c9 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,55 @@ +struct x__atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + +RWByteAddressBuffer sb_rw : register(u0, space0); + +struct atomic_compare_exchange_weak_ret_type { + uint old_value; + bool exchanged; +}; + +atomic_compare_exchange_weak_ret_type tint_atomicCompareExchangeWeak(RWByteAddressBuffer buffer, uint offset, uint compare, uint value) { + atomic_compare_exchange_weak_ret_type result=(atomic_compare_exchange_weak_ret_type)0; + buffer.InterlockedCompareExchange(offset, compare, value, result.old_value); + result.exchanged = result.old_value == compare; + return result; +} + + +void atomicCompareExchangeWeak_63d8e6() { + uint arg_1 = 0u; + uint arg_2 = 0u; + x__atomic_compare_exchange_resultu32 res = {0u, false}; + arg_1 = 1u; + arg_2 = 1u; + const uint x_21 = arg_2; + const atomic_compare_exchange_weak_ret_type tint_symbol = tint_atomicCompareExchangeWeak(sb_rw, 0u, arg_1, x_21); + const uint old_value_1 = tint_symbol.old_value; + const uint x_23 = old_value_1; + const x__atomic_compare_exchange_resultu32 tint_symbol_1 = {x_23, (x_23 == x_21)}; + res = tint_symbol_1; + return; +} + +void fragment_main_1() { + atomicCompareExchangeWeak_63d8e6(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicCompareExchangeWeak_63d8e6(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..39de0eadad --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.msl @@ -0,0 +1,63 @@ +#include + +using namespace metal; + +struct atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; +atomic_compare_exchange_resultu32 atomicCompareExchangeWeak_1(device atomic_uint* atomic, uint compare, uint value) { + uint old_value = compare; + bool exchanged = atomic_compare_exchange_weak_explicit(atomic, &old_value, value, memory_order_relaxed, memory_order_relaxed); + return {old_value, exchanged}; +} + +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +struct x__atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + +void atomicCompareExchangeWeak_63d8e6(device SB_RW_atomic* const tint_symbol_2) { + uint arg_1 = 0u; + uint arg_2 = 0u; + x__atomic_compare_exchange_resultu32 res = {.old_value=0u, .exchanged=false}; + arg_1 = 1u; + arg_2 = 1u; + uint const x_21 = arg_2; + uint const x_22 = arg_1; + atomic_compare_exchange_resultu32 const tint_symbol = atomicCompareExchangeWeak_1(&((*(tint_symbol_2)).arg_0), x_22, x_21); + uint const old_value_1 = tint_symbol.old_value; + uint const x_23 = old_value_1; + x__atomic_compare_exchange_resultu32 const tint_symbol_1 = {.old_value=x_23, .exchanged=(x_23 == x_21)}; + res = tint_symbol_1; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicCompareExchangeWeak_63d8e6(tint_symbol_3); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + fragment_main_1(tint_symbol_4); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_5) { + atomicCompareExchangeWeak_63d8e6(tint_symbol_5); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_6 [[buffer(0)]]) { + compute_main_1(tint_symbol_6); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..9cce8485ae --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,96 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 46 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicCompareExchangeWeak_63d8e6 "atomicCompareExchangeWeak_63d8e6" + OpName %arg_1 "arg_1" + OpName %arg_2 "arg_2" + OpName %x__atomic_compare_exchange_resultu32 "x__atomic_compare_exchange_resultu32" + OpMemberName %x__atomic_compare_exchange_resultu32 0 "old_value" + OpMemberName %x__atomic_compare_exchange_resultu32 1 "exchanged" + OpName %res "res" + OpName %__atomic_compare_exchange_resultu32 "__atomic_compare_exchange_resultu32" + OpMemberName %__atomic_compare_exchange_resultu32 0 "old_value" + OpMemberName %__atomic_compare_exchange_resultu32 1 "exchanged" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + OpMemberDecorate %x__atomic_compare_exchange_resultu32 0 Offset 0 + OpMemberDecorate %x__atomic_compare_exchange_resultu32 1 Offset 4 + OpMemberDecorate %__atomic_compare_exchange_resultu32 0 Offset 0 + OpMemberDecorate %__atomic_compare_exchange_resultu32 1 Offset 4 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %bool = OpTypeBool +%x__atomic_compare_exchange_resultu32 = OpTypeStruct %uint %bool + %15 = OpConstantNull %bool + %16 = OpConstantComposite %x__atomic_compare_exchange_resultu32 %9 %15 +%_ptr_Function_x__atomic_compare_exchange_resultu32 = OpTypePointer Function %x__atomic_compare_exchange_resultu32 + %19 = OpConstantNull %x__atomic_compare_exchange_resultu32 + %uint_1 = OpConstant %uint 1 +%__atomic_compare_exchange_resultu32 = OpTypeStruct %uint %bool + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicCompareExchangeWeak_63d8e6 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %9 + %arg_2 = OpVariable %_ptr_Function_uint Function %9 + %res = OpVariable %_ptr_Function_x__atomic_compare_exchange_resultu32 Function %19 + OpStore %arg_1 %9 + OpStore %arg_2 %9 + OpStore %res %16 + OpStore %arg_1 %uint_1 + OpStore %arg_2 %uint_1 + %21 = OpLoad %uint %arg_2 + %22 = OpLoad %uint %arg_1 + %28 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %29 = OpAtomicCompareExchange %uint %28 %uint_1 %uint_0 %uint_0 %21 %22 + %30 = OpIEqual %bool %29 %21 + %23 = OpCompositeConstruct %__atomic_compare_exchange_resultu32 %29 %30 + %31 = OpCompositeExtract %uint %23 0 + %32 = OpIEqual %bool %31 %21 + %33 = OpCompositeConstruct %x__atomic_compare_exchange_resultu32 %31 %32 + OpStore %res %33 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %35 = OpLabel + %36 = OpFunctionCall %void %atomicCompareExchangeWeak_63d8e6 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %38 = OpLabel + %39 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %41 = OpLabel + %42 = OpFunctionCall %void %atomicCompareExchangeWeak_63d8e6 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %44 = OpLabel + %45 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..c3b661b632 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,48 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +struct x__atomic_compare_exchange_resultu32 { + old_value : u32, + exchanged : bool, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicCompareExchangeWeak_63d8e6() { + var arg_1 : u32 = 0u; + var arg_2 : u32 = 0u; + var res : x__atomic_compare_exchange_resultu32 = x__atomic_compare_exchange_resultu32(0u, false); + arg_1 = 1u; + arg_2 = 1u; + let x_21 : u32 = arg_2; + let x_22 : u32 = arg_1; + let old_value_1 = atomicCompareExchangeWeak(&(sb_rw.arg_0), x_22, x_21).old_value; + let x_23 : u32 = old_value_1; + res = x__atomic_compare_exchange_resultu32(x_23, (x_23 == x_21)); + return; +} + +fn fragment_main_1() { + atomicCompareExchangeWeak_63d8e6(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicCompareExchangeWeak_63d8e6(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm new file mode 100644 index 0000000000..b4e3102de6 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm @@ -0,0 +1,72 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 42 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicCompareExchangeWeak_e88938 "atomicCompareExchangeWeak_e88938" + OpName %arg_1 "arg_1" + OpName %arg_2 "arg_2" + OpName %__atomic_compare_exchange_resulti32 "__atomic_compare_exchange_resulti32" + OpMemberName %__atomic_compare_exchange_resulti32 0 "old_value" + OpMemberName %__atomic_compare_exchange_resulti32 1 "exchanged" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %__atomic_compare_exchange_resulti32 0 Offset 0 + OpMemberDecorate %__atomic_compare_exchange_resulti32 1 Offset 4 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %14 = OpConstantNull %int + %bool = OpTypeBool +%__atomic_compare_exchange_resulti32 = OpTypeStruct %int %bool + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 +%_ptr_Function___atomic_compare_exchange_resulti32 = OpTypePointer Function %__atomic_compare_exchange_resulti32 + %28 = OpConstantNull %__atomic_compare_exchange_resulti32 + %29 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicCompareExchangeWeak_e88938 = OpFunction %void None %7 + %10 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %arg_2 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function___atomic_compare_exchange_resulti32 Function %28 + OpStore %arg_1 %int_1 + OpStore %arg_2 %int_1 + %22 = OpLoad %int %arg_2 + %23 = OpLoad %int %arg_1 + %24 = OpAtomicCompareExchange %int %arg_0 %uint_2 %uint_0 %uint_0 %22 %23 + %25 = OpIEqual %bool %24 %22 + %16 = OpCompositeConstruct %__atomic_compare_exchange_resulti32 %24 %25 + OpStore %res %16 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %29 +%local_invocation_index = OpFunctionParameter %uint + %32 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %37 = OpFunctionCall %void %atomicCompareExchangeWeak_e88938 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %39 = OpLabel + %41 = OpLoad %uint %local_invocation_index_1 + %40 = OpFunctionCall %void %compute_main_inner %41 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..c370e71096 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,59 @@ +#version 310 es + +struct atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + + +struct x__atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicCompareExchangeWeak_e88938() { + int arg_1 = 0; + int arg_2 = 0; + x__atomic_compare_exchange_resulti32 res = x__atomic_compare_exchange_resulti32(0, false); + arg_1 = 1; + arg_2 = 1; + int x_22 = arg_2; + atomic_compare_exchange_resulti32 atomic_compare_result; + atomic_compare_result.old_value = atomicCompSwap(arg_0, arg_1, x_22); + atomic_compare_result.exchanged = atomic_compare_result.old_value == arg_1; + atomic_compare_exchange_resulti32 tint_symbol = atomic_compare_result; + int old_value_1 = tint_symbol.old_value; + int x_24 = old_value_1; + x__atomic_compare_exchange_resulti32 tint_symbol_1 = x__atomic_compare_exchange_resulti32(x_24, (x_24 == x_22)); + res = tint_symbol_1; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicCompareExchangeWeak_e88938(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..55ac417313 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,63 @@ +struct atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; +struct x__atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicCompareExchangeWeak_e88938() { + int arg_1 = 0; + int arg_2 = 0; + x__atomic_compare_exchange_resulti32 res = {0, false}; + arg_1 = 1; + arg_2 = 1; + const int x_22 = arg_2; + atomic_compare_exchange_resulti32 atomic_result = (atomic_compare_exchange_resulti32)0; + int atomic_compare_value = arg_1; + InterlockedCompareExchange(arg_0, atomic_compare_value, x_22, atomic_result.old_value); + atomic_result.exchanged = atomic_result.old_value == atomic_compare_value; + const atomic_compare_exchange_resulti32 tint_symbol_2 = atomic_result; + const int old_value_1 = tint_symbol_2.old_value; + const int x_24 = old_value_1; + const x__atomic_compare_exchange_resulti32 tint_symbol_3 = {x_24, (x_24 == x_22)}; + res = tint_symbol_3; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicCompareExchangeWeak_e88938(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..52cfd0fe09 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,64 @@ +#include + +using namespace metal; + +struct atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; +atomic_compare_exchange_resulti32 atomicCompareExchangeWeak_1(threadgroup atomic_int* atomic, int compare, int value) { + int old_value = compare; + bool exchanged = atomic_compare_exchange_weak_explicit(atomic, &old_value, value, memory_order_relaxed, memory_order_relaxed); + return {old_value, exchanged}; +} + +struct x__atomic_compare_exchange_resulti32 { + int old_value; + bool exchanged; +}; + +void atomicCompareExchangeWeak_e88938(threadgroup atomic_int* const tint_symbol_2) { + int arg_1 = 0; + int arg_2 = 0; + x__atomic_compare_exchange_resulti32 res = {.old_value=0, .exchanged=false}; + arg_1 = 1; + arg_2 = 1; + int const x_22 = arg_2; + int const x_23 = arg_1; + atomic_compare_exchange_resulti32 const tint_symbol = atomicCompareExchangeWeak_1(tint_symbol_2, x_23, x_22); + int const old_value_1 = tint_symbol.old_value; + int const x_24 = old_value_1; + x__atomic_compare_exchange_resulti32 const tint_symbol_1 = {.old_value=x_24, .exchanged=(x_24 == x_22)}; + res = tint_symbol_1; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_3) { + atomic_store_explicit(tint_symbol_3, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicCompareExchangeWeak_e88938(tint_symbol_3); + return; +} + +void compute_main_1(thread uint* const tint_symbol_4, threadgroup atomic_int* const tint_symbol_5) { + uint const x_41 = *(tint_symbol_4); + compute_main_inner(x_41, tint_symbol_5); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_6, thread uint* const tint_symbol_7) { + { + atomic_store_explicit(tint_symbol_6, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_7) = local_invocation_index_1_param; + compute_main_1(tint_symbol_7, tint_symbol_6); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_8; + thread uint tint_symbol_9 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_8), &(tint_symbol_9)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..ceae3b59a6 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,108 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 62 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicCompareExchangeWeak_e88938 "atomicCompareExchangeWeak_e88938" + OpName %arg_1 "arg_1" + OpName %arg_2 "arg_2" + OpName %x__atomic_compare_exchange_resulti32 "x__atomic_compare_exchange_resulti32" + OpMemberName %x__atomic_compare_exchange_resulti32 0 "old_value" + OpMemberName %x__atomic_compare_exchange_resulti32 1 "exchanged" + OpName %res "res" + OpName %__atomic_compare_exchange_resulti32 "__atomic_compare_exchange_resulti32" + OpMemberName %__atomic_compare_exchange_resulti32 0 "old_value" + OpMemberName %__atomic_compare_exchange_resulti32 1 "exchanged" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %x__atomic_compare_exchange_resulti32 0 Offset 0 + OpMemberDecorate %x__atomic_compare_exchange_resulti32 1 Offset 4 + OpMemberDecorate %__atomic_compare_exchange_resulti32 0 Offset 0 + OpMemberDecorate %__atomic_compare_exchange_resulti32 1 Offset 4 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %bool = OpTypeBool +%x__atomic_compare_exchange_resulti32 = OpTypeStruct %int %bool + %20 = OpConstantNull %bool + %21 = OpConstantComposite %x__atomic_compare_exchange_resulti32 %14 %20 +%_ptr_Function_x__atomic_compare_exchange_resulti32 = OpTypePointer Function %x__atomic_compare_exchange_resulti32 + %24 = OpConstantNull %x__atomic_compare_exchange_resulti32 + %int_1 = OpConstant %int 1 +%__atomic_compare_exchange_resulti32 = OpTypeStruct %int %bool + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %38 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicCompareExchangeWeak_e88938 = OpFunction %void None %10 + %13 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %arg_2 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_x__atomic_compare_exchange_resulti32 Function %24 + OpStore %arg_1 %14 + OpStore %arg_2 %14 + OpStore %res %21 + OpStore %arg_1 %int_1 + OpStore %arg_2 %int_1 + %26 = OpLoad %int %arg_2 + %27 = OpLoad %int %arg_1 + %33 = OpAtomicCompareExchange %int %arg_0 %uint_2 %uint_0 %uint_0 %26 %27 + %34 = OpIEqual %bool %33 %26 + %28 = OpCompositeConstruct %__atomic_compare_exchange_resulti32 %33 %34 + %35 = OpCompositeExtract %int %28 0 + %36 = OpIEqual %bool %35 %26 + %37 = OpCompositeConstruct %x__atomic_compare_exchange_resulti32 %35 %36 + OpStore %res %37 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %38 +%local_invocation_index = OpFunctionParameter %uint + %41 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %46 = OpFunctionCall %void %atomicCompareExchangeWeak_e88938 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %48 = OpLabel + %49 = OpLoad %uint %local_invocation_index_1 + %50 = OpFunctionCall %void %compute_main_inner %49 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %38 +%local_invocation_index_1_param = OpFunctionParameter %uint + %53 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %57 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %59 = OpLabel + %61 = OpLoad %uint %local_invocation_index_1_param_1 + %60 = OpFunctionCall %void %compute_main_inner_1 %61 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..aaa949ea64 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,41 @@ +struct x__atomic_compare_exchange_resulti32 { + old_value : i32, + exchanged : bool, +} + +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicCompareExchangeWeak_e88938() { + var arg_1 : i32 = 0i; + var arg_2 : i32 = 0i; + var res : x__atomic_compare_exchange_resulti32 = x__atomic_compare_exchange_resulti32(0i, false); + arg_1 = 1i; + arg_2 = 1i; + let x_22 : i32 = arg_2; + let x_23 : i32 = arg_1; + let old_value_1 = atomicCompareExchangeWeak(&(arg_0), x_23, x_22).old_value; + let x_24 : i32 = old_value_1; + res = x__atomic_compare_exchange_resulti32(x_24, (x_24 == x_22)); + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicCompareExchangeWeak_e88938(); + return; +} + +fn compute_main_1() { + let x_41 : u32 = local_invocation_index_1; + compute_main_inner(x_41); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm new file mode 100644 index 0000000000..b163b6f12c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm @@ -0,0 +1,71 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 41 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicCompareExchangeWeak_83580d "atomicCompareExchangeWeak_83580d" + OpName %arg_1 "arg_1" + OpName %arg_2 "arg_2" + OpName %__atomic_compare_exchange_resultu32 "__atomic_compare_exchange_resultu32" + OpMemberName %__atomic_compare_exchange_resultu32 0 "old_value" + OpMemberName %__atomic_compare_exchange_resultu32 1 "exchanged" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %__atomic_compare_exchange_resultu32 0 Offset 0 + OpMemberDecorate %__atomic_compare_exchange_resultu32 1 Offset 4 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %13 = OpConstantNull %uint + %bool = OpTypeBool +%__atomic_compare_exchange_resultu32 = OpTypeStruct %uint %bool + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 +%_ptr_Function___atomic_compare_exchange_resultu32 = OpTypePointer Function %__atomic_compare_exchange_resultu32 + %27 = OpConstantNull %__atomic_compare_exchange_resultu32 + %28 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicCompareExchangeWeak_83580d = OpFunction %void None %6 + %9 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %13 + %arg_2 = OpVariable %_ptr_Function_uint Function %13 + %res = OpVariable %_ptr_Function___atomic_compare_exchange_resultu32 Function %27 + OpStore %arg_1 %uint_1 + OpStore %arg_2 %uint_1 + %21 = OpLoad %uint %arg_2 + %22 = OpLoad %uint %arg_1 + %23 = OpAtomicCompareExchange %uint %arg_0 %uint_2 %uint_0 %uint_0 %21 %22 + %24 = OpIEqual %bool %23 %21 + %15 = OpCompositeConstruct %__atomic_compare_exchange_resultu32 %23 %24 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %28 +%local_invocation_index = OpFunctionParameter %uint + %31 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %13 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %36 = OpFunctionCall %void %atomicCompareExchangeWeak_83580d + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %38 = OpLabel + %40 = OpLoad %uint %local_invocation_index_1 + %39 = OpFunctionCall %void %compute_main_inner %40 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..645a53e004 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,59 @@ +#version 310 es + +struct atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + + +struct x__atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicCompareExchangeWeak_83580d() { + uint arg_1 = 0u; + uint arg_2 = 0u; + x__atomic_compare_exchange_resultu32 res = x__atomic_compare_exchange_resultu32(0u, false); + arg_1 = 1u; + arg_2 = 1u; + uint x_21 = arg_2; + atomic_compare_exchange_resultu32 atomic_compare_result; + atomic_compare_result.old_value = atomicCompSwap(arg_0, arg_1, x_21); + atomic_compare_result.exchanged = atomic_compare_result.old_value == arg_1; + atomic_compare_exchange_resultu32 tint_symbol = atomic_compare_result; + uint old_value_1 = tint_symbol.old_value; + uint x_23 = old_value_1; + x__atomic_compare_exchange_resultu32 tint_symbol_1 = x__atomic_compare_exchange_resultu32(x_23, (x_23 == x_21)); + res = tint_symbol_1; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicCompareExchangeWeak_83580d(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..6a120b1b74 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,63 @@ +struct atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; +struct x__atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicCompareExchangeWeak_83580d() { + uint arg_1 = 0u; + uint arg_2 = 0u; + x__atomic_compare_exchange_resultu32 res = {0u, false}; + arg_1 = 1u; + arg_2 = 1u; + const uint x_21 = arg_2; + atomic_compare_exchange_resultu32 atomic_result = (atomic_compare_exchange_resultu32)0; + uint atomic_compare_value = arg_1; + InterlockedCompareExchange(arg_0, atomic_compare_value, x_21, atomic_result.old_value); + atomic_result.exchanged = atomic_result.old_value == atomic_compare_value; + const atomic_compare_exchange_resultu32 tint_symbol_2 = atomic_result; + const uint old_value_1 = tint_symbol_2.old_value; + const uint x_23 = old_value_1; + const x__atomic_compare_exchange_resultu32 tint_symbol_3 = {x_23, (x_23 == x_21)}; + res = tint_symbol_3; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicCompareExchangeWeak_83580d(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..b7888746b9 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,64 @@ +#include + +using namespace metal; + +struct atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; +atomic_compare_exchange_resultu32 atomicCompareExchangeWeak_1(threadgroup atomic_uint* atomic, uint compare, uint value) { + uint old_value = compare; + bool exchanged = atomic_compare_exchange_weak_explicit(atomic, &old_value, value, memory_order_relaxed, memory_order_relaxed); + return {old_value, exchanged}; +} + +struct x__atomic_compare_exchange_resultu32 { + uint old_value; + bool exchanged; +}; + +void atomicCompareExchangeWeak_83580d(threadgroup atomic_uint* const tint_symbol_2) { + uint arg_1 = 0u; + uint arg_2 = 0u; + x__atomic_compare_exchange_resultu32 res = {.old_value=0u, .exchanged=false}; + arg_1 = 1u; + arg_2 = 1u; + uint const x_21 = arg_2; + uint const x_22 = arg_1; + atomic_compare_exchange_resultu32 const tint_symbol = atomicCompareExchangeWeak_1(tint_symbol_2, x_22, x_21); + uint const old_value_1 = tint_symbol.old_value; + uint const x_23 = old_value_1; + x__atomic_compare_exchange_resultu32 const tint_symbol_1 = {.old_value=x_23, .exchanged=(x_23 == x_21)}; + res = tint_symbol_1; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_3) { + atomic_store_explicit(tint_symbol_3, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicCompareExchangeWeak_83580d(tint_symbol_3); + return; +} + +void compute_main_1(thread uint* const tint_symbol_4, threadgroup atomic_uint* const tint_symbol_5) { + uint const x_40 = *(tint_symbol_4); + compute_main_inner(x_40, tint_symbol_5); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_6, thread uint* const tint_symbol_7) { + { + atomic_store_explicit(tint_symbol_6, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_7) = local_invocation_index_1_param; + compute_main_1(tint_symbol_7, tint_symbol_6); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_8; + thread uint tint_symbol_9 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_8), &(tint_symbol_9)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..a2d0294ffd --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,106 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 60 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicCompareExchangeWeak_83580d "atomicCompareExchangeWeak_83580d" + OpName %arg_1 "arg_1" + OpName %arg_2 "arg_2" + OpName %x__atomic_compare_exchange_resultu32 "x__atomic_compare_exchange_resultu32" + OpMemberName %x__atomic_compare_exchange_resultu32 0 "old_value" + OpMemberName %x__atomic_compare_exchange_resultu32 1 "exchanged" + OpName %res "res" + OpName %__atomic_compare_exchange_resultu32 "__atomic_compare_exchange_resultu32" + OpMemberName %__atomic_compare_exchange_resultu32 0 "old_value" + OpMemberName %__atomic_compare_exchange_resultu32 1 "exchanged" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + OpMemberDecorate %x__atomic_compare_exchange_resultu32 0 Offset 0 + OpMemberDecorate %x__atomic_compare_exchange_resultu32 1 Offset 4 + OpMemberDecorate %__atomic_compare_exchange_resultu32 0 Offset 0 + OpMemberDecorate %__atomic_compare_exchange_resultu32 1 Offset 4 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %bool = OpTypeBool +%x__atomic_compare_exchange_resultu32 = OpTypeStruct %uint %bool + %18 = OpConstantNull %bool + %19 = OpConstantComposite %x__atomic_compare_exchange_resultu32 %6 %18 +%_ptr_Function_x__atomic_compare_exchange_resultu32 = OpTypePointer Function %x__atomic_compare_exchange_resultu32 + %22 = OpConstantNull %x__atomic_compare_exchange_resultu32 + %uint_1 = OpConstant %uint 1 +%__atomic_compare_exchange_resultu32 = OpTypeStruct %uint %bool + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %36 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicCompareExchangeWeak_83580d = OpFunction %void None %9 + %12 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %6 + %arg_2 = OpVariable %_ptr_Function_uint Function %6 + %res = OpVariable %_ptr_Function_x__atomic_compare_exchange_resultu32 Function %22 + OpStore %arg_1 %6 + OpStore %arg_2 %6 + OpStore %res %19 + OpStore %arg_1 %uint_1 + OpStore %arg_2 %uint_1 + %24 = OpLoad %uint %arg_2 + %25 = OpLoad %uint %arg_1 + %31 = OpAtomicCompareExchange %uint %arg_0 %uint_2 %uint_0 %uint_0 %24 %25 + %32 = OpIEqual %bool %31 %24 + %26 = OpCompositeConstruct %__atomic_compare_exchange_resultu32 %31 %32 + %33 = OpCompositeExtract %uint %26 0 + %34 = OpIEqual %bool %33 %24 + %35 = OpCompositeConstruct %x__atomic_compare_exchange_resultu32 %33 %34 + OpStore %res %35 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %36 +%local_invocation_index = OpFunctionParameter %uint + %39 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %44 = OpFunctionCall %void %atomicCompareExchangeWeak_83580d + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %46 = OpLabel + %47 = OpLoad %uint %local_invocation_index_1 + %48 = OpFunctionCall %void %compute_main_inner %47 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %36 +%local_invocation_index_1_param = OpFunctionParameter %uint + %51 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %55 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %57 = OpLabel + %59 = OpLoad %uint %local_invocation_index_1_param_1 + %58 = OpFunctionCall %void %compute_main_inner_1 %59 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..4a5fdf835d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicCompareExchangeWeak/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,41 @@ +struct x__atomic_compare_exchange_resultu32 { + old_value : u32, + exchanged : bool, +} + +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicCompareExchangeWeak_83580d() { + var arg_1 : u32 = 0u; + var arg_2 : u32 = 0u; + var res : x__atomic_compare_exchange_resultu32 = x__atomic_compare_exchange_resultu32(0u, false); + arg_1 = 1u; + arg_2 = 1u; + let x_21 : u32 = arg_2; + let x_22 : u32 = arg_1; + let old_value_1 = atomicCompareExchangeWeak(&(arg_0), x_22, x_21).old_value; + let x_23 : u32 = old_value_1; + res = x__atomic_compare_exchange_resultu32(x_23, (x_23 == x_21)); + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicCompareExchangeWeak_83580d(); + return; +} + +fn compute_main_1() { + let x_40 : u32 = local_invocation_index_1; + compute_main_inner(x_40); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm new file mode 100644 index 0000000000..755a537b01 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm @@ -0,0 +1,57 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 28 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicExchange_f2e22f "atomicExchange_f2e22f" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %12 = OpConstantNull %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicExchange_f2e22f = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %12 + %res = OpVariable %_ptr_Function_int Function %12 + OpStore %arg_1 %int_1 + %19 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %20 = OpLoad %int %arg_1 + %13 = OpAtomicExchange %int %19 %uint_1 %uint_0 %20 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicExchange_f2e22f + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %atomicExchange_f2e22f + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..284be713fc --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicExchange_f2e22f() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicExchange(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicExchange_f2e22f(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicExchange_f2e22f() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicExchange(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void compute_main_1() { + atomicExchange_f2e22f(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..32a2a705bc --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicExchange(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedExchange(offset, value, original_value); + return original_value; +} + + +void atomicExchange_f2e22f() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + const int x_13 = tint_atomicExchange(sb_rw, 0u, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicExchange_f2e22f(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicExchange_f2e22f(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..1f5986b375 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicExchange_f2e22f(device SB_RW_atomic* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_20 = arg_1; + int const x_13 = atomic_exchange_explicit(&((*(tint_symbol)).arg_0), x_20, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicExchange_f2e22f(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicExchange_f2e22f(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..2b2b678143 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,71 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicExchange_f2e22f "atomicExchange_f2e22f" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicExchange_f2e22f = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %9 + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %int_1 + %14 = OpLoad %int %arg_1 + %21 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %15 = OpAtomicExchange %int %21 %uint_1 %uint_0 %14 + OpStore %res %15 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicExchange_f2e22f + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %29 = OpLabel + %30 = OpFunctionCall %void %atomicExchange_f2e22f + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %32 = OpLabel + %33 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..e4dad2dce0 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,39 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicExchange_f2e22f() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_20 : i32 = arg_1; + let x_13 : i32 = atomicExchange(&(sb_rw.arg_0), x_20); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicExchange_f2e22f(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicExchange_f2e22f(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm new file mode 100644 index 0000000000..2ec90f3908 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm @@ -0,0 +1,55 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicExchange_d59712 "atomicExchange_d59712" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %12 = OpConstantNull %uint + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicExchange_d59712 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %12 + %res = OpVariable %_ptr_Function_uint Function %12 + OpStore %arg_1 %uint_1 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %18 = OpLoad %uint %arg_1 + %13 = OpAtomicExchange %uint %17 %uint_1 %uint_0 %18 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicExchange_d59712 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicExchange_d59712 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..edc360d54d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicExchange_d59712() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicExchange(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicExchange_d59712(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicExchange_d59712() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicExchange(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void compute_main_1() { + atomicExchange_d59712(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..84b133b3a3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicExchange(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedExchange(offset, value, original_value); + return original_value; +} + + +void atomicExchange_d59712() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + const uint x_13 = tint_atomicExchange(sb_rw, 0u, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicExchange_d59712(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicExchange_d59712(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..e27ba223e5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicExchange_d59712(device SB_RW_atomic* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_18 = arg_1; + uint const x_13 = atomic_exchange_explicit(&((*(tint_symbol)).arg_0), x_18, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicExchange_d59712(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicExchange_d59712(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..7e620f005e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,69 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicExchange_d59712 "atomicExchange_d59712" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicExchange_d59712 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %9 + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %uint_1 + %14 = OpLoad %uint %arg_1 + %19 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %15 = OpAtomicExchange %uint %19 %uint_1 %uint_0 %14 + OpStore %res %15 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicExchange_d59712 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %27 = OpLabel + %28 = OpFunctionCall %void %atomicExchange_d59712 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %30 = OpLabel + %31 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..d7b8cb6d08 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,39 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicExchange_d59712() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_18 : u32 = arg_1; + let x_13 : u32 = atomicExchange(&(sb_rw.arg_0), x_18); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicExchange_d59712(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicExchange_d59712(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm new file mode 100644 index 0000000000..0e6f0a80e1 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm @@ -0,0 +1,57 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicExchange_e114ba "atomicExchange_e114ba" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %14 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %21 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicExchange_e114ba = OpFunction %void None %7 + %10 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %int_1 + %19 = OpLoad %int %arg_1 + %15 = OpAtomicExchange %int %arg_0 %uint_2 %uint_0 %19 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %21 +%local_invocation_index = OpFunctionParameter %uint + %24 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %29 = OpFunctionCall %void %atomicExchange_e114ba + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %31 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..03a22c2166 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicExchange_e114ba() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_15 = atomicExchange(arg_0, arg_1); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicExchange_e114ba(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..d0e30a4659 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicExchange_e114ba() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int atomic_result = 0; + InterlockedExchange(arg_0, arg_1, atomic_result); + const int x_15 = atomic_result; + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicExchange_e114ba(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..1886d0a165 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,42 @@ +#include + +using namespace metal; +void atomicExchange_e114ba(threadgroup atomic_int* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_19 = arg_1; + int const x_15 = atomic_exchange_explicit(tint_symbol, x_19, memory_order_relaxed); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicExchange_e114ba(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_33 = *(tint_symbol_2); + compute_main_inner(x_33, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..e72725be34 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,81 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 48 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicExchange_e114ba "atomicExchange_e114ba" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %24 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicExchange_e114ba = OpFunction %void None %10 + %13 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %14 + OpStore %res %14 + OpStore %arg_1 %int_1 + %19 = OpLoad %int %arg_1 + %20 = OpAtomicExchange %int %arg_0 %uint_2 %uint_0 %19 + OpStore %res %20 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %24 +%local_invocation_index = OpFunctionParameter %uint + %27 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %32 = OpFunctionCall %void %atomicExchange_e114ba + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %34 = OpLabel + %35 = OpLoad %uint %local_invocation_index_1 + %36 = OpFunctionCall %void %compute_main_inner %35 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %24 +%local_invocation_index_1_param = OpFunctionParameter %uint + %39 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %43 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %45 = OpLabel + %47 = OpLoad %uint %local_invocation_index_1_param_1 + %46 = OpFunctionCall %void %compute_main_inner_1 %47 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..555469e670 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,32 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicExchange_e114ba() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_19 : i32 = arg_1; + let x_15 : i32 = atomicExchange(&(arg_0), x_19); + res = x_15; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicExchange_e114ba(); + return; +} + +fn compute_main_1() { + let x_33 : u32 = local_invocation_index_1; + compute_main_inner(x_33); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm new file mode 100644 index 0000000000..3bbfe18b89 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm @@ -0,0 +1,56 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 33 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicExchange_0a5dca "atomicExchange_0a5dca" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %13 = OpConstantNull %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicExchange_0a5dca = OpFunction %void None %6 + %9 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %13 + %res = OpVariable %_ptr_Function_uint Function %13 + OpStore %arg_1 %uint_1 + %18 = OpLoad %uint %arg_1 + %14 = OpAtomicExchange %uint %arg_0 %uint_2 %uint_0 %18 + OpStore %res %14 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %13 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicExchange_0a5dca + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %30 = OpLabel + %32 = OpLoad %uint %local_invocation_index_1 + %31 = OpFunctionCall %void %compute_main_inner %32 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..32711c9133 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicExchange_0a5dca() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_14 = atomicExchange(arg_0, arg_1); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicExchange_0a5dca(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..f5ff3f7038 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicExchange_0a5dca() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint atomic_result = 0u; + InterlockedExchange(arg_0, arg_1, atomic_result); + const uint x_14 = atomic_result; + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicExchange_0a5dca(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..c42c47d438 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,42 @@ +#include + +using namespace metal; +void atomicExchange_0a5dca(threadgroup atomic_uint* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_18 = arg_1; + uint const x_14 = atomic_exchange_explicit(tint_symbol, x_18, memory_order_relaxed); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicExchange_0a5dca(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_32 = *(tint_symbol_2); + compute_main_inner(x_32, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..697005356b --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,79 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 46 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicExchange_0a5dca "atomicExchange_0a5dca" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %22 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicExchange_0a5dca = OpFunction %void None %9 + %12 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %6 + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %arg_1 %6 + OpStore %res %6 + OpStore %arg_1 %uint_1 + %17 = OpLoad %uint %arg_1 + %18 = OpAtomicExchange %uint %arg_0 %uint_2 %uint_0 %17 + OpStore %res %18 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %22 +%local_invocation_index = OpFunctionParameter %uint + %25 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpFunctionCall %void %atomicExchange_0a5dca + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %32 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %22 +%local_invocation_index_1_param = OpFunctionParameter %uint + %37 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %41 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %43 = OpLabel + %45 = OpLoad %uint %local_invocation_index_1_param_1 + %44 = OpFunctionCall %void %compute_main_inner_1 %45 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..89fff60d5c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicExchange/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,32 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicExchange_0a5dca() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_18 : u32 = arg_1; + let x_14 : u32 = atomicExchange(&(arg_0), x_18); + res = x_14; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicExchange_0a5dca(); + return; +} + +fn compute_main_1() { + let x_32 : u32 = local_invocation_index_1; + compute_main_inner(x_32); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm new file mode 100644 index 0000000000..d961ea5c86 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm @@ -0,0 +1,52 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 25 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicLoad_0806ad "atomicLoad_0806ad" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%_ptr_Function_int = OpTypePointer Function %int + %18 = OpConstantNull %int +%atomicLoad_0806ad = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %18 + %15 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %9 = OpAtomicLoad %int %15 %uint_1 %uint_0 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %20 = OpLabel + %21 = OpFunctionCall %void %atomicLoad_0806ad + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicLoad_0806ad + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..d034197209 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicLoad_0806ad() { + int res = 0; + int x_9 = atomicOr(sb_rw.arg_0, 0); + res = x_9; + return; +} + +void fragment_main_1() { + atomicLoad_0806ad(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicLoad_0806ad() { + int res = 0; + int x_9 = atomicOr(sb_rw.arg_0, 0); + res = x_9; + return; +} + +void compute_main_1() { + atomicLoad_0806ad(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..8ce9cf2f39 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicLoad(RWByteAddressBuffer buffer, uint offset) { + int value = 0; + buffer.InterlockedOr(offset, 0, value); + return value; +} + + +void atomicLoad_0806ad() { + int res = 0; + const int x_9 = tint_atomicLoad(sb_rw, 0u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicLoad_0806ad(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicLoad_0806ad(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..1ea07a1c38 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicLoad_0806ad(device SB_RW_atomic* const tint_symbol) { + int res = 0; + int const x_9 = atomic_load_explicit(&((*(tint_symbol)).arg_0), memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicLoad_0806ad(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicLoad_0806ad(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..40034c7744 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,65 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 31 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicLoad_0806ad "atomicLoad_0806ad" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicLoad_0806ad = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %res %9 + %18 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %12 = OpAtomicLoad %int %18 %uint_1 %uint_0 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %20 = OpLabel + %21 = OpFunctionCall %void %atomicLoad_0806ad + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %atomicLoad_0806ad + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %29 = OpLabel + %30 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..b13dbfb432 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicLoad_0806ad() { + var res : i32 = 0i; + let x_9 : i32 = atomicLoad(&(sb_rw.arg_0)); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicLoad_0806ad(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicLoad_0806ad(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm new file mode 100644 index 0000000000..776c62c09f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm @@ -0,0 +1,51 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 24 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicLoad_fe6cc3 "atomicLoad_fe6cc3" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %17 = OpConstantNull %uint +%atomicLoad_fe6cc3 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %17 + %14 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %9 = OpAtomicLoad %uint %14 %uint_1 %uint_0 + OpStore %res %9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicLoad_fe6cc3 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %atomicLoad_fe6cc3 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..cebe232998 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicLoad_fe6cc3() { + uint res = 0u; + uint x_9 = atomicOr(sb_rw.arg_0, 0u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicLoad_fe6cc3(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicLoad_fe6cc3() { + uint res = 0u; + uint x_9 = atomicOr(sb_rw.arg_0, 0u); + res = x_9; + return; +} + +void compute_main_1() { + atomicLoad_fe6cc3(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..454ed3cf18 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,36 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicLoad(RWByteAddressBuffer buffer, uint offset) { + uint value = 0; + buffer.InterlockedOr(offset, 0, value); + return value; +} + + +void atomicLoad_fe6cc3() { + uint res = 0u; + const uint x_9 = tint_atomicLoad(sb_rw, 0u); + res = x_9; + return; +} + +void fragment_main_1() { + atomicLoad_fe6cc3(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicLoad_fe6cc3(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..a6cce2757a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.msl @@ -0,0 +1,38 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicLoad_fe6cc3(device SB_RW_atomic* const tint_symbol) { + uint res = 0u; + uint const x_9 = atomic_load_explicit(&((*(tint_symbol)).arg_0), memory_order_relaxed); + res = x_9; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicLoad_fe6cc3(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicLoad_fe6cc3(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..e12b47bae3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,64 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 30 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicLoad_fe6cc3 "atomicLoad_fe6cc3" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicLoad_fe6cc3 = OpFunction %void None %5 + %8 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %res %9 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %12 = OpAtomicLoad %uint %17 %uint_1 %uint_0 + OpStore %res %12 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %19 = OpLabel + %20 = OpFunctionCall %void %atomicLoad_fe6cc3 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %25 = OpLabel + %26 = OpFunctionCall %void %atomicLoad_fe6cc3 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %28 = OpLabel + %29 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..b03da62e6d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,36 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicLoad_fe6cc3() { + var res : u32 = 0u; + let x_9 : u32 = atomicLoad(&(sb_rw.arg_0)); + res = x_9; + return; +} + +fn fragment_main_1() { + atomicLoad_fe6cc3(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicLoad_fe6cc3(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm new file mode 100644 index 0000000000..b996359601 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm @@ -0,0 +1,52 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 31 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicLoad_afcc03 "atomicLoad_afcc03" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 +%_ptr_Function_int = OpTypePointer Function %int + %17 = OpConstantNull %int + %18 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicLoad_afcc03 = OpFunction %void None %7 + %10 = OpLabel + %res = OpVariable %_ptr_Function_int Function %17 + %11 = OpAtomicLoad %int %arg_0 %uint_2 %uint_0 + OpStore %res %11 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %18 +%local_invocation_index = OpFunctionParameter %uint + %21 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %17 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %26 = OpFunctionCall %void %atomicLoad_afcc03 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %28 = OpLabel + %30 = OpLoad %uint %local_invocation_index_1 + %29 = OpFunctionCall %void %compute_main_inner %30 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..e0c158b430 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicLoad_afcc03() { + int res = 0; + int x_11 = atomicOr(arg_0, 0); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicLoad_afcc03(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..1593c13612 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicLoad_afcc03() { + int res = 0; + int atomic_result = 0; + InterlockedOr(arg_0, 0, atomic_result); + const int x_11 = atomic_result; + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicLoad_afcc03(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..8f6ee408a4 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicLoad_afcc03(threadgroup atomic_int* const tint_symbol) { + int res = 0; + int const x_11 = atomic_load_explicit(tint_symbol, memory_order_relaxed); + res = x_11; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicLoad_afcc03(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_30 = *(tint_symbol_2); + compute_main_inner(x_30, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..829b8487e3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,75 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 45 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicLoad_afcc03 "atomicLoad_afcc03" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %21 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicLoad_afcc03 = OpFunction %void None %10 + %13 = OpLabel + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %res %14 + %17 = OpAtomicLoad %int %arg_0 %uint_2 %uint_0 + OpStore %res %17 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %21 +%local_invocation_index = OpFunctionParameter %uint + %24 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %29 = OpFunctionCall %void %atomicLoad_afcc03 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %31 = OpLabel + %32 = OpLoad %uint %local_invocation_index_1 + %33 = OpFunctionCall %void %compute_main_inner %32 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %21 +%local_invocation_index_1_param = OpFunctionParameter %uint + %36 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %40 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %42 = OpLabel + %44 = OpLoad %uint %local_invocation_index_1_param_1 + %43 = OpFunctionCall %void %compute_main_inner_1 %44 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..af0c057346 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicLoad_afcc03() { + var res : i32 = 0i; + let x_11 : i32 = atomicLoad(&(arg_0)); + res = x_11; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicLoad_afcc03(); + return; +} + +fn compute_main_1() { + let x_30 : u32 = local_invocation_index_1; + compute_main_inner(x_30); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm new file mode 100644 index 0000000000..20eeca7ef5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm @@ -0,0 +1,51 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 30 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicLoad_361bf1 "atomicLoad_361bf1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 +%_ptr_Function_uint = OpTypePointer Function %uint + %16 = OpConstantNull %uint + %17 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicLoad_361bf1 = OpFunction %void None %6 + %9 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %16 + %10 = OpAtomicLoad %uint %arg_0 %uint_2 %uint_0 + OpStore %res %10 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %17 +%local_invocation_index = OpFunctionParameter %uint + %20 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %16 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %25 = OpFunctionCall %void %atomicLoad_361bf1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %27 = OpLabel + %29 = OpLoad %uint %local_invocation_index_1 + %28 = OpFunctionCall %void %compute_main_inner %29 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..8bd40a675c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicLoad_361bf1() { + uint res = 0u; + uint x_10 = atomicOr(arg_0, 0u); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicLoad_361bf1(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..803eadd060 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,44 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicLoad_361bf1() { + uint res = 0u; + uint atomic_result = 0u; + InterlockedOr(arg_0, 0, atomic_result); + const uint x_10 = atomic_result; + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicLoad_361bf1(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..d7fcb6e569 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +void atomicLoad_361bf1(threadgroup atomic_uint* const tint_symbol) { + uint res = 0u; + uint const x_10 = atomic_load_explicit(tint_symbol, memory_order_relaxed); + res = x_10; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicLoad_361bf1(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_29 = *(tint_symbol_2); + compute_main_inner(x_29, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..7a075badba --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,73 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 43 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicLoad_361bf1 "atomicLoad_361bf1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %19 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicLoad_361bf1 = OpFunction %void None %9 + %12 = OpLabel + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %res %6 + %15 = OpAtomicLoad %uint %arg_0 %uint_2 %uint_0 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %19 +%local_invocation_index = OpFunctionParameter %uint + %22 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %27 = OpFunctionCall %void %atomicLoad_361bf1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %29 = OpLabel + %30 = OpLoad %uint %local_invocation_index_1 + %31 = OpFunctionCall %void %compute_main_inner %30 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %19 +%local_invocation_index_1_param = OpFunctionParameter %uint + %34 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %38 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %40 = OpLabel + %42 = OpLoad %uint %local_invocation_index_1_param_1 + %41 = OpFunctionCall %void %compute_main_inner_1 %42 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..f132c6fa83 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicLoad/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,29 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicLoad_361bf1() { + var res : u32 = 0u; + let x_10 : u32 = atomicLoad(&(arg_0)); + res = x_10; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicLoad_361bf1(); + return; +} + +fn compute_main_1() { + let x_29 : u32 = local_invocation_index_1; + compute_main_inner(x_29); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm new file mode 100644 index 0000000000..e6ff30ef3a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm @@ -0,0 +1,57 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 28 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicMax_92aa72 "atomicMax_92aa72" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %12 = OpConstantNull %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicMax_92aa72 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %12 + %res = OpVariable %_ptr_Function_int Function %12 + OpStore %arg_1 %int_1 + %19 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %20 = OpLoad %int %arg_1 + %13 = OpAtomicSMax %int %19 %uint_1 %uint_0 %20 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicMax_92aa72 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %atomicMax_92aa72 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..d458f056ad --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicMax_92aa72() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicMax(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicMax_92aa72(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicMax_92aa72() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicMax(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void compute_main_1() { + atomicMax_92aa72(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..9b64baf78f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicMax(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedMax(offset, value, original_value); + return original_value; +} + + +void atomicMax_92aa72() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + const int x_13 = tint_atomicMax(sb_rw, 0u, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicMax_92aa72(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicMax_92aa72(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..61bf2eb800 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicMax_92aa72(device SB_RW_atomic* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_20 = arg_1; + int const x_13 = atomic_fetch_max_explicit(&((*(tint_symbol)).arg_0), x_20, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicMax_92aa72(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicMax_92aa72(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..c0a4470ffb --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,71 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicMax_92aa72 "atomicMax_92aa72" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicMax_92aa72 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %9 + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %int_1 + %14 = OpLoad %int %arg_1 + %21 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %15 = OpAtomicSMax %int %21 %uint_1 %uint_0 %14 + OpStore %res %15 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicMax_92aa72 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %29 = OpLabel + %30 = OpFunctionCall %void %atomicMax_92aa72 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %32 = OpLabel + %33 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..eea496ef2d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,39 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicMax_92aa72() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_20 : i32 = arg_1; + let x_13 : i32 = atomicMax(&(sb_rw.arg_0), x_20); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicMax_92aa72(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicMax_92aa72(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm new file mode 100644 index 0000000000..97bae6a5c4 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm @@ -0,0 +1,55 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicMax_51b9be "atomicMax_51b9be" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %12 = OpConstantNull %uint + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicMax_51b9be = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %12 + %res = OpVariable %_ptr_Function_uint Function %12 + OpStore %arg_1 %uint_1 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %18 = OpLoad %uint %arg_1 + %13 = OpAtomicUMax %uint %17 %uint_1 %uint_0 %18 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicMax_51b9be + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicMax_51b9be + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..e5f7f89955 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicMax_51b9be() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicMax(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicMax_51b9be(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicMax_51b9be() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicMax(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void compute_main_1() { + atomicMax_51b9be(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..e9a8f8456a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicMax(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedMax(offset, value, original_value); + return original_value; +} + + +void atomicMax_51b9be() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + const uint x_13 = tint_atomicMax(sb_rw, 0u, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicMax_51b9be(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicMax_51b9be(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..a77e9cfa68 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicMax_51b9be(device SB_RW_atomic* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_18 = arg_1; + uint const x_13 = atomic_fetch_max_explicit(&((*(tint_symbol)).arg_0), x_18, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicMax_51b9be(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicMax_51b9be(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..4ed13b0a3c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,69 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicMax_51b9be "atomicMax_51b9be" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicMax_51b9be = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %9 + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %uint_1 + %14 = OpLoad %uint %arg_1 + %19 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %15 = OpAtomicUMax %uint %19 %uint_1 %uint_0 %14 + OpStore %res %15 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicMax_51b9be + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %27 = OpLabel + %28 = OpFunctionCall %void %atomicMax_51b9be + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %30 = OpLabel + %31 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..ea27f1d7c2 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,39 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicMax_51b9be() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_18 : u32 = arg_1; + let x_13 : u32 = atomicMax(&(sb_rw.arg_0), x_18); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicMax_51b9be(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicMax_51b9be(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm new file mode 100644 index 0000000000..2864a14479 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm @@ -0,0 +1,57 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicMax_a89cc3 "atomicMax_a89cc3" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %14 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %21 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicMax_a89cc3 = OpFunction %void None %7 + %10 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %int_1 + %19 = OpLoad %int %arg_1 + %15 = OpAtomicSMax %int %arg_0 %uint_2 %uint_0 %19 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %21 +%local_invocation_index = OpFunctionParameter %uint + %24 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %29 = OpFunctionCall %void %atomicMax_a89cc3 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %31 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..ce19147f59 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicMax_a89cc3() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_15 = atomicMax(arg_0, arg_1); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicMax_a89cc3(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..3020cf2dca --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicMax_a89cc3() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int atomic_result = 0; + InterlockedMax(arg_0, arg_1, atomic_result); + const int x_15 = atomic_result; + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicMax_a89cc3(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..7a3987d5ac --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,42 @@ +#include + +using namespace metal; +void atomicMax_a89cc3(threadgroup atomic_int* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_19 = arg_1; + int const x_15 = atomic_fetch_max_explicit(tint_symbol, x_19, memory_order_relaxed); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicMax_a89cc3(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_33 = *(tint_symbol_2); + compute_main_inner(x_33, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..696868b763 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,81 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 48 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicMax_a89cc3 "atomicMax_a89cc3" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %24 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicMax_a89cc3 = OpFunction %void None %10 + %13 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %14 + OpStore %res %14 + OpStore %arg_1 %int_1 + %19 = OpLoad %int %arg_1 + %20 = OpAtomicSMax %int %arg_0 %uint_2 %uint_0 %19 + OpStore %res %20 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %24 +%local_invocation_index = OpFunctionParameter %uint + %27 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %32 = OpFunctionCall %void %atomicMax_a89cc3 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %34 = OpLabel + %35 = OpLoad %uint %local_invocation_index_1 + %36 = OpFunctionCall %void %compute_main_inner %35 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %24 +%local_invocation_index_1_param = OpFunctionParameter %uint + %39 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %43 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %45 = OpLabel + %47 = OpLoad %uint %local_invocation_index_1_param_1 + %46 = OpFunctionCall %void %compute_main_inner_1 %47 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..9086b7426e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,32 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicMax_a89cc3() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_19 : i32 = arg_1; + let x_15 : i32 = atomicMax(&(arg_0), x_19); + res = x_15; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicMax_a89cc3(); + return; +} + +fn compute_main_1() { + let x_33 : u32 = local_invocation_index_1; + compute_main_inner(x_33); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm new file mode 100644 index 0000000000..03577ee568 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm @@ -0,0 +1,56 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 33 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicMax_beccfc "atomicMax_beccfc" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %13 = OpConstantNull %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicMax_beccfc = OpFunction %void None %6 + %9 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %13 + %res = OpVariable %_ptr_Function_uint Function %13 + OpStore %arg_1 %uint_1 + %18 = OpLoad %uint %arg_1 + %14 = OpAtomicUMax %uint %arg_0 %uint_2 %uint_0 %18 + OpStore %res %14 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %13 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicMax_beccfc + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %30 = OpLabel + %32 = OpLoad %uint %local_invocation_index_1 + %31 = OpFunctionCall %void %compute_main_inner %32 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..f20964483c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicMax_beccfc() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_14 = atomicMax(arg_0, arg_1); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicMax_beccfc(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..b87186d8da --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicMax_beccfc() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint atomic_result = 0u; + InterlockedMax(arg_0, arg_1, atomic_result); + const uint x_14 = atomic_result; + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicMax_beccfc(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..edd31021e4 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,42 @@ +#include + +using namespace metal; +void atomicMax_beccfc(threadgroup atomic_uint* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_18 = arg_1; + uint const x_14 = atomic_fetch_max_explicit(tint_symbol, x_18, memory_order_relaxed); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicMax_beccfc(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_32 = *(tint_symbol_2); + compute_main_inner(x_32, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..ad735e12c7 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,79 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 46 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicMax_beccfc "atomicMax_beccfc" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %22 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicMax_beccfc = OpFunction %void None %9 + %12 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %6 + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %arg_1 %6 + OpStore %res %6 + OpStore %arg_1 %uint_1 + %17 = OpLoad %uint %arg_1 + %18 = OpAtomicUMax %uint %arg_0 %uint_2 %uint_0 %17 + OpStore %res %18 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %22 +%local_invocation_index = OpFunctionParameter %uint + %25 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpFunctionCall %void %atomicMax_beccfc + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %32 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %22 +%local_invocation_index_1_param = OpFunctionParameter %uint + %37 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %41 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %43 = OpLabel + %45 = OpLoad %uint %local_invocation_index_1_param_1 + %44 = OpFunctionCall %void %compute_main_inner_1 %45 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..e74059976f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMax/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,32 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicMax_beccfc() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_18 : u32 = arg_1; + let x_14 : u32 = atomicMax(&(arg_0), x_18); + res = x_14; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicMax_beccfc(); + return; +} + +fn compute_main_1() { + let x_32 : u32 = local_invocation_index_1; + compute_main_inner(x_32); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm new file mode 100644 index 0000000000..f2ca9b8e59 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm @@ -0,0 +1,57 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 28 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicMin_8e38dc "atomicMin_8e38dc" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %12 = OpConstantNull %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicMin_8e38dc = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %12 + %res = OpVariable %_ptr_Function_int Function %12 + OpStore %arg_1 %int_1 + %19 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %20 = OpLoad %int %arg_1 + %13 = OpAtomicSMin %int %19 %uint_1 %uint_0 %20 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicMin_8e38dc + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %atomicMin_8e38dc + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..e233a685b8 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicMin_8e38dc() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicMin(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicMin_8e38dc(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicMin_8e38dc() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicMin(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void compute_main_1() { + atomicMin_8e38dc(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..e169190664 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicMin(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedMin(offset, value, original_value); + return original_value; +} + + +void atomicMin_8e38dc() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + const int x_13 = tint_atomicMin(sb_rw, 0u, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicMin_8e38dc(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicMin_8e38dc(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..dfe6ecb27f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicMin_8e38dc(device SB_RW_atomic* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_20 = arg_1; + int const x_13 = atomic_fetch_min_explicit(&((*(tint_symbol)).arg_0), x_20, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicMin_8e38dc(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicMin_8e38dc(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..7e5e670ac5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,71 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicMin_8e38dc "atomicMin_8e38dc" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicMin_8e38dc = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %9 + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %int_1 + %14 = OpLoad %int %arg_1 + %21 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %15 = OpAtomicSMin %int %21 %uint_1 %uint_0 %14 + OpStore %res %15 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicMin_8e38dc + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %29 = OpLabel + %30 = OpFunctionCall %void %atomicMin_8e38dc + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %32 = OpLabel + %33 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..0ef454132d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,39 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicMin_8e38dc() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_20 : i32 = arg_1; + let x_13 : i32 = atomicMin(&(sb_rw.arg_0), x_20); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicMin_8e38dc(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicMin_8e38dc(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm new file mode 100644 index 0000000000..f3cc67b6e6 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm @@ -0,0 +1,55 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicMin_c67a74 "atomicMin_c67a74" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %12 = OpConstantNull %uint + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicMin_c67a74 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %12 + %res = OpVariable %_ptr_Function_uint Function %12 + OpStore %arg_1 %uint_1 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %18 = OpLoad %uint %arg_1 + %13 = OpAtomicUMin %uint %17 %uint_1 %uint_0 %18 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicMin_c67a74 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicMin_c67a74 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..06e8d89512 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicMin_c67a74() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicMin(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicMin_c67a74(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicMin_c67a74() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicMin(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void compute_main_1() { + atomicMin_c67a74(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..76447efb9a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicMin(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedMin(offset, value, original_value); + return original_value; +} + + +void atomicMin_c67a74() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + const uint x_13 = tint_atomicMin(sb_rw, 0u, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicMin_c67a74(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicMin_c67a74(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..147d01efb7 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicMin_c67a74(device SB_RW_atomic* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_18 = arg_1; + uint const x_13 = atomic_fetch_min_explicit(&((*(tint_symbol)).arg_0), x_18, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicMin_c67a74(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicMin_c67a74(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..309f258a47 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,69 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicMin_c67a74 "atomicMin_c67a74" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicMin_c67a74 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %9 + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %uint_1 + %14 = OpLoad %uint %arg_1 + %19 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %15 = OpAtomicUMin %uint %19 %uint_1 %uint_0 %14 + OpStore %res %15 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicMin_c67a74 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %27 = OpLabel + %28 = OpFunctionCall %void %atomicMin_c67a74 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %30 = OpLabel + %31 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..3586e32234 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,39 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicMin_c67a74() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_18 : u32 = arg_1; + let x_13 : u32 = atomicMin(&(sb_rw.arg_0), x_18); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicMin_c67a74(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicMin_c67a74(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm new file mode 100644 index 0000000000..ddfa25a7f9 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm @@ -0,0 +1,57 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicMin_278235 "atomicMin_278235" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %14 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %21 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicMin_278235 = OpFunction %void None %7 + %10 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %int_1 + %19 = OpLoad %int %arg_1 + %15 = OpAtomicSMin %int %arg_0 %uint_2 %uint_0 %19 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %21 +%local_invocation_index = OpFunctionParameter %uint + %24 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %29 = OpFunctionCall %void %atomicMin_278235 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %31 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..abb7ad0e94 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicMin_278235() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_15 = atomicMin(arg_0, arg_1); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicMin_278235(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..cfc09f24e2 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicMin_278235() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int atomic_result = 0; + InterlockedMin(arg_0, arg_1, atomic_result); + const int x_15 = atomic_result; + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicMin_278235(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..8b6eeebddf --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,42 @@ +#include + +using namespace metal; +void atomicMin_278235(threadgroup atomic_int* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_19 = arg_1; + int const x_15 = atomic_fetch_min_explicit(tint_symbol, x_19, memory_order_relaxed); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicMin_278235(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_33 = *(tint_symbol_2); + compute_main_inner(x_33, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..564e8b7e97 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,81 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 48 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicMin_278235 "atomicMin_278235" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %24 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicMin_278235 = OpFunction %void None %10 + %13 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %14 + OpStore %res %14 + OpStore %arg_1 %int_1 + %19 = OpLoad %int %arg_1 + %20 = OpAtomicSMin %int %arg_0 %uint_2 %uint_0 %19 + OpStore %res %20 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %24 +%local_invocation_index = OpFunctionParameter %uint + %27 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %32 = OpFunctionCall %void %atomicMin_278235 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %34 = OpLabel + %35 = OpLoad %uint %local_invocation_index_1 + %36 = OpFunctionCall %void %compute_main_inner %35 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %24 +%local_invocation_index_1_param = OpFunctionParameter %uint + %39 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %43 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %45 = OpLabel + %47 = OpLoad %uint %local_invocation_index_1_param_1 + %46 = OpFunctionCall %void %compute_main_inner_1 %47 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..e55849b691 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,32 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicMin_278235() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_19 : i32 = arg_1; + let x_15 : i32 = atomicMin(&(arg_0), x_19); + res = x_15; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicMin_278235(); + return; +} + +fn compute_main_1() { + let x_33 : u32 = local_invocation_index_1; + compute_main_inner(x_33); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm new file mode 100644 index 0000000000..784a0143e3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm @@ -0,0 +1,56 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 33 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicMin_69d383 "atomicMin_69d383" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %13 = OpConstantNull %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicMin_69d383 = OpFunction %void None %6 + %9 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %13 + %res = OpVariable %_ptr_Function_uint Function %13 + OpStore %arg_1 %uint_1 + %18 = OpLoad %uint %arg_1 + %14 = OpAtomicUMin %uint %arg_0 %uint_2 %uint_0 %18 + OpStore %res %14 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %13 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicMin_69d383 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %30 = OpLabel + %32 = OpLoad %uint %local_invocation_index_1 + %31 = OpFunctionCall %void %compute_main_inner %32 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..b5b3a4a548 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicMin_69d383() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_14 = atomicMin(arg_0, arg_1); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicMin_69d383(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..64c8150087 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicMin_69d383() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint atomic_result = 0u; + InterlockedMin(arg_0, arg_1, atomic_result); + const uint x_14 = atomic_result; + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicMin_69d383(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..6336751508 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,42 @@ +#include + +using namespace metal; +void atomicMin_69d383(threadgroup atomic_uint* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_18 = arg_1; + uint const x_14 = atomic_fetch_min_explicit(tint_symbol, x_18, memory_order_relaxed); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicMin_69d383(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_32 = *(tint_symbol_2); + compute_main_inner(x_32, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..8c0bfde247 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,79 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 46 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicMin_69d383 "atomicMin_69d383" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %22 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicMin_69d383 = OpFunction %void None %9 + %12 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %6 + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %arg_1 %6 + OpStore %res %6 + OpStore %arg_1 %uint_1 + %17 = OpLoad %uint %arg_1 + %18 = OpAtomicUMin %uint %arg_0 %uint_2 %uint_0 %17 + OpStore %res %18 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %22 +%local_invocation_index = OpFunctionParameter %uint + %25 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpFunctionCall %void %atomicMin_69d383 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %32 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %22 +%local_invocation_index_1_param = OpFunctionParameter %uint + %37 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %41 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %43 = OpLabel + %45 = OpLoad %uint %local_invocation_index_1_param_1 + %44 = OpFunctionCall %void %compute_main_inner_1 %45 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..9a15df0279 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicMin/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,32 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicMin_69d383() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_18 : u32 = arg_1; + let x_14 : u32 = atomicMin(&(arg_0), x_18); + res = x_14; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicMin_69d383(); + return; +} + +fn compute_main_1() { + let x_32 : u32 = local_invocation_index_1; + compute_main_inner(x_32); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm new file mode 100644 index 0000000000..978e4ad7b2 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm @@ -0,0 +1,57 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 28 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicOr_8d96a0 "atomicOr_8d96a0" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %12 = OpConstantNull %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicOr_8d96a0 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %12 + %res = OpVariable %_ptr_Function_int Function %12 + OpStore %arg_1 %int_1 + %19 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %20 = OpLoad %int %arg_1 + %13 = OpAtomicOr %int %19 %uint_1 %uint_0 %20 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicOr_8d96a0 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %atomicOr_8d96a0 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..dd172741ef --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicOr_8d96a0() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicOr(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicOr_8d96a0(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicOr_8d96a0() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicOr(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void compute_main_1() { + atomicOr_8d96a0(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..1daeac4f1c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicOr(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedOr(offset, value, original_value); + return original_value; +} + + +void atomicOr_8d96a0() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + const int x_13 = tint_atomicOr(sb_rw, 0u, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicOr_8d96a0(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicOr_8d96a0(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..a0bf71fd5b --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicOr_8d96a0(device SB_RW_atomic* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_20 = arg_1; + int const x_13 = atomic_fetch_or_explicit(&((*(tint_symbol)).arg_0), x_20, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicOr_8d96a0(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicOr_8d96a0(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..a5753a7dab --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,71 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicOr_8d96a0 "atomicOr_8d96a0" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicOr_8d96a0 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %9 + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %int_1 + %14 = OpLoad %int %arg_1 + %21 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %15 = OpAtomicOr %int %21 %uint_1 %uint_0 %14 + OpStore %res %15 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicOr_8d96a0 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %29 = OpLabel + %30 = OpFunctionCall %void %atomicOr_8d96a0 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %32 = OpLabel + %33 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..5c96c733a5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,39 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicOr_8d96a0() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_20 : i32 = arg_1; + let x_13 : i32 = atomicOr(&(sb_rw.arg_0), x_20); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicOr_8d96a0(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicOr_8d96a0(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm new file mode 100644 index 0000000000..c38fc528ec --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm @@ -0,0 +1,55 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicOr_5e95d4 "atomicOr_5e95d4" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %12 = OpConstantNull %uint + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicOr_5e95d4 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %12 + %res = OpVariable %_ptr_Function_uint Function %12 + OpStore %arg_1 %uint_1 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %18 = OpLoad %uint %arg_1 + %13 = OpAtomicOr %uint %17 %uint_1 %uint_0 %18 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicOr_5e95d4 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicOr_5e95d4 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..ba78059d7a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicOr_5e95d4() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicOr(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicOr_5e95d4(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicOr_5e95d4() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicOr(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void compute_main_1() { + atomicOr_5e95d4(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..2268f30589 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicOr(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedOr(offset, value, original_value); + return original_value; +} + + +void atomicOr_5e95d4() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + const uint x_13 = tint_atomicOr(sb_rw, 0u, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicOr_5e95d4(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicOr_5e95d4(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..fa5456597c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicOr_5e95d4(device SB_RW_atomic* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_18 = arg_1; + uint const x_13 = atomic_fetch_or_explicit(&((*(tint_symbol)).arg_0), x_18, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicOr_5e95d4(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicOr_5e95d4(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..2d2a230427 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,69 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicOr_5e95d4 "atomicOr_5e95d4" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicOr_5e95d4 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %9 + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %uint_1 + %14 = OpLoad %uint %arg_1 + %19 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %15 = OpAtomicOr %uint %19 %uint_1 %uint_0 %14 + OpStore %res %15 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicOr_5e95d4 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %27 = OpLabel + %28 = OpFunctionCall %void %atomicOr_5e95d4 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %30 = OpLabel + %31 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..8dae20d3b5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,39 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicOr_5e95d4() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_18 : u32 = arg_1; + let x_13 : u32 = atomicOr(&(sb_rw.arg_0), x_18); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicOr_5e95d4(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicOr_5e95d4(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm new file mode 100644 index 0000000000..6a5541c37d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm @@ -0,0 +1,57 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicOr_d09248 "atomicOr_d09248" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %14 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %21 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicOr_d09248 = OpFunction %void None %7 + %10 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %int_1 + %19 = OpLoad %int %arg_1 + %15 = OpAtomicOr %int %arg_0 %uint_2 %uint_0 %19 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %21 +%local_invocation_index = OpFunctionParameter %uint + %24 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %29 = OpFunctionCall %void %atomicOr_d09248 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %31 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..b045e75169 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicOr_d09248() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_15 = atomicOr(arg_0, arg_1); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicOr_d09248(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..a4a9b58dad --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicOr_d09248() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int atomic_result = 0; + InterlockedOr(arg_0, arg_1, atomic_result); + const int x_15 = atomic_result; + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicOr_d09248(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..e262929f5c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,42 @@ +#include + +using namespace metal; +void atomicOr_d09248(threadgroup atomic_int* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_19 = arg_1; + int const x_15 = atomic_fetch_or_explicit(tint_symbol, x_19, memory_order_relaxed); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicOr_d09248(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_33 = *(tint_symbol_2); + compute_main_inner(x_33, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..f2cdcca2b4 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,81 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 48 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicOr_d09248 "atomicOr_d09248" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %24 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicOr_d09248 = OpFunction %void None %10 + %13 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %14 + OpStore %res %14 + OpStore %arg_1 %int_1 + %19 = OpLoad %int %arg_1 + %20 = OpAtomicOr %int %arg_0 %uint_2 %uint_0 %19 + OpStore %res %20 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %24 +%local_invocation_index = OpFunctionParameter %uint + %27 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %32 = OpFunctionCall %void %atomicOr_d09248 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %34 = OpLabel + %35 = OpLoad %uint %local_invocation_index_1 + %36 = OpFunctionCall %void %compute_main_inner %35 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %24 +%local_invocation_index_1_param = OpFunctionParameter %uint + %39 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %43 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %45 = OpLabel + %47 = OpLoad %uint %local_invocation_index_1_param_1 + %46 = OpFunctionCall %void %compute_main_inner_1 %47 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..f0329eb20e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,32 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicOr_d09248() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_19 : i32 = arg_1; + let x_15 : i32 = atomicOr(&(arg_0), x_19); + res = x_15; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicOr_d09248(); + return; +} + +fn compute_main_1() { + let x_33 : u32 = local_invocation_index_1; + compute_main_inner(x_33); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm new file mode 100644 index 0000000000..9db7191d2f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm @@ -0,0 +1,56 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 33 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicOr_5e3d61 "atomicOr_5e3d61" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %13 = OpConstantNull %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicOr_5e3d61 = OpFunction %void None %6 + %9 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %13 + %res = OpVariable %_ptr_Function_uint Function %13 + OpStore %arg_1 %uint_1 + %18 = OpLoad %uint %arg_1 + %14 = OpAtomicOr %uint %arg_0 %uint_2 %uint_0 %18 + OpStore %res %14 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %13 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicOr_5e3d61 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %30 = OpLabel + %32 = OpLoad %uint %local_invocation_index_1 + %31 = OpFunctionCall %void %compute_main_inner %32 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..2894885906 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicOr_5e3d61() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_14 = atomicOr(arg_0, arg_1); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicOr_5e3d61(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..7a4ad50d89 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicOr_5e3d61() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint atomic_result = 0u; + InterlockedOr(arg_0, arg_1, atomic_result); + const uint x_14 = atomic_result; + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicOr_5e3d61(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..4078be65eb --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,42 @@ +#include + +using namespace metal; +void atomicOr_5e3d61(threadgroup atomic_uint* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_18 = arg_1; + uint const x_14 = atomic_fetch_or_explicit(tint_symbol, x_18, memory_order_relaxed); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicOr_5e3d61(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_32 = *(tint_symbol_2); + compute_main_inner(x_32, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..437d7bf15b --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,79 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 46 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicOr_5e3d61 "atomicOr_5e3d61" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %22 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicOr_5e3d61 = OpFunction %void None %9 + %12 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %6 + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %arg_1 %6 + OpStore %res %6 + OpStore %arg_1 %uint_1 + %17 = OpLoad %uint %arg_1 + %18 = OpAtomicOr %uint %arg_0 %uint_2 %uint_0 %17 + OpStore %res %18 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %22 +%local_invocation_index = OpFunctionParameter %uint + %25 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpFunctionCall %void %atomicOr_5e3d61 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %32 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %22 +%local_invocation_index_1_param = OpFunctionParameter %uint + %37 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %41 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %43 = OpLabel + %45 = OpLoad %uint %local_invocation_index_1_param_1 + %44 = OpFunctionCall %void %compute_main_inner_1 %45 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..781ca2e3b2 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicOr/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,32 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicOr_5e3d61() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_18 : u32 = arg_1; + let x_14 : u32 = atomicOr(&(arg_0), x_18); + res = x_14; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicOr_5e3d61(); + return; +} + +fn compute_main_1() { + let x_32 : u32 = local_invocation_index_1; + compute_main_inner(x_32); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm new file mode 100644 index 0000000000..5d03e4ee54 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm @@ -0,0 +1,54 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 27 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicStore_d1e9a6 "atomicStore_d1e9a6" + OpName %arg_1 "arg_1" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %12 = OpConstantNull %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicStore_d1e9a6 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %12 + OpStore %arg_1 %int_1 + %19 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %20 = OpLoad %int %arg_1 + OpAtomicStore %19 %uint_1 %uint_0 %20 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %atomicStore_d1e9a6 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %25 = OpLabel + %26 = OpFunctionCall %void %atomicStore_d1e9a6 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..cf63c29f5c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicStore_d1e9a6() { + int arg_1 = 0; + arg_1 = 1; + atomicExchange(sb_rw.arg_0, arg_1); + return; +} + +void fragment_main_1() { + atomicStore_d1e9a6(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicStore_d1e9a6() { + int arg_1 = 0; + arg_1 = 1; + atomicExchange(sb_rw.arg_0, arg_1); + return; +} + +void compute_main_1() { + atomicStore_d1e9a6(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..4151049395 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,35 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +void tint_atomicStore(RWByteAddressBuffer buffer, uint offset, int value) { + int ignored; + buffer.InterlockedExchange(offset, value, ignored); +} + + +void atomicStore_d1e9a6() { + int arg_1 = 0; + arg_1 = 1; + tint_atomicStore(sb_rw, 0u, arg_1); + return; +} + +void fragment_main_1() { + atomicStore_d1e9a6(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicStore_d1e9a6(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..4aa0544815 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicStore_d1e9a6(device SB_RW_atomic* const tint_symbol) { + int arg_1 = 0; + arg_1 = 1; + int const x_20 = arg_1; + atomic_store_explicit(&((*(tint_symbol)).arg_0), x_20, memory_order_relaxed); + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicStore_d1e9a6(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicStore_d1e9a6(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..77ab9b09e1 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,67 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 33 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicStore_d1e9a6 "atomicStore_d1e9a6" + OpName %arg_1 "arg_1" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicStore_d1e9a6 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %9 + OpStore %arg_1 %9 + OpStore %arg_1 %int_1 + %13 = OpLoad %int %arg_1 + %20 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + OpAtomicStore %20 %uint_1 %uint_0 %13 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %atomicStore_d1e9a6 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %25 = OpLabel + %26 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %28 = OpLabel + %29 = OpFunctionCall %void %atomicStore_d1e9a6 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %31 = OpLabel + %32 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..9db31ae995 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,37 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicStore_d1e9a6() { + var arg_1 : i32 = 0i; + arg_1 = 1i; + let x_20 : i32 = arg_1; + atomicStore(&(sb_rw.arg_0), x_20); + return; +} + +fn fragment_main_1() { + atomicStore_d1e9a6(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicStore_d1e9a6(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm new file mode 100644 index 0000000000..f0d74fe1cf --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm @@ -0,0 +1,52 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 25 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicStore_cdc29e "atomicStore_cdc29e" + OpName %arg_1 "arg_1" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %12 = OpConstantNull %uint + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicStore_cdc29e = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %12 + OpStore %arg_1 %uint_1 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %18 = OpLoad %uint %arg_1 + OpAtomicStore %17 %uint_1 %uint_0 %18 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %20 = OpLabel + %21 = OpFunctionCall %void %atomicStore_cdc29e + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicStore_cdc29e + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..7a8d693ac8 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.glsl @@ -0,0 +1,68 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicStore_cdc29e() { + uint arg_1 = 0u; + arg_1 = 1u; + atomicExchange(sb_rw.arg_0, arg_1); + return; +} + +void fragment_main_1() { + atomicStore_cdc29e(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicStore_cdc29e() { + uint arg_1 = 0u; + arg_1 = 1u; + atomicExchange(sb_rw.arg_0, arg_1); + return; +} + +void compute_main_1() { + atomicStore_cdc29e(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..4550cdd2eb --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,35 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +void tint_atomicStore(RWByteAddressBuffer buffer, uint offset, uint value) { + uint ignored; + buffer.InterlockedExchange(offset, value, ignored); +} + + +void atomicStore_cdc29e() { + uint arg_1 = 0u; + arg_1 = 1u; + tint_atomicStore(sb_rw, 0u, arg_1); + return; +} + +void fragment_main_1() { + atomicStore_cdc29e(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicStore_cdc29e(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..21f974662a --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.msl @@ -0,0 +1,39 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicStore_cdc29e(device SB_RW_atomic* const tint_symbol) { + uint arg_1 = 0u; + arg_1 = 1u; + uint const x_18 = arg_1; + atomic_store_explicit(&((*(tint_symbol)).arg_0), x_18, memory_order_relaxed); + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicStore_cdc29e(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicStore_cdc29e(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..ababfa4ef8 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,65 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 31 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicStore_cdc29e "atomicStore_cdc29e" + OpName %arg_1 "arg_1" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicStore_cdc29e = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %9 + OpStore %arg_1 %9 + OpStore %arg_1 %uint_1 + %13 = OpLoad %uint %arg_1 + %18 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + OpAtomicStore %18 %uint_1 %uint_0 %13 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %20 = OpLabel + %21 = OpFunctionCall %void %atomicStore_cdc29e + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %atomicStore_cdc29e + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %29 = OpLabel + %30 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..1095ccc7d9 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,37 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicStore_cdc29e() { + var arg_1 : u32 = 0u; + arg_1 = 1u; + let x_18 : u32 = arg_1; + atomicStore(&(sb_rw.arg_0), x_18); + return; +} + +fn fragment_main_1() { + atomicStore_cdc29e(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicStore_cdc29e(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm new file mode 100644 index 0000000000..a0c7fb72f9 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm @@ -0,0 +1,54 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 33 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicStore_8bea94 "atomicStore_8bea94" + OpName %arg_1 "arg_1" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %14 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicStore_8bea94 = OpFunction %void None %7 + %10 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %int_1 + %19 = OpLoad %int %arg_1 + OpAtomicStore %arg_0 %uint_2 %uint_0 %19 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicStore_8bea94 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %30 = OpLabel + %32 = OpLoad %uint %local_invocation_index_1 + %31 = OpFunctionCall %void %compute_main_inner %32 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..89e564c47f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicStore_8bea94() { + int arg_1 = 0; + arg_1 = 1; + atomicExchange(arg_0, arg_1); + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicStore_8bea94(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..68704dd4a3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,43 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicStore_8bea94() { + int arg_1 = 0; + arg_1 = 1; + int atomic_result = 0; + InterlockedExchange(arg_0, arg_1, atomic_result); + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicStore_8bea94(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..1e0fd57bcd --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,40 @@ +#include + +using namespace metal; +void atomicStore_8bea94(threadgroup atomic_int* const tint_symbol) { + int arg_1 = 0; + arg_1 = 1; + int const x_19 = arg_1; + atomic_store_explicit(tint_symbol, x_19, memory_order_relaxed); + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicStore_8bea94(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_32 = *(tint_symbol_2); + compute_main_inner(x_32, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..63e93126b1 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,77 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 47 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicStore_8bea94 "atomicStore_8bea94" + OpName %arg_1 "arg_1" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %23 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicStore_8bea94 = OpFunction %void None %10 + %13 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %14 + OpStore %arg_1 %int_1 + %18 = OpLoad %int %arg_1 + OpAtomicStore %arg_0 %uint_2 %uint_0 %18 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %23 +%local_invocation_index = OpFunctionParameter %uint + %26 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %31 = OpFunctionCall %void %atomicStore_8bea94 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %33 = OpLabel + %34 = OpLoad %uint %local_invocation_index_1 + %35 = OpFunctionCall %void %compute_main_inner %34 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %23 +%local_invocation_index_1_param = OpFunctionParameter %uint + %38 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %42 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %44 = OpLabel + %46 = OpLoad %uint %local_invocation_index_1_param_1 + %45 = OpFunctionCall %void %compute_main_inner_1 %46 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..026212237f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,30 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicStore_8bea94() { + var arg_1 : i32 = 0i; + arg_1 = 1i; + let x_19 : i32 = arg_1; + atomicStore(&(arg_0), x_19); + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicStore_8bea94(); + return; +} + +fn compute_main_1() { + let x_32 : u32 = local_invocation_index_1; + compute_main_inner(x_32); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm new file mode 100644 index 0000000000..72d2c5fc56 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm @@ -0,0 +1,53 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicStore_726882 "atomicStore_726882" + OpName %arg_1 "arg_1" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %13 = OpConstantNull %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %19 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicStore_726882 = OpFunction %void None %6 + %9 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %13 + OpStore %arg_1 %uint_1 + %18 = OpLoad %uint %arg_1 + OpAtomicStore %arg_0 %uint_2 %uint_0 %18 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %19 +%local_invocation_index = OpFunctionParameter %uint + %22 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %13 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %27 = OpFunctionCall %void %atomicStore_726882 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %29 = OpLabel + %31 = OpLoad %uint %local_invocation_index_1 + %30 = OpFunctionCall %void %compute_main_inner %31 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..dcceb313f5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,37 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicStore_726882() { + uint arg_1 = 0u; + arg_1 = 1u; + atomicExchange(arg_0, arg_1); + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicStore_726882(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..5c4176348e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,43 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicStore_726882() { + uint arg_1 = 0u; + arg_1 = 1u; + uint atomic_result = 0u; + InterlockedExchange(arg_0, arg_1, atomic_result); + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicStore_726882(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..fd362677ce --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,40 @@ +#include + +using namespace metal; +void atomicStore_726882(threadgroup atomic_uint* const tint_symbol) { + uint arg_1 = 0u; + arg_1 = 1u; + uint const x_18 = arg_1; + atomic_store_explicit(tint_symbol, x_18, memory_order_relaxed); + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicStore_726882(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_31 = *(tint_symbol_2); + compute_main_inner(x_31, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..2b50c09779 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,75 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 45 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicStore_726882 "atomicStore_726882" + OpName %arg_1 "arg_1" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %21 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicStore_726882 = OpFunction %void None %9 + %12 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %6 + OpStore %arg_1 %6 + OpStore %arg_1 %uint_1 + %16 = OpLoad %uint %arg_1 + OpAtomicStore %arg_0 %uint_2 %uint_0 %16 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %21 +%local_invocation_index = OpFunctionParameter %uint + %24 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %29 = OpFunctionCall %void %atomicStore_726882 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %31 = OpLabel + %32 = OpLoad %uint %local_invocation_index_1 + %33 = OpFunctionCall %void %compute_main_inner %32 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %21 +%local_invocation_index_1_param = OpFunctionParameter %uint + %36 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %40 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %42 = OpLabel + %44 = OpLoad %uint %local_invocation_index_1_param_1 + %43 = OpFunctionCall %void %compute_main_inner_1 %44 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..fa0013aba5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicStore/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,30 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicStore_726882() { + var arg_1 : u32 = 0u; + arg_1 = 1u; + let x_18 : u32 = arg_1; + atomicStore(&(arg_0), x_18); + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicStore_726882(); + return; +} + +fn compute_main_1() { + let x_31 : u32 = local_invocation_index_1; + compute_main_inner(x_31); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm new file mode 100644 index 0000000000..3bbf26a4b0 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm @@ -0,0 +1,57 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 28 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicSub_051100 "atomicSub_051100" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %12 = OpConstantNull %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicSub_051100 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %12 + %res = OpVariable %_ptr_Function_int Function %12 + OpStore %arg_1 %int_1 + %19 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %20 = OpLoad %int %arg_1 + %13 = OpAtomicISub %int %19 %uint_1 %uint_0 %20 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicSub_051100 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %atomicSub_051100 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..fcc4155037 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicSub_051100() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicAdd(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicSub_051100(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicSub_051100() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicAdd(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void compute_main_1() { + atomicSub_051100(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..fca2ec1757 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicSub(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedAdd(offset, -value, original_value); + return original_value; +} + + +void atomicSub_051100() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + const int x_13 = tint_atomicSub(sb_rw, 0u, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicSub_051100(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicSub_051100(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..2a79213ba0 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicSub_051100(device SB_RW_atomic* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_20 = arg_1; + int const x_13 = atomic_fetch_sub_explicit(&((*(tint_symbol)).arg_0), x_20, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicSub_051100(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicSub_051100(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..c40bebac32 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,71 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicSub_051100 "atomicSub_051100" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicSub_051100 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %9 + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %int_1 + %14 = OpLoad %int %arg_1 + %21 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %15 = OpAtomicISub %int %21 %uint_1 %uint_0 %14 + OpStore %res %15 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicSub_051100 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %29 = OpLabel + %30 = OpFunctionCall %void %atomicSub_051100 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %32 = OpLabel + %33 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..d47d88650f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,39 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicSub_051100() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_20 : i32 = arg_1; + let x_13 : i32 = atomicSub(&(sb_rw.arg_0), x_20); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicSub_051100(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicSub_051100(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm new file mode 100644 index 0000000000..4d20c6d426 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm @@ -0,0 +1,55 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicSub_15bfc9 "atomicSub_15bfc9" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %12 = OpConstantNull %uint + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicSub_15bfc9 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %12 + %res = OpVariable %_ptr_Function_uint Function %12 + OpStore %arg_1 %uint_1 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %18 = OpLoad %uint %arg_1 + %13 = OpAtomicISub %uint %17 %uint_1 %uint_0 %18 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicSub_15bfc9 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicSub_15bfc9 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..f91b7f880f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicSub_15bfc9() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicAdd(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicSub_15bfc9(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicSub_15bfc9() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicAdd(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void compute_main_1() { + atomicSub_15bfc9(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..f036c9002d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicSub(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedAdd(offset, -value, original_value); + return original_value; +} + + +void atomicSub_15bfc9() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + const uint x_13 = tint_atomicSub(sb_rw, 0u, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicSub_15bfc9(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicSub_15bfc9(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..efb4526599 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicSub_15bfc9(device SB_RW_atomic* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_18 = arg_1; + uint const x_13 = atomic_fetch_sub_explicit(&((*(tint_symbol)).arg_0), x_18, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicSub_15bfc9(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicSub_15bfc9(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..6704485521 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,69 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicSub_15bfc9 "atomicSub_15bfc9" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicSub_15bfc9 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %9 + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %uint_1 + %14 = OpLoad %uint %arg_1 + %19 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %15 = OpAtomicISub %uint %19 %uint_1 %uint_0 %14 + OpStore %res %15 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicSub_15bfc9 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %27 = OpLabel + %28 = OpFunctionCall %void %atomicSub_15bfc9 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %30 = OpLabel + %31 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..bd9a80c284 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,39 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicSub_15bfc9() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_18 : u32 = arg_1; + let x_13 : u32 = atomicSub(&(sb_rw.arg_0), x_18); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicSub_15bfc9(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicSub_15bfc9(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm new file mode 100644 index 0000000000..d96432dd36 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm @@ -0,0 +1,57 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicSub_77883a "atomicSub_77883a" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %14 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %21 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicSub_77883a = OpFunction %void None %7 + %10 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %int_1 + %19 = OpLoad %int %arg_1 + %15 = OpAtomicISub %int %arg_0 %uint_2 %uint_0 %19 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %21 +%local_invocation_index = OpFunctionParameter %uint + %24 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %29 = OpFunctionCall %void %atomicSub_77883a + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %31 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..e08bb7b4be --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicSub_77883a() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_15 = atomicAdd(arg_0, arg_1); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicSub_77883a(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..988dbad445 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicSub_77883a() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int atomic_result = 0; + InterlockedAdd(arg_0, -arg_1, atomic_result); + const int x_15 = atomic_result; + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicSub_77883a(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..208e18a20d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,42 @@ +#include + +using namespace metal; +void atomicSub_77883a(threadgroup atomic_int* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_19 = arg_1; + int const x_15 = atomic_fetch_sub_explicit(tint_symbol, x_19, memory_order_relaxed); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicSub_77883a(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_33 = *(tint_symbol_2); + compute_main_inner(x_33, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..9f3a0652f8 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,81 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 48 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicSub_77883a "atomicSub_77883a" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %24 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicSub_77883a = OpFunction %void None %10 + %13 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %14 + OpStore %res %14 + OpStore %arg_1 %int_1 + %19 = OpLoad %int %arg_1 + %20 = OpAtomicISub %int %arg_0 %uint_2 %uint_0 %19 + OpStore %res %20 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %24 +%local_invocation_index = OpFunctionParameter %uint + %27 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %32 = OpFunctionCall %void %atomicSub_77883a + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %34 = OpLabel + %35 = OpLoad %uint %local_invocation_index_1 + %36 = OpFunctionCall %void %compute_main_inner %35 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %24 +%local_invocation_index_1_param = OpFunctionParameter %uint + %39 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %43 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %45 = OpLabel + %47 = OpLoad %uint %local_invocation_index_1_param_1 + %46 = OpFunctionCall %void %compute_main_inner_1 %47 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..b2781cec60 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,32 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicSub_77883a() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_19 : i32 = arg_1; + let x_15 : i32 = atomicSub(&(arg_0), x_19); + res = x_15; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicSub_77883a(); + return; +} + +fn compute_main_1() { + let x_33 : u32 = local_invocation_index_1; + compute_main_inner(x_33); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm new file mode 100644 index 0000000000..2c6b98e511 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm @@ -0,0 +1,56 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 33 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicSub_0d26c2 "atomicSub_0d26c2" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %13 = OpConstantNull %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicSub_0d26c2 = OpFunction %void None %6 + %9 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %13 + %res = OpVariable %_ptr_Function_uint Function %13 + OpStore %arg_1 %uint_1 + %18 = OpLoad %uint %arg_1 + %14 = OpAtomicISub %uint %arg_0 %uint_2 %uint_0 %18 + OpStore %res %14 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %13 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicSub_0d26c2 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %30 = OpLabel + %32 = OpLoad %uint %local_invocation_index_1 + %31 = OpFunctionCall %void %compute_main_inner %32 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..a11a53ea08 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicSub_0d26c2() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_14 = atomicAdd(arg_0, arg_1); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicSub_0d26c2(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..eb60c8aa26 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicSub_0d26c2() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint atomic_result = 0u; + InterlockedAdd(arg_0, -arg_1, atomic_result); + const uint x_14 = atomic_result; + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicSub_0d26c2(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..ec9661dceb --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,42 @@ +#include + +using namespace metal; +void atomicSub_0d26c2(threadgroup atomic_uint* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_18 = arg_1; + uint const x_14 = atomic_fetch_sub_explicit(tint_symbol, x_18, memory_order_relaxed); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicSub_0d26c2(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_32 = *(tint_symbol_2); + compute_main_inner(x_32, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..c1b5f7a3c6 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,79 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 46 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicSub_0d26c2 "atomicSub_0d26c2" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %22 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicSub_0d26c2 = OpFunction %void None %9 + %12 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %6 + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %arg_1 %6 + OpStore %res %6 + OpStore %arg_1 %uint_1 + %17 = OpLoad %uint %arg_1 + %18 = OpAtomicISub %uint %arg_0 %uint_2 %uint_0 %17 + OpStore %res %18 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %22 +%local_invocation_index = OpFunctionParameter %uint + %25 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpFunctionCall %void %atomicSub_0d26c2 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %32 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %22 +%local_invocation_index_1_param = OpFunctionParameter %uint + %37 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %41 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %43 = OpLabel + %45 = OpLoad %uint %local_invocation_index_1_param_1 + %44 = OpFunctionCall %void %compute_main_inner_1 %45 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..77f25f7d70 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicSub/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,32 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicSub_0d26c2() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_18 : u32 = arg_1; + let x_14 : u32 = atomicSub(&(arg_0), x_18); + res = x_14; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicSub_0d26c2(); + return; +} + +fn compute_main_1() { + let x_32 : u32 = local_invocation_index_1; + compute_main_inner(x_32); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm new file mode 100644 index 0000000000..cff5564090 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm @@ -0,0 +1,57 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 28 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicXor_c1b78c "atomicXor_c1b78c" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %12 = OpConstantNull %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicXor_c1b78c = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %12 + %res = OpVariable %_ptr_Function_int Function %12 + OpStore %arg_1 %int_1 + %19 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %20 = OpLoad %int %arg_1 + %13 = OpAtomicXor %int %19 %uint_1 %uint_0 %20 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicXor_c1b78c + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %atomicXor_c1b78c + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..4953346784 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicXor_c1b78c() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicXor(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicXor_c1b78c(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicXor_c1b78c() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicXor(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void compute_main_1() { + atomicXor_c1b78c(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..195284cb72 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicXor(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedXor(offset, value, original_value); + return original_value; +} + + +void atomicXor_c1b78c() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + const int x_13 = tint_atomicXor(sb_rw, 0u, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicXor_c1b78c(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicXor_c1b78c(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..1e98bee8f1 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicXor_c1b78c(device SB_RW_atomic* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_20 = arg_1; + int const x_13 = atomic_fetch_xor_explicit(&((*(tint_symbol)).arg_0), x_20, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicXor_c1b78c(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicXor_c1b78c(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..74a9caa4c6 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,71 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicXor_c1b78c "atomicXor_c1b78c" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicXor_c1b78c = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %9 + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %int_1 + %14 = OpLoad %int %arg_1 + %21 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %15 = OpAtomicXor %int %21 %uint_1 %uint_0 %14 + OpStore %res %15 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicXor_c1b78c + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %29 = OpLabel + %30 = OpFunctionCall %void %atomicXor_c1b78c + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %32 = OpLabel + %33 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..4325da12d4 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,39 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicXor_c1b78c() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_20 : i32 = arg_1; + let x_13 : i32 = atomicXor(&(sb_rw.arg_0), x_20); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicXor_c1b78c(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicXor_c1b78c(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm new file mode 100644 index 0000000000..a16daff5f6 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm @@ -0,0 +1,55 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicXor_54510e "atomicXor_54510e" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %12 = OpConstantNull %uint + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicXor_54510e = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %12 + %res = OpVariable %_ptr_Function_uint Function %12 + OpStore %arg_1 %uint_1 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %18 = OpLoad %uint %arg_1 + %13 = OpAtomicXor %uint %17 %uint_1 %uint_0 %18 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicXor_54510e + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicXor_54510e + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..c382bffbcf --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicXor_54510e() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicXor(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicXor_54510e(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicXor_54510e() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicXor(sb_rw.arg_0, arg_1); + res = x_13; + return; +} + +void compute_main_1() { + atomicXor_54510e(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..36ccd4793e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicXor(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedXor(offset, value, original_value); + return original_value; +} + + +void atomicXor_54510e() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + const uint x_13 = tint_atomicXor(sb_rw, 0u, arg_1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicXor_54510e(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicXor_54510e(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..068d4aa69e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicXor_54510e(device SB_RW_atomic* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_18 = arg_1; + uint const x_13 = atomic_fetch_xor_explicit(&((*(tint_symbol)).arg_0), x_18, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicXor_54510e(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicXor_54510e(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..786b9f608c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,69 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 32 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicXor_54510e "atomicXor_54510e" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicXor_54510e = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %9 + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %uint_1 + %14 = OpLoad %uint %arg_1 + %19 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %15 = OpAtomicXor %uint %19 %uint_1 %uint_0 %14 + OpStore %res %15 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicXor_54510e + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %27 = OpLabel + %28 = OpFunctionCall %void %atomicXor_54510e + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %30 = OpLabel + %31 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..2b3dd0d850 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,39 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicXor_54510e() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_18 : u32 = arg_1; + let x_13 : u32 = atomicXor(&(sb_rw.arg_0), x_18); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicXor_54510e(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicXor_54510e(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm new file mode 100644 index 0000000000..62e03513cf --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm @@ -0,0 +1,57 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicXor_75dc95 "atomicXor_75dc95" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %14 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %21 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicXor_75dc95 = OpFunction %void None %7 + %10 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %int_1 + %19 = OpLoad %int %arg_1 + %15 = OpAtomicXor %int %arg_0 %uint_2 %uint_0 %19 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %21 +%local_invocation_index = OpFunctionParameter %uint + %24 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %29 = OpFunctionCall %void %atomicXor_75dc95 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %31 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..f5685175ea --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicXor_75dc95() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_15 = atomicXor(arg_0, arg_1); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicXor_75dc95(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..2c71c9af5e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicXor_75dc95() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int atomic_result = 0; + InterlockedXor(arg_0, arg_1, atomic_result); + const int x_15 = atomic_result; + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicXor_75dc95(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..840c3182c3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,42 @@ +#include + +using namespace metal; +void atomicXor_75dc95(threadgroup atomic_int* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_19 = arg_1; + int const x_15 = atomic_fetch_xor_explicit(tint_symbol, x_19, memory_order_relaxed); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicXor_75dc95(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_33 = *(tint_symbol_2); + compute_main_inner(x_33, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..2bac01dfc2 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,81 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 48 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicXor_75dc95 "atomicXor_75dc95" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %24 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicXor_75dc95 = OpFunction %void None %10 + %13 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %14 + OpStore %res %14 + OpStore %arg_1 %int_1 + %19 = OpLoad %int %arg_1 + %20 = OpAtomicXor %int %arg_0 %uint_2 %uint_0 %19 + OpStore %res %20 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %24 +%local_invocation_index = OpFunctionParameter %uint + %27 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %32 = OpFunctionCall %void %atomicXor_75dc95 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %34 = OpLabel + %35 = OpLoad %uint %local_invocation_index_1 + %36 = OpFunctionCall %void %compute_main_inner %35 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %24 +%local_invocation_index_1_param = OpFunctionParameter %uint + %39 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %43 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %45 = OpLabel + %47 = OpLoad %uint %local_invocation_index_1_param_1 + %46 = OpFunctionCall %void %compute_main_inner_1 %47 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..54490e1c5f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,32 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicXor_75dc95() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_19 : i32 = arg_1; + let x_15 : i32 = atomicXor(&(arg_0), x_19); + res = x_15; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicXor_75dc95(); + return; +} + +fn compute_main_1() { + let x_33 : u32 = local_invocation_index_1; + compute_main_inner(x_33); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm new file mode 100644 index 0000000000..ba98e8dc4e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm @@ -0,0 +1,56 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 33 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicXor_c8e6be "atomicXor_c8e6be" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %13 = OpConstantNull %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicXor_c8e6be = OpFunction %void None %6 + %9 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %13 + %res = OpVariable %_ptr_Function_uint Function %13 + OpStore %arg_1 %uint_1 + %18 = OpLoad %uint %arg_1 + %14 = OpAtomicXor %uint %arg_0 %uint_2 %uint_0 %18 + OpStore %res %14 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %13 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicXor_c8e6be + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %30 = OpLabel + %32 = OpLoad %uint %local_invocation_index_1 + %31 = OpFunctionCall %void %compute_main_inner %32 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..2c8878127b --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicXor_c8e6be() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_14 = atomicXor(arg_0, arg_1); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicXor_c8e6be(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..e7ceab2e56 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicXor_c8e6be() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint atomic_result = 0u; + InterlockedXor(arg_0, arg_1, atomic_result); + const uint x_14 = atomic_result; + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicXor_c8e6be(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..3eb2509da5 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,42 @@ +#include + +using namespace metal; +void atomicXor_c8e6be(threadgroup atomic_uint* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_18 = arg_1; + uint const x_14 = atomic_fetch_xor_explicit(tint_symbol, x_18, memory_order_relaxed); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicXor_c8e6be(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_32 = *(tint_symbol_2); + compute_main_inner(x_32, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..83c9054512 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,79 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 46 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicXor_c8e6be "atomicXor_c8e6be" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %22 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicXor_c8e6be = OpFunction %void None %9 + %12 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %6 + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %arg_1 %6 + OpStore %res %6 + OpStore %arg_1 %uint_1 + %17 = OpLoad %uint %arg_1 + %18 = OpAtomicXor %uint %arg_0 %uint_2 %uint_0 %17 + OpStore %res %18 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %22 +%local_invocation_index = OpFunctionParameter %uint + %25 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %30 = OpFunctionCall %void %atomicXor_c8e6be + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %32 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %34 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %22 +%local_invocation_index_1_param = OpFunctionParameter %uint + %37 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %41 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %43 = OpLabel + %45 = OpLoad %uint %local_invocation_index_1_param_1 + %44 = OpFunctionCall %void %compute_main_inner_1 %45 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..c75d80815c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/atomicXor/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,32 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicXor_c8e6be() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_18 : u32 = arg_1; + let x_14 : u32 = atomicXor(&(arg_0), x_18); + res = x_14; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicXor_c8e6be(); + return; +} + +fn compute_main_1() { + let x_32 : u32 = local_invocation_index_1; + compute_main_inner(x_32); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm new file mode 100644 index 0000000000..fb43e2cc3d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm @@ -0,0 +1,56 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 28 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_d32fe4 "atomicAdd_d32fe4" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %12 = OpConstantNull %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicAdd_d32fe4 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %12 + %res = OpVariable %_ptr_Function_int Function %12 + OpStore %arg_1 %int_1 + %19 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %13 = OpAtomicIDecrement %int %19 %uint_1 %uint_0 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..167e99cff9 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicAdd_d32fe4() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicAdd(sb_rw.arg_0, 1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicAdd_d32fe4(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicAdd_d32fe4() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicAdd(sb_rw.arg_0, 1); + res = x_13; + return; +} + +void compute_main_1() { + atomicAdd_d32fe4(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..abf10b505d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicSub(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedAdd(offset, -value, original_value); + return original_value; +} + + +void atomicAdd_d32fe4() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + const int x_13 = tint_atomicSub(sb_rw, 0u, 1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicAdd_d32fe4(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicAdd_d32fe4(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..8bbb60029d --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.msl @@ -0,0 +1,40 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicAdd_d32fe4(device SB_RW_atomic* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_13 = atomic_fetch_sub_explicit(&((*(tint_symbol)).arg_0), 1, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicAdd_d32fe4(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicAdd_d32fe4(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..870704eaac --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,70 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 33 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_d32fe4 "atomicAdd_d32fe4" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicAdd_d32fe4 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %9 + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %int_1 + %20 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %14 = OpAtomicISub %int %20 %uint_1 %uint_0 %int_1 + OpStore %res %14 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %25 = OpLabel + %26 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %28 = OpLabel + %29 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %31 = OpLabel + %32 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..1e011b06f3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,38 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicAdd_d32fe4() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_13 : i32 = atomicSub(&(sb_rw.arg_0), 1i); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicAdd_d32fe4(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicAdd_d32fe4(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm new file mode 100644 index 0000000000..9e693ca337 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm @@ -0,0 +1,54 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_8a199a "atomicAdd_8a199a" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %12 = OpConstantNull %uint + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicAdd_8a199a = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %12 + %res = OpVariable %_ptr_Function_uint Function %12 + OpStore %arg_1 %uint_1 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %13 = OpAtomicIDecrement %uint %17 %uint_1 %uint_0 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..d9e05156d9 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicAdd_8a199a() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicAdd(sb_rw.arg_0, 1u); + res = x_13; + return; +} + +void fragment_main_1() { + atomicAdd_8a199a(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicAdd_8a199a() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicAdd(sb_rw.arg_0, 1u); + res = x_13; + return; +} + +void compute_main_1() { + atomicAdd_8a199a(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..4e6bb866ec --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicSub(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedAdd(offset, -value, original_value); + return original_value; +} + + +void atomicAdd_8a199a() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + const uint x_13 = tint_atomicSub(sb_rw, 0u, 1u); + res = x_13; + return; +} + +void fragment_main_1() { + atomicAdd_8a199a(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicAdd_8a199a(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..7fe160f01b --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.msl @@ -0,0 +1,40 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicAdd_8a199a(device SB_RW_atomic* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_13 = atomic_fetch_sub_explicit(&((*(tint_symbol)).arg_0), 1u, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicAdd_8a199a(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicAdd_8a199a(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..63b3eebfdb --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,68 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 31 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_8a199a "atomicAdd_8a199a" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicAdd_8a199a = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %9 + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %uint_1 + %18 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %14 = OpAtomicISub %uint %18 %uint_1 %uint_0 %uint_1 + OpStore %res %14 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %20 = OpLabel + %21 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %29 = OpLabel + %30 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..f12b29eafc --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,38 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicAdd_8a199a() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_13 : u32 = atomicSub(&(sb_rw.arg_0), 1u); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicAdd_8a199a(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicAdd_8a199a(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm new file mode 100644 index 0000000000..9f14c537d0 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm @@ -0,0 +1,56 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_794055 "atomicAdd_794055" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %14 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %21 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_794055 = OpFunction %void None %7 + %10 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %int_1 + %15 = OpAtomicIDecrement %int %arg_0 %uint_2 %uint_0 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %21 +%local_invocation_index = OpFunctionParameter %uint + %24 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %29 = OpFunctionCall %void %atomicAdd_794055 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %31 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..ef3ffb1c16 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicAdd_794055() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_15 = atomicAdd(arg_0, 1); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicAdd_794055(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..181873a5f6 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicAdd_794055() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int atomic_result = 0; + InterlockedAdd(arg_0, -1, atomic_result); + const int x_15 = atomic_result; + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicAdd_794055(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..9f11082f0e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +void atomicAdd_794055(threadgroup atomic_int* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_15 = atomic_fetch_sub_explicit(tint_symbol, 1, memory_order_relaxed); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicAdd_794055(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_33 = *(tint_symbol_2); + compute_main_inner(x_33, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..843bd5ae40 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,80 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 47 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_794055 "atomicAdd_794055" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %23 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_794055 = OpFunction %void None %10 + %13 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %14 + OpStore %res %14 + OpStore %arg_1 %int_1 + %19 = OpAtomicISub %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %19 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %23 +%local_invocation_index = OpFunctionParameter %uint + %26 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %31 = OpFunctionCall %void %atomicAdd_794055 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %33 = OpLabel + %34 = OpLoad %uint %local_invocation_index_1 + %35 = OpFunctionCall %void %compute_main_inner %34 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %23 +%local_invocation_index_1_param = OpFunctionParameter %uint + %38 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %42 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %44 = OpLabel + %46 = OpLoad %uint %local_invocation_index_1_param_1 + %45 = OpFunctionCall %void %compute_main_inner_1 %46 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..540501adaf --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,31 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicAdd_794055() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_15 : i32 = atomicSub(&(arg_0), 1i); + res = x_15; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicAdd_794055(); + return; +} + +fn compute_main_1() { + let x_33 : u32 = local_invocation_index_1; + compute_main_inner(x_33); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm new file mode 100644 index 0000000000..1d1b5bdfef --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm @@ -0,0 +1,55 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 33 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_d5db1d "atomicAdd_d5db1d" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %13 = OpConstantNull %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_d5db1d = OpFunction %void None %6 + %9 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %13 + %res = OpVariable %_ptr_Function_uint Function %13 + OpStore %arg_1 %uint_1 + %14 = OpAtomicIDecrement %uint %arg_0 %uint_2 %uint_0 + OpStore %res %14 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %13 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicAdd_d5db1d + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %30 = OpLabel + %32 = OpLoad %uint %local_invocation_index_1 + %31 = OpFunctionCall %void %compute_main_inner %32 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..b9c2faf670 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicAdd_d5db1d() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_14 = atomicAdd(arg_0, 1u); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicAdd_d5db1d(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..16aaa1c4d7 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicAdd_d5db1d() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint atomic_result = 0u; + InterlockedAdd(arg_0, -1u, atomic_result); + const uint x_14 = atomic_result; + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicAdd_d5db1d(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..74b7a0d727 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +void atomicAdd_d5db1d(threadgroup atomic_uint* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_14 = atomic_fetch_sub_explicit(tint_symbol, 1u, memory_order_relaxed); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicAdd_d5db1d(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_32 = *(tint_symbol_2); + compute_main_inner(x_32, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..77041b4aef --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,78 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 45 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_d5db1d "atomicAdd_d5db1d" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %21 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_d5db1d = OpFunction %void None %9 + %12 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %6 + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %arg_1 %6 + OpStore %res %6 + OpStore %arg_1 %uint_1 + %17 = OpAtomicISub %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %17 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %21 +%local_invocation_index = OpFunctionParameter %uint + %24 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %29 = OpFunctionCall %void %atomicAdd_d5db1d + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %31 = OpLabel + %32 = OpLoad %uint %local_invocation_index_1 + %33 = OpFunctionCall %void %compute_main_inner %32 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %21 +%local_invocation_index_1_param = OpFunctionParameter %uint + %36 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %40 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %42 = OpLabel + %44 = OpLoad %uint %local_invocation_index_1_param_1 + %43 = OpFunctionCall %void %compute_main_inner_1 %44 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..64dabf43d1 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicDecrement/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,31 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicAdd_d5db1d() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_14 : u32 = atomicSub(&(arg_0), 1u); + res = x_14; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicAdd_d5db1d(); + return; +} + +fn compute_main_1() { + let x_32 : u32 = local_invocation_index_1; + compute_main_inner(x_32); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm new file mode 100644 index 0000000000..9bacaec6ed --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm @@ -0,0 +1,56 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 28 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_d32fe4 "atomicAdd_d32fe4" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 + %SB_RW = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %12 = OpConstantNull %int + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicAdd_d32fe4 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %12 + %res = OpVariable %_ptr_Function_int Function %12 + OpStore %arg_1 %int_1 + %19 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %13 = OpAtomicIIncrement %int %19 %uint_1 %uint_0 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..167e99cff9 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicAdd_d32fe4() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicAdd(sb_rw.arg_0, 1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicAdd_d32fe4(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + int arg_0; +} sb_rw; +void atomicAdd_d32fe4() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_13 = atomicAdd(sb_rw.arg_0, 1); + res = x_13; + return; +} + +void compute_main_1() { + atomicAdd_d32fe4(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..9be7a9ef69 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +int tint_atomicAdd(RWByteAddressBuffer buffer, uint offset, int value) { + int original_value = 0; + buffer.InterlockedAdd(offset, value, original_value); + return original_value; +} + + +void atomicAdd_d32fe4() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + const int x_13 = tint_atomicAdd(sb_rw, 0u, 1); + res = x_13; + return; +} + +void fragment_main_1() { + atomicAdd_d32fe4(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicAdd_d32fe4(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.msl new file mode 100644 index 0000000000..acfdf7fd8e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.msl @@ -0,0 +1,40 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_int arg_0; +}; + +struct SB_RW { + int arg_0; +}; + +void atomicAdd_d32fe4(device SB_RW_atomic* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_13 = atomic_fetch_add_explicit(&((*(tint_symbol)).arg_0), 1, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicAdd_d32fe4(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicAdd_d32fe4(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..f206f17221 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.spvasm @@ -0,0 +1,70 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 33 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_d32fe4 "atomicAdd_d32fe4" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %int = OpTypeInt 32 1 +%SB_RW_atomic = OpTypeStruct %int +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int +%atomicAdd_d32fe4 = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %9 + %res = OpVariable %_ptr_Function_int Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %int_1 + %20 = OpAccessChain %_ptr_StorageBuffer_int %sb_rw %uint_0 + %14 = OpAtomicIAdd %int %20 %uint_1 %uint_0 %int_1 + OpStore %res %14 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %22 = OpLabel + %23 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %25 = OpLabel + %26 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %28 = OpLabel + %29 = OpFunctionCall %void %atomicAdd_d32fe4 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %31 = OpLabel + %32 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..da3a03b950 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_i32.spvasm.expected.wgsl @@ -0,0 +1,38 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : i32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicAdd_d32fe4() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_13 : i32 = atomicAdd(&(sb_rw.arg_0), 1i); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicAdd_d32fe4(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicAdd_d32fe4(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm new file mode 100644 index 0000000000..8aad806bab --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm @@ -0,0 +1,54 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 26 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW "SB_RW" + OpMemberName %SB_RW 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_8a199a "atomicAdd_8a199a" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main "fragment_main" + OpName %compute_main "compute_main" + OpDecorate %SB_RW Block + OpMemberDecorate %SB_RW 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 + %SB_RW = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW = OpTypePointer StorageBuffer %SB_RW + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %12 = OpConstantNull %uint + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicAdd_8a199a = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %12 + %res = OpVariable %_ptr_Function_uint Function %12 + OpStore %arg_1 %uint_1 + %17 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %13 = OpAtomicIIncrement %uint %17 %uint_1 %uint_0 + OpStore %res %13 + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %21 = OpLabel + %22 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %24 = OpLabel + %25 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..d9e05156d9 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.glsl @@ -0,0 +1,72 @@ +#version 310 es +precision mediump float; + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicAdd_8a199a() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicAdd(sb_rw.arg_0, 1u); + res = x_13; + return; +} + +void fragment_main_1() { + atomicAdd_8a199a(); + return; +} + +void fragment_main() { + fragment_main_1(); +} + +void main() { + fragment_main(); + return; +} +#version 310 es + +struct SB_RW_atomic { + uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +layout(binding = 0, std430) buffer SB_RW_atomic_1 { + uint arg_0; +} sb_rw; +void atomicAdd_8a199a() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_13 = atomicAdd(sb_rw.arg_0, 1u); + res = x_13; + return; +} + +void compute_main_1() { + atomicAdd_8a199a(); + return; +} + +void compute_main() { + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..442a1ffc24 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.hlsl @@ -0,0 +1,38 @@ +RWByteAddressBuffer sb_rw : register(u0, space0); + +uint tint_atomicAdd(RWByteAddressBuffer buffer, uint offset, uint value) { + uint original_value = 0; + buffer.InterlockedAdd(offset, value, original_value); + return original_value; +} + + +void atomicAdd_8a199a() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + const uint x_13 = tint_atomicAdd(sb_rw, 0u, 1u); + res = x_13; + return; +} + +void fragment_main_1() { + atomicAdd_8a199a(); + return; +} + +void fragment_main() { + fragment_main_1(); + return; +} + +void compute_main_1() { + atomicAdd_8a199a(); + return; +} + +[numthreads(1, 1, 1)] +void compute_main() { + compute_main_1(); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.msl new file mode 100644 index 0000000000..b3d0ecd75e --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.msl @@ -0,0 +1,40 @@ +#include + +using namespace metal; +struct SB_RW_atomic { + /* 0x0000 */ atomic_uint arg_0; +}; + +struct SB_RW { + uint arg_0; +}; + +void atomicAdd_8a199a(device SB_RW_atomic* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_13 = atomic_fetch_add_explicit(&((*(tint_symbol)).arg_0), 1u, memory_order_relaxed); + res = x_13; + return; +} + +void fragment_main_1(device SB_RW_atomic* const tint_symbol_1) { + atomicAdd_8a199a(tint_symbol_1); + return; +} + +fragment void fragment_main(device SB_RW_atomic* tint_symbol_2 [[buffer(0)]]) { + fragment_main_1(tint_symbol_2); + return; +} + +void compute_main_1(device SB_RW_atomic* const tint_symbol_3) { + atomicAdd_8a199a(tint_symbol_3); + return; +} + +kernel void compute_main(device SB_RW_atomic* tint_symbol_4 [[buffer(0)]]) { + compute_main_1(tint_symbol_4); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..17ebf7b797 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.spvasm @@ -0,0 +1,68 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 31 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %fragment_main "fragment_main" + OpEntryPoint GLCompute %compute_main "compute_main" + OpExecutionMode %fragment_main OriginUpperLeft + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %SB_RW_atomic "SB_RW_atomic" + OpMemberName %SB_RW_atomic 0 "arg_0" + OpName %sb_rw "sb_rw" + OpName %atomicAdd_8a199a "atomicAdd_8a199a" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %fragment_main_1 "fragment_main_1" + OpName %fragment_main "fragment_main" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main "compute_main" + OpDecorate %SB_RW_atomic Block + OpMemberDecorate %SB_RW_atomic 0 Offset 0 + OpDecorate %sb_rw DescriptorSet 0 + OpDecorate %sb_rw Binding 0 + %uint = OpTypeInt 32 0 +%SB_RW_atomic = OpTypeStruct %uint +%_ptr_StorageBuffer_SB_RW_atomic = OpTypePointer StorageBuffer %SB_RW_atomic + %sb_rw = OpVariable %_ptr_StorageBuffer_SB_RW_atomic StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %9 = OpConstantNull %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%atomicAdd_8a199a = OpFunction %void None %5 + %8 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %9 + %res = OpVariable %_ptr_Function_uint Function %9 + OpStore %arg_1 %9 + OpStore %res %9 + OpStore %arg_1 %uint_1 + %18 = OpAccessChain %_ptr_StorageBuffer_uint %sb_rw %uint_0 + %14 = OpAtomicIAdd %uint %18 %uint_1 %uint_0 %uint_1 + OpStore %res %14 + OpReturn + OpFunctionEnd +%fragment_main_1 = OpFunction %void None %5 + %20 = OpLabel + %21 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd +%fragment_main = OpFunction %void None %5 + %23 = OpLabel + %24 = OpFunctionCall %void %fragment_main_1 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %5 + %26 = OpLabel + %27 = OpFunctionCall %void %atomicAdd_8a199a + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %5 + %29 = OpLabel + %30 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..61fbe492e0 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/storage_u32.spvasm.expected.wgsl @@ -0,0 +1,38 @@ +struct SB_RW_atomic { + arg_0 : atomic, +} + +struct SB_RW { + arg_0 : u32, +} + +@group(0) @binding(0) var sb_rw : SB_RW_atomic; + +fn atomicAdd_8a199a() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_13 : u32 = atomicAdd(&(sb_rw.arg_0), 1u); + res = x_13; + return; +} + +fn fragment_main_1() { + atomicAdd_8a199a(); + return; +} + +@fragment +fn fragment_main() { + fragment_main_1(); +} + +fn compute_main_1() { + atomicAdd_8a199a(); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main() { + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm new file mode 100644 index 0000000000..2fb3e8ddeb --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm @@ -0,0 +1,56 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_794055 "atomicAdd_794055" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %7 = OpTypeFunction %void + %int_1 = OpConstant %int 1 +%_ptr_Function_int = OpTypePointer Function %int + %14 = OpConstantNull %int + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %21 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_794055 = OpFunction %void None %7 + %10 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %int_1 + %15 = OpAtomicIIncrement %int %arg_0 %uint_2 %uint_0 + OpStore %res %15 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %21 +%local_invocation_index = OpFunctionParameter %uint + %24 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %29 = OpFunctionCall %void %atomicAdd_794055 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %7 + %31 = OpLabel + %33 = OpLoad %uint %local_invocation_index_1 + %32 = OpFunctionCall %void %compute_main_inner %33 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.glsl new file mode 100644 index 0000000000..ef3ffb1c16 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared int arg_0; +void atomicAdd_794055() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int x_15 = atomicAdd(arg_0, 1); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0); + barrier(); + atomicAdd_794055(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.hlsl new file mode 100644 index 0000000000..6270b9d3e3 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared int arg_0; + +void atomicAdd_794055() { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int atomic_result = 0; + InterlockedAdd(arg_0, 1, atomic_result); + const int x_15 = atomic_result; + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index) { + int atomic_result_1 = 0; + InterlockedExchange(arg_0, 0, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicAdd_794055(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + int atomic_result_2 = 0; + InterlockedExchange(arg_0, 0, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.msl new file mode 100644 index 0000000000..dc059dd0c0 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +void atomicAdd_794055(threadgroup atomic_int* const tint_symbol) { + int arg_1 = 0; + int res = 0; + arg_1 = 1; + int const x_15 = atomic_fetch_add_explicit(tint_symbol, 1, memory_order_relaxed); + res = x_15; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_int* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicAdd_794055(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_int* const tint_symbol_3) { + uint const x_33 = *(tint_symbol_2); + compute_main_inner(x_33, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_int* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_int tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.spvasm new file mode 100644 index 0000000000..ed49501697 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.spvasm @@ -0,0 +1,80 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 47 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_794055 "atomicAdd_794055" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 + %int = OpTypeInt 32 1 +%_ptr_Workgroup_int = OpTypePointer Workgroup %int + %arg_0 = OpVariable %_ptr_Workgroup_int Workgroup + %void = OpTypeVoid + %10 = OpTypeFunction %void + %14 = OpConstantNull %int +%_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %23 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_794055 = OpFunction %void None %10 + %13 = OpLabel + %arg_1 = OpVariable %_ptr_Function_int Function %14 + %res = OpVariable %_ptr_Function_int Function %14 + OpStore %arg_1 %14 + OpStore %res %14 + OpStore %arg_1 %int_1 + %19 = OpAtomicIAdd %int %arg_0 %uint_2 %uint_0 %int_1 + OpStore %res %19 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %23 +%local_invocation_index = OpFunctionParameter %uint + %26 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %31 = OpFunctionCall %void %atomicAdd_794055 + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %10 + %33 = OpLabel + %34 = OpLoad %uint %local_invocation_index_1 + %35 = OpFunctionCall %void %compute_main_inner %34 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %23 +%local_invocation_index_1_param = OpFunctionParameter %uint + %38 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %14 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %42 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %10 + %44 = OpLabel + %46 = OpLoad %uint %local_invocation_index_1_param_1 + %45 = OpFunctionCall %void %compute_main_inner_1 %46 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.wgsl new file mode 100644 index 0000000000..b5076c3852 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_i32.spvasm.expected.wgsl @@ -0,0 +1,31 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicAdd_794055() { + var arg_1 : i32 = 0i; + var res : i32 = 0i; + arg_1 = 1i; + let x_15 : i32 = atomicAdd(&(arg_0), 1i); + res = x_15; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0i); + workgroupBarrier(); + atomicAdd_794055(); + return; +} + +fn compute_main_1() { + let x_33 : u32 = local_invocation_index_1; + compute_main_inner(x_33); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm new file mode 100644 index 0000000000..48d906dae9 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm @@ -0,0 +1,55 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 33 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_d5db1d "atomicAdd_d5db1d" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %6 = OpTypeFunction %void + %uint_1 = OpConstant %uint 1 +%_ptr_Function_uint = OpTypePointer Function %uint + %13 = OpConstantNull %uint + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %20 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_d5db1d = OpFunction %void None %6 + %9 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %13 + %res = OpVariable %_ptr_Function_uint Function %13 + OpStore %arg_1 %uint_1 + %14 = OpAtomicIIncrement %uint %arg_0 %uint_2 %uint_0 + OpStore %res %14 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %20 +%local_invocation_index = OpFunctionParameter %uint + %23 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %13 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %28 = OpFunctionCall %void %atomicAdd_d5db1d + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %6 + %30 = OpLabel + %32 = OpLoad %uint %local_invocation_index_1 + %31 = OpFunctionCall %void %compute_main_inner %32 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.glsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.glsl new file mode 100644 index 0000000000..b9c2faf670 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.glsl @@ -0,0 +1,39 @@ +#version 310 es + +uint local_invocation_index_1 = 0u; +shared uint arg_0; +void atomicAdd_d5db1d() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint x_14 = atomicAdd(arg_0, 1u); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + atomicExchange(arg_0, 0u); + barrier(); + atomicAdd_d5db1d(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +void compute_main(uint local_invocation_index_1_param) { + { + atomicExchange(arg_0, 0u); + } + barrier(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + compute_main(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.hlsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.hlsl new file mode 100644 index 0000000000..d2a0213b3c --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.hlsl @@ -0,0 +1,46 @@ +static uint local_invocation_index_1 = 0u; +groupshared uint arg_0; + +void atomicAdd_d5db1d() { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint atomic_result = 0u; + InterlockedAdd(arg_0, 1u, atomic_result); + const uint x_14 = atomic_result; + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index) { + uint atomic_result_1 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_1); + GroupMemoryBarrierWithGroupSync(); + atomicAdd_d5db1d(); + return; +} + +void compute_main_1() { + compute_main_inner(local_invocation_index_1); + return; +} + +struct tint_symbol_1 { + uint local_invocation_index_1_param : SV_GroupIndex; +}; + +void compute_main_inner_1(uint local_invocation_index_1_param) { + { + uint atomic_result_2 = 0u; + InterlockedExchange(arg_0, 0u, atomic_result_2); + } + GroupMemoryBarrierWithGroupSync(); + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +} + +[numthreads(1, 1, 1)] +void compute_main(tint_symbol_1 tint_symbol) { + compute_main_inner_1(tint_symbol.local_invocation_index_1_param); + return; +} diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.msl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.msl new file mode 100644 index 0000000000..1b33ab894f --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.msl @@ -0,0 +1,41 @@ +#include + +using namespace metal; +void atomicAdd_d5db1d(threadgroup atomic_uint* const tint_symbol) { + uint arg_1 = 0u; + uint res = 0u; + arg_1 = 1u; + uint const x_14 = atomic_fetch_add_explicit(tint_symbol, 1u, memory_order_relaxed); + res = x_14; + return; +} + +void compute_main_inner(uint local_invocation_index, threadgroup atomic_uint* const tint_symbol_1) { + atomic_store_explicit(tint_symbol_1, 0u, memory_order_relaxed); + threadgroup_barrier(mem_flags::mem_threadgroup); + atomicAdd_d5db1d(tint_symbol_1); + return; +} + +void compute_main_1(thread uint* const tint_symbol_2, threadgroup atomic_uint* const tint_symbol_3) { + uint const x_32 = *(tint_symbol_2); + compute_main_inner(x_32, tint_symbol_3); + return; +} + +void compute_main_inner_1(uint local_invocation_index_1_param, threadgroup atomic_uint* const tint_symbol_4, thread uint* const tint_symbol_5) { + { + atomic_store_explicit(tint_symbol_4, 0u, memory_order_relaxed); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol_5) = local_invocation_index_1_param; + compute_main_1(tint_symbol_5, tint_symbol_4); +} + +kernel void compute_main(uint local_invocation_index_1_param [[thread_index_in_threadgroup]]) { + threadgroup atomic_uint tint_symbol_6; + thread uint tint_symbol_7 = 0u; + compute_main_inner_1(local_invocation_index_1_param, &(tint_symbol_6), &(tint_symbol_7)); + return; +} + diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.spvasm b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.spvasm new file mode 100644 index 0000000000..1388894da0 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.spvasm @@ -0,0 +1,78 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 45 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %compute_main "compute_main" %local_invocation_index_1_param_1 + OpExecutionMode %compute_main LocalSize 1 1 1 + OpName %local_invocation_index_1_param_1 "local_invocation_index_1_param_1" + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %arg_0 "arg_0" + OpName %atomicAdd_d5db1d "atomicAdd_d5db1d" + OpName %arg_1 "arg_1" + OpName %res "res" + OpName %compute_main_inner "compute_main_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %compute_main_1 "compute_main_1" + OpName %compute_main_inner_1 "compute_main_inner_1" + OpName %local_invocation_index_1_param "local_invocation_index_1_param" + OpName %compute_main "compute_main" + OpDecorate %local_invocation_index_1_param_1 BuiltIn LocalInvocationIndex + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1_param_1 = OpVariable %_ptr_Input_uint Input +%_ptr_Private_uint = OpTypePointer Private %uint + %6 = OpConstantNull %uint +%local_invocation_index_1 = OpVariable %_ptr_Private_uint Private %6 +%_ptr_Workgroup_uint = OpTypePointer Workgroup %uint + %arg_0 = OpVariable %_ptr_Workgroup_uint Workgroup + %void = OpTypeVoid + %9 = OpTypeFunction %void +%_ptr_Function_uint = OpTypePointer Function %uint + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_0 = OpConstant %uint 0 + %21 = OpTypeFunction %void %uint + %uint_264 = OpConstant %uint 264 +%atomicAdd_d5db1d = OpFunction %void None %9 + %12 = OpLabel + %arg_1 = OpVariable %_ptr_Function_uint Function %6 + %res = OpVariable %_ptr_Function_uint Function %6 + OpStore %arg_1 %6 + OpStore %res %6 + OpStore %arg_1 %uint_1 + %17 = OpAtomicIAdd %uint %arg_0 %uint_2 %uint_0 %uint_1 + OpStore %res %17 + OpReturn + OpFunctionEnd +%compute_main_inner = OpFunction %void None %21 +%local_invocation_index = OpFunctionParameter %uint + %24 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %29 = OpFunctionCall %void %atomicAdd_d5db1d + OpReturn + OpFunctionEnd +%compute_main_1 = OpFunction %void None %9 + %31 = OpLabel + %32 = OpLoad %uint %local_invocation_index_1 + %33 = OpFunctionCall %void %compute_main_inner %32 + OpReturn + OpFunctionEnd +%compute_main_inner_1 = OpFunction %void None %21 +%local_invocation_index_1_param = OpFunctionParameter %uint + %36 = OpLabel + OpAtomicStore %arg_0 %uint_2 %uint_0 %6 + OpControlBarrier %uint_2 %uint_2 %uint_264 + OpStore %local_invocation_index_1 %local_invocation_index_1_param + %40 = OpFunctionCall %void %compute_main_1 + OpReturn + OpFunctionEnd +%compute_main = OpFunction %void None %9 + %42 = OpLabel + %44 = OpLoad %uint %local_invocation_index_1_param_1 + %43 = OpFunctionCall %void %compute_main_inner_1 %44 + OpReturn + OpFunctionEnd diff --git a/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.wgsl b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.wgsl new file mode 100644 index 0000000000..7faf057482 --- /dev/null +++ b/test/tint/builtins/atomics/from_gen/var/spvAtomicIncrement/workgroup_u32.spvasm.expected.wgsl @@ -0,0 +1,31 @@ +var local_invocation_index_1 : u32; + +var arg_0 : atomic; + +fn atomicAdd_d5db1d() { + var arg_1 : u32 = 0u; + var res : u32 = 0u; + arg_1 = 1u; + let x_14 : u32 = atomicAdd(&(arg_0), 1u); + res = x_14; + return; +} + +fn compute_main_inner(local_invocation_index : u32) { + atomicStore(&(arg_0), 0u); + workgroupBarrier(); + atomicAdd_d5db1d(); + return; +} + +fn compute_main_1() { + let x_32 : u32 = local_invocation_index_1; + compute_main_inner(x_32); + return; +} + +@compute @workgroup_size(1i, 1i, 1i) +fn compute_main(@builtin(local_invocation_index) local_invocation_index_1_param : u32) { + local_invocation_index_1 = local_invocation_index_1_param; + compute_main_1(); +}