47 lines
1021 B
Plaintext
47 lines
1021 B
Plaintext
#version 450
|
|
|
|
// Output is a global indices[] buffer, indexed by gl_InstanceIndex.
|
|
|
|
layout(local_size_x = 256, local_size_y = 1, local_size_z = 1) in;
|
|
|
|
layout(std430, set = 0, binding = 0) readonly buffer SortedBlocks
|
|
{
|
|
uint blocks[];
|
|
} sortedBlocks;
|
|
|
|
layout(std430, set = 0, binding = 1) writeonly buffer DrawIndices
|
|
{
|
|
uint indices[];
|
|
} outIndices;
|
|
|
|
layout(push_constant) uniform Push
|
|
{
|
|
uvec4 header; // x=base, y=count, z=flags (bit0=identity)
|
|
} pc;
|
|
|
|
const uint BLOCK_SIZE = 256u;
|
|
|
|
void main()
|
|
{
|
|
uint i = gl_GlobalInvocationID.x;
|
|
uint count = pc.header.y;
|
|
if (i >= count) return;
|
|
|
|
uint base = pc.header.x;
|
|
uint flags = pc.header.z;
|
|
|
|
uint outIdx = base + i;
|
|
uint particleIdx = base + i;
|
|
|
|
if ((flags & 1u) == 0u)
|
|
{
|
|
uint blockRank = i / BLOCK_SIZE;
|
|
uint within = i - blockRank * BLOCK_SIZE;
|
|
uint block = sortedBlocks.blocks[blockRank];
|
|
particleIdx = base + block * BLOCK_SIZE + within;
|
|
}
|
|
|
|
outIndices.indices[outIdx] = particleIdx;
|
|
}
|
|
|