diff --git a/include/sirit/sirit.h b/include/sirit/sirit.h index cc549b6..90def4b 100644 --- a/include/sirit/sirit.h +++ b/include/sirit/sirit.h @@ -16,7 +16,7 @@ namespace Sirit { static const std::uint32_t GeneratorMagicNumber = 0; -class Ref; +class Op; class Module { public: @@ -44,37 +44,37 @@ public: void SetMemoryModel(spv::AddressingModel addressing_model, spv::MemoryModel memory_model); /// Adds an entry point. - void AddEntryPoint(spv::ExecutionModel execution_model, const Ref* entry_point, - const std::string& name, const std::vector& interfaces = {}); + void AddEntryPoint(spv::ExecutionModel execution_model, const Op* entry_point, + const std::string& name, const std::vector& interfaces = {}); /// Returns type void. - const Ref* TypeVoid(); + const Op* TypeVoid(); /// Returns a function type. - const Ref* TypeFunction(const Ref* return_type, const std::vector& arguments = {}); + const Op* TypeFunction(const Op* return_type, const std::vector& arguments = {}); - /// Adds a reference to code block - void Add(const Ref* ref); + /// Adds an instruction to module's code block + const Op* Emit(const Op* op); /// Emits a function. - const Ref* EmitFunction(const Ref* result_type, spv::FunctionControlMask function_control, - const Ref* function_type); + const Op* Function(const Op* result_type, spv::FunctionControlMask function_control, + const Op* function_type); /// Emits a label. It starts a block. - const Ref* EmitLabel(); + const Op* Label(); /// Emits a return. It ends a block. - const Ref* EmitReturn(); + const Op* Return(); /// Emits a function end. - const Ref* EmitFunctionEnd(); + const Op* FunctionEnd(); private: - const Ref* AddCode(Ref* ref); + const Op* AddCode(Op* op); - const Ref* AddCode(spv::Op opcode, std::uint32_t id = UINT32_MAX); + const Op* AddCode(spv::Op opcode, std::uint32_t id = UINT32_MAX); - const Ref* AddDeclaration(Ref* ref); + const Op* AddDeclaration(Op* op); std::uint32_t bound{1}; @@ -82,24 +82,24 @@ private: std::set extensions; - std::set> ext_inst_import; + std::set> ext_inst_import; spv::AddressingModel addressing_model{spv::AddressingModel::Logical}; spv::MemoryModel memory_model{spv::MemoryModel::GLSL450}; - std::vector> entry_points; + std::vector> entry_points; - std::vector> execution_mode; + std::vector> execution_mode; - std::vector> debug; + std::vector> debug; - std::vector> annotations; + std::vector> annotations; - std::vector> declarations; + std::vector> declarations; - std::vector code; + std::vector code; - std::vector> code_store; + std::vector> code_store; }; } // namespace Sirit diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5e22f29..b362331 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,8 +1,8 @@ add_library(sirit ../include/sirit/sirit.h sirit.cpp - ref.cpp - ref.h + op.cpp + op.h stream.cpp stream.h operand.cpp diff --git a/src/ref.cpp b/src/op.cpp similarity index 66% rename from src/ref.cpp rename to src/op.cpp index 22a9403..73002fb 100644 --- a/src/ref.cpp +++ b/src/op.cpp @@ -7,35 +7,35 @@ #include #include "common_types.h" #include "operand.h" -#include "ref.h" +#include "op.h" namespace Sirit { -Ref::Ref(spv::Op opcode_, u32 id_, const Ref* result_type_) +Op::Op(spv::Op opcode_, u32 id_, const Op* result_type_) : opcode(opcode_), id(id_), result_type(result_type_) { operand_type = OperandType::Ref; } -Ref::~Ref() = default; +Op::~Op() = default; -void Ref::Fetch(Stream& stream) const { +void Op::Fetch(Stream& stream) const { assert(id != UINT32_MAX); stream.Write(id); } -u16 Ref::GetWordCount() const { +u16 Op::GetWordCount() const { return 1; } -bool Ref::operator==(const Operand& other) const { +bool Op::operator==(const Operand& other) const { if (operand_type != other.GetType()) { return false; } - const Ref& ref = dynamic_cast(other); - if (ref.opcode == opcode && result_type == ref.result_type && - operands.size() == ref.operands.size()) { + const Op& op = dynamic_cast(other); + if (op.opcode == opcode && result_type == op.result_type && + operands.size() == op.operands.size()) { for (std::size_t i{}; i < operands.size(); i++) { - if (*operands[i] != *ref.operands[i]) { + if (*operands[i] != *op.operands[i]) { return false; } } @@ -44,7 +44,7 @@ bool Ref::operator==(const Operand& other) const { return false; } -void Ref::Write(Stream& stream) const { +void Op::Write(Stream& stream) const { stream.Write(static_cast(opcode)); stream.Write(WordCount()); @@ -59,30 +59,30 @@ void Ref::Write(Stream& stream) const { } } -void Ref::Add(Operand* operand) { +void Op::Add(Operand* operand) { Add(static_cast(operand)); operand_store.push_back(std::unique_ptr(operand)); } -void Ref::Add(const Operand* operand) { +void Op::Add(const Operand* operand) { operands.push_back(operand); } -void Ref::Add(u32 integer) { +void Op::Add(u32 integer) { Add(new LiteralInteger(integer)); } -void Ref::Add(const std::string& string) { +void Op::Add(const std::string& string) { Add(new LiteralString(string)); } -void Ref::Add(const std::vector& ids) { - for (const Ref* ref : ids) { - Add(ref); +void Op::Add(const std::vector& ids) { + for (const Op* op : ids) { + Add(op); } } -u16 Ref::WordCount() const { +u16 Op::WordCount() const { u16 count{1}; if (result_type) { count++; diff --git a/src/ref.h b/src/op.h similarity index 80% rename from src/ref.h rename to src/op.h index 5b6f6b6..c68b05d 100644 --- a/src/ref.h +++ b/src/op.h @@ -13,10 +13,10 @@ namespace Sirit { -class Ref : public Operand { +class Op : public Operand { public: - explicit Ref(spv::Op opcode, u32 id = UINT32_MAX, const Ref* result_type = nullptr); - ~Ref(); + explicit Op(spv::Op opcode, u32 id = UINT32_MAX, const Op* result_type = nullptr); + ~Op(); virtual void Fetch(Stream& stream) const; virtual u16 GetWordCount() const; @@ -33,14 +33,14 @@ public: void Add(const std::string& string); - void Add(const std::vector& ids); + void Add(const std::vector& ids); private: u16 WordCount() const; spv::Op opcode; - const Ref* result_type; + const Op* result_type; u32 id; diff --git a/src/sirit.cpp b/src/sirit.cpp index faacfcf..8131ada 100644 --- a/src/sirit.cpp +++ b/src/sirit.cpp @@ -8,16 +8,16 @@ #include #include "sirit/sirit.h" #include "common_types.h" -#include "ref.h" +#include "op.h" #include "stream.h" namespace Sirit { template -static void WriteEnum(Stream& stream, spv::Op op, T value) { - Ref ref{op}; - ref.Add(static_cast(value)); - ref.Write(stream); +static void WriteEnum(Stream& stream, spv::Op opcode, T value) { + Op op{opcode}; + op.Add(static_cast(value)); + op.Write(stream); } Module::Module() {} @@ -42,7 +42,7 @@ std::vector Module::Assembly() const { // TODO write ext inst imports - Ref memory_model_ref{spv::Op::OpMemoryModel}; + Op memory_model_ref{spv::Op::OpMemoryModel}; memory_model_ref.Add(static_cast(addressing_model)); memory_model_ref.Add(static_cast(memory_model)); memory_model_ref.Write(stream); @@ -79,74 +79,75 @@ void Module::SetMemoryModel(spv::AddressingModel addressing_model, spv::MemoryMo this->memory_model = memory_model; } -void Module::AddEntryPoint(spv::ExecutionModel execution_model, const Ref* entry_point, - const std::string& name, const std::vector& interfaces) { - Ref* op{new Ref(spv::Op::OpEntryPoint)}; +void Module::AddEntryPoint(spv::ExecutionModel execution_model, const Op* entry_point, + const std::string& name, const std::vector& interfaces) { + Op* op{new Op(spv::Op::OpEntryPoint)}; op->Add(static_cast(execution_model)); op->Add(entry_point); op->Add(name); op->Add(interfaces); - entry_points.push_back(std::unique_ptr(op)); + entry_points.push_back(std::unique_ptr(op)); } -const Ref* Module::TypeVoid() { - return AddDeclaration(new Ref(spv::Op::OpTypeVoid, bound)); +const Op* Module::TypeVoid() { + return AddDeclaration(new Op(spv::Op::OpTypeVoid, bound)); } -const Ref* Module::TypeFunction(const Ref* return_type, const std::vector& arguments) { - Ref* type_func{new Ref(spv::Op::OpTypeFunction, bound)}; +const Op* Module::TypeFunction(const Op* return_type, const std::vector& arguments) { + Op* type_func{new Op(spv::Op::OpTypeFunction, bound)}; type_func->Add(return_type); - for (const Ref* arg : arguments) { + for (const Op* arg : arguments) { type_func->Add(arg); } return AddDeclaration(type_func); } -void Module::Add(const Ref* ref) { - assert(ref); - code.push_back(ref); +const Op* Module::Emit(const Op* op) { + assert(op); + code.push_back(op); + return op; } -const Ref* Module::EmitFunction(const Ref* result_type, spv::FunctionControlMask function_control, - const Ref* function_type) { - Ref* op{new Ref{spv::Op::OpFunction, bound++, result_type}}; +const Op* Module::Function(const Op* result_type, spv::FunctionControlMask function_control, + const Op* function_type) { + Op* op{new Op{spv::Op::OpFunction, bound++, result_type}}; op->Add(static_cast(function_control)); op->Add(function_type); return AddCode(op); } -const Ref* Module::EmitLabel() { +const Op* Module::Label() { return AddCode(spv::Op::OpLabel, bound++); } -const Ref* Module::EmitReturn() { +const Op* Module::Return() { return AddCode(spv::Op::OpReturn); } -const Ref* Module::EmitFunctionEnd() { +const Op* Module::FunctionEnd() { return AddCode(spv::Op::OpFunctionEnd); } -const Ref* Module::AddCode(Ref* ref) { - code_store.push_back(std::unique_ptr(ref)); - return ref; +const Op* Module::AddCode(Op* op) { + code_store.push_back(std::unique_ptr(op)); + return op; } -const Ref* Module::AddCode(spv::Op opcode, u32 id) { - return AddCode(new Ref{opcode, id}); +const Op* Module::AddCode(spv::Op opcode, u32 id) { + return AddCode(new Op{opcode, id}); } -const Ref* Module::AddDeclaration(Ref* ref) { +const Op* Module::AddDeclaration(Op* op) { const auto& found{std::find_if(declarations.begin(), declarations.end(), [=](const auto& other) { - return *other == *ref; + return *other == *op; })}; if (found != declarations.end()) { - delete ref; + delete op; return found->get(); } else { - declarations.push_back(std::unique_ptr(ref)); + declarations.push_back(std::unique_ptr(op)); bound++; - return ref; + return op; } } diff --git a/tests/main.cpp b/tests/main.cpp index ab8f68d..d96a4d1 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -18,11 +18,10 @@ public: SetMemoryModel(spv::AddressingModel::Logical, spv::MemoryModel::GLSL450); auto main_type{TypeFunction(TypeVoid())}; - auto main_func{EmitFunction(TypeVoid(), spv::FunctionControlMask::MaskNone, main_type)}; - Add(main_func); - Add(EmitLabel()); - Add(EmitReturn()); - Add(EmitFunctionEnd()); + auto main_func{Emit(Function(TypeVoid(), spv::FunctionControlMask::MaskNone, main_type))}; + Emit(Label()); + Emit(Return()); + Emit(FunctionEnd()); AddEntryPoint(spv::ExecutionModel::Vertex, main_func, "main"); }