diff --git a/src/vkcv/ShaderProgram.hpp b/include/vkcv/ShaderProgram.hpp similarity index 74% rename from src/vkcv/ShaderProgram.hpp rename to include/vkcv/ShaderProgram.hpp index 107b6d17aa693547beceae9a97a1ee076a796987..d9f60f17c60a6945ab70b0554e3bda7b81881cd8 100644 --- a/src/vkcv/ShaderProgram.hpp +++ b/include/vkcv/ShaderProgram.hpp @@ -10,14 +10,17 @@ #include <fstream> #include <iostream> #include <vulkan/vulkan.hpp> -#include "Context.hpp" namespace vkcv { class ShaderProgram final { public: - enum ShaderStage {VERTEX, FRAGMENT, COMPUTE}; + enum class ShaderStage { + VERTEX, + FRAGMENT, + COMPUTE + }; /** @@ -39,28 +42,35 @@ namespace vkcv { * @param[in] flag that signals the respective shaderStage (e.g. VK_SHADER_STAGE_VERTEX_BIT) * @param[in] relative path to the shader code (e.g. "../../../../../shaders/vert.spv") */ - void addShader(vk::ShaderStageFlagBits shaderStage, const std::string& filepath); + void addShader(ShaderProgram::ShaderStage shaderStage, const std::string& filepath); /** * Tests if the shader program contains a certain shader stage. * @param[in] flag that signals the respective shader stage (e.g. VK_SHADER_STAGE_VERTEX_BIT) * @return boolean that is true if the shader program contains the shader stage */ - bool containsShaderStage(vk::ShaderStageFlagBits shaderStage); + bool containsShaderStage(ShaderProgram::ShaderStage shaderStage); /** * Deletes the given shader stage in the shader program. * @param[in] flag that signals the respective shader stage (e.g. VK_SHADER_STAGE_VERTEX_BIT) * @return boolean that is false if the shader stage was not found in the shader program */ - bool deleteShaderStage(vk::ShaderStageFlagBits shaderStage); + bool deleteShaderStage(ShaderProgram::ShaderStage shaderStage); /** * Returns a list with all the shader stages in the shader program. * Needed for the transfer to the pipeline. * @return vector list with all shader stage info structs */ - std::vector<vk::PipelineShaderStageCreateInfo> getShaderStages(); + std::vector<vk::ShaderStageFlagBits> getShaderStages(); + + /** + * Returns a list with all the shader code in the shader program. + * Needed for the transfer to the pipeline. + * @return vector list with all shader code char vecs + */ + std::vector<std::vector<char>> getShaderCode(); /** * Returns the number of shader stages in the shader program. @@ -78,16 +88,13 @@ namespace vkcv { std::vector<vk::ShaderStageFlagBits> shaderStageFlag; }; - vkcv::Context& m_context; - std::vector<vk::PipelineShaderStageCreateInfo> m_shaderStagesList; - ShaderStages m_shaderStages; /** * Constructor of ShaderProgram requires a context for the logical device. * @param context of the app */ - ShaderProgram(vkcv::Context& context); + ShaderProgram(); /** * Reads the file of a given shader code. @@ -97,6 +104,13 @@ namespace vkcv { */ std::vector<char> readFile(const std::string& filepath); + /** + * Converts ShaderStage Enum into vk::ShaderStageFlagBits + * @param[in] ShaderStage enum + * @return vk::ShaderStageFlagBits + */ + vk::ShaderStageFlagBits convertToShaderStageFlagBits(ShaderProgram::ShaderStage shaderStage); + /** * Creates a shader module that encapsulates the read shader code. * Only used within the class. @@ -104,7 +118,7 @@ namespace vkcv { * @param[in] a vector of chars as a buffer for the code * @return shader module */ - vk::ShaderModule createShaderModule(const std::vector<char>& shaderCode); + //vk::ShaderModule createShaderModule(const std::vector<char>& shaderCode); -> Core /** * Creates a shader stage (info struct) for the to be added shader. @@ -113,11 +127,7 @@ namespace vkcv { * @param[in] flag that signals the respective shaderStage * @return pipeline shader stage info struct */ - vk::PipelineShaderStageCreateInfo createShaderStage(vk::ShaderModule& shaderModule, vk::ShaderStageFlagBits shaderStage); - - - - + //vk::PipelineShaderStageCreateInfo createShaderStage(vk::ShaderModule& shaderModule, vk::ShaderStageFlagBits shaderStage); -> Core }; } diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp index 24c3b4afd3b86a7396a8500a30da43e025d2e867..40d58de34e5d4f735229f3955c085f92dcd412e4 100644 --- a/projects/first_triangle/src/main.cpp +++ b/projects/first_triangle/src/main.cpp @@ -34,13 +34,6 @@ int main(int argc, const char** argv) { default: std::cout << "Unknown GPU vendor?! Either you're on an exotic system or your driver is broken..." << std::endl; } -<<<<<<< HEAD - vkcv::ShaderProgram shaderProgram = vkcv::ShaderProgram::create(context); - shaderProgram.addShader(vk::ShaderStageFlagBits::eVertex , "../../../../../shaders/vert.spv"); - shaderProgram.addShader(vk::ShaderStageFlagBits::eFragment, "../../../../../shaders/frag.spv"); - - while (window.isWindowOpen()) { -======= /* * BufferHandle triangleVertices = core.createBuffer(vertices); * BufferHandle triangleIndices = core.createBuffer(indices); @@ -65,7 +58,6 @@ int main(int argc, const char** argv) { // TBD: synchronization ->>>>>>> 74ff8e7041d7958006a434cf4d3a7fee0a3fa724 window.pollEvents(); } return 0; diff --git a/src/vkcv/ShaderProgram.cpp b/src/vkcv/ShaderProgram.cpp index 917e192c589d02f3e26aa7cf9c5201bea4c1a915..7659b1a7d94a3968c9be424e8a46945f7621cdb6 100644 --- a/src/vkcv/ShaderProgram.cpp +++ b/src/vkcv/ShaderProgram.cpp @@ -4,7 +4,7 @@ * @brief ShaderProgram class to handle and prepare the shader stages for a graphics pipeline */ -#include "ShaderProgram.hpp" +#include "vkcv/ShaderProgram.hpp" std::vector<const char*> validationLayers = { "VK_LAYER_KHRONOS_validation" @@ -31,22 +31,34 @@ namespace vkcv { return buffer; } - vk::ShaderModule ShaderProgram::createShaderModule(const std::vector<char>& shaderCode) { + vk::ShaderStageFlagBits ShaderProgram::convertToShaderStageFlagBits(ShaderProgram::ShaderStage shaderStage){ + switch (shaderStage) { + case ShaderStage::VERTEX: + return vk::ShaderStageFlagBits::eVertex; + case ShaderStage::FRAGMENT: + return vk::ShaderStageFlagBits::eFragment; + case ShaderStage::COMPUTE: + return vk::ShaderStageFlagBits::eCompute; + } + throw std::runtime_error("Shader Type not yet implemented."); + } + + /*vk::ShaderModule ShaderProgram::createShaderModule(const std::vector<char>& shaderCode) { vk::ShaderModuleCreateInfo createInfo({}, shaderCode.size(), reinterpret_cast<const uint32_t*>(shaderCode.data())); vk::ShaderModule shaderModule; if ((m_context.getDevice().createShaderModule(&createInfo, nullptr, &shaderModule)) != vk::Result::eSuccess) { throw std::runtime_error("Failed to create shader module!"); } return shaderModule; - } + }*/ - vk::PipelineShaderStageCreateInfo ShaderProgram::createShaderStage(vk::ShaderModule& shaderModule, vk::ShaderStageFlagBits shaderStage) { + /*vk::PipelineShaderStageCreateInfo ShaderProgram::createShaderStage(vk::ShaderModule& shaderModule, vk::ShaderStageFlagBits shaderStage) { vk::PipelineShaderStageCreateInfo shaderStageInfo({}, shaderStage, shaderModule, "main", {}); shaderStageInfo.stage = shaderStage; shaderStageInfo.module = shaderModule; shaderStageInfo.pName = "main"; return shaderStageInfo; - } + }*/ ShaderProgram::~ShaderProgram() { } @@ -55,47 +67,53 @@ namespace vkcv { return ShaderProgram(); } - //TODO: Enum übergeben statt ShaderStageFlagBits - void ShaderProgram::addShader(vk::ShaderStageFlagBits shaderStage, const std::string& filepath) { + void ShaderProgram::addShader(ShaderProgram::ShaderStage shaderStage, const std::string& filepath) { if (containsShaderStage(shaderStage)) { throw std::runtime_error("Shader program already contains this particular shader stage."); } else { auto shaderCode = readFile(filepath); + vk::ShaderStageFlagBits convertedShaderStage = convertToShaderStageFlagBits(shaderStage); //vk::ShaderModule shaderModule = createShaderModule(shaderCode); //vk::PipelineShaderStageCreateInfo shaderInfo = createShaderStage(shaderModule, shaderStage); //m_shaderStagesList.push_back(shaderInfo); //m_context.getDevice().destroyShaderModule(shaderModule, nullptr); m_shaderStages.shaderCode.push_back(shaderCode); - m_shaderStages.shaderStageFlag.push_back(shaderStage); - + m_shaderStages.shaderStageFlag.push_back(convertedShaderStage); } } - bool ShaderProgram::containsShaderStage(vk::ShaderStageFlagBits shaderStage) { - for (int i = 0; i < m_shaderStagesList.size(); i++) { - if (m_shaderStagesList[i].stage == shaderStage) { + bool ShaderProgram::containsShaderStage(ShaderProgram::ShaderStage shaderStage) { + vk::ShaderStageFlagBits convertedShaderStage = convertToShaderStageFlagBits(shaderStage); + for (int i = 0; i < m_shaderStages.shaderStageFlag.size(); i++) { + if (m_shaderStages.shaderStageFlag[i] == convertedShaderStage) { return true; } } return false; } - bool ShaderProgram::deleteShaderStage(vk::ShaderStageFlagBits shaderStage) { - for (int i = 0; i < m_shaderStagesList.size() - 1; i++) { - if (m_shaderStagesList[i].stage == shaderStage) { - m_shaderStagesList.erase(m_shaderStagesList.begin() + i); + bool ShaderProgram::deleteShaderStage(ShaderProgram::ShaderStage shaderStage) { + vk::ShaderStageFlagBits convertedShaderStage = convertToShaderStageFlagBits(shaderStage); + for (int i = 0; i < m_shaderStages.shaderStageFlag.size() - 1; i++) { + if (m_shaderStages.shaderStageFlag[i] == convertedShaderStage) { + m_shaderStages.shaderStageFlag.erase(m_shaderStages.shaderStageFlag.begin() + i); + m_shaderStages.shaderCode.erase(m_shaderStages.shaderCode.begin() + i); return true; } } return false; } - std::vector<vk::PipelineShaderStageCreateInfo> ShaderProgram::getShaderStages() { - return m_shaderStagesList; + std::vector<vk::ShaderStageFlagBits> ShaderProgram::getShaderStages() { + return m_shaderStages.shaderStageFlag; + } + + std::vector<std::vector<char>> ShaderProgram::getShaderCode() { + return m_shaderStages.shaderCode; } int ShaderProgram::getShaderStagesCount() { - return m_shaderStagesList.size(); + return m_shaderStages.shaderStageFlag.size(); } }