blob: 354f6fe78c4258537b171410a459ae915c1b4cc2 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
Nicolas Capens16004fc2014-06-11 11:29:11 -04002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
Geoff Lang0a73dd82014-11-19 16:18:08 -05006#ifndef COMPILER_TRANSLATOR_PARSECONTEXT_H_
7#define COMPILER_TRANSLATOR_PARSECONTEXT_H_
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00008
Olli Etuahod5f44c92017-11-29 17:15:40 +02009#include "compiler/preprocessor/Preprocessor.h"
Jamie Madilld4a3a312014-06-25 16:04:56 -040010#include "compiler/translator/Compiler.h"
Olli Etuahod5f44c92017-11-29 17:15:40 +020011#include "compiler/translator/Declarator.h"
Geoff Lang17732822013-08-29 13:46:49 -040012#include "compiler/translator/Diagnostics.h"
13#include "compiler/translator/DirectiveHandler.h"
Martin Radev70866b82016-07-22 15:27:42 +030014#include "compiler/translator/QualifierTypes.h"
Olli Etuahod5f44c92017-11-29 17:15:40 +020015#include "compiler/translator/SymbolTable.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000016
Jamie Madill45bcc782016-11-07 13:58:48 -050017namespace sh
18{
19
Jamie Madill06145232015-05-13 13:10:01 -040020struct TMatrixFields
21{
daniel@transgaming.com0578f812010-05-17 09:58:39 +000022 bool wholeRow;
23 bool wholeCol;
24 int row;
25 int col;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000026};
27
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000028//
29// The following are extra variables needed during parsing, grouped together so
30// they can be passed to the parser without needing a global.
31//
Jamie Madill6e06b1f2015-05-14 10:01:17 -040032class TParseContext : angle::NonCopyable
Jamie Madill06145232015-05-13 13:10:01 -040033{
Jamie Madill6e06b1f2015-05-14 10:01:17 -040034 public:
Jamie Madill06145232015-05-13 13:10:01 -040035 TParseContext(TSymbolTable &symt,
36 TExtensionBehavior &ext,
Jamie Madill06145232015-05-13 13:10:01 -040037 sh::GLenum type,
38 ShShaderSpec spec,
Qiankun Miao7ebb97f2016-09-08 18:01:50 +080039 ShCompileOptions options,
Jamie Madill06145232015-05-13 13:10:01 -040040 bool checksPrecErrors,
Olli Etuaho77ba4082016-12-16 12:01:18 +000041 TDiagnostics *diagnostics,
Jamie Madillacb4b812016-11-07 13:50:29 -050042 const ShBuiltInResources &resources);
jchen104cdac9e2017-05-08 11:01:20 +080043 ~TParseContext();
Jamie Madill06145232015-05-13 13:10:01 -040044
Jamie Madill6e06b1f2015-05-14 10:01:17 -040045 const pp::Preprocessor &getPreprocessor() const { return mPreprocessor; }
46 pp::Preprocessor &getPreprocessor() { return mPreprocessor; }
47 void *getScanner() const { return mScanner; }
48 void setScanner(void *scanner) { mScanner = scanner; }
49 int getShaderVersion() const { return mShaderVersion; }
50 sh::GLenum getShaderType() const { return mShaderType; }
51 ShShaderSpec getShaderSpec() const { return mShaderSpec; }
Olli Etuaho77ba4082016-12-16 12:01:18 +000052 int numErrors() const { return mDiagnostics->numErrors(); }
Olli Etuaho4de340a2016-12-16 09:32:03 +000053 void error(const TSourceLoc &loc, const char *reason, const char *token);
54 void warning(const TSourceLoc &loc, const char *reason, const char *token);
Jamie Madill14e95b32015-05-07 10:10:41 -040055
Olli Etuaho7c3848e2015-11-04 13:19:17 +020056 // If isError is false, a warning will be reported instead.
57 void outOfRangeError(bool isError,
58 const TSourceLoc &loc,
59 const char *reason,
Olli Etuaho4de340a2016-12-16 09:32:03 +000060 const char *token);
Olli Etuaho7c3848e2015-11-04 13:19:17 +020061
Olli Etuaho6d40bbd2016-09-30 13:49:38 +010062 TIntermBlock *getTreeRoot() const { return mTreeRoot; }
63 void setTreeRoot(TIntermBlock *treeRoot) { mTreeRoot = treeRoot; }
Jamie Madill6e06b1f2015-05-14 10:01:17 -040064
Olli Etuahoa6996682015-10-12 14:32:30 +030065 bool getFragmentPrecisionHigh() const
Jamie Madill6e06b1f2015-05-14 10:01:17 -040066 {
Olli Etuahoa6996682015-10-12 14:32:30 +030067 return mFragmentPrecisionHighOnESSL1 || mShaderVersion >= 300;
68 }
69 void setFragmentPrecisionHighOnESSL1(bool fragmentPrecisionHigh)
70 {
71 mFragmentPrecisionHighOnESSL1 = fragmentPrecisionHigh;
Jamie Madill6e06b1f2015-05-14 10:01:17 -040072 }
73
Jamie Madilld7b1ab52016-12-12 14:42:19 -050074 void setLoopNestingLevel(int loopNestintLevel) { mLoopNestingLevel = loopNestintLevel; }
Jamie Madill6e06b1f2015-05-14 10:01:17 -040075
Jamie Madill6e06b1f2015-05-14 10:01:17 -040076 void incrLoopNestingLevel() { ++mLoopNestingLevel; }
77 void decrLoopNestingLevel() { --mLoopNestingLevel; }
78
79 void incrSwitchNestingLevel() { ++mSwitchNestingLevel; }
80 void decrSwitchNestingLevel() { --mSwitchNestingLevel; }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000081
Martin Radev802abe02016-08-04 17:48:32 +030082 bool isComputeShaderLocalSizeDeclared() const { return mComputeShaderLocalSizeDeclared; }
Martin Radev4c4c8e72016-08-04 12:25:34 +030083 sh::WorkGroupSize getComputeShaderLocalSize() const;
Martin Radev802abe02016-08-04 17:48:32 +030084
Olli Etuaho09b04a22016-12-15 13:30:26 +000085 int getNumViews() const { return mNumViews; }
86
Martin Radev70866b82016-07-22 15:27:42 +030087 void enterFunctionDeclaration() { mDeclaringFunction = true; }
88
89 void exitFunctionDeclaration() { mDeclaringFunction = false; }
90
91 bool declaringFunction() const { return mDeclaringFunction; }
92
Olli Etuaho56229f12017-07-10 14:16:33 +030093 TIntermConstantUnion *addScalarLiteral(const TConstantUnion *constantUnion,
94 const TSourceLoc &line);
95
Jamie Madill5c097022014-08-20 16:38:32 -040096 // This method is guaranteed to succeed, even if no variable with 'name' exists.
Jamie Madilld7b1ab52016-12-12 14:42:19 -050097 const TVariable *getNamedVariable(const TSourceLoc &location,
98 const TString *name,
99 const TSymbol *symbol);
Olli Etuaho82c29ed2015-11-03 13:06:54 +0200100 TIntermTyped *parseVariableIdentifier(const TSourceLoc &location,
101 const TString *name,
102 const TSymbol *symbol);
Jamie Madill5c097022014-08-20 16:38:32 -0400103
Olli Etuahoeb7f90f2017-07-07 17:25:23 +0300104 // Look at a '.' field selector string and change it into offsets for a vector.
105 bool parseVectorFields(const TSourceLoc &line,
106 const TString &compString,
107 int vecSize,
108 TVector<int> *fieldOffsets);
alokp@chromium.org75fe6b72011-08-14 05:31:22 +0000109
Jamie Madill06145232015-05-13 13:10:01 -0400110 void assignError(const TSourceLoc &line, const char *op, TString left, TString right);
111 void unaryOpError(const TSourceLoc &line, const char *op, TString operand);
112 void binaryOpError(const TSourceLoc &line, const char *op, TString left, TString right);
Olli Etuaho856c4972016-08-08 11:38:39 +0300113
Olli Etuaho8a176262016-08-16 14:23:01 +0300114 // Check functions - the ones that return bool return false if an error was generated.
115
Olli Etuaho856c4972016-08-08 11:38:39 +0300116 bool checkIsNotReserved(const TSourceLoc &line, const TString &identifier);
117 void checkPrecisionSpecified(const TSourceLoc &line, TPrecision precision, TBasicType type);
118 bool checkCanBeLValue(const TSourceLoc &line, const char *op, TIntermTyped *node);
119 void checkIsConst(TIntermTyped *node);
120 void checkIsScalarInteger(TIntermTyped *node, const char *token);
Qiankun Miaof69682b2016-08-16 14:50:42 +0800121 bool checkIsAtGlobalLevel(const TSourceLoc &line, const char *token);
Olli Etuaho856c4972016-08-08 11:38:39 +0300122 bool checkConstructorArguments(const TSourceLoc &line,
Olli Etuahoaf6fc1b2017-01-26 17:45:35 -0800123 const TIntermSequence *arguments,
Olli Etuaho856c4972016-08-08 11:38:39 +0300124 const TType &type);
125
126 // Returns a sanitized array size to use (the size is at least 1).
127 unsigned int checkIsValidArraySize(const TSourceLoc &line, TIntermTyped *expr);
Olli Etuaho8a176262016-08-16 14:23:01 +0300128 bool checkIsValidQualifierForArray(const TSourceLoc &line, const TPublicType &elementQualifier);
Olli Etuahoe0803872017-08-23 15:30:23 +0300129 bool checkArrayElementIsNotArray(const TSourceLoc &line, const TPublicType &elementType);
Olli Etuaho856c4972016-08-08 11:38:39 +0300130 bool checkIsNonVoid(const TSourceLoc &line, const TString &identifier, const TBasicType &type);
Olli Etuaho56229f12017-07-10 14:16:33 +0300131 bool checkIsScalarBool(const TSourceLoc &line, const TIntermTyped *type);
Olli Etuaho856c4972016-08-08 11:38:39 +0300132 void checkIsScalarBool(const TSourceLoc &line, const TPublicType &pType);
jchen10cc2a10e2017-05-03 14:05:12 +0800133 bool checkIsNotOpaqueType(const TSourceLoc &line,
134 const TTypeSpecifierNonArray &pType,
135 const char *reason);
Olli Etuaho856c4972016-08-08 11:38:39 +0300136 void checkDeclaratorLocationIsNotSpecified(const TSourceLoc &line, const TPublicType &pType);
137 void checkLocationIsNotSpecified(const TSourceLoc &location,
138 const TLayoutQualifier &layoutQualifier);
Qin Jiajiaca68d982017-09-18 16:41:56 +0800139 void checkStd430IsForShaderStorageBlock(const TSourceLoc &location,
140 const TLayoutBlockStorage &blockStorage,
141 const TQualifier &qualifier);
Olli Etuaho856c4972016-08-08 11:38:39 +0300142 void checkIsParameterQualifierValid(const TSourceLoc &line,
Martin Radev70866b82016-07-22 15:27:42 +0300143 const TTypeQualifierBuilder &typeQualifierBuilder,
Olli Etuaho856c4972016-08-08 11:38:39 +0300144 TType *type);
Olli Etuaho703671e2017-11-08 17:47:18 +0200145
146 // Check if at least one of the specified extensions can be used, and generate error/warning as
147 // appropriate according to the spec.
148 // This function is only needed for a few different small constant sizes of extension array, and
149 // we want to avoid unnecessary dynamic allocations. That's why checkCanUseOneOfExtensions is a
150 // template function rather than one taking a vector.
151 template <size_t size>
152 bool checkCanUseOneOfExtensions(const TSourceLoc &line,
153 const std::array<TExtension, size> &extensions);
Olli Etuaho2a1e8f92017-07-14 11:49:36 +0300154 bool checkCanUseExtension(const TSourceLoc &line, TExtension extension);
Olli Etuahobb7e5a72017-04-24 10:16:44 +0300155
156 // Done for all declarations, whether empty or not.
157 void declarationQualifierErrorCheck(const sh::TQualifier qualifier,
158 const sh::TLayoutQualifier &layoutQualifier,
159 const TSourceLoc &location);
160 // Done for the first non-empty declarator in a declaration.
161 void nonEmptyDeclarationErrorCheck(const TPublicType &publicType,
162 const TSourceLoc &identifierLocation);
163 // Done only for empty declarations.
Olli Etuaho55bde912017-10-25 13:41:13 +0300164 void emptyDeclarationErrorCheck(const TType &type, const TSourceLoc &location);
Olli Etuahobb7e5a72017-04-24 10:16:44 +0300165
Olli Etuaho856c4972016-08-08 11:38:39 +0300166 void checkLayoutQualifierSupported(const TSourceLoc &location,
167 const TString &layoutQualifierName,
168 int versionRequired);
169 bool checkWorkGroupSizeIsNotSpecified(const TSourceLoc &location,
170 const TLayoutQualifier &layoutQualifier);
Jiajia Qinbc585152017-06-23 15:42:17 +0800171 void functionCallRValueLValueErrorCheck(const TFunction *fnCandidate, TIntermAggregate *fnCall);
Martin Radev70866b82016-07-22 15:27:42 +0300172 void checkInvariantVariableQualifier(bool invariant,
173 const TQualifier qualifier,
174 const TSourceLoc &invariantLocation);
Olli Etuaho856c4972016-08-08 11:38:39 +0300175 void checkInputOutputTypeIsValidES3(const TQualifier qualifier,
176 const TPublicType &type,
177 const TSourceLoc &qualifierLocation);
Martin Radev2cc85b32016-08-05 16:22:53 +0300178 void checkLocalVariableConstStorageQualifier(const TQualifierWrapperBase &qualifier);
Jamie Madill6e06b1f2015-05-14 10:01:17 -0400179 const TPragma &pragma() const { return mDirectiveHandler.pragma(); }
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500180 const TExtensionBehavior &extensionBehavior() const
181 {
182 return mDirectiveHandler.extensionBehavior();
183 }
Olli Etuaho703671e2017-11-08 17:47:18 +0200184
Olli Etuaho2a1e8f92017-07-14 11:49:36 +0300185 bool isExtensionEnabled(TExtension extension) const;
Jamie Madill06145232015-05-13 13:10:01 -0400186 void handleExtensionDirective(const TSourceLoc &loc, const char *extName, const char *behavior);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500187 void handlePragmaDirective(const TSourceLoc &loc,
188 const char *name,
189 const char *value,
190 bool stdgl);
alokp@chromium.org75fe6b72011-08-14 05:31:22 +0000191
Olli Etuaho914b79a2017-06-19 16:03:19 +0300192 // Returns true on success. *initNode may still be nullptr on success in case the initialization
193 // is not needed in the AST.
Jamie Madill06145232015-05-13 13:10:01 -0400194 bool executeInitializer(const TSourceLoc &line,
195 const TString &identifier,
Olli Etuahob60d30f2018-01-16 12:31:06 +0200196 TType *type,
Jamie Madill06145232015-05-13 13:10:01 -0400197 TIntermTyped *initializer,
Olli Etuaho13389b62016-10-16 11:48:18 +0100198 TIntermBinary **initNode);
Olli Etuaho914b79a2017-06-19 16:03:19 +0300199 TIntermNode *addConditionInitializer(const TPublicType &pType,
200 const TString &identifier,
201 TIntermTyped *initializer,
202 const TSourceLoc &loc);
203 TIntermNode *addLoop(TLoopType type,
204 TIntermNode *init,
205 TIntermNode *cond,
206 TIntermTyped *expr,
207 TIntermNode *body,
208 const TSourceLoc &loc);
alokp@chromium.org75fe6b72011-08-14 05:31:22 +0000209
Olli Etuahocce89652017-06-19 16:04:09 +0300210 // For "if" test nodes. There are three children: a condition, a true path, and a false path.
211 // The two paths are in TIntermNodePair code.
212 TIntermNode *addIfElse(TIntermTyped *cond, TIntermNodePair code, const TSourceLoc &loc);
213
Olli Etuaho0e3aee32016-10-27 12:56:38 +0100214 void addFullySpecifiedType(TPublicType *typeSpecifier);
Martin Radev70866b82016-07-22 15:27:42 +0300215 TPublicType addFullySpecifiedType(const TTypeQualifierBuilder &typeQualifierBuilder,
Jamie Madill06145232015-05-13 13:10:01 -0400216 const TPublicType &typeSpecifier);
Olli Etuahoe7847b02015-03-16 11:56:12 +0200217
Olli Etuaho13389b62016-10-16 11:48:18 +0100218 TIntermDeclaration *parseSingleDeclaration(TPublicType &publicType,
219 const TSourceLoc &identifierOrTypeLocation,
220 const TString &identifier);
Olli Etuaho55bde912017-10-25 13:41:13 +0300221 TIntermDeclaration *parseSingleArrayDeclaration(TPublicType &elementType,
Olli Etuaho13389b62016-10-16 11:48:18 +0100222 const TSourceLoc &identifierLocation,
223 const TString &identifier,
224 const TSourceLoc &indexLocation,
Olli Etuaho7881cfd2017-08-23 18:00:21 +0300225 const TVector<unsigned int> &arraySizes);
Olli Etuaho13389b62016-10-16 11:48:18 +0100226 TIntermDeclaration *parseSingleInitDeclaration(const TPublicType &publicType,
227 const TSourceLoc &identifierLocation,
228 const TString &identifier,
229 const TSourceLoc &initLocation,
230 TIntermTyped *initializer);
Jamie Madill47e3ec02014-08-20 16:38:33 -0400231
Olli Etuaho3875ffd2015-04-10 16:45:14 +0300232 // Parse a declaration like "type a[n] = initializer"
233 // Note that this does not apply to declarations like "type[n] a = initializer"
Olli Etuaho55bde912017-10-25 13:41:13 +0300234 TIntermDeclaration *parseSingleArrayInitDeclaration(TPublicType &elementType,
Olli Etuaho13389b62016-10-16 11:48:18 +0100235 const TSourceLoc &identifierLocation,
236 const TString &identifier,
237 const TSourceLoc &indexLocation,
Olli Etuaho7881cfd2017-08-23 18:00:21 +0300238 const TVector<unsigned int> &arraySizes,
Olli Etuaho13389b62016-10-16 11:48:18 +0100239 const TSourceLoc &initLocation,
240 TIntermTyped *initializer);
Olli Etuaho3875ffd2015-04-10 16:45:14 +0300241
Olli Etuahobf4e1b72016-12-09 11:30:15 +0000242 TIntermInvariantDeclaration *parseInvariantDeclaration(
243 const TTypeQualifierBuilder &typeQualifierBuilder,
244 const TSourceLoc &identifierLoc,
245 const TString *identifier,
246 const TSymbol *symbol);
Olli Etuahoe7847b02015-03-16 11:56:12 +0200247
Olli Etuaho13389b62016-10-16 11:48:18 +0100248 void parseDeclarator(TPublicType &publicType,
249 const TSourceLoc &identifierLocation,
250 const TString &identifier,
251 TIntermDeclaration *declarationOut);
Olli Etuaho55bde912017-10-25 13:41:13 +0300252 void parseArrayDeclarator(TPublicType &elementType,
Olli Etuaho13389b62016-10-16 11:48:18 +0100253 const TSourceLoc &identifierLocation,
254 const TString &identifier,
255 const TSourceLoc &arrayLocation,
Olli Etuaho7881cfd2017-08-23 18:00:21 +0300256 const TVector<unsigned int> &arraySizes,
Olli Etuaho13389b62016-10-16 11:48:18 +0100257 TIntermDeclaration *declarationOut);
258 void parseInitDeclarator(const TPublicType &publicType,
259 const TSourceLoc &identifierLocation,
260 const TString &identifier,
261 const TSourceLoc &initLocation,
262 TIntermTyped *initializer,
263 TIntermDeclaration *declarationOut);
Olli Etuahoe7847b02015-03-16 11:56:12 +0200264
Olli Etuaho3875ffd2015-04-10 16:45:14 +0300265 // Parse a declarator like "a[n] = initializer"
Olli Etuaho55bde912017-10-25 13:41:13 +0300266 void parseArrayInitDeclarator(const TPublicType &elementType,
Olli Etuaho13389b62016-10-16 11:48:18 +0100267 const TSourceLoc &identifierLocation,
268 const TString &identifier,
269 const TSourceLoc &indexLocation,
Olli Etuaho7881cfd2017-08-23 18:00:21 +0300270 const TVector<unsigned int> &arraySizes,
Olli Etuaho13389b62016-10-16 11:48:18 +0100271 const TSourceLoc &initLocation,
272 TIntermTyped *initializer,
273 TIntermDeclaration *declarationOut);
Olli Etuaho3875ffd2015-04-10 16:45:14 +0300274
Olli Etuahob8ee9dd2017-10-30 12:43:27 +0200275 TIntermNode *addEmptyStatement(const TSourceLoc &location);
276
Olli Etuahocce89652017-06-19 16:04:09 +0300277 void parseDefaultPrecisionQualifier(const TPrecision precision,
278 const TPublicType &type,
279 const TSourceLoc &loc);
Martin Radev70866b82016-07-22 15:27:42 +0300280 void parseGlobalLayoutQualifier(const TTypeQualifierBuilder &typeQualifierBuilder);
Olli Etuahocce89652017-06-19 16:04:09 +0300281
Olli Etuaho16c745a2017-01-16 17:02:27 +0000282 TIntermFunctionPrototype *addFunctionPrototypeDeclaration(const TFunction &parsedFunction,
283 const TSourceLoc &location);
Olli Etuaho8ad9e752017-01-16 19:55:20 +0000284 TIntermFunctionDefinition *addFunctionDefinition(TIntermFunctionPrototype *functionPrototype,
Olli Etuaho336b1472016-10-05 16:37:55 +0100285 TIntermBlock *functionBody,
286 const TSourceLoc &location);
Olli Etuaho476197f2016-10-11 13:59:08 +0100287 void parseFunctionDefinitionHeader(const TSourceLoc &location,
288 TFunction **function,
Olli Etuaho8ad9e752017-01-16 19:55:20 +0000289 TIntermFunctionPrototype **prototypeOut);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500290 TFunction *parseFunctionDeclarator(const TSourceLoc &location, TFunction *function);
Olli Etuaho9de84a52016-06-14 17:36:01 +0300291 TFunction *parseFunctionHeader(const TPublicType &type,
292 const TString *name,
293 const TSourceLoc &location);
Olli Etuahocce89652017-06-19 16:04:09 +0300294 TFunction *addNonConstructorFunc(const TString *name, const TSourceLoc &loc);
Jamie Madill06145232015-05-13 13:10:01 -0400295 TFunction *addConstructorFunc(const TPublicType &publicType);
Olli Etuahocce89652017-06-19 16:04:09 +0300296 TParameter parseParameterDeclarator(const TPublicType &publicType,
297 const TString *name,
298 const TSourceLoc &nameLoc);
Olli Etuaho55bde912017-10-25 13:41:13 +0300299
300 TParameter parseParameterArrayDeclarator(const TString *name,
301 const TSourceLoc &nameLoc,
Olli Etuaho7881cfd2017-08-23 18:00:21 +0300302 const TVector<unsigned int> &arraySizes,
Olli Etuahocce89652017-06-19 16:04:09 +0300303 const TSourceLoc &arrayLoc,
Olli Etuaho55bde912017-10-25 13:41:13 +0300304 TPublicType *elementType);
Olli Etuaho90892fb2016-07-14 14:44:51 +0300305
Jamie Madill06145232015-05-13 13:10:01 -0400306 TIntermTyped *addIndexExpression(TIntermTyped *baseExpression,
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500307 const TSourceLoc &location,
Jamie Madill06145232015-05-13 13:10:01 -0400308 TIntermTyped *indexExpression);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500309 TIntermTyped *addFieldSelectionExpression(TIntermTyped *baseExpression,
Jamie Madill06145232015-05-13 13:10:01 -0400310 const TSourceLoc &dotLocation,
311 const TString &fieldString,
312 const TSourceLoc &fieldLocation);
shannonwoods@chromium.orga9100882013-05-30 00:11:39 +0000313
Olli Etuahocce89652017-06-19 16:04:09 +0300314 // Parse declarator for a single field
Olli Etuahod5f44c92017-11-29 17:15:40 +0200315 TDeclarator *parseStructDeclarator(const TString *identifier, const TSourceLoc &loc);
316 TDeclarator *parseStructArrayDeclarator(const TString *identifier,
317 const TSourceLoc &loc,
318 const TVector<unsigned int> *arraySizes);
Olli Etuahocce89652017-06-19 16:04:09 +0300319
Olli Etuaho722bfb52017-10-26 17:00:11 +0300320 void checkDoesNotHaveDuplicateFieldName(const TFieldList::const_iterator begin,
321 const TFieldList::const_iterator end,
322 const TString &name,
323 const TSourceLoc &location);
324 TFieldList *addStructFieldList(TFieldList *fields, const TSourceLoc &location);
Olli Etuaho4de340a2016-12-16 09:32:03 +0000325 TFieldList *combineStructFieldLists(TFieldList *processedFields,
326 const TFieldList *newlyAddedFields,
327 const TSourceLoc &location);
Martin Radev70866b82016-07-22 15:27:42 +0300328 TFieldList *addStructDeclaratorListWithQualifiers(
329 const TTypeQualifierBuilder &typeQualifierBuilder,
330 TPublicType *typeSpecifier,
Olli Etuahod5f44c92017-11-29 17:15:40 +0200331 const TDeclaratorList *declaratorList);
332 TFieldList *addStructDeclaratorList(const TPublicType &typeSpecifier,
333 const TDeclaratorList *declaratorList);
Martin Radev4a9cd802016-09-01 16:51:51 +0300334 TTypeSpecifierNonArray addStructure(const TSourceLoc &structLine,
335 const TSourceLoc &nameLine,
336 const TString *structName,
337 TFieldList *fieldList);
kbr@chromium.org476541f2011-10-27 21:14:51 +0000338
Olli Etuaho13389b62016-10-16 11:48:18 +0100339 TIntermDeclaration *addInterfaceBlock(const TTypeQualifierBuilder &typeQualifierBuilder,
340 const TSourceLoc &nameLine,
341 const TString &blockName,
342 TFieldList *fieldList,
343 const TString *instanceName,
344 const TSourceLoc &instanceLine,
345 TIntermTyped *arrayIndex,
346 const TSourceLoc &arrayIndexLine);
shannonwoods@chromium.org5668c5d2013-05-30 00:11:48 +0000347
Martin Radev802abe02016-08-04 17:48:32 +0300348 void parseLocalSize(const TString &qualifierType,
349 const TSourceLoc &qualifierTypeLine,
350 int intValue,
351 const TSourceLoc &intValueLine,
352 const std::string &intValueString,
353 size_t index,
Martin Radev4c4c8e72016-08-04 12:25:34 +0300354 sh::WorkGroupSize *localSize);
Olli Etuaho09b04a22016-12-15 13:30:26 +0000355 void parseNumViews(int intValue,
356 const TSourceLoc &intValueLine,
357 const std::string &intValueString,
358 int *numViews);
Shaob5cc1192017-07-06 10:47:20 +0800359 void parseInvocations(int intValue,
360 const TSourceLoc &intValueLine,
361 const std::string &intValueString,
362 int *numInvocations);
363 void parseMaxVertices(int intValue,
364 const TSourceLoc &intValueLine,
365 const std::string &intValueString,
366 int *numMaxVertices);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500367 TLayoutQualifier parseLayoutQualifier(const TString &qualifierType,
368 const TSourceLoc &qualifierTypeLine);
Jamie Madill06145232015-05-13 13:10:01 -0400369 TLayoutQualifier parseLayoutQualifier(const TString &qualifierType,
370 const TSourceLoc &qualifierTypeLine,
Jamie Madill06145232015-05-13 13:10:01 -0400371 int intValue,
372 const TSourceLoc &intValueLine);
Olli Etuaho613b9592016-09-05 12:05:53 +0300373 TTypeQualifierBuilder *createTypeQualifierBuilder(const TSourceLoc &loc);
Olli Etuahocce89652017-06-19 16:04:09 +0300374 TStorageQualifierWrapper *parseGlobalStorageQualifier(TQualifier qualifier,
375 const TSourceLoc &loc);
376 TStorageQualifierWrapper *parseVaryingQualifier(const TSourceLoc &loc);
377 TStorageQualifierWrapper *parseInQualifier(const TSourceLoc &loc);
378 TStorageQualifierWrapper *parseOutQualifier(const TSourceLoc &loc);
379 TStorageQualifierWrapper *parseInOutQualifier(const TSourceLoc &loc);
Martin Radev802abe02016-08-04 17:48:32 +0300380 TLayoutQualifier joinLayoutQualifiers(TLayoutQualifier leftQualifier,
381 TLayoutQualifier rightQualifier,
382 const TSourceLoc &rightQualifierLocation);
shannonwoods@chromium.org302adfe2013-05-30 00:21:06 +0000383
kbr@chromium.org476541f2011-10-27 21:14:51 +0000384 // Performs an error check for embedded struct declarations.
Olli Etuaho383b7912016-08-05 11:22:59 +0300385 void enterStructDeclaration(const TSourceLoc &line, const TString &identifier);
kbr@chromium.org476541f2011-10-27 21:14:51 +0000386 void exitStructDeclaration();
387
Olli Etuaho8a176262016-08-16 14:23:01 +0300388 void checkIsBelowStructNestingLimit(const TSourceLoc &line, const TField &field);
Olli Etuaho09b22472015-02-11 11:47:26 +0200389
Olli Etuaho6d40bbd2016-09-30 13:49:38 +0100390 TIntermSwitch *addSwitch(TIntermTyped *init,
391 TIntermBlock *statementList,
392 const TSourceLoc &loc);
Olli Etuahoa3a36662015-02-17 13:46:51 +0200393 TIntermCase *addCase(TIntermTyped *condition, const TSourceLoc &loc);
394 TIntermCase *addDefault(const TSourceLoc &loc);
395
Jamie Madill06145232015-05-13 13:10:01 -0400396 TIntermTyped *addUnaryMath(TOperator op, TIntermTyped *child, const TSourceLoc &loc);
397 TIntermTyped *addUnaryMathLValue(TOperator op, TIntermTyped *child, const TSourceLoc &loc);
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500398 TIntermTyped *addBinaryMath(TOperator op,
399 TIntermTyped *left,
400 TIntermTyped *right,
401 const TSourceLoc &loc);
402 TIntermTyped *addBinaryMathBooleanResult(TOperator op,
403 TIntermTyped *left,
404 TIntermTyped *right,
405 const TSourceLoc &loc);
406 TIntermTyped *addAssign(TOperator op,
407 TIntermTyped *left,
408 TIntermTyped *right,
409 const TSourceLoc &loc);
Olli Etuaho49300862015-02-20 14:54:49 +0200410
Olli Etuaho0b2d2dc2015-11-04 16:35:32 +0200411 TIntermTyped *addComma(TIntermTyped *left, TIntermTyped *right, const TSourceLoc &loc);
412
Olli Etuaho49300862015-02-20 14:54:49 +0200413 TIntermBranch *addBranch(TOperator op, const TSourceLoc &loc);
Olli Etuahocce89652017-06-19 16:04:09 +0300414 TIntermBranch *addBranch(TOperator op, TIntermTyped *expression, const TSourceLoc &loc);
Olli Etuahoc4ba3be2015-03-02 14:42:24 +0200415
Martin Radev84aa2dc2017-09-11 15:51:02 +0300416 void checkTextureGather(TIntermAggregate *functionCall);
Olli Etuahoe1a94c62015-11-16 17:35:25 +0200417 void checkTextureOffsetConst(TIntermAggregate *functionCall);
Martin Radev2cc85b32016-08-05 16:22:53 +0300418 void checkImageMemoryAccessForBuiltinFunctions(TIntermAggregate *functionCall);
419 void checkImageMemoryAccessForUserDefinedFunctions(const TFunction *functionDefinition,
420 const TIntermAggregate *functionCall);
Jiajia Qina3106c52017-11-03 09:39:39 +0800421 void checkAtomicMemoryBuiltinFunctions(TIntermAggregate *functionCall);
Olli Etuahoaf6fc1b2017-01-26 17:45:35 -0800422 TIntermSequence *createEmptyArgumentsList();
Olli Etuaho72d10202017-01-19 15:58:30 +0000423
Olli Etuahoaf6fc1b2017-01-26 17:45:35 -0800424 // fnCall is only storing the built-in op, and function name or constructor type. arguments
Olli Etuaho72d10202017-01-19 15:58:30 +0000425 // has the arguments.
Jamie Madill06145232015-05-13 13:10:01 -0400426 TIntermTyped *addFunctionCallOrMethod(TFunction *fnCall,
Olli Etuahoaf6fc1b2017-01-26 17:45:35 -0800427 TIntermSequence *arguments,
Jamie Madill06145232015-05-13 13:10:01 -0400428 TIntermNode *thisNode,
Olli Etuaho72d10202017-01-19 15:58:30 +0000429 const TSourceLoc &loc);
Olli Etuahofc1806e2015-03-17 13:03:11 +0200430
Olli Etuahod0bad2c2016-09-09 18:01:16 +0300431 TIntermTyped *addTernarySelection(TIntermTyped *cond,
432 TIntermTyped *trueExpression,
433 TIntermTyped *falseExpression,
434 const TSourceLoc &line);
Olli Etuaho52901742015-04-15 13:42:45 +0300435
Shaob5cc1192017-07-06 10:47:20 +0800436 int getGeometryShaderMaxVertices() const { return mGeometryShaderMaxVertices; }
437 int getGeometryShaderInvocations() const
438 {
439 return (mGeometryShaderInvocations > 0) ? mGeometryShaderInvocations : 1;
440 }
441 TLayoutPrimitiveType getGeometryShaderInputPrimitiveType() const
442 {
443 return mGeometryShaderInputPrimitiveType;
444 }
445 TLayoutPrimitiveType getGeometryShaderOutputPrimitiveType() const
446 {
447 return mGeometryShaderOutputPrimitiveType;
448 }
449
Olli Etuaho56229f12017-07-10 14:16:33 +0300450 // TODO(jmadill): make this private
Jamie Madill6e06b1f2015-05-14 10:01:17 -0400451 TSymbolTable &symbolTable; // symbol table that goes with the language currently being parsed
452
Olli Etuahofc1806e2015-03-17 13:03:11 +0200453 private:
jchen104cdac9e2017-05-08 11:01:20 +0800454 class AtomicCounterBindingState;
455 constexpr static size_t kAtomicCounterSize = 4;
456 // UNIFORM_ARRAY_STRIDE for atomic counter arrays is an implementation-dependent value which
457 // can be queried after a program is linked according to ES 3.10 section 7.7.1. This is
458 // controversial with the offset inheritance as described in ESSL 3.10 section 4.4.6. Currently
459 // we treat it as always 4 in favour of the original interpretation in
460 // "ARB_shader_atomic_counters".
461 // TODO(jie.a.chen@intel.com): Double check this once the spec vagueness is resolved.
Olli Etuaho55bc9052017-10-25 17:33:06 +0300462 // Note that there may be tests in AtomicCounter_test that will need to be updated as well.
jchen104cdac9e2017-05-08 11:01:20 +0800463 constexpr static size_t kAtomicCounterArrayStride = 4;
464
Olli Etuaho4de340a2016-12-16 09:32:03 +0000465 // Returns a clamped index. If it prints out an error message, the token is "[]".
Olli Etuahoebee5b32017-11-23 12:56:32 +0200466 int checkIndexLessThan(bool outOfRangeIndexIsError,
467 const TSourceLoc &location,
468 int index,
469 int arraySize,
470 const char *reason);
Olli Etuaho90892fb2016-07-14 14:44:51 +0300471
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500472 bool declareVariable(const TSourceLoc &line,
473 const TString &identifier,
Olli Etuahob60d30f2018-01-16 12:31:06 +0200474 const TType *type,
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500475 TVariable **variable);
Olli Etuaho2935c582015-04-08 14:32:06 +0300476
Olli Etuaho856c4972016-08-08 11:38:39 +0300477 void checkCanBeDeclaredWithoutInitializer(const TSourceLoc &line,
478 const TString &identifier,
Olli Etuaho55bde912017-10-25 13:41:13 +0300479 TType *type);
480
481 TParameter parseParameterDeclarator(TType *type,
482 const TString *name,
483 const TSourceLoc &nameLoc);
Olli Etuaho376f1b52015-04-13 13:23:41 +0300484
Olli Etuaho8a176262016-08-16 14:23:01 +0300485 bool checkIsValidTypeAndQualifierForArray(const TSourceLoc &indexLocation,
486 const TPublicType &elementType);
jchen104cdac9e2017-05-08 11:01:20 +0800487 // Done for all atomic counter declarations, whether empty or not.
488 void atomicCounterQualifierErrorCheck(const TPublicType &publicType,
489 const TSourceLoc &location);
Olli Etuaho8a176262016-08-16 14:23:01 +0300490
Olli Etuaho1dded802016-08-18 18:13:13 +0300491 // Assumes that multiplication op has already been set based on the types.
492 bool isMultiplicationTypeCombinationValid(TOperator op, const TType &left, const TType &right);
493
Martin Radev2cc85b32016-08-05 16:22:53 +0300494 void checkOutParameterIsNotOpaqueType(const TSourceLoc &line,
495 TQualifier qualifier,
496 const TType &type);
Martin Radev2cc85b32016-08-05 16:22:53 +0300497
Olli Etuaho43364892017-02-13 16:00:12 +0000498 void checkInternalFormatIsNotSpecified(const TSourceLoc &location,
499 TLayoutImageInternalFormat internalFormat);
500 void checkMemoryQualifierIsNotSpecified(const TMemoryQualifier &memoryQualifier,
501 const TSourceLoc &location);
Olli Etuaho55bc9052017-10-25 17:33:06 +0300502 void checkAtomicCounterOffsetDoesNotOverlap(bool forceAppend,
503 const TSourceLoc &loc,
504 TType *type);
Olli Etuaho43364892017-02-13 16:00:12 +0000505 void checkBindingIsValid(const TSourceLoc &identifierLocation, const TType &type);
506 void checkBindingIsNotSpecified(const TSourceLoc &location, int binding);
jchen104cdac9e2017-05-08 11:01:20 +0800507 void checkOffsetIsNotSpecified(const TSourceLoc &location, int offset);
Olli Etuaho96f6adf2017-08-16 11:18:54 +0300508 void checkImageBindingIsValid(const TSourceLoc &location,
509 int binding,
510 int arrayTotalElementCount);
511 void checkSamplerBindingIsValid(const TSourceLoc &location,
512 int binding,
513 int arrayTotalElementCount);
Jiajia Qinbc585152017-06-23 15:42:17 +0800514 void checkBlockBindingIsValid(const TSourceLoc &location,
515 const TQualifier &qualifier,
516 int binding,
517 int arraySize);
jchen104cdac9e2017-05-08 11:01:20 +0800518 void checkAtomicCounterBindingIsValid(const TSourceLoc &location, int binding);
Olli Etuaho43364892017-02-13 16:00:12 +0000519
Olli Etuaho6ca2b652017-02-19 18:05:10 +0000520 void checkUniformLocationInRange(const TSourceLoc &location,
521 int objectLocationCount,
522 const TLayoutQualifier &layoutQualifier);
523
Andrei Volykhina5527072017-03-22 16:46:30 +0300524 void checkYuvIsNotSpecified(const TSourceLoc &location, bool yuv);
525
Olli Etuaho96f6adf2017-08-16 11:18:54 +0300526 bool checkUnsizedArrayConstructorArgumentDimensionality(TIntermSequence *arguments,
527 TType type,
528 const TSourceLoc &line);
529
Olli Etuaho454c34c2017-10-25 16:35:56 +0300530 // Will set the size of the outermost array according to geometry shader input layout.
531 void checkGeometryShaderInputAndSetArraySize(const TSourceLoc &location,
532 const char *token,
533 TType *type);
534
Olli Etuaho55bde912017-10-25 13:41:13 +0300535 // Will size any unsized array type so unsized arrays won't need to be taken into account
536 // further along the line in parsing.
537 void checkIsNotUnsizedArray(const TSourceLoc &line,
538 const char *errorMessage,
539 const char *token,
540 TType *arrayType);
541
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500542 TIntermTyped *addBinaryMathInternal(TOperator op,
543 TIntermTyped *left,
544 TIntermTyped *right,
545 const TSourceLoc &loc);
Olli Etuaho13389b62016-10-16 11:48:18 +0100546 TIntermBinary *createAssign(TOperator op,
547 TIntermTyped *left,
548 TIntermTyped *right,
549 const TSourceLoc &loc);
Olli Etuahoaf6fc1b2017-01-26 17:45:35 -0800550 TIntermTyped *createUnaryMath(TOperator op, TIntermTyped *child, const TSourceLoc &loc);
551
Olli Etuahobed35d72017-12-20 16:36:26 +0200552 TIntermTyped *addMethod(const TString &name,
Olli Etuahoaf6fc1b2017-01-26 17:45:35 -0800553 TIntermSequence *arguments,
554 TIntermNode *thisNode,
555 const TSourceLoc &loc);
556 TIntermTyped *addConstructor(TIntermSequence *arguments,
Olli Etuahoaf6fc1b2017-01-26 17:45:35 -0800557 TType type,
558 const TSourceLoc &line);
Olli Etuahobed35d72017-12-20 16:36:26 +0200559 TIntermTyped *addNonConstructorFunctionCall(const TString &name,
Olli Etuahoaf6fc1b2017-01-26 17:45:35 -0800560 TIntermSequence *arguments,
561 const TSourceLoc &loc);
Olli Etuahod6b14282015-03-17 14:31:35 +0200562
Olli Etuaho765924f2018-01-04 12:48:36 +0200563 // Return either the original expression or the folded version of the expression in case the
564 // folded node will validate the same way during subsequent parsing.
565 TIntermTyped *expressionOrFoldedResult(TIntermTyped *expression);
566
Olli Etuaho47fd36a2015-03-19 14:22:24 +0200567 // Return true if the checks pass
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500568 bool binaryOpCommonCheck(TOperator op,
569 TIntermTyped *left,
570 TIntermTyped *right,
571 const TSourceLoc &loc);
Olli Etuahofa33d582015-04-09 14:33:12 +0300572
Olli Etuaho8ad9e752017-01-16 19:55:20 +0000573 TIntermFunctionPrototype *createPrototypeNodeFromFunction(const TFunction &function,
574 const TSourceLoc &location,
575 bool insertParametersToSymbolTable);
576
jchen104cdac9e2017-05-08 11:01:20 +0800577 void setAtomicCounterBindingDefaultOffset(const TPublicType &declaration,
578 const TSourceLoc &location);
579
Shaob5cc1192017-07-06 10:47:20 +0800580 bool checkPrimitiveTypeMatchesTypeQualifier(const TTypeQualifier &typeQualifier);
581 bool parseGeometryShaderInputLayoutQualifier(const TTypeQualifier &typeQualifier);
582 bool parseGeometryShaderOutputLayoutQualifier(const TTypeQualifier &typeQualifier);
Jiawei Shao8e4b3552017-08-30 14:20:58 +0800583 void setGeometryShaderInputArraySize(unsigned int inputArraySize, const TSourceLoc &line);
Shaob5cc1192017-07-06 10:47:20 +0800584
Olli Etuahobb7e5a72017-04-24 10:16:44 +0300585 // Set to true when the last/current declarator list was started with an empty declaration. The
586 // non-empty declaration error check will need to be performed if the empty declaration is
587 // followed by a declarator.
588 bool mDeferredNonEmptyDeclarationErrorCheck;
Jamie Madill6e06b1f2015-05-14 10:01:17 -0400589
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500590 sh::GLenum mShaderType; // vertex or fragment language (future: pack or unpack)
Qiankun Miao7ebb97f2016-09-08 18:01:50 +0800591 ShShaderSpec mShaderSpec; // The language specification compiler conforms to - GLES2 or WebGL.
592 ShCompileOptions mCompileOptions; // Options passed to TCompiler
Jamie Madill6e06b1f2015-05-14 10:01:17 -0400593 int mShaderVersion;
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500594 TIntermBlock *mTreeRoot; // root of parse tree being created
595 int mLoopNestingLevel; // 0 if outside all loops
596 int mStructNestingLevel; // incremented while parsing a struct declaration
597 int mSwitchNestingLevel; // 0 if outside all switch statements
Qiankun Miao7ebb97f2016-09-08 18:01:50 +0800598 const TType
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500599 *mCurrentFunctionType; // the return type of the function that's currently being parsed
600 bool mFunctionReturnsValue; // true if a non-void function has a return
Qiankun Miao7ebb97f2016-09-08 18:01:50 +0800601 bool mChecksPrecisionErrors; // true if an error will be generated when a variable is declared
602 // without precision, explicit or implicit.
Olli Etuahoa6996682015-10-12 14:32:30 +0300603 bool mFragmentPrecisionHighOnESSL1; // true if highp precision is supported when compiling
604 // ESSL1.
Jiajia Qinbc585152017-06-23 15:42:17 +0800605 TLayoutMatrixPacking mDefaultUniformMatrixPacking;
606 TLayoutBlockStorage mDefaultUniformBlockStorage;
607 TLayoutMatrixPacking mDefaultBufferMatrixPacking;
608 TLayoutBlockStorage mDefaultBufferBlockStorage;
Jamie Madill6e06b1f2015-05-14 10:01:17 -0400609 TString mHashErrMsg;
Olli Etuaho77ba4082016-12-16 12:01:18 +0000610 TDiagnostics *mDiagnostics;
Jamie Madill6e06b1f2015-05-14 10:01:17 -0400611 TDirectiveHandler mDirectiveHandler;
612 pp::Preprocessor mPreprocessor;
613 void *mScanner;
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500614 bool mUsesFragData; // track if we are using both gl_FragData and gl_FragColor
Jamie Madill14e95b32015-05-07 10:10:41 -0400615 bool mUsesFragColor;
Kimmo Kinnunenb18609b2015-07-16 14:13:11 +0300616 bool mUsesSecondaryOutputs; // Track if we are using either gl_SecondaryFragData or
617 // gl_Secondary FragColor or both.
Olli Etuahoe1a94c62015-11-16 17:35:25 +0200618 int mMinProgramTexelOffset;
619 int mMaxProgramTexelOffset;
Martin Radev802abe02016-08-04 17:48:32 +0300620
Martin Radev84aa2dc2017-09-11 15:51:02 +0300621 int mMinProgramTextureGatherOffset;
622 int mMaxProgramTextureGatherOffset;
623
Martin Radev802abe02016-08-04 17:48:32 +0300624 // keep track of local group size declared in layout. It should be declared only once.
625 bool mComputeShaderLocalSizeDeclared;
Martin Radev4c4c8e72016-08-04 12:25:34 +0300626 sh::WorkGroupSize mComputeShaderLocalSize;
Olli Etuaho09b04a22016-12-15 13:30:26 +0000627 // keep track of number of views declared in layout.
628 int mNumViews;
629 int mMaxNumViews;
Olli Etuaho43364892017-02-13 16:00:12 +0000630 int mMaxImageUnits;
631 int mMaxCombinedTextureImageUnits;
Olli Etuaho6ca2b652017-02-19 18:05:10 +0000632 int mMaxUniformLocations;
jchen10af713a22017-04-19 09:10:56 +0800633 int mMaxUniformBufferBindings;
jchen104cdac9e2017-05-08 11:01:20 +0800634 int mMaxAtomicCounterBindings;
Jiajia Qinbc585152017-06-23 15:42:17 +0800635 int mMaxShaderStorageBufferBindings;
jchen104cdac9e2017-05-08 11:01:20 +0800636
Martin Radev70866b82016-07-22 15:27:42 +0300637 // keeps track whether we are declaring / defining a function
638 bool mDeclaringFunction;
jchen104cdac9e2017-05-08 11:01:20 +0800639
640 // Track the state of each atomic counter binding.
641 std::map<int, AtomicCounterBindingState> mAtomicCounterBindingStates;
Shaob5cc1192017-07-06 10:47:20 +0800642
643 // Track the geometry shader global parameters declared in layout.
644 TLayoutPrimitiveType mGeometryShaderInputPrimitiveType;
645 TLayoutPrimitiveType mGeometryShaderOutputPrimitiveType;
646 int mGeometryShaderInvocations;
647 int mGeometryShaderMaxVertices;
648 int mMaxGeometryShaderInvocations;
649 int mMaxGeometryShaderMaxVertices;
Jiawei Shao8e4b3552017-08-30 14:20:58 +0800650
Olli Etuahoc74ec1a2018-01-09 15:23:28 +0200651 // Store gl_in variable with its array size once the array size can be determined. The array
652 // size can also be checked against latter input primitive type declaration.
653 const TVariable *mGlInVariableWithArraySize;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000654};
655
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500656int PaParseStrings(size_t count,
657 const char *const string[],
658 const int length[],
659 TParseContext *context);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000660
Jamie Madill45bcc782016-11-07 13:58:48 -0500661} // namespace sh
662
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500663#endif // COMPILER_TRANSLATOR_PARSECONTEXT_H_