(unofficial mirror fork)
47d85b81a7
Previously this wasn't utilizing any of the compiler flags, meaning it wasn't applying any of the specified warnings. Since applying the warnings to the target, this uncovered a few warning cases, such as shadowing class variables on MSVC, etc, which have been fixed. |
||
---|---|---|
externals | ||
include/sirit | ||
src | ||
tests | ||
.clang-format | ||
.gitignore | ||
.gitmodules | ||
CMakeLists.txt | ||
LICENSE.txt | ||
README.md |
Sirit
A runtime SPIR-V assembler. It aims to ease dynamic SPIR-V code generation
without calling external applications (like Khronos' spirv-as
)
Its design aims to move code that does not belong to the application in the library without, limitting its functionality.
What it does for you:
- Sort declaration opcodes
- Handle types and constant duplicates
- Emit SPIR-V opcodes
What does not do for you:
- Avoid ID duplicates (emitting the same instruction twice)
- Dump code to disk
- Handle code blocks/branches
- Compile from a higher level language
It's in early stages of development, many instructions are missing since they are written manually instead of being generated from a file.
Example
class MyModule : public Sirit::Module {
public:
MyModule() {}
~MyModule() = default;
void Generate() {
AddCapability(spv::Capability::Shader);
SetMemoryModel(spv::AddressingModel::Logical, spv::MemoryModel::GLSL450);
auto main_type{TypeFunction(TypeVoid())};
auto main_func{Emit(OpFunction(TypeVoid(), spv::FunctionControlMask::MaskNone, main_type))};
Emit(OpLabel());
Emit(OpReturn());
Emit(OpFunctionEnd());
AddEntryPoint(spv::ExecutionModel::Vertex, main_func, "main");
}
};
// Then...
MyModule module;
module.Generate();
std::vector<std::uint8_t> code{module.Assemble()};