From b1cacf8f9ec97bdb37bd8f329dd5c52b21fe8a5a Mon Sep 17 00:00:00 2001
From: Sebastian Gaida <sebastian-gaida@gmx.de>
Date: Tue, 7 Sep 2021 16:58:42 +0200
Subject: [PATCH] [#111] add second compute pipeline and did some flipflop

---
 projects/particle_simulation/src/main.cpp     |  2 +-
 projects/sph/shaders/shader_gravity.comp      | 80 ----------------
 projects/sph/shaders/shader_space.comp        | 73 ---------------
 projects/sph/shaders/shader_space.frag        | 46 ----------
 .../{shader_water.comp => shader_water1.comp} | 22 ++---
 projects/sph/shaders/shader_water2.comp       | 74 +++++++++++++++
 projects/sph/src/main.cpp                     | 91 ++++++++++---------
 7 files changed, 133 insertions(+), 255 deletions(-)
 delete mode 100644 projects/sph/shaders/shader_gravity.comp
 delete mode 100644 projects/sph/shaders/shader_space.comp
 delete mode 100644 projects/sph/shaders/shader_space.frag
 rename projects/sph/shaders/{shader_water.comp => shader_water1.comp} (79%)
 create mode 100644 projects/sph/shaders/shader_water2.comp

diff --git a/projects/particle_simulation/src/main.cpp b/projects/particle_simulation/src/main.cpp
index b760d876..42efb45c 100644
--- a/projects/particle_simulation/src/main.cpp
+++ b/projects/particle_simulation/src/main.cpp
@@ -65,7 +65,7 @@ int main(int argc, const char **argv) {
 			shaderPathFragment = "shaders/shader_space.frag";
     	} else
 		if (strcmp(argv[i], "--water") == 0) {
-			shaderPathCompute = "shaders/shader_water.comp";
+			shaderPathCompute = "shaders/shader_water1.comp";
 			shaderPathFragment = "shaders/shader_water.frag";
 		} else
 		if (strcmp(argv[i], "--gravity") == 0) {
diff --git a/projects/sph/shaders/shader_gravity.comp b/projects/sph/shaders/shader_gravity.comp
deleted file mode 100644
index 77954958..00000000
--- a/projects/sph/shaders/shader_gravity.comp
+++ /dev/null
@@ -1,80 +0,0 @@
-#version 450 core
-#extension GL_ARB_separate_shader_objects : enable
-
-layout(local_size_x = 256) in;
-
-struct Particle
-{
-    vec3 position;
-    float lifeTime;
-    vec3 velocity;
-    float mass;
-    vec3 reset_velocity;
-    float _padding;
-};
-
-layout(std430, binding = 0) coherent buffer buffer_inParticle
-{
-    Particle inParticle[];
-};
-
-layout( push_constant ) uniform constants{
-    float deltaTime;
-    float rand;
-};
-
-const int n = 4;
-vec4 gravityPoint[n] = vec4[n](
-    vec4(-0.8, -0.5,  0.0, 3),
-    vec4(-0.4,  0.5,  0.8, 2),
-    vec4( 0.8,  0.8, -0.3, 4),
-    vec4( 0.5, -0.7, -0.5, 1)
-);
-
-const float G = 6.6743015e-11;
-const float sim_d_factor = 10e11;
-const float sim_g_factor = 10e30;
-const float sim_t_factor = 5;
-const float c = 299792458;
-
-void main() {
-    uint id = gl_GlobalInvocationID.x;
-    inParticle[id].lifeTime -= deltaTime;
-    vec3 pos = inParticle[id].position;
-    vec3 vel = inParticle[id].velocity;
-    float mass = inParticle[id].mass;
-
-    if(inParticle[id].lifeTime < 0.f)
-    {
-        inParticle[id].lifeTime = 5.f * rand;
-        inParticle[id].mass *= rand;
-
-        pos = vec3(0);
-        vel *= rand;
-    }
-
-    for(int i = 0; i < n; i++)
-    {
-        vec3 d = (gravityPoint[i].xyz - pos) * sim_d_factor;
-        float r = length(d);
-        float g = G * (gravityPoint[i].w * sim_g_factor) / (r * r);
-
-        if (r > 0) {
-            vec3 dvel = (deltaTime * sim_t_factor) * g * (d / r);
-
-            vel = (vel + dvel) / (1.0 + dot(vel, dvel) / (c*c));
-        }
-    }
-
-    pos += vel * (deltaTime * sim_t_factor);
-
-    vec3 a_pos = abs(pos);
-
-    if ((a_pos.x > 2.0) || (a_pos.y > 2.0) || (a_pos.z > 2.0))
-    {
-        inParticle[id].lifeTime *= 0.9;
-    }
-
-    inParticle[id].position = pos;
-    inParticle[id].velocity = vel;
-}
diff --git a/projects/sph/shaders/shader_space.comp b/projects/sph/shaders/shader_space.comp
deleted file mode 100644
index 6e25fff8..00000000
--- a/projects/sph/shaders/shader_space.comp
+++ /dev/null
@@ -1,73 +0,0 @@
-#version 450 core
-#extension GL_ARB_separate_shader_objects : enable
-
-layout(local_size_x = 256) in;
-
-struct Particle
-{
-    vec3 position;
-    float lifeTime;
-    vec3 velocity;
-    float padding_2;
-    vec3 reset_velocity;
-    float padding_3;
-};
-
-layout(std430, binding = 0) coherent buffer buffer_inParticle
-{
-    Particle inParticle[];
-};
-
-layout( push_constant ) uniform constants{
-    float deltaTime;
-    float rand;
-};
-
-vec3 attraction(vec3 pos, vec3 attractPos)
-{
-    vec3 delta = attractPos - pos;
-    const float damp = 0.5;
-    float dDampedDot = dot(delta, delta) + damp;
-    float invDist = 1.0f / sqrt(dDampedDot);
-    float invDistCubed = invDist*invDist*invDist;
-    return delta * invDistCubed * 0.0035;
-}
-
-vec3 repulsion(vec3 pos, vec3 attractPos)
-{
-    vec3 delta = attractPos - pos;
-    float targetDistance = sqrt(dot(delta, delta));
-    return delta * (1.0 / (targetDistance * targetDistance * targetDistance)) * -0.000035;
-}
-
-
-const int n = 4;
-vec3 gravity = vec3(0,-9.8,0);
-vec3 gravityPoint[n] = vec3[n](vec3(-0.3, .5, -0.6),vec3(-0.2, 0.6, -0.3),vec3(.4, -0.4, 0.6),vec3(-.4, -0.4, -0.6));
-//vec3 gravityPoint[n] = vec3[n](vec3(-0.5, 0.5, 0));
-void main() {
-    uint id = gl_GlobalInvocationID.x;
-    inParticle[id].lifeTime -= deltaTime;
-    vec3 pos = inParticle[id].position;
-    vec3 vel = inParticle[id].velocity;
-    if(inParticle[id].lifeTime < 0.f)
-    {
-        inParticle[id].lifeTime = 5.f;
-        pos = vec3(0);
-    }
-    //    inParticle[id].position += deltaTime * -normalize(max(2 - distance(inParticle[id].position,respawnPos),0.0) * respawnPos - inParticle[id].position);
-
-    for(int i = 0; i < n; i++)
-    {
-        vel += deltaTime * deltaTime * normalize(max(2 - distance(pos,gravityPoint[i]),0.1) * gravityPoint[i] - pos);
-    }
-
-    if((pos.x <= -2.0) || (pos.x > 2.0) || (pos.y <= -2.0) || (pos.y > 2.0)|| (pos.z <= -2.0) || (pos.z > 2.0)){
-        vel = (-vel * 0.1);
-    }
-
-    pos += normalize(vel) * deltaTime;
-    inParticle[id].position = pos;
-    float rand1 = rand;
-    inParticle[id].velocity = vel;
-}
diff --git a/projects/sph/shaders/shader_space.frag b/projects/sph/shaders/shader_space.frag
deleted file mode 100644
index 7f6d2206..00000000
--- a/projects/sph/shaders/shader_space.frag
+++ /dev/null
@@ -1,46 +0,0 @@
-#version 450
-#extension GL_ARB_separate_shader_objects : enable
-#extension GL_GOOGLE_include_directive : enable
-
-#include "particleShading.inc"
-
-layout(location = 0) in vec2 passTriangleCoordinates;
-layout(location = 1) in vec3 passVelocity;
-layout(location = 2) in float passlifeTime;
-
-layout(location = 0) out vec3 outColor;
-
-layout(set=0, binding=0) uniform uColor {
-	vec4 color;
-} Color;
-
-layout(set=0,binding=1) uniform uPosition{
-	vec2 position;
-} Position;
-
-
-void main()
-{
-	vec2 mouse = vec2(Position.position.x, Position.position.y);
-    
-    vec3 c0 = vec3(1, 1, 0.05);
-    vec3 c1 = vec3(1, passlifeTime * 0.5, 0.05);
-    vec3 c2 = vec3(passlifeTime * 0.5,passlifeTime * 0.5,0.05);
-    vec3 c3 = vec3(1, 0.05, 0.05);
-    
-    if(passlifeTime  < 1){
-        outColor = mix(c0, c1, passlifeTime );
-    }
-    else if(passlifeTime  < 2){
-        outColor = mix(c1, c2, passlifeTime  - 1);
-    }
-    else{
-        outColor = mix(c2, c3, clamp((passlifeTime  - 2) * 0.5, 0, 1));
-    }
-   
-   // make the triangle look like a circle
-   outColor *= circleFactor(passTriangleCoordinates);
-   
-   // fade out particle shortly before it dies
-   outColor *= clamp(passlifeTime * 2, 0, 1);
-}
\ No newline at end of file
diff --git a/projects/sph/shaders/shader_water.comp b/projects/sph/shaders/shader_water1.comp
similarity index 79%
rename from projects/sph/shaders/shader_water.comp
rename to projects/sph/shaders/shader_water1.comp
index a182b401..80b1e8cc 100644
--- a/projects/sph/shaders/shader_water.comp
+++ b/projects/sph/shaders/shader_water1.comp
@@ -25,7 +25,7 @@ layout(std430, binding = 1) writeonly buffer buffer_outParticle
 
 layout( push_constant ) uniform constants{
     float deltaTime;
-    float rand;
+    float particleCount;
 };
 
 vec3 attraction(vec3 pos, vec3 attractPos)
@@ -52,6 +52,14 @@ vec3 gravityPoint[n] = vec3[n](vec3(-0.5, 0.5, 0),vec3(0.5, 0.5, 0),vec3(0, -0.5
 //vec3 gravityPoint[n] = vec3[n](vec3(-0.5, 0.5, 0));
 void main() {
     uint id = gl_GlobalInvocationID.x;
+
+    if(id >= int(particleCount))
+    {
+        return;
+    }
+
+    outParticle[id] = inParticle[id];
+
     outParticle[id].lifeTime = inParticle[id].lifeTime - deltaTime;
     vec3 pos = inParticle[id].position;
     vec3 vel = inParticle[id].velocity;
@@ -62,28 +70,16 @@ void main() {
         vel = inParticle[id].reset_velocity;
         outParticle[id].velocity = inParticle[id].reset_velocity;
     }
-    //    inParticle[id].position += deltaTime * -normalize(max(2 - distance(inParticle[id].position,respawnPos),0.0) * respawnPos - inParticle[id].position);
 
     for(int i = 0; i < n; i++)
     {
         vel += deltaTime * deltaTime * deltaTime * normalize(max(2 - distance(pos,gravityPoint[i]),0.1) * gravityPoint[i] - pos);
     }
 
-    //vec3 delta = respawnPos - pos;
-    //float targetDistane = sqrt(dot(delta,delta));
-    //vel += repulsion(pos, respawnPos);
-
-    //if((pos.x <= -1.0) || (pos.x > 1.0) || (pos.y <= -1.0) || (pos.y > 1.0)|| (pos.z <= -1.0) || (pos.z > 1.0))
     vel = (-vel * 0.01);
-
-    if((pos.y <= -1.0) || (pos.y > 1.0)){
-        vel = reflect(vel, vec3(0,1,0));
-    }
-
     pos += normalize(vel) * deltaTime;
     outParticle[id].position = pos;
 
     float weight = 1.0;
-    float rand1 = rand;
     outParticle[id].velocity = vel;
 }
diff --git a/projects/sph/shaders/shader_water2.comp b/projects/sph/shaders/shader_water2.comp
new file mode 100644
index 00000000..32599a64
--- /dev/null
+++ b/projects/sph/shaders/shader_water2.comp
@@ -0,0 +1,74 @@
+#version 450 core
+#extension GL_ARB_separate_shader_objects : enable
+
+layout(local_size_x = 256) in;
+
+struct Particle
+{
+    vec3 position;
+    float lifeTime;
+    vec3 velocity;
+    float padding_2;
+    vec3 reset_velocity;
+    float padding_3;
+};
+
+layout(std430, binding = 1) readonly buffer buffer_inParticle
+{
+    Particle inParticle[];
+};
+
+layout(std430, binding = 0) writeonly buffer buffer_outParticle
+{
+    Particle outParticle[];
+};
+
+layout( push_constant ) uniform constants{
+    float deltaTime;
+    float particleCount;
+};
+
+const ivec4 gridSize = ivec4(4);
+const ivec4 origin = ivec4(1);
+const float energyloss = 0.0;
+
+void main() {
+    uint id = gl_GlobalInvocationID.x;
+
+    if(id >= int(particleCount))
+    {
+        return;
+    }
+
+    outParticle[id] = inParticle[id];
+    //collisition X-Axis
+//    if(inParticle[id].position.x >= gridSize.x - origin.x)
+//    {
+//        outParticle[id].position.x = gridSize.x  - origin.x - 0.001f;
+//        outParticle[id].velocity = reflect(inParticle[id].velocity.xyz,vec3(-1.f,0.f,0.f))* energyloss;
+//    }else if(inParticle[id].position.x < origin.x)
+//    {
+//        outParticle[id].position.x = origin.x + 0.001f;
+//        outParticle[id].velocity = reflect(inParticle[id].velocity.xyz,vec3(1.f,0.f,0.f)) * energyloss;
+//    }
+//    //collisition Y-Axis
+//    if(inParticle[id].position.y >= gridSize.y - origin.y)
+//    {
+//        outParticle[id].position.y = gridSize.y - origin.y - 0.001f;
+//        outParticle[id].velocity = reflect(inParticle[id].velocity.xyz,vec3(0.f,-1.f,0.f)) * energyloss;
+//    }else if(inParticle[id].position.y < origin.y)
+//    {
+//        outParticle[id].position.y = origin.y + 0.001f;
+//        outParticle[id].velocity = reflect(inParticle[id].velocity.xyz,vec3(0.f,1.f,0.f)) * energyloss;
+//    }
+//    //collisition Z-Axis
+//    if(inParticle[id].position.z >= gridSize.z - origin.z)
+//    {
+//        outParticle[id].position.z = gridSize.z - origin.z - 0.001f;
+//        outParticle[id].velocity = reflect(inParticle[id].velocity.xyz,vec3(0.f,0.f,-1.f)) * energyloss;
+//    }else if(inParticle[id].position.z < origin.z)
+//    {
+//        outParticle[id].position.z = origin.z + 0.001f;
+//        outParticle[id].velocity = reflect(inParticle[id].velocity.xyz,vec3(0.f,0.f,1.f)) * energyloss;
+//    }
+}
diff --git a/projects/sph/src/main.cpp b/projects/sph/src/main.cpp
index 5acdd906..9550af8b 100644
--- a/projects/sph/src/main.cpp
+++ b/projects/sph/src/main.cpp
@@ -11,7 +11,7 @@
 #include "BloomAndFlares.hpp"
 
 int main(int argc, const char **argv) {
-    const char *applicationName = "Particlesystem";
+    const char *applicationName = "SPH";
 
     vkcv::Window window = vkcv::Window::create(
             applicationName,
@@ -54,48 +54,47 @@ int main(int argc, const char **argv) {
         std::cout << "Error. Could not create renderpass. Exiting." << std::endl;
         return EXIT_FAILURE;
     }
-
-    // use space or use water or gravity
-    std::string shaderPathCompute = "shaders/shader_water.comp";
-	std::string shaderPathFragment = "shaders/shader_water.frag";
-
-//    for (int i = 1; i < argc; i++) {
-//    	if (strcmp(argv[i], "--space") == 0) {
-//    		shaderPathCompute = "shaders/shader_space.comp";
-//			shaderPathFragment = "shaders/shader_space.frag";
-//    	} else
-//		if (strcmp(argv[i], "--water") == 0) {
-//			shaderPathCompute = "shaders/shader_water.comp";
-//			shaderPathFragment = "shaders/shader_water.frag";
-//		} else
-//		if (strcmp(argv[i], "--gravity") == 0) {
-//			shaderPathCompute = "shaders/shader_gravity.comp";
-//			shaderPathFragment = "shaders/shader_space.frag";
-//		}
-//    }
-
-    vkcv::shader::GLSLCompiler compiler;
-    vkcv::ShaderProgram computeShaderProgram{};
-    compiler.compile(vkcv::ShaderStage::COMPUTE, shaderPathCompute, [&](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) {
-        computeShaderProgram.addShader(shaderStage, path);
+	vkcv::shader::GLSLCompiler compiler;
+// comp shader 1
+    vkcv::ShaderProgram computeShaderProgram1{};
+    compiler.compile(vkcv::ShaderStage::COMPUTE, "shaders/shader_water1.comp", [&](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) {
+        computeShaderProgram1.addShader(shaderStage, path);
     });
 
-    vkcv::DescriptorSetLayoutHandle computeDescriptorSetLayout = core.createDescriptorSetLayout(computeShaderProgram.getReflectedDescriptors().at(0));
-    vkcv::DescriptorSetHandle computeDescriptorSet = core.createDescriptorSet(computeDescriptorSetLayout);
+    vkcv::DescriptorSetLayoutHandle computeDescriptorSetLayout1 = core.createDescriptorSetLayout(computeShaderProgram1.getReflectedDescriptors().at(0));
+    vkcv::DescriptorSetHandle computeDescriptorSet1 = core.createDescriptorSet(computeDescriptorSetLayout1);
 
-    const std::vector<vkcv::VertexAttachment> computeVertexAttachments = computeShaderProgram.getVertexAttachments();
+    const std::vector<vkcv::VertexAttachment> computeVertexAttachments1 = computeShaderProgram1.getVertexAttachments();
 
-    std::vector<vkcv::VertexBinding> computeBindings;
-    for (size_t i = 0; i < computeVertexAttachments.size(); i++) {
-        computeBindings.push_back(vkcv::VertexBinding(i, { computeVertexAttachments[i] }));
+    std::vector<vkcv::VertexBinding> computeBindings1;
+    for (size_t i = 0; i < computeVertexAttachments1.size(); i++) {
+        computeBindings1.push_back(vkcv::VertexBinding(i, { computeVertexAttachments1[i] }));
     }
-    const vkcv::VertexLayout computeLayout(computeBindings);
+    const vkcv::VertexLayout computeLayout1(computeBindings1);
+
+// comp shader 2
+	vkcv::ShaderProgram computeShaderProgram2{};
+	compiler.compile(vkcv::ShaderStage::COMPUTE, "shaders/shader_water2.comp", [&](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) {
+		computeShaderProgram2.addShader(shaderStage, path);
+	});
+
+	vkcv::DescriptorSetLayoutHandle computeDescriptorSetLayout2 = core.createDescriptorSetLayout(computeShaderProgram2.getReflectedDescriptors().at(0));
+	vkcv::DescriptorSetHandle computeDescriptorSet2 = core.createDescriptorSet(computeDescriptorSetLayout2);
+
+	const std::vector<vkcv::VertexAttachment> computeVertexAttachments2 = computeShaderProgram2.getVertexAttachments();
+
+	std::vector<vkcv::VertexBinding> computeBindings2;
+	for (size_t i = 0; i < computeVertexAttachments2.size(); i++) {
+		computeBindings2.push_back(vkcv::VertexBinding(i, { computeVertexAttachments2[i] }));
+	}
+	const vkcv::VertexLayout computeLayout2(computeBindings2);
 
+// shader
     vkcv::ShaderProgram particleShaderProgram{};
     compiler.compile(vkcv::ShaderStage::VERTEX, "shaders/shader.vert", [&](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) {
         particleShaderProgram.addShader(shaderStage, path);
     });
-    compiler.compile(vkcv::ShaderStage::FRAGMENT, shaderPathFragment, [&](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) {
+    compiler.compile(vkcv::ShaderStage::FRAGMENT, "shaders/shader_water.frag", [&](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) {
         particleShaderProgram.addShader(shaderStage, path);
     });
 
@@ -137,7 +136,8 @@ int main(int argc, const char **argv) {
 
     vkcv::PipelineHandle particlePipeline = core.createGraphicsPipeline(particlePipelineDefinition);
 
-    vkcv::PipelineHandle computePipeline = core.createComputePipeline(computeShaderProgram, {core.getDescriptorSetLayout(computeDescriptorSetLayout).vulkanHandle} );
+    vkcv::PipelineHandle computePipeline1 = core.createComputePipeline(computeShaderProgram1, {core.getDescriptorSetLayout(computeDescriptorSetLayout1).vulkanHandle} );
+	vkcv::PipelineHandle computePipeline2 = core.createComputePipeline(computeShaderProgram2, {core.getDescriptorSetLayout(computeDescriptorSetLayout2).vulkanHandle} );
 
     vkcv::Buffer<glm::vec4> color = core.createBuffer<glm::vec4>(
             vkcv::BufferType::UNIFORM,
@@ -177,9 +177,10 @@ int main(int argc, const char **argv) {
     vkcv::DescriptorWrites computeWrites;
     computeWrites.storageBufferWrites = { vkcv::BufferDescriptorWrite(0,particleBuffer1.getHandle()),
 										  vkcv::BufferDescriptorWrite(1,particleBuffer2.getHandle())};
-    core.writeDescriptorSet(computeDescriptorSet, computeWrites);
+    core.writeDescriptorSet(computeDescriptorSet1, computeWrites);
+	core.writeDescriptorSet(computeDescriptorSet2, computeWrites);
 
-    if (!particlePipeline || !computePipeline)
+    if (!particlePipeline || !computePipeline1 || !computePipeline2)
     {
         std::cout << "Error. Could not create graphics pipeline. Exiting." << std::endl;
         return EXIT_FAILURE;
@@ -252,8 +253,6 @@ int main(int argc, const char **argv) {
         tonemappingShader, 
         { core.getDescriptorSetLayout(tonemappingDescriptorLayout).vulkanHandle });
 
-    std::uniform_real_distribution<float> rdm = std::uniform_real_distribution<float>(0.95f, 1.05f);
-    std::default_random_engine rdmEngine;
     while (window.isWindowOpen()) {
         vkcv::Window::pollEvents();
 
@@ -281,22 +280,30 @@ int main(int argc, const char **argv) {
         renderingMatrices.projection = cameraManager.getActiveCamera().getProjection();
 
         auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics);
-        float random = rdm(rdmEngine);
-        glm::vec2 pushData = glm::vec2(deltatime, random);
+        glm::vec2 pushData = glm::vec2(deltatime, static_cast<float>(particleSystem.getParticles().size()));
 
         vkcv::PushConstants pushConstantsCompute (sizeof(glm::vec2));
         pushConstantsCompute.appendDrawcall(pushData);
         
         uint32_t computeDispatchCount[3] = {static_cast<uint32_t> (std::ceil(particleSystem.getParticles().size()/256.f)),1,1};
         core.recordComputeDispatchToCmdStream(cmdStream,
-                                              computePipeline,
+                                              computePipeline1,
                                               computeDispatchCount,
-                                              {vkcv::DescriptorSetUsage(0,core.getDescriptorSet(computeDescriptorSet).vulkanHandle)},
+                                              {vkcv::DescriptorSetUsage(0,core.getDescriptorSet(computeDescriptorSet1).vulkanHandle)},
 											  pushConstantsCompute);
 
         core.recordBufferMemoryBarrier(cmdStream, particleBuffer1.getHandle());
 		core.recordBufferMemoryBarrier(cmdStream, particleBuffer2.getHandle());
 
+		core.recordComputeDispatchToCmdStream(cmdStream,
+											  computePipeline2,
+											  computeDispatchCount,
+											  {vkcv::DescriptorSetUsage(0,core.getDescriptorSet(computeDescriptorSet2).vulkanHandle)},
+											  pushConstantsCompute);
+
+		core.recordBufferMemoryBarrier(cmdStream, particleBuffer1.getHandle());
+		core.recordBufferMemoryBarrier(cmdStream, particleBuffer2.getHandle());
+
         vkcv::PushConstants pushConstantsDraw (sizeof(renderingMatrices));
         pushConstantsDraw.appendDrawcall(renderingMatrices);
         
-- 
GitLab