From fb3e188d3d083a713134dade431f2f406697b0be Mon Sep 17 00:00:00 2001
From: Josh Morgenstern <josh@morgenstern.dev>
Date: Wed, 2 Feb 2022 18:45:09 +0100
Subject: [PATCH] ADD ALL THE BARRIERS!!!

---
 .../wobble_bobble/shaders/init_particle_volumes.comp     | 9 +++++++++
 .../shaders/transform_particles_to_grid.comp             | 3 +++
 projects/wobble_bobble/shaders/update_grid_forces.comp   | 7 +++++++
 .../shaders/update_particle_deformation.comp             | 6 ++++++
 .../wobble_bobble/shaders/update_particle_positions.comp | 4 ++++
 .../shaders/update_particle_velocities.comp              | 7 +++++++
 6 files changed, 36 insertions(+)

diff --git a/projects/wobble_bobble/shaders/init_particle_volumes.comp b/projects/wobble_bobble/shaders/init_particle_volumes.comp
index be0e0d06..c7c64be3 100644
--- a/projects/wobble_bobble/shaders/init_particle_volumes.comp
+++ b/projects/wobble_bobble/shaders/init_particle_volumes.comp
@@ -24,6 +24,9 @@ void main()	{
         float mass = 0.0f;
         int i, j, k;
 
+        barrier();
+        memoryBarrierImage();
+
         for (i = -gridWindow.x; i <= gridWindow.x; i++) {
             for (j = -gridWindow.y; j <= gridWindow.y; j++) {
                 for (k = -gridWindow.z; k <= gridWindow.z; k++) {
@@ -37,6 +40,9 @@ void main()	{
             }
         }
 
+        barrier();
+        memoryBarrierBuffer();
+
         if (volume > 0.0f) {
             float density = minimal.mass / volume;
 
@@ -44,6 +50,9 @@ void main()	{
             //mass = density * volume;
         }
 
+        barrier();
+        memoryBarrierBuffer();
+
         particles[gl_GlobalInvocationID.x].minimal.size = sphere_radius(volume);
         particles[gl_GlobalInvocationID.x].minimal.mass = mass;
     }
diff --git a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
index 0ccc6eb2..9bae58ef 100644
--- a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
+++ b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
@@ -55,6 +55,9 @@ void main()	{
         gridValue.xyz /= gridValue.w;
     }
 
+    barrier();
+    memoryBarrierShared();
+
     imageStore(
         gridImage,
         ivec3(gl_GlobalInvocationID),
diff --git a/projects/wobble_bobble/shaders/update_grid_forces.comp b/projects/wobble_bobble/shaders/update_grid_forces.comp
index 32779864..0cc83a26 100644
--- a/projects/wobble_bobble/shaders/update_grid_forces.comp
+++ b/projects/wobble_bobble/shaders/update_grid_forces.comp
@@ -41,6 +41,8 @@ void main()	{
     }
 
     barrier();
+    memoryBarrierBuffer();
+    memoryBarrierShared();
     memoryBarrierImage();
 
     const vec3 gridResolution = vec3(imageSize(gridImage));
@@ -128,6 +130,11 @@ void main()	{
 
     velocity = mix(velocity, -velocity, invert);
 
+    barrier();
+    memoryBarrierBuffer();
+    memoryBarrierShared();
+    memoryBarrierImage();
+
     imageStore(
         gridForceImage,
         ivec3(gl_GlobalInvocationID),
diff --git a/projects/wobble_bobble/shaders/update_particle_deformation.comp b/projects/wobble_bobble/shaders/update_particle_deformation.comp
index 73d8961a..a8a89bc5 100644
--- a/projects/wobble_bobble/shaders/update_particle_deformation.comp
+++ b/projects/wobble_bobble/shaders/update_particle_deformation.comp
@@ -47,12 +47,18 @@ void main()	{
             }
         }
 
+        barrier();
+        memoryBarrierBuffer();
+
         mat3 deformation_elastic = deformation;
 
         if (dt > 0.0f) {
             deformation_elastic = (mat3(1.0f) + dt * velocity_gradient) * deformation;
         }
 
+        barrier();
+        memoryBarrierBuffer();
+
         particles[gl_GlobalInvocationID.x].deformation = mat4(deformation_elastic);
     }
 }
\ No newline at end of file
diff --git a/projects/wobble_bobble/shaders/update_particle_positions.comp b/projects/wobble_bobble/shaders/update_particle_positions.comp
index 6351cdde..5e012f40 100644
--- a/projects/wobble_bobble/shaders/update_particle_positions.comp
+++ b/projects/wobble_bobble/shaders/update_particle_positions.comp
@@ -39,9 +39,13 @@ void main()	{
             }
         }
 
+        barrier();
+        memoryBarrierBuffer();
+
         particles[gl_GlobalInvocationID.x].minimal.position = position;
         particles[gl_GlobalInvocationID.x].minimal.velocity = velocity;
     }
 
+    barrier();
     memoryBarrierBuffer();
 }
\ No newline at end of file
diff --git a/projects/wobble_bobble/shaders/update_particle_velocities.comp b/projects/wobble_bobble/shaders/update_particle_velocities.comp
index bc592ad6..d29b22e1 100644
--- a/projects/wobble_bobble/shaders/update_particle_velocities.comp
+++ b/projects/wobble_bobble/shaders/update_particle_velocities.comp
@@ -58,6 +58,9 @@ void main()	{
             }
         }
 
+        barrier();
+        memoryBarrierBuffer();
+
         mat3 affine_C = mat3(0.0f);
         vec3 velocity_apic = vec3(0.0f);
 
@@ -75,11 +78,15 @@ void main()	{
             }
         }
 
+        barrier();
+        memoryBarrierBuffer();
+
         vec3 velocity_alpha = mix(velocity_pic, velocity_flip, alpha);
         vec3 velocity_beta = mix(velocity_alpha, velocity_apic, beta);
 
         particles[gl_GlobalInvocationID.x].minimal.velocity = velocity_beta;
     }
 
+    barrier();
     memoryBarrierBuffer();
 }
\ No newline at end of file
-- 
GitLab