summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/shader_recompiler/backend/glsl/emit_context.cpp22
1 files changed, 19 insertions, 3 deletions
diff --git a/src/shader_recompiler/backend/glsl/emit_context.cpp b/src/shader_recompiler/backend/glsl/emit_context.cpp
index 6e164b958..6f10002fe 100644
--- a/src/shader_recompiler/backend/glsl/emit_context.cpp
+++ b/src/shader_recompiler/backend/glsl/emit_context.cpp
@@ -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";
}
}