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