mirror of
https://github.com/italicsjenga/vello.git
synced 2025-01-10 20:51:29 +11:00
32 lines
742 B
GLSL
32 lines
742 B
GLSL
|
// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense
|
||
|
|
||
|
// Linked list building.
|
||
|
|
||
|
#version 450
|
||
|
|
||
|
#define N_BUCKETS 65536
|
||
|
#define N_ITER 100
|
||
|
|
||
|
layout(local_size_x = 256, local_size_y = 1) in;
|
||
|
|
||
|
layout(set = 0, binding = 0) buffer MemBuf {
|
||
|
uint[] mem;
|
||
|
};
|
||
|
|
||
|
void main() {
|
||
|
uint rng = gl_GlobalInvocationID.x + 1;
|
||
|
for (uint i = 0; i < N_ITER; i++) {
|
||
|
// xorshift32
|
||
|
rng ^= rng << 13;
|
||
|
rng ^= rng >> 17;
|
||
|
rng ^= rng << 5;
|
||
|
uint bucket = rng % N_BUCKETS;
|
||
|
if (bucket != 0) {
|
||
|
uint alloc = atomicAdd(mem[0], 2) + N_BUCKETS;
|
||
|
uint old = atomicExchange(mem[bucket], alloc);
|
||
|
mem[alloc] = old;
|
||
|
mem[alloc + 1] = gl_GlobalInvocationID.x;
|
||
|
}
|
||
|
}
|
||
|
}
|