From b032f8f779ff216fc381d928bd769c69e19395b7 Mon Sep 17 00:00:00 2001
From: Tobias Frisch <tfrisch@uni-koblenz.de>
Date: Tue, 1 Feb 2022 21:55:21 +0100
Subject: [PATCH] Fix some issues with shared memory in shaders

Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de>
---
 .../shaders/transform_particles_to_grid.comp   |  2 ++
 .../shaders/update_grid_forces.comp            | 18 ++++++++++--------
 projects/wobble_bobble/src/main.cpp            |  8 ++++----
 3 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
index ab5c30b2..581bd667 100644
--- a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
+++ b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
@@ -49,6 +49,8 @@ void main()	{
                 mass
             );
         }
+
+        memoryBarrierShared();
     }
 
     if (gridValue.w > 0.0f) {
diff --git a/projects/wobble_bobble/shaders/update_grid_forces.comp b/projects/wobble_bobble/shaders/update_grid_forces.comp
index 3e0259cc..6d9434c4 100644
--- a/projects/wobble_bobble/shaders/update_grid_forces.comp
+++ b/projects/wobble_bobble/shaders/update_grid_forces.comp
@@ -40,12 +40,12 @@ void main()	{
         poisson /= (6.0f * K);
     }
 
+    memoryBarrierImage();
+
     const vec3 gridResolution = vec3(imageSize(gridImage));
     const vec3 position = (vec3(gl_GlobalInvocationID) + vec3(0.5f)) / gridResolution;
     const float h3 = 1.0f / gridResolution.x / gridResolution.y / gridResolution.z;
 
-    memoryBarrierImage();
-
     vec4 gridSample = imageLoad(
         gridImage,
         ivec3(gl_GlobalInvocationID)
@@ -75,22 +75,22 @@ void main()	{
         memoryBarrierShared();
 
         for (uint i = 0; i < SHARED_PARTICLES_BATCH_SIZE; i++) {
-            float volume = sphere_volume(shared_particles[gl_LocalInvocationIndex].minimal.size);
-            mat3 F = mat3(shared_particles[gl_LocalInvocationIndex].deformation);
+            float volume = sphere_volume(shared_particles[i].minimal.size);
+            mat3 F = mat3(shared_particles[i].deformation);
 
             float J = determinant(F);
 
             if ((J > 0.0f) && (volume > 0.0f)) {
                 mat3 F_invT = inverse(transpose(F));
 
-                vec3 v = shared_particles[gl_LocalInvocationIndex].minimal.velocity;
-                float m = shared_particles[gl_LocalInvocationIndex].minimal.mass;
+                vec3 v = shared_particles[i].minimal.velocity;
+                float m = shared_particles[i].minimal.mass;
 
                 mat3 delta = lame2 * (F - F_invT) + lame1 * log(J) * F_invT;
 
                 vec3 weight_gradient = voxel_particle_grad_weight(
                     position,
-                    shared_particles[gl_LocalInvocationIndex].minimal
+                    shared_particles[i].minimal
                 );
 
                 force -= (
@@ -100,6 +100,8 @@ void main()	{
                 );
             }
         }
+
+        memoryBarrierShared();
     }
 
     if (dt > 0.0f) {
@@ -111,7 +113,7 @@ void main()	{
     bvec3 lowerID = lessThanEqual(gl_GlobalInvocationID, ivec3(0));
     bvec3 negativeVelocity = lessThan(velocity, vec3(0.0f));
 
-    bvec3 greaterID = greaterThanEqual(gl_GlobalInvocationID + ivec3(1), imageSize(gridImage));
+    bvec3 greaterID = greaterThanEqual(gl_GlobalInvocationID + ivec3(1), imageSize(gridForceImage));
     bvec3 positiveVelocity = greaterThan(velocity, vec3(0.0f));
 
     bvec3 invert = bvec3(
diff --git a/projects/wobble_bobble/src/main.cpp b/projects/wobble_bobble/src/main.cpp
index 02096dba..23d3c90c 100644
--- a/projects/wobble_bobble/src/main.cpp
+++ b/projects/wobble_bobble/src/main.cpp
@@ -165,13 +165,13 @@ int main(int argc, const char **argv) {
 			swapchainExtent.height
 	).getHandle();
 	
-	glm::vec3 initialVelocity (0.0f, 0.0f, 0.0f);
+	glm::vec3 initialVelocity (0.0f, 1.0f, 0.0f);
 	float density = 2500.0f;
 	float radius = 0.1f;
 	
 	vkcv::Buffer<Particle> particles = core.createBuffer<Particle>(
 			vkcv::BufferType::STORAGE,
-			1024
+			64
 	);
 	
 	resetParticles(particles, initialVelocity, density, radius);
@@ -563,8 +563,8 @@ int main(int argc, const char **argv) {
 	float elasticity_modulus = 45.0f;
 	int elasticity_exponent = 9;
 	
-	float alpha = 0.5f;
-	float beta = 0.75f;
+	float alpha = 1.0f;
+	float beta = 0.0f;
 	
 	auto start = std::chrono::system_clock::now();
 	auto current = start;
-- 
GitLab