diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp index fbd1cc9cce12ee9584065708b56810e6859cf733..d44c50161db32ba386ad21926269dea907e35352 100644 --- a/include/vkcv/Core.hpp +++ b/include/vkcv/Core.hpp @@ -166,7 +166,9 @@ namespace vkcv * @return True if pipeline creation was successful, False if not */ [[nodiscard]] - PipelineHandle createComputePipeline(const ShaderProgram &config); + PipelineHandle createComputePipeline( + const ShaderProgram &config, + const std::vector<vk::DescriptorSetLayout> &descriptorSetLayouts); /** * Creates a basic vulkan render pass using @p config from the render pass config class and returns it using the @p handle. diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp index 648118a667caa9b0c155ec4ecc58a4b5b90d9b5c..d79ece30d83bdbba7dd8570c0363c0da395be90e 100644 --- a/projects/first_triangle/src/main.cpp +++ b/projects/first_triangle/src/main.cpp @@ -119,8 +119,14 @@ int main(int argc, const char** argv) { // Compute Pipeline vkcv::ShaderProgram computeShaderProgram{}; computeShaderProgram.addShader(vkcv::ShaderStage::COMPUTE, std::filesystem::path("shaders/comp.spv")); + computeShaderProgram.reflectShader(vkcv::ShaderStage::COMPUTE); - vkcv::PipelineHandle computePipeline = core.createComputePipeline(computeShaderProgram); + // take care, assuming shader has exactly one descriptor set + vkcv::DescriptorSetHandle computeDescriptorSet = core.createDescriptorSet(computeShaderProgram.getReflectedDescriptors()[0]); + + vkcv::PipelineHandle computePipeline = core.createComputePipeline( + computeShaderProgram, + { core.getDescriptorSet(computeDescriptorSet).layout }); /* * BufferHandle triangleVertices = core.createBuffer(vertices); diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp index 057821119d96b5403180e9afdf4a4fd6042cfaea..afa450065a0bf26fe6ed2cab55e83e56b97b01cb 100644 --- a/src/vkcv/Core.cpp +++ b/src/vkcv/Core.cpp @@ -101,9 +101,11 @@ namespace vkcv return m_PipelineManager->createPipeline(config, *m_PassManager); } - PipelineHandle Core::createComputePipeline(const ShaderProgram &shaderProgram) + PipelineHandle Core::createComputePipeline( + const ShaderProgram &shaderProgram, + const std::vector<vk::DescriptorSetLayout>& descriptorSetLayouts) { - return m_PipelineManager->createComputePipeline(shaderProgram); + return m_PipelineManager->createComputePipeline(shaderProgram, descriptorSetLayouts); } diff --git a/src/vkcv/PipelineManager.cpp b/src/vkcv/PipelineManager.cpp index 6a0a42b276453788c40e2307fe230ff80233a9e5..765263b2cf6cd073a6c049b3ff8e68f368ce9983 100644 --- a/src/vkcv/PipelineManager.cpp +++ b/src/vkcv/PipelineManager.cpp @@ -315,9 +315,11 @@ namespace vkcv return m_Configs.at(id); } - PipelineHandle PipelineManager::createComputePipeline(const ShaderProgram &shaderProgram) { - // Temporally handing over the Shader Program instead of a pipeline config + PipelineHandle PipelineManager::createComputePipeline( + const ShaderProgram &shaderProgram, + const std::vector<vk::DescriptorSetLayout> &descriptorSetLayouts) { + // Temporally handing over the Shader Program instead of a pipeline config vk::ShaderModule computeModule{}; if (createShaderModule(computeModule, shaderProgram, ShaderStage::COMPUTE) != vk::Result::eSuccess) return PipelineHandle(); @@ -330,14 +332,14 @@ namespace vkcv nullptr ); - // TODO: Validation Layer Error -> the size is 0 but has to be greater! - const size_t matrixPushConstantSize = shaderProgram.getPushConstantSize(); - const vk::PushConstantRange pushConstantRange(vk::ShaderStageFlagBits::eAll, 0, matrixPushConstantSize); + vk::PipelineLayoutCreateInfo pipelineLayoutCreateInfo({}, descriptorSetLayouts); - vk::PipelineLayoutCreateInfo pipelineLayoutCreateInfo( // TODO: Check this. I'm not sure if this is correct - {}, - {}, // TODO: For now no Descriptor Set - {});// (pushConstantRange)); push constant range must not be size 0, either do not specify or or set size + const size_t pushConstantSize = shaderProgram.getPushConstantSize(); + vk::PushConstantRange pushConstantRange(vk::ShaderStageFlagBits::eCompute, 0, pushConstantSize); + if (pushConstantSize > 0) { + pipelineLayoutCreateInfo.setPushConstantRangeCount(1); + pipelineLayoutCreateInfo.setPPushConstantRanges(&pushConstantRange); + } vk::PipelineLayout vkPipelineLayout{}; if (m_Device.createPipelineLayout(&pipelineLayoutCreateInfo, nullptr, &vkPipelineLayout) != vk::Result::eSuccess) diff --git a/src/vkcv/PipelineManager.hpp b/src/vkcv/PipelineManager.hpp index 568a8d5b8933355b0eb516a997c3df94f54edb89..634f5f4e6464532306e35fd10d9a1623df6ace16 100644 --- a/src/vkcv/PipelineManager.hpp +++ b/src/vkcv/PipelineManager.hpp @@ -37,7 +37,9 @@ namespace vkcv PipelineHandle createPipeline(const PipelineConfig &config, PassManager& passManager); - PipelineHandle createComputePipeline(const ShaderProgram &shaderProgram); + PipelineHandle createComputePipeline( + const ShaderProgram& shaderProgram, + const std::vector<vk::DescriptorSetLayout>& descriptorSetLayouts); [[nodiscard]] vk::Pipeline getVkPipeline(const PipelineHandle &handle) const;