// Copyright (C) 2021 Jérôme "Lynix" Leclercq (lynix680@gmail.com) // This file is part of the "Nazara Engine - Shader module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_SHADER_SPIRVSECTIONBASE_HPP #define NAZARA_SHADER_SPIRVSECTIONBASE_HPP #include #include #include #include #include namespace Nz { class NAZARA_SHADER_API SpirvSectionBase { public: struct OpSize; struct Raw; SpirvSectionBase() = default; SpirvSectionBase(const SpirvSectionBase&) = default; SpirvSectionBase(SpirvSectionBase&&) = default; ~SpirvSectionBase() = default; inline const std::vector& GetBytecode() const; inline std::size_t GetOutputOffset() const; SpirvSectionBase& operator=(const SpirvSectionBase&) = delete; SpirvSectionBase& operator=(SpirvSectionBase&&) = default; struct OpSize { unsigned int wc; }; struct Raw { const void* ptr; std::size_t size; }; static inline UInt32 BuildOpcode(SpirvOp opcode, unsigned int wordCount); protected: inline std::size_t Append(SpirvOp opcode, const OpSize& wordCount); template std::size_t Append(SpirvOp opcode, const Args&... args); template std::size_t AppendVariadic(SpirvOp opcode, F&& callback); inline std::size_t AppendRaw(const char* str); inline std::size_t AppendRaw(const std::string_view& str); inline std::size_t AppendRaw(const std::string& str); inline std::size_t AppendRaw(UInt32 value); std::size_t AppendRaw(const Raw& raw); inline std::size_t AppendRaw(std::initializer_list codepoints); inline std::size_t AppendSection(const SpirvSectionBase& section); template || std::is_enum_v>> std::size_t AppendRaw(T value); inline unsigned int CountWord(const char* str); inline unsigned int CountWord(const std::string_view& str); inline unsigned int CountWord(const std::string& str); inline unsigned int CountWord(const Raw& raw); template || std::is_enum_v>> unsigned int CountWord(const T& value); template unsigned int CountWord(const T1& value, const T2& value2, const Args&... rest); private: std::vector m_bytecode; }; } #include #endif // NAZARA_SHADER_SPIRVSECTIONBASE_HPP