|
|
|
@ -319,6 +319,34 @@ std::string_view StageHeader(Stage stage) {
|
|
|
|
|
}
|
|
|
|
|
throw InvalidArgument("Invalid stage {}", stage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::string_view InputPrimitive(InputTopology topology) {
|
|
|
|
|
switch (topology) {
|
|
|
|
|
case InputTopology::Points:
|
|
|
|
|
return "POINTS";
|
|
|
|
|
case InputTopology::Lines:
|
|
|
|
|
return "LINES";
|
|
|
|
|
case InputTopology::LinesAdjacency:
|
|
|
|
|
return "LINESS_ADJACENCY";
|
|
|
|
|
case InputTopology::Triangles:
|
|
|
|
|
return "TRIANGLES";
|
|
|
|
|
case InputTopology::TrianglesAdjacency:
|
|
|
|
|
return "TRIANGLES_ADJACENCY";
|
|
|
|
|
}
|
|
|
|
|
throw InvalidArgument("Invalid input topology {}", topology);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::string_view OutputPrimitive(OutputTopology topology) {
|
|
|
|
|
switch (topology) {
|
|
|
|
|
case OutputTopology::PointList:
|
|
|
|
|
return "POINTS";
|
|
|
|
|
case OutputTopology::LineStrip:
|
|
|
|
|
return "LINE_STRIP";
|
|
|
|
|
case OutputTopology::TriangleStrip:
|
|
|
|
|
return "TRIANGLE_STRIP";
|
|
|
|
|
}
|
|
|
|
|
throw InvalidArgument("Invalid output topology {}", topology);
|
|
|
|
|
}
|
|
|
|
|
} // Anonymous namespace
|
|
|
|
|
|
|
|
|
|
std::string EmitGLASM(const Profile& profile, IR::Program& program, Bindings& bindings) {
|
|
|
|
@ -328,6 +356,13 @@ 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::Geometry:
|
|
|
|
|
header += fmt::format("PRIMITIVE_IN {};"
|
|
|
|
|
"PRIMITIVE_OUT {};"
|
|
|
|
|
"VERTICES_OUT {};",
|
|
|
|
|
InputPrimitive(profile.input_topology),
|
|
|
|
|
OutputPrimitive(program.output_topology), program.output_vertices);
|
|
|
|
|
break;
|
|
|
|
|
case Stage::Compute:
|
|
|
|
|
header += fmt::format("GROUP_SIZE {} {} {};", program.workgroup_size[0],
|
|
|
|
|
program.workgroup_size[1], program.workgroup_size[2]);
|
|
|
|
|