gKit2 light
count_buffer.glsl
Go to the documentation of this file.
1 
3 
4 #version 430
5 
6 #ifdef COMPUTE_SHADER
7 
8 layout( std430, binding= 0 ) buffer inputData
9 {
10  int a[];
11 };
12 
13 layout( std430, binding= 1 ) buffer outputData
14 {
15  int b[];
16 };
17 
18 layout( std430, binding= 2 ) buffer countData
19 {
20  uint count;
21 };
22 
23 uniform int v= 5;
24 
25 shared uint group_count;
26 shared uint group_offset;
27 
28 layout( local_size_x=256 ) in;
29 void main( )
30 {
31  uint ID= gl_GlobalInvocationID.x;
32 
33 /* version directe...
34  if(a[ID] < v)
35  {
36  uint index= atomicAdd(count, 1);
37  b[index]= a[ID];
38  }
39 */
40 
41 /* version decomposee par groupe
42  */
43  // 0. init
44  if(gl_LocalInvocationID.x == 0)
45  group_count= 0;
46  barrier();
47 
48  // 1. evaluer la condition / predicat
49  uint offset= -1;
50  if(a[ID] < v)
51  offset= atomicAdd(group_count, 1);
52 
53  // group_count contient le nombre de threads qui veulent ecrire un resultat dans le buffer
54  // et offset contient la position du resultat dans le groupe...
55 
56  // 2. reserver une place pour les resultats du groupe dans le buffer
57  if(gl_LocalInvocationID.x == 0)
58  group_offset= atomicAdd(count, group_count);
59  barrier();
60  // group_offset contient la position des resultats du groupe dans le buffer resultat
61 
62  // 3. ecrire les resultats
63  if(offset != -1)
64  // ecrit la valeur lorsqu'elle verifie la condition et qu'elle a une position...
65  b[group_offset+offset]= a[ID];
66  // toutes les valeurs d'un groupe sont ecrites en sequence dans le buffer resultat
67 }
68 
69 #endif