From 3c77a6b5ba1a3a2ce482cf7a838247818c12d6bc Mon Sep 17 00:00:00 2001
From: Mark Oliver Mints <mmints@uni-koblenz.de>
Date: Wed, 9 Jun 2021 11:54:10 +0200
Subject: [PATCH] [#65][Update] Extend first_triangle by a Compute Pipeline

---
 projects/first_triangle/shaders/comp.spv    | Bin 0 -> 2004 bytes
 projects/first_triangle/shaders/shader.comp |  21 ++++++++++++++++++++
 projects/first_triangle/src/main.cpp        |   7 +++++++
 3 files changed, 28 insertions(+)
 create mode 100644 projects/first_triangle/shaders/comp.spv
 create mode 100644 projects/first_triangle/shaders/shader.comp

diff --git a/projects/first_triangle/shaders/comp.spv b/projects/first_triangle/shaders/comp.spv
new file mode 100644
index 0000000000000000000000000000000000000000..622ced351097932ea7f7eb1451e9433bc017812d
GIT binary patch
literal 2004
zcmZ9M+fNfw5XO&`B8uGP<_#>M0Yy={i6RIJE;UUs@xjMtZ8xyVQb<{eylJBUi_bp!
zj~OqCiQjK~CfW2P!_0i=n>lmYQs|gI@7y_e(e=95u5|`ohY;s_Tvw)p%G=8PNm`#@
zT7C$l&lNHvoPKeN(w&mSFm7-$BpDD6HYkB-Qc!G%{2u~3^=eS5277x!Wv5y@KCYgm
zXGv5|;zm@h$IYmg#-|ay?i?>})RGVNJfSE?{{5mVx}Z1Sgw60UN~7k9%c=z9yo>AU
zfi#taQQK}5?;oUKof$@rp@iH$(#Pado}y}@zx|{dBuDSVq}(_?s)cEM)F^Lf{DPa6
zj_a-11=&e>md%a#@Ht_#Sv`|3Y931&(&Del7XJ|te0&c4kJ9khGekAZv!15gFnR)G
zF2<uLux?49Jj8+pV$l<Q-tayJbV)4U>b7@?2P=3!JxobB<inrLyq5n|c0Ql=mCpxe
z`RFm951)MWMgG9sQklQ&eY-Eqr=P2mA$3Wglgdth>|y<-o)P8J55ScqoKZ2DPf0T2
z=gU3P!ue`lHaq6Grg(hb!YAJ)>5_z6=Dgo4n^ThCCk>aJWAgcpU{f3Sm!*jXCqF*>
zv3zicB^>x8(%gaDd+agKzv+GWGoA~7T(7cgdYh2VPVwO_N;4}k>cD5OVD`?6_u)U5
zO<&|9FFUuq>=qy1Gih>wkr$u+f^q-c+r%!&r_Mk^Kj!axe^FaxPGt!kaC%+Q?#RdY
z%VD;^h48<MH)o`0CFI@`%1-(v?2%oq`*#OC4u?69O4tSSH_n*Hzl*~+bwxrP_&4PN
z<2wZZrAn?#bN=cM{F(%e`mn8@aoP5pw6`XNfm=N#+0;YN#+j5|l2|=cvWWx#qc`j=
z^iNHI`lcn+$9&*Z2esao=1?n~TM{s8#r~(QV1rrRcVxHE@vbm%t9wp%d)@bhfqzjI
z?B%|MIB<)bm)$=92g1NV`8fXB5(~be9@sOO&1YFQ7&-Z7S0&WTw+yFS`iTVGVm4&A
zV!E>Lb2GbZeJk8q+?H(azA86)UP#CVzNJa?ZNHT8JK{T|7K`1M&E01oyCWNn92WaZ
Oc0QK=z~HirRmp!!>V9DW

literal 0
HcmV?d00001

diff --git a/projects/first_triangle/shaders/shader.comp b/projects/first_triangle/shaders/shader.comp
new file mode 100644
index 00000000..c63870da
--- /dev/null
+++ b/projects/first_triangle/shaders/shader.comp
@@ -0,0 +1,21 @@
+#version 440
+
+layout(local_size_x_id = 0, local_size_y_id = 1) in; // workgroup size defined with specialization constants. On cpp side there is associated SpecializationInfo entry in PipelineShaderStageCreateInfo
+layout(push_constant) uniform Parameters {           // specify push constants. on cpp side its layout is fixed at PipelineLayout, and values are provided via vk::CommandBuffer::pushConstants()
+    uint Width;
+    uint Height;
+    float a;
+} params;
+
+layout(std430, binding = 0) buffer lay0 { float arr_y[]; };
+layout(std430, binding = 1) buffer lay1 { float arr_x[]; };
+
+void main(){
+    // drop threads outside the buffer dimensions.
+    if(params.Width <= gl_GlobalInvocationID.x || params.Height <= gl_GlobalInvocationID.y){
+        return;
+    }
+    const uint id = params.Width*gl_GlobalInvocationID.y + gl_GlobalInvocationID.x; // current offset
+
+    arr_y[id] += params.a*arr_x[id]; // saxpy
+}
\ No newline at end of file
diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp
index 2ede653f..648118a6 100644
--- a/projects/first_triangle/src/main.cpp
+++ b/projects/first_triangle/src/main.cpp
@@ -92,6 +92,7 @@ int main(int argc, const char** argv) {
 		return EXIT_FAILURE;
 	}
 
+	// Graphics Pipeline
 	vkcv::ShaderProgram triangleShaderProgram{};
 	triangleShaderProgram.addShader(vkcv::ShaderStage::VERTEX, std::filesystem::path("shaders/vert.spv"));
 	triangleShaderProgram.addShader(vkcv::ShaderStage::FRAGMENT, std::filesystem::path("shaders/frag.spv"));
@@ -115,6 +116,12 @@ int main(int argc, const char** argv) {
 		return EXIT_FAILURE;
 	}
 
+	// Compute Pipeline
+	vkcv::ShaderProgram computeShaderProgram{};
+	computeShaderProgram.addShader(vkcv::ShaderStage::COMPUTE, std::filesystem::path("shaders/comp.spv"));
+
+	vkcv::PipelineHandle computePipeline = core.createComputePipeline(computeShaderProgram);
+
 	/*
 	 * BufferHandle triangleVertices = core.createBuffer(vertices);
 	 * BufferHandle triangleIndices = core.createBuffer(indices);
-- 
GitLab