Go to file
ReinUsesLisp 51d541f1a1 Remove forward references and add phi node patching
The previous API for forward declarations broke when more than one
definition was done. Forward references on instructions that are not
labels were only needed for phi nodes, so it has been replaced with a
deferred phi node instruction and a method to patch these after
everything has been defined.
2021-04-11 02:02:43 -03:00
externals Update SPIRV-Headers 2021-02-20 03:22:09 -03:00
include/sirit Remove forward references and add phi node patching 2021-04-11 02:02:43 -03:00
src Remove forward references and add phi node patching 2021-04-11 02:02:43 -03:00
tests Stream SPIR-V instructions directly to a binary 2020-08-01 01:50:01 -03:00
.clang-format Change clang-format settings 2019-03-11 03:26:21 -03:00
.gitignore aloha 2018-08-23 04:59:57 -03:00
.gitmodules aloha 2018-08-23 04:59:57 -03:00
CMakeLists.txt Upgrade to C++20 and use std::span 2020-07-29 05:46:50 -03:00
LICENSE.txt Relicense to The BSD 3-clause license 2019-07-14 18:50:44 -03:00
README.md Fix typos in README.md 2019-10-24 03:25:42 -03:00

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()};