From dca0b5cc5ac6e5d0c2ced06b23dc665f822249f7 Mon Sep 17 00:00:00 2001
From: Sebastian Gaida <gaida@ca-digit.com>
Date: Mon, 21 Jun 2021 20:05:39 +0200
Subject: [PATCH] [#69] added instance rendering and added GPU computation

---
 include/vkcv/DrawcallRecording.hpp            |   5 +-
 .../particle_simulation/shaders/comp1.spv     | Bin 1316 -> 2112 bytes
 projects/particle_simulation/shaders/frag.spv | Bin 1064 -> 1156 bytes
 .../particle_simulation/shaders/shader.frag   |   4 +-
 .../particle_simulation/shaders/shader.vert   |   9 +++-
 .../particle_simulation/shaders/shader1.comp  |  14 ++++-
 projects/particle_simulation/shaders/vert.spv | Bin 1620 -> 2116 bytes
 .../src/ParticleSystem.cpp                    |   4 ++
 .../src/ParticleSystem.hpp                    |   2 +
 projects/particle_simulation/src/main.cpp     |  51 ++++++++----------
 src/vkcv/DrawcallRecording.cpp                |   4 +-
 11 files changed, 56 insertions(+), 37 deletions(-)

diff --git a/include/vkcv/DrawcallRecording.hpp b/include/vkcv/DrawcallRecording.hpp
index 0929ad03..7f653d21 100644
--- a/include/vkcv/DrawcallRecording.hpp
+++ b/include/vkcv/DrawcallRecording.hpp
@@ -37,11 +37,12 @@ namespace vkcv {
     };
 
     struct DrawcallInfo {
-        inline DrawcallInfo(const Mesh& mesh, const std::vector<DescriptorSetUsage>& descriptorSets)
-            : mesh(mesh), descriptorSets(descriptorSets) {}
+        inline DrawcallInfo(const Mesh& mesh, const std::vector<DescriptorSetUsage>& descriptorSets, const uint32_t instanceCount)
+            : mesh(mesh), descriptorSets(descriptorSets), instanceCount(instanceCount){}
 
         Mesh                            mesh;
         std::vector<DescriptorSetUsage> descriptorSets;
+        uint32_t                        instanceCount;
     };
 
     void recordDrawcall(
diff --git a/projects/particle_simulation/shaders/comp1.spv b/projects/particle_simulation/shaders/comp1.spv
index aa72785c8955dbb67fd1d1f5d37274e8789ddb40..c82562d6735289dd7f7ba2dbeb2243817034d47d 100644
GIT binary patch
delta 1109
zcmZ3&bwGfZnMs+Qfq{{Mi-DKHeIxH_Mo(4-Rt9MX28QJPyyB9?ypm!D1_m|;Hn122
z0|P@*YH>kgd0s$%F+!Y?fq@|<HK!yoBr`Xafq{XQftf*e@<qnumL5>kKsuE{1Oo#D
zObnz8B*w$Qz~Iin47Py@%w}P5+dP*^nz3G+frUYwfq_Aa0pv&q1~~>6urfgg1_l8J
z1_lKN76usx1_n+B2C%p_lrIYv1If!l*)a8r3=9k)Ye0OE`5;;o>NF7sCI&4A1_r2j
zJ%c`2!odM#kP*}%kmVr0DbyekAEW`~P&=p?h|k8rz~I8bz~BHi5X5(ddPIkT4eV$)
zs2Y$s2%9mmf*r>Kws*1{OI*Dp11kf_5AqBQ3?P4j!orq;1?qnW29UTT13LrAUrG!N
z3}Orn3=#|s43f}rgQ*1tHAudhffcM*g@J(qB&NW?zyQ;)imAVz!H$8M0VDy^05S~Z
z4>bk`1`Z^R>PQ+va>$O<U|?VX$?srbg$6DI14s-M=-(Nb8FayZWnlQlz`~%-z`&rx
zzyKEe!NA0z!%)w_0JBsN%~As-OF?oVOF@nWiGv~zrq2+rkCg!wiN?^71ceev4JZOl
z7#J8p;-HWKMXVXj?0N<U29N<D#UR5$5+KDt8JOU%1o;4D5GZ8Kp_ak;7EnISU`v?6
z3=9k)Igq&^wID}WF)%QI<Y7^6&A`A=j~?eX3=9k)36Lg`g|=uG*dtj0k^?14kXn!h
zpri<r?_*$P0P!86$rEH|BUH?Zfq?<!5RjZB1G_E*C^(#v3<dcR<Z4i8fW$!>{xUE!
JSTHa$003VbMOFX+

delta 284
zcmX>gu!M`3nMs+Qfq{{Mi-DIxZ6oh##>pB?2Uy)1SQu0{D>6$n)+;cuFi0~nFfcJN
zFbFa*FlaNdFbFU(Fvu}L0E{osz`($DUD-y5feoxq0jdTh4pIwJ$Hu_Gpv=I)-~crT
z#8+VeS<k=#(#Ofbz@Q3M0}@wZV3@4Unj31%z`_7hE5*RTz`?-4;K;xZc9RSP1A`a?
z1A_zu0|Q77M1$0V+$qbzzyOkOWMBomN0EVn0VD=;7g+z~gRH_5ARTrL%nV8l3=AL@
Me;F7VEEpIW0ApVhwg3PC

diff --git a/projects/particle_simulation/shaders/frag.spv b/projects/particle_simulation/shaders/frag.spv
index 1b3a6f369887d3cad66e2f93316261c9c94202ac..a37f971964481b32a05bafc7efcf0c7b4b25671e 100644
GIT binary patch
delta 298
zcmZ3%(Zb2g%%sfDz`)4B#lXv;GLhF*oSlJ%fdPzj6EpJ|7#J9&7#J87CWijCXJb%c
zU|=XnEG`a9&B;&BEU5%Zvof$SC^9fGlsf0<<QFk8uraWL`5?Juh!6uvjq>D5#%Nb}
z1{Sa>att6_85lf}R4aqDFfcH<GcbcqU;?vQ7(n7ma5)wR<;|Q-qKrZf_Sy_A3~USx
z3^Gv3$p*|KiXaXMi!-n=fNTLNU<P@CfrUXHWb5QaW?@Z61_lN>s67%;S&$tdJ3+p&
PW?*3e@s%eRGH(X}R`DGS

delta 209
zcmZqST*1N1%%sfDz`)4B#lXv;IFZ*>n2mvjfdPzj6EpJ|7#J9&CPw}hW?_(HU|=Y9
z&d<p&VqjonU}cb-+{h@*s4#gdW3;IUh!0ZBz`&pkrQI2r!Fre&7#Q3cSQr!-7#Nh`
zax4rAn@yQS8J!szv>8|!*cccXWWbUQ_Bssg3=#|s46+Oi4AM|>5Dmg|P(wlT3Jfd^
S@(c_NOp_-v3s1hlyafQ3VHGI=

diff --git a/projects/particle_simulation/shaders/shader.frag b/projects/particle_simulation/shaders/shader.frag
index f7a6c9bc..1c228be0 100644
--- a/projects/particle_simulation/shaders/shader.frag
+++ b/projects/particle_simulation/shaders/shader.frag
@@ -1,6 +1,8 @@
 #version 450
 #extension GL_ARB_separate_shader_objects : enable
 
+layout(location = 1) in vec3 passVelocity;
+
 layout(location = 0) out vec4 outColor;
 
 layout(set=0, binding=0) uniform uColor {
@@ -14,7 +16,7 @@ layout(set=0,binding=1) uniform uPosition{
 void main()
 {
 	vec2 mouse = vec2(Position.position.x, Position.position.y);
-		outColor = vec4(0,1,0,0);
+		outColor = vec4(1,0,0,0);
 		//outColor = float(distance(gl_FragCoord.xy, mouse) < 100) * vec4(0,0,1,0) +
 		// 		   float(distance(gl_FragCoord.xy, mouse) >= 100) * Color.color;
 }
\ No newline at end of file
diff --git a/projects/particle_simulation/shaders/shader.vert b/projects/particle_simulation/shaders/shader.vert
index 9e3a8249..d68f087f 100644
--- a/projects/particle_simulation/shaders/shader.vert
+++ b/projects/particle_simulation/shaders/shader.vert
@@ -1,4 +1,4 @@
-#version 450 core
+#version 460 core
 #extension GL_ARB_separate_shader_objects : enable
 
 layout(location = 0) in vec3 particle;
@@ -20,7 +20,12 @@ layout( push_constant ) uniform constants{
     mat4 mvp;
 };
 
+layout(location = 1) out vec3 passVelocity;
+
 void main()
 {
-	gl_Position = mvp * vec4(particle, 1.0);
+    int id = gl_InstanceIndex;
+    passVelocity = inParticle[id].velocity;
+    vec3 moved_particle = particle + inParticle[id].position;
+	gl_Position =   mvp * vec4(moved_particle, 1.0);
 }
\ No newline at end of file
diff --git a/projects/particle_simulation/shaders/shader1.comp b/projects/particle_simulation/shaders/shader1.comp
index ee84397b..eea7fe7b 100644
--- a/projects/particle_simulation/shaders/shader1.comp
+++ b/projects/particle_simulation/shaders/shader1.comp
@@ -16,7 +16,19 @@ layout(std430, binding = 0) coherent buffer buffer_inParticle
     Particle inParticle[];
 };
 
+layout( push_constant ) uniform constants{
+    vec3 respawnPos;
+    float deltaTime;
+};
+
 void main() {
     uint id = gl_GlobalInvocationID.x;
-    inParticle[id].position = inParticle[id].position + vec3(0.f,0.01f,0.f);
+    inParticle[id].lifeTime -= deltaTime;
+    if(inParticle[id].lifeTime < 0.f)
+    {
+        inParticle[id].lifeTime = 3.f;
+        inParticle[id].position = respawnPos;
+    }
+
+    inParticle[id].position = (inParticle[id].position + deltaTime * inParticle[id].velocity);
 }
diff --git a/projects/particle_simulation/shaders/vert.spv b/projects/particle_simulation/shaders/vert.spv
index 841133cd5ef81d8fed6fdf94b598f82627eed2f5..bdfc6c77e59f2b2a73ea0c4ec9a44086a438d15e 100644
GIT binary patch
literal 2116
zcmZQ(Qf6mhU}WH8;AOC8fB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!N<T1qQG+e
z44hy#3j+f~ZenI0h{MIez`)PIz#zxKz@Wvzz`)GF%)rFJz;K3<fq{jAlfm65-Z982
zzBsiYu_&=5HNH3_F(tJqK0hfdHMyi1q=pNm#@*lF-N!XPxu77vxTG>CH9jXZFEu_T
zvnVyWB(p3Pq>ckgU1nZ#PH76V0#*hV24r`!GB7i6FfcG=rZ6zDGO#m%+?k#e@0nLz
zl9-pA>Y104S^;uDD+3$Y{RN4|#bK#A`N^3jl@M`O1_1^JhJeJPlFa0sRFD`O0~=Tj
z#4gA$&Me8y2ZsSn92AZ@nQ5sZnYk$HLE%w`WHwAaC}ax~Q&KYX(&LR7Anp`mU|>ip
zO-oBHiqFhLvK*ubBnPq^Spwuw5s)BQKO2J#C~or0Qd8m!;4WunU<JnyLIh+N8-oS|
z14DXFd_ZbZSZYxTBs@U&fW$#Yg5+S{WMg0ls|WcJES{NH5}a8D^(RCQ<j?e+c;}qV
z0+&okI5WWXf&2=RE6vG)%YobuN;4q4KyK7wU|>kj2geX7X)v%curPqcK=Qd|1q>kd
zdLRx11A{vQ3ph@>85kI}p?p|61i8_J0TO>8<;oy}fq?-g29gJf@gRwT+zt{0#W_qJ
z$ju-zP?&=36J%guU}IolPyp*=VSvSlIGE20=Y#ZstaN8!28)5r0qF<DlM+Y*>Ru3E
zk%0l6UqJGpJOsiZB_KDz;sNAGWHFHYL1G{prViwOkQm4=m>7r+5(DK6kXu0Jfz){*
zg)1x6?XYl$xgBH%OpKj@0i5nZW`M*%W(YGdf!(bL&hZdGh%&Ii!w2Lx1qK!dkX{gm
zgd3<t0F^+HaI^-O5DegW1gRHeU}gZt2`GHU8CV#285qEPkUv0X@qx=12Cz6tFNhC{
zbCA3oG;hN6z-U<pW(H8af#OvT8Xq7&$UI?a*n{E`WFCkQiW89kw4r_x1qD1fjY0ed
ziffQONWTPBKgcc+Uz&jd>|YpPmI2~d5Fcbdh!2WikY7RmQ-S&q6hEM_Q-!82kd+|&
zL3}l+88Qqk4C+wzATf}CLGcMQ10)B+Aa`g&!wDo0vKPb$<ugz?NieX0^9x8H$X-yG
zfZ`OChd_FD85qE&JV*?r7sLnUIZ(+DlGlgIgVclE2#PObkb@Z->_PIDP`g3qn=!D0
z(+J2OkP?vnKNy%8KxqzSHYi<y%4iS`;)B8ul-EFfTWI)$(l4m&wu6@EAU;e^jDZ1M
z#yc{wGl1ekl7WE%6n~&N1IdBn3Zxbk{!$DK3?O-sIiNHH;=|<Rq4gJt4@sw}=7RDl
z%v?~~1ep&~3o;j!pF#4C46NXE3Ccep^FZPtyFmT{i8(T`GJwJkRH=f(6J`b|91R&5
z7(n7MGeLC$NM9fWD>(g|FfcHH#6V#P6ElU1fzlF8%nT|9N}mA?><pkdFlS(30O<#*
v2g!rtY9a$GSk8ihfdOPUNDat+pt!Sw*5e@ef!q(`gVg<HU}UghU}OLQd@8GA

literal 1620
zcmZQ(Qf6mhU}WH8;APNYfB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!N<T1qQG+e
z4D4Vw3j+f~ZenI0h{Makz#z%Mz`)GF%)rFJz;K9>fq{jAlfm65-Z982zBsiYu_&=5
zHNH3_F(tJqK0hfdHMyi1q=pNm#@*lF-N!XPxu77vxTG>CH9jXZFEu_TvnVyWB(p3P
zq>ckgU1nZ#PH76V0#*hV24wfJGO#glGcYiu=fnr37KNo2m84dH+{p$N2eCnN`Nf$f
znfZAPYz*vR^`I~Si)ZGQ1ZP&Ig4Ds}K>kY4iFeM)EO5yzE=kNwPKE0Og$_urG$#ix
z$I8IW016k78LSMf41x>{49WR<Ae|tuGq5qRfW<)axn%_mAoao^4g&)NNIfV#3lfV;
zGLv(_?f{7?GcYg&Ac=we0}=yiD}Z^1fq?-g4)RY<W?E`UW-izam^jEUWvMy&$(bdU
zAiXegkUt6%Q&KYX(&LT5?qFw7Wnf@PDosmEEsD>~L$VyC2P6m5k1PT5hdM}*fq}t;
zffXFCATB6AKr~DY<Tj8Ph=z%Q+yxQ?xdSE!VuQp$@$1gO3^os>&I2j@SfO@-!Wd)+
zEKERVz{EhQR)B$l0b~Y93}l8o0}D9a%7HXN&4B5J(I7KGY>+!aG!K$GkQpE`khw5*
zAoqgAWWaW@FsOjzgMmQ-td9j8o*?VQ!F*OYAEXB)4sstTTtVi5+y@FvC6ENvJP==z
zfdQP)gc+E?v?4g?LBzxum>Jj@Aohtfuz+(bhz|-sQ3e(U4yYW+NNp&elL1sBFfhn4
zurP2z-3t<vgXR}d*n!Ld$$_u}0}BHv96)Xa#f>$T4@&PKF_1lcP<ue(2C@gl=LcEJ
zz`!8Ez`_6uGmyC;cgZm@gYyDN3}m(t0|Nudeo#Dt%m(p6c>^Q{k{5x>gVclk2ntJ(
z`#^Ss<Rzf~0f~e3gZQBQ1ak{Wtu)vz4fY`Qpzs9g1-S?0XHZ;#^n%pEXjukka9o1q
zK<)*_5h!j!`qiNE0TKh*2jYX`36ws}7+Aq^1o9`yN{~H27?>D9Y1WZ}l>y`zQ3eJE
zkpDp8V+#!%F$M+(kT{4Ba)T7Kj16P}m2RN8VqgG?fy{)7$udC1K>mb@fzmce9mp*K
z4D8_aAkP5N4^j`32ZhB%23D{fD4l}r2B`tL4-___^aqMtko)Wym>EEPkh;GNj0_eG
Gj0^zCZ-?&y

diff --git a/projects/particle_simulation/src/ParticleSystem.cpp b/projects/particle_simulation/src/ParticleSystem.cpp
index daf9a16d..b3162d6b 100644
--- a/projects/particle_simulation/src/ParticleSystem.cpp
+++ b/projects/particle_simulation/src/ParticleSystem.cpp
@@ -54,3 +54,7 @@ void ParticleSystem::setRdmVelocity( glm::vec3 minVelocity, glm::vec3 maxVelocit
     m_rdmVel[1] = std::uniform_real_distribution<float> (minVelocity.y,maxVelocity.y);
     m_rdmVel[2] = std::uniform_real_distribution<float> (minVelocity.z,maxVelocity.z);
 }
+
+const glm::vec3 ParticleSystem::getRespawnPos() const{
+    return m_respawnPos;
+}
diff --git a/projects/particle_simulation/src/ParticleSystem.hpp b/projects/particle_simulation/src/ParticleSystem.hpp
index 2afb8253..fe5c99f9 100644
--- a/projects/particle_simulation/src/ParticleSystem.hpp
+++ b/projects/particle_simulation/src/ParticleSystem.hpp
@@ -14,6 +14,8 @@ public:
     void setRespawnPos( const glm::vec3 respawnPos );
     void setRdmLifeTime( const glm::vec2 lifeTime );
     void setRdmVelocity( glm::vec3 minVelocity, glm::vec3 maxVelocity );
+    const glm::vec3 getRespawnPos() const;
+
 private:
 
     void addParticle( const Particle particle );
diff --git a/projects/particle_simulation/src/main.cpp b/projects/particle_simulation/src/main.cpp
index a9c3e259..5305be84 100644
--- a/projects/particle_simulation/src/main.cpp
+++ b/projects/particle_simulation/src/main.cpp
@@ -120,9 +120,9 @@ int main(int argc, const char **argv) {
             1
     );
 
-    glm::vec3 minVelocity = glm::vec3(-0.0f,-0.0f,0.f);
-    glm::vec3 maxVelocity = glm::vec3(0.0f,0.0f,0.f);
-    glm::vec2 lifeTime = glm::vec2(0.f,5.f);
+    glm::vec3 minVelocity = glm::vec3(-0.1f,-0.1f,0.f);
+    glm::vec3 maxVelocity = glm::vec3(0.1f,0.1f,0.f);
+    glm::vec2 lifeTime = glm::vec2(0.f,2.f);
     ParticleSystem particleSystem = ParticleSystem( 100 , minVelocity, maxVelocity, lifeTime);
 
     vkcv::Buffer<Particle> particleBuffer = core.createBuffer<Particle>(
@@ -164,6 +164,7 @@ int main(int argc, const char **argv) {
 
     window.e_mouseMove.add([&](double offsetX, double offsetY) {
         pos = glm::vec2(static_cast<float>(offsetX), static_cast<float>(offsetY));
+//        std::cout << offsetX << " , " << offsetY << std::endl;
         // borders are assumed to be 0.5
         //pos = glm::vec2((pos.x -0.5f * static_cast<float>(window.getWidth()))/static_cast<float>(window.getWidth()), (pos.y -0.5f * static_cast<float>(window.getHeight()))/static_cast<float>(window.getHeight()));
         //borders are assumed to be 1
@@ -173,11 +174,11 @@ int main(int argc, const char **argv) {
         glm::vec4 row2 = glm::row(cameraManager.getCamera(0).getView(), 1);
         glm::vec4 row3 = glm::row(cameraManager.getCamera(0).getView(), 2);
         glm::vec4 camera_pos = glm::column(cameraManager.getCamera(0).getView(), 3);
-        std::cout << "row1: " << row1.x << ", " << row1.y << ", " << row1.z << std::endl;
-        std::cout << "row2: " << row2.x << ", " << row2.y << ", " << row2.z << std::endl;
-        std::cout << "row3: " << row3.x << ", " << row3.y << ", " << row3.z << std::endl;
-        std::cout << "camerapos: " << camera_pos.x << ", " << camera_pos.y << ", " << camera_pos.z << std::endl;
-        std::cout << "camerapos: " << camera_pos.x << ", " << camera_pos.y << ", " << camera_pos.z << std::endl;
+//        std::cout << "row1: " << row1.x << ", " << row1.y << ", " << row1.z << std::endl;
+//        std::cout << "row2: " << row2.x << ", " << row2.y << ", " << row2.z << std::endl;
+//        std::cout << "row3: " << row3.x << ", " << row3.y << ", " << row3.z << std::endl;
+//        std::cout << "camerapos: " << camera_pos.x << ", " << camera_pos.y << ", " << camera_pos.z << std::endl;
+//        std::cout << "camerapos: " << camera_pos.x << ", " << camera_pos.y << ", " << camera_pos.z << std::endl;
         //glm::vec4 view_axis = glm::row(cameraManager.getCamera().getView(), 2);
         // std::cout << "view_axis: " << view_axis.x << ", " << view_axis.y << ", " << view_axis.z << std::endl;
         //std::cout << "Front: " << cameraManager.getCamera().getFront().x << ", " << cameraManager.getCamera().getFront().z << ", " << cameraManager.getCamera().getFront().z << std::endl;
@@ -186,15 +187,12 @@ int main(int argc, const char **argv) {
         tempPosition = viewmat * glm::vec4(spawnPosition, 1.0f);
         spawnPosition = glm::vec3(tempPosition.x, tempPosition.y, tempPosition.z);
         particleSystem.setRespawnPos(glm::vec3(-spawnPosition.x, -spawnPosition.y, spawnPosition.z));
-        std::cout << "respawn pos: " << spawnPosition.x << ", " << spawnPosition.y << ", " << spawnPosition.z << std::endl;
+//        std::cout << "respawn pos: " << spawnPosition.x << ", " << spawnPosition.y << ", " << spawnPosition.z << std::endl;
     });
 
     std::vector<glm::mat4> modelMatrices;
     std::vector<vkcv::DrawcallInfo> drawcalls;
-    for (auto particle :  particleSystem.getParticles()) {
-        modelMatrices.push_back(glm::translate(glm::mat4(1.f), particle.getPosition()));
-        drawcalls.push_back(vkcv::DrawcallInfo(renderMesh, {descriptorUsage}));
-    }
+    drawcalls.push_back(vkcv::DrawcallInfo(renderMesh, {descriptorUsage}, particleSystem.getParticles().size()));
 
     auto start = std::chrono::system_clock::now();
 
@@ -215,41 +213,36 @@ int main(int argc, const char **argv) {
         }
 
         color.fill(&colorData);
-
-
         position.fill(&pos);
+
         auto end = std::chrono::system_clock::now();
-        auto deltatime = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
+        float deltatime = 0.000001 * static_cast<float>( std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() );
         start = end;
-        particleSystem.updateParticles(0.000001 * static_cast<float>(deltatime.count()));
+        particleSystem.updateParticles(deltatime);
 
-        modelMatrices.clear();
-        for (Particle particle :  particleSystem.getParticles()) {
-            modelMatrices.push_back(glm::translate(glm::mat4(1.f), particle.getPosition()));
-        }
-
-        cameraManager.update(0.000001 * static_cast<double>(deltatime.count()));
+        cameraManager.update(deltatime);
         std::vector<glm::mat4> mvp;
         mvp.clear();
-        for (const auto &m : modelMatrices) {
-            mvp.push_back(m * cameraManager.getActiveCamera().getMVP());
-        }
+        mvp.push_back( cameraManager.getCamera(0).getMVP());
 
-        vkcv::PushConstantData pushConstantData((void *) mvp.data(), sizeof(glm::mat4));
         auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics);
 
+        glm::vec4 pushData = glm::vec4(particleSystem.getRespawnPos(),deltatime);
+
+        vkcv::PushConstantData pushConstantDataCompute( &pushData, sizeof(glm::vec4));
         uint32_t computeDispatchCount[3] = {static_cast<uint32_t> (std::ceil(particleSystem.getParticles().size()/64.f)),1,1};
         core.recordComputeDispatchToCmdStream(cmdStream,
                                               computePipeline,
                                               computeDispatchCount,
                                               {vkcv::DescriptorSetUsage(0,core.getDescriptorSet(computeDescriptorSet).vulkanHandle)},
-                                               vkcv::PushConstantData(nullptr, 0));
+                                              pushConstantDataCompute);
 
+        vkcv::PushConstantData pushConstantDataDraw((void *) mvp.data(), sizeof(glm::mat4));
         core.recordDrawcallsToCmdStream(
                 cmdStream,
                 particlePass,
                 particlePipeline,
-                pushConstantData,
+                pushConstantDataDraw,
                 {drawcalls},
                 {swapchainInput});
         core.prepareSwapchainImageForPresent(cmdStream);
diff --git a/src/vkcv/DrawcallRecording.cpp b/src/vkcv/DrawcallRecording.cpp
index df7b7bbc..5e0ef6ba 100644
--- a/src/vkcv/DrawcallRecording.cpp
+++ b/src/vkcv/DrawcallRecording.cpp
@@ -36,10 +36,10 @@ namespace vkcv {
 
         if (drawcall.mesh.indexBuffer) {
             cmdBuffer.bindIndexBuffer(drawcall.mesh.indexBuffer, 0, vk::IndexType::eUint16);	//FIXME: choose proper size
-            cmdBuffer.drawIndexed(drawcall.mesh.indexCount, 1, 0, 0, {});
+            cmdBuffer.drawIndexed(drawcall.mesh.indexCount, drawcall.instanceCount, 0, 0, {});
         }
         else {
             cmdBuffer.draw(drawcall.mesh.indexCount, 1, 0, 0, {});
         }
     }
-}
\ No newline at end of file
+}
-- 
GitLab