From a63faa79071a8178f3a6b79c45c2770e5a955c17 Mon Sep 17 00:00:00 2001
From: John Kessenich <cepheus@frii.com>
Date: Fri, 27 Jun 2014 06:17:16 +0000
Subject: [PATCH] Non-functional:  Encapsulate testing for IO that is supposed
 to be arrayed with extra level for per-vertex data.

git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@27169 e7fa87d3-cd2b-0410-9028-fcbf551c1848
---
 glslang/Include/Types.h                     | 16 ++++++++++++++++
 glslang/MachineIndependent/ParseHelper.cpp  |  4 +---
 glslang/MachineIndependent/linkValidate.cpp |  5 +----
 3 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/glslang/Include/Types.h b/glslang/Include/Types.h
index 4f0c92379..42ce63bdf 100644
--- a/glslang/Include/Types.h
+++ b/glslang/Include/Types.h
@@ -39,6 +39,7 @@
 
 #include "../Include/Common.h"
 #include "../Include/BaseTypes.h"
+#include "../Public/ShaderLang.h"
 
 namespace glslang {
 
@@ -384,6 +385,21 @@ public:
         }
     }
 
+    // True if this type of IO is supposed to be arrayed with extra level for per-vertex data
+    bool isArrayedIo(EShLanguage language) const
+    {
+        switch (language) {
+        case EShLangGeometry:
+            return isPipeInput();
+        case EShLangTessControl:
+            return ! patch && (isPipeInput() || isPipeOutput());
+        case EShLangTessEvaluation:
+            return ! patch && isPipeInput();
+        default:
+            return false;
+        }
+    }
+
     // Implementing an embedded layout-qualifier class here, since C++ can't have a real class bitfield
     void clearLayout()
     {
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index 747eaf43a..addd8f667 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -590,9 +590,7 @@ void TParseContext::fixIoArraySize(TSourceLoc loc, TType& type)
 void TParseContext::ioArrayCheck(TSourceLoc loc, const TType& type, const TString& identifier)
 {
     if (! type.isArray() && ! symbolTable.atBuiltInLevel()) {
-        if ((language == EShLangGeometry       &&  type.getQualifier().storage == EvqVaryingIn) ||
-            (language == EShLangTessControl    && (type.getQualifier().storage == EvqVaryingOut || type.getQualifier().storage == EvqVaryingIn) && ! type.getQualifier().patch) ||
-            (language == EShLangTessEvaluation &&  type.getQualifier().storage == EvqVaryingIn && ! type.getQualifier().patch))
+        if (type.getQualifier().isArrayedIo(language))
             error(loc, "type must be an array:", type.getStorageQualifierString(), identifier.c_str());
     }
 }
diff --git a/glslang/MachineIndependent/linkValidate.cpp b/glslang/MachineIndependent/linkValidate.cpp
index e9c3610ec..6625a34ef 100644
--- a/glslang/MachineIndependent/linkValidate.cpp
+++ b/glslang/MachineIndependent/linkValidate.cpp
@@ -607,10 +607,7 @@ int TIntermediate::addUsedLocation(const TQualifier& qualifier, const TType& typ
             size = 1;
     } else {
         // Strip off the outer array dimension for those having an extra one.
-        if (type.isArray() && ! qualifier.patch &&
-            (language == EShLangGeometry && qualifier.isPipeInput()) ||
-            language == EShLangTessControl                           ||
-            (language == EShLangTessEvaluation && qualifier.isPipeInput())) {
+        if (type.isArray() && qualifier.isArrayedIo(language)) {
             TType elementType(type, 0);
             size = computeTypeLocationSize(elementType);
         } else
-- 
GitLab