#version 430 #define SORT_SIZE 512 layout(std430, row_major) buffer ParticleDistances{ float particle_distances[]; } ; layout(std430, row_major) buffer AliveParticles1{ uint alive_particles_1[]; } ; #define NUM_THREADS (SORT_SIZE/2) layout(local_size_x = 256, local_size_y = 1, local_size_z = 1) in ; uniform int elements; shared vec2 local_storage[SORT_SIZE]; void main(); void _GLSLTK_main_1(){ uvec4 tgp = uvec4((gl_WorkGroupID.x * 256), 0, elements, clamp((elements - (gl_WorkGroupID.x * 512)), uint(0), uint(512))); uint global_base_index = (tgp.y + ((tgp.x * 2) + gl_LocalInvocationID.x)); uint local_base_index = gl_LocalInvocationIndex; for(uint i = 0; (i < 2); ++i){ if(((gl_LocalInvocationIndex + (i * NUM_THREADS)) < tgp.w)){ uint load_index = (global_base_index + (i * NUM_THREADS)); local_storage[(local_base_index + (i * NUM_THREADS))] = vec2(particle_distances[load_index], float(alive_particles_1[load_index])); }; }; groupMemoryBarrier(); barrier(); for(uint sub_size = (SORT_SIZE >> 1); (0 < sub_size); sub_size = (sub_size >> 1)){ uint tmp_index = gl_LocalInvocationIndex; uint index_low = (tmp_index & (sub_size - 1)); uint index_high = (2 * (tmp_index - index_low)); uint index = (index_low + index_high); uint candidate = (index_high + (index_low + sub_size)); if((candidate < tgp.w)){ vec2 a = local_storage[index]; vec2 b = local_storage[candidate]; if((b.x < a.x)){ local_storage[index] = b; local_storage[candidate] = a; }; }; groupMemoryBarrier(); barrier(); }; for(uint i = 0; (i < 2); ++i){ if(((gl_LocalInvocationIndex + (i * NUM_THREADS)) < tgp.w)){ uint load_index = (local_base_index + (i * NUM_THREADS)); uint store_index = (global_base_index + (i * NUM_THREADS)); particle_distances[store_index] = local_storage[load_index].x; alive_particles_1[store_index] = uint(local_storage[load_index].y); }; }; } void main(){ _GLSLTK_main_1(); }