#ifndef EMULATOR_INCLUDE_EMULATOR_GRAPHICS_SHADER_RECOMPILER_SPIRVBUILDER_H_ #define EMULATOR_INCLUDE_EMULATOR_GRAPHICS_SHADER_RECOMPILER_SPIRVBUILDER_H_ #include "common/common.h" #include #include namespace Libs::Graphics::ShaderRecompiler::Spirv { class Builder { public: Builder(); ~Builder() = default; KYTY_CLASS_DEFAULT_COPY(Builder); uint32_t AllocateId(); void AddCapability(std::initializer_list operands); void AddExtension(const char* name); void AddExtInstImport(uint32_t id, const char* name); void AddMemoryModel(std::initializer_list operands); void AddEntryPoint(uint32_t execution_model, uint32_t entry_point, const char* name, const std::vector& interfaces); void AddExecutionMode(std::initializer_list operands); void AddName(uint32_t target, const char* name); void AddAnnotation(std::initializer_list words); void AddType(std::initializer_list words); void AddFunction(std::initializer_list words); void AddFunction(const std::vector& words); [[nodiscard]] std::vector Build() const; private: static void AppendInstruction(std::vector& section, uint32_t opcode, const std::vector& operands); static void AppendInstruction(std::vector& section, uint32_t opcode, std::initializer_list operands); static void AppendString(std::vector& words, const char* text); uint32_t m_next_id = 1; std::vector m_capabilities; std::vector m_extensions; std::vector m_ext_inst_imports; std::vector m_memory_model; std::vector m_entry_points; std::vector m_execution_modes; std::vector m_debug; std::vector m_annotations; std::vector m_types; std::vector m_functions; }; } // namespace Libs::Graphics::ShaderRecompiler::Spirv #endif /* EMULATOR_INCLUDE_EMULATOR_GRAPHICS_SHADER_RECOMPILER_SPIRVBUILDER_H_ */