No description
Find a file
Lioncash f6f5913b5f op: Use std::vector's insert member function within vector variant of Add()
While looping here does work fine, it's mildly inefficient, particularly
if the number of members being added is large, because it can result in
multiple allocations over the period of the insertion, depending on how
much extra memory push_back may allocate for successive elements.

Instead, we can just tell the std::vector that we want to slap the whole
contained sequence at the back of it with insert, which lets it allocate
the whole memory block in one attempt.
2019-03-14 04:31:14 -03:00
externals aloha 2018-08-23 04:59:57 -03:00
include/sirit Pass std::string by value where applicable. 2019-03-14 04:30:39 -03:00
src op: Use std::vector's insert member function within vector variant of Add() 2019-03-14 04:31:14 -03:00
tests Add ellipsis overloads for instructions ending in vectors 2019-03-11 04:38:09 -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 Avoid CMake SPIR-V module dependencies 2018-11-16 03:59:28 -03:00
LICENSE.txt Upgrade from LGPLv2.1 to LGPLv3 2018-11-16 04:10:10 -03:00
README.md Remove Op prefix on Type instructions 2019-03-13 18:32:38 -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 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()};