|
|
|
@ -32,6 +32,19 @@ std::string_view InputArrayDecorator(Stage stage) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool StoresPerVertexAttributes(Stage stage) {
|
|
|
|
|
switch (stage) {
|
|
|
|
|
case Stage::VertexA:
|
|
|
|
|
case Stage::VertexB:
|
|
|
|
|
case Stage::Geometry:
|
|
|
|
|
case Stage::TessellationControl:
|
|
|
|
|
case Stage::TessellationEval:
|
|
|
|
|
return true;
|
|
|
|
|
default:
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::string OutputDecorator(Stage stage, u32 size) {
|
|
|
|
|
switch (stage) {
|
|
|
|
|
case Stage::TessellationControl:
|
|
|
|
@ -137,7 +150,7 @@ std::string_view OutputPrimitive(OutputTopology topology) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SetupOutPerVertex(Stage stage, const Info& info, std::string& header) {
|
|
|
|
|
if (stage != Stage::VertexA && stage != Stage::VertexB && stage != Stage::Geometry) {
|
|
|
|
|
if (!StoresPerVertexAttributes(stage)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
header += "out gl_PerVertex{";
|
|
|
|
@ -150,8 +163,11 @@ void SetupOutPerVertex(Stage stage, const Info& info, std::string& header) {
|
|
|
|
|
if (info.stores_clip_distance) {
|
|
|
|
|
header += "float gl_ClipDistance[];";
|
|
|
|
|
}
|
|
|
|
|
if (info.stores_viewport_index && stage != Stage::Geometry) {
|
|
|
|
|
header += "int gl_ViewportIndex;";
|
|
|
|
|
}
|
|
|
|
|
header += "};\n";
|
|
|
|
|
if (info.stores_viewport_index) {
|
|
|
|
|
if (info.stores_viewport_index && stage == Stage::Geometry) {
|
|
|
|
|
header += "out int gl_ViewportIndex;";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -265,7 +281,7 @@ void EmitContext::SetupExtensions(std::string&) {
|
|
|
|
|
header += "#extension GL_ARB_gpu_shader_int64 : enable\n";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (info.stores_viewport_index) {
|
|
|
|
|
if (info.stores_viewport_index && stage != Stage::Geometry) {
|
|
|
|
|
header += "#extension GL_ARB_shader_viewport_layer_array : enable\n";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|