|
|
|
@ -347,6 +347,30 @@ std::string_view OutputPrimitive(OutputTopology topology) {
|
|
|
|
|
}
|
|
|
|
|
throw InvalidArgument("Invalid output topology {}", topology);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::string_view GetTessMode(TessPrimitive primitive) {
|
|
|
|
|
switch (primitive) {
|
|
|
|
|
case TessPrimitive::Triangles:
|
|
|
|
|
return "TRIANGLES";
|
|
|
|
|
case TessPrimitive::Quads:
|
|
|
|
|
return "QUADS";
|
|
|
|
|
case TessPrimitive::Isolines:
|
|
|
|
|
return "ISOLINES";
|
|
|
|
|
}
|
|
|
|
|
throw InvalidArgument("Invalid tessellation primitive {}", primitive);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::string_view GetTessSpacing(TessSpacing spacing) {
|
|
|
|
|
switch (spacing) {
|
|
|
|
|
case TessSpacing::Equal:
|
|
|
|
|
return "EQUAL";
|
|
|
|
|
case TessSpacing::FractionalOdd:
|
|
|
|
|
return "FRACTIONAL_ODD";
|
|
|
|
|
case TessSpacing::FractionalEven:
|
|
|
|
|
return "FRACTIONAL_EVEN";
|
|
|
|
|
}
|
|
|
|
|
throw InvalidArgument("Invalid tessellation spacing {}", spacing);
|
|
|
|
|
}
|
|
|
|
|
} // Anonymous namespace
|
|
|
|
|
|
|
|
|
|
std::string EmitGLASM(const Profile& profile, IR::Program& program, Bindings& bindings) {
|
|
|
|
@ -356,6 +380,17 @@ std::string EmitGLASM(const Profile& profile, IR::Program& program, Bindings& bi
|
|
|
|
|
std::string header{StageHeader(program.stage)};
|
|
|
|
|
SetupOptions(program, profile, header);
|
|
|
|
|
switch (program.stage) {
|
|
|
|
|
case Stage::TessellationControl:
|
|
|
|
|
header += fmt::format("VERTICES_OUT {};", program.invocations);
|
|
|
|
|
break;
|
|
|
|
|
case Stage::TessellationEval:
|
|
|
|
|
header +=
|
|
|
|
|
fmt::format("TESS_MODE {};"
|
|
|
|
|
"TESS_SPACING {};"
|
|
|
|
|
"TESS_VERTEX_ORDER {};",
|
|
|
|
|
GetTessMode(profile.tess_primitive), GetTessSpacing(profile.tess_spacing),
|
|
|
|
|
profile.tess_clockwise ? "CW" : "CCW");
|
|
|
|
|
break;
|
|
|
|
|
case Stage::Geometry:
|
|
|
|
|
header += fmt::format("PRIMITIVE_IN {};"
|
|
|
|
|
"PRIMITIVE_OUT {};"
|
|
|
|
|