2018-08-23 08:59:57 +01:00
|
|
|
/* This file is part of the sirit project.
|
|
|
|
* Copyright (c) 2018 ReinUsesLisp
|
|
|
|
* This software may be used and distributed according to the terms of the GNU
|
2018-08-27 03:28:39 +01:00
|
|
|
* Lesser General Public License version 2.1 or any later version.
|
2018-08-23 08:59:57 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <sirit/sirit.h>
|
2018-08-26 00:16:37 +01:00
|
|
|
#include <cstdio>
|
|
|
|
#include <cstdlib>
|
|
|
|
|
|
|
|
class MyModule : public Sirit::Module {
|
|
|
|
public:
|
|
|
|
MyModule() {}
|
|
|
|
~MyModule() = default;
|
|
|
|
|
|
|
|
void Generate() {
|
|
|
|
AddCapability(spv::Capability::Shader);
|
|
|
|
SetMemoryModel(spv::AddressingModel::Logical, spv::MemoryModel::GLSL450);
|
|
|
|
|
2018-08-26 18:25:59 +01:00
|
|
|
// Type testing
|
|
|
|
TypeBool();
|
|
|
|
TypeBool();
|
|
|
|
TypeInt(64, false);
|
|
|
|
TypeInt(16, false);
|
|
|
|
TypeFloat(16);
|
|
|
|
TypeFloat(32);
|
|
|
|
TypeFloat(64);
|
|
|
|
TypeVector(TypeBool(), 4);
|
|
|
|
TypeVector(TypeBool(), 3);
|
|
|
|
TypeMatrix(TypeVector(TypeFloat(32), 4), 4);
|
|
|
|
TypeImage(TypeFloat(32), spv::Dim::Dim2D, 0, false, false, 0,
|
2018-08-26 19:48:10 +01:00
|
|
|
spv::ImageFormat::Rg32f);
|
2018-08-26 18:25:59 +01:00
|
|
|
TypeSampledImage(TypeImage(TypeFloat(32), spv::Dim::Rect, 0, false, false, 0,
|
2018-08-28 08:41:42 +01:00
|
|
|
spv::ImageFormat::Rg32f));
|
|
|
|
TypeVector(TypeInt(32, false), 4);
|
|
|
|
TypeVector(TypeInt(64, false), 4);
|
|
|
|
TypeRuntimeArray(TypeInt(32, false));
|
|
|
|
TypeStruct({TypeInt(32, false), TypeFloat(64)});
|
2018-08-26 19:48:10 +01:00
|
|
|
TypePointer(spv::StorageClass::Private, TypeFloat(16));
|
2018-08-26 23:35:48 +01:00
|
|
|
ConstantTrue(TypeBool());
|
|
|
|
ConstantTrue(TypeBool());
|
|
|
|
ConstantFalse(TypeBool());
|
2018-08-27 04:29:40 +01:00
|
|
|
Constant(TypeFloat(64), Literal(6342.21));
|
|
|
|
Constant(TypeFloat(32), Literal(6342.21f));
|
|
|
|
Constant(TypeFloat(16), Literal(30u));
|
|
|
|
Constant(TypeInt(32, false), Literal(30u));
|
|
|
|
Constant(TypeInt(16, false), Literal(30u));
|
|
|
|
Constant(TypeInt(8, false), Literal(30u));
|
2018-08-27 04:38:25 +01:00
|
|
|
ConstantComposite(TypeVector(TypeFloat(32), 2),
|
|
|
|
{Constant(TypeFloat(32), Literal(50.0f)),
|
|
|
|
Constant(TypeFloat(32), Literal(50.0f))});
|
2018-08-28 08:46:18 +01:00
|
|
|
ConstantNull(TypeVector(TypeInt(64, false), 4));
|
2018-08-26 18:25:59 +01:00
|
|
|
|
2018-08-26 00:16:37 +01:00
|
|
|
auto main_type{TypeFunction(TypeVoid())};
|
2018-08-26 00:34:06 +01:00
|
|
|
auto main_func{Emit(Function(TypeVoid(), spv::FunctionControlMask::MaskNone, main_type))};
|
|
|
|
Emit(Label());
|
|
|
|
Emit(Return());
|
|
|
|
Emit(FunctionEnd());
|
2018-08-26 00:16:37 +01:00
|
|
|
|
|
|
|
AddEntryPoint(spv::ExecutionModel::Vertex, main_func, "main");
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
int main(int argc, char** argv) {
|
|
|
|
MyModule module;
|
|
|
|
module.Generate();
|
|
|
|
|
|
|
|
module.Optimize(2);
|
|
|
|
std::vector<std::uint8_t> code{module.Assembly()};
|
|
|
|
|
|
|
|
FILE* file = fopen("sirit.spv", "wb");
|
|
|
|
fwrite(code.data(), 1, code.size(), file);
|
|
|
|
fclose(file);
|
2018-08-23 08:59:57 +01:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|