From 31147ffe69882141cb83bf83d5e01890524ab85a Mon Sep 17 00:00:00 2001
From: ameerj <52414509+ameerj@users.noreply.github.com>
Date: Tue, 1 Jun 2021 01:49:24 -0400
Subject: glsl: Yet another gl_ViewportIndex fix attempt

---
 .../backend/glsl/emit_context.cpp                  | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

(limited to 'src/shader_recompiler/backend/glsl/emit_context.cpp')

diff --git a/src/shader_recompiler/backend/glsl/emit_context.cpp b/src/shader_recompiler/backend/glsl/emit_context.cpp
index 6e164b9588..6f10002fed 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";
     }
 }
-- 
cgit v1.2.3-70-g09d2