darktux 00dd7295a3 Improve SPIRV-Headers loading behavior 10 ماه پیش
..
include 9b991208cd Added submodule contents into tree 10 ماه پیش
src 9b991208cd Added submodule contents into tree 10 ماه پیش
tests 9b991208cd Added submodule contents into tree 10 ماه پیش
.clang-format 9b991208cd Added submodule contents into tree 10 ماه پیش
.gitignore 9b991208cd Added submodule contents into tree 10 ماه پیش
.gitmodules 9b991208cd Added submodule contents into tree 10 ماه پیش
CMakeLists.txt 00dd7295a3 Improve SPIRV-Headers loading behavior 10 ماه پیش
LICENSE.txt 9b991208cd Added submodule contents into tree 10 ماه پیش
README.md 9b991208cd Added submodule contents into tree 10 ماه پیش

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 in the application to the library, without limiting its functionality.

What Sirit does for you:

  • Sort declaration opcodes
  • Handle types and constant duplicates
  • Emit SPIR-V opcodes

What Sirit won't do for you:

  • Avoid ID duplicates (e.g. emitting the same label twice)
  • Dump code to disk
  • Handle control flow
  • 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{OpFunction(TypeVoid(), spv::FunctionControlMask::MaskNone, main_type)};
        AddLabel(OpLabel());
        OpReturn();
        OpFunctionEnd();

        AddEntryPoint(spv::ExecutionModel::Vertex, main_func, "main");
    }
};

// Then...

MyModule module;
module.Generate();

std::vector<std::uint32_t> code{module.Assemble()};