#ifndef __SCOP_SHADER__ #define __SCOP_SHADER__ #include #include #include #include namespace Scop { struct ShaderSetLayout { std::vector > binds; ShaderSetLayout(std::vector > b) : binds(std::move(b)) {} }; struct ShaderPushConstantLayout { std::size_t offset; std::size_t size; ShaderPushConstantLayout(std::size_t o, std::size_t s) : offset(o), size(s) {} }; struct ShaderLayout { std::vector > set_layouts; std::vector push_constants; ShaderLayout(std::vector > s, std::vector pc) : set_layouts(std::move(s)), push_constants(std::move(pc)) {} }; enum class ShaderType { Vertex, Fragment, Compute }; struct ShaderPipelineLayoutPart { std::vector push_constants; std::vector set_layouts; }; class Shader { public: Shader(const std::vector& bytecode, ShaderType type, ShaderLayout layout); [[nodiscard]] inline const ShaderLayout& GetShaderLayout() const { return m_layout; } [[nodiscard]] inline const std::vector& GetByteCode() const noexcept { return m_bytecode; } [[nodiscard]] inline const ShaderPipelineLayoutPart& GetPipelineLayout() const noexcept { return m_pipeline_layout_part; } [[nodiscard]] inline VkShaderModule GetShaderModule() const noexcept { return m_module; } [[nodiscard]] inline VkShaderStageFlagBits GetShaderStage() const noexcept { return m_stage; } void Destroy(); ~Shader(); private: void GeneratePipelineLayout(ShaderLayout layout); private: ShaderLayout m_layout; ShaderPipelineLayoutPart m_pipeline_layout_part; std::vector m_bytecode; std::vector m_set_layouts; VkShaderStageFlagBits m_stage; VkShaderModule m_module = VK_NULL_HANDLE; }; std::shared_ptr LoadShaderFromFile(const std::filesystem::path& filepath, ShaderType type, ShaderLayout layout); } #endif