From c0d3d3c4304b8eed9c78634b530cfbcd64ab5d08 Mon Sep 17 00:00:00 2001
From: Mark Oliver Mints <mmints@uni-koblenz.de>
Date: Wed, 9 Jun 2021 09:30:28 +0200
Subject: [PATCH] [#65][Add] Compute Shader Module

---
 src/vkcv/PipelineManager.cpp | 19 ++++++++++++++++---
 src/vkcv/PipelineManager.hpp |  4 +++-
 2 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/src/vkcv/PipelineManager.cpp b/src/vkcv/PipelineManager.cpp
index c8da089b..d0161271 100644
--- a/src/vkcv/PipelineManager.cpp
+++ b/src/vkcv/PipelineManager.cpp
@@ -315,10 +315,14 @@ namespace vkcv
         return m_Configs.at(id);
     }
 
-    PipelineHandle PipelineManager::createComputePipeline() {
-
+    PipelineHandle PipelineManager::createComputePipeline(const ShaderProgram &shaderProgram) {
+        // Temporally handing over the Shader Program instead of a pipeline config
 
         // TODO: Set Compute Shader Stage
+        vk::ShaderModule computeModule{};
+        if (createShaderModule(computeModule, shaderProgram, ShaderStage::COMPUTE) != vk::Result::eSuccess)
+            return PipelineHandle();
+
         vk::PipelineShaderStageCreateInfo pipelineShaderStageCreateInfo; // TODO: Set params
 
         // TODO: Set Compute Pipeline Layout
@@ -331,7 +335,16 @@ namespace vkcv
         {
             // TODO: Set Params
         }
-
         return PipelineHandle();
     }
+
+    // There is an issue for refactoring the Pipeline Manager.
+    // While including Compute Pipeline Creation, some private helper functions where introduced:
+
+    vk::Result PipelineManager::createShaderModule(vk::ShaderModule &module, const ShaderProgram &shaderProgram, const ShaderStage stage)
+    {
+        std::vector<char> code = shaderProgram.getShader(stage).shaderCode;
+        vk::ShaderModuleCreateInfo moduleInfo({}, code.size(), reinterpret_cast<uint32_t*>(code.data()));
+        return m_Device.createShaderModule(&moduleInfo, nullptr, &module);
+    }
 }
\ No newline at end of file
diff --git a/src/vkcv/PipelineManager.hpp b/src/vkcv/PipelineManager.hpp
index 43590dfa..cdff8153 100644
--- a/src/vkcv/PipelineManager.hpp
+++ b/src/vkcv/PipelineManager.hpp
@@ -21,6 +21,8 @@ namespace vkcv
         std::vector<PipelineConfig> m_Configs;
         
         void destroyPipelineById(uint64_t id);
+
+        vk::Result createShaderModule(vk::ShaderModule &module, const ShaderProgram &shaderProgram, const ShaderStage stage);
         
     public:
         PipelineManager() = delete; // no default ctor
@@ -35,7 +37,7 @@ namespace vkcv
 
         PipelineHandle createPipeline(const PipelineConfig &config, PassManager& passManager);
 
-        PipelineHandle createComputePipeline();
+        PipelineHandle createComputePipeline(const ShaderProgram &shaderProgram);
 
         [[nodiscard]]
         vk::Pipeline getVkPipeline(const PipelineHandle &handle) const;
-- 
GitLab