|
|
|
@ -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"; |
|
|
|
} |
|
|
|
} |
|
|
|
|