xref: /aosp_15_r20/external/skia/resources/sksl/compute/AtomicOperations.compute (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Workerlayout(local_size_x = 64) in;
2*c8dee2aaSAndroid Build Coastguard Worker
3*c8dee2aaSAndroid Build Coastguard Workerlayout(metal, binding = 0) buffer ssbo {
4*c8dee2aaSAndroid Build Coastguard Worker    atomicUint globalCounter;
5*c8dee2aaSAndroid Build Coastguard Worker};
6*c8dee2aaSAndroid Build Coastguard Worker
7*c8dee2aaSAndroid Build Coastguard Workerworkgroup atomic_uint localCounter;  // atomic_uint is a synonym for atomicUint
8*c8dee2aaSAndroid Build Coastguard Worker
9*c8dee2aaSAndroid Build Coastguard Workervoid main() {
10*c8dee2aaSAndroid Build Coastguard Worker    // Initialize the local counter.
11*c8dee2aaSAndroid Build Coastguard Worker    if (sk_LocalInvocationID.x == 0) {
12*c8dee2aaSAndroid Build Coastguard Worker        atomicStore(localCounter, 0);
13*c8dee2aaSAndroid Build Coastguard Worker    }
14*c8dee2aaSAndroid Build Coastguard Worker
15*c8dee2aaSAndroid Build Coastguard Worker    // Synchronize the threads in the workgroup so they all see the initial value.
16*c8dee2aaSAndroid Build Coastguard Worker    workgroupBarrier();
17*c8dee2aaSAndroid Build Coastguard Worker
18*c8dee2aaSAndroid Build Coastguard Worker    // All threads increment the counter.
19*c8dee2aaSAndroid Build Coastguard Worker    atomicAdd(localCounter, 1);
20*c8dee2aaSAndroid Build Coastguard Worker
21*c8dee2aaSAndroid Build Coastguard Worker    // Synchronize the threads again to ensure they have all executed the increment
22*c8dee2aaSAndroid Build Coastguard Worker    // and the following load reads the same value across all threads in the
23*c8dee2aaSAndroid Build Coastguard Worker    // workgroup.
24*c8dee2aaSAndroid Build Coastguard Worker    workgroupBarrier();
25*c8dee2aaSAndroid Build Coastguard Worker
26*c8dee2aaSAndroid Build Coastguard Worker    // Add the workgroup-only tally to the global counter.
27*c8dee2aaSAndroid Build Coastguard Worker    if (sk_LocalInvocationID.x == 0) {
28*c8dee2aaSAndroid Build Coastguard Worker        atomicAdd(globalCounter, atomicLoad(localCounter));
29*c8dee2aaSAndroid Build Coastguard Worker    }
30*c8dee2aaSAndroid Build Coastguard Worker}
31