blob: f9fa1def69919900a100842435989dd4c6cc3333 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
2// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7//
8// Definition of the in-memory high-level intermediate representation
9// of shaders. This is a tree that parser creates.
10//
11// Nodes in the tree are defined as a hierarchy of classes derived from
12// TIntermNode. Each is a node in a tree. There is no preset branching factor;
13// each node can have it's own type of list of children.
14//
15
16#ifndef __INTERMEDIATE_H
17#define __INTERMEDIATE_H
18
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000019#include "compiler/Common.h"
20#include "compiler/Types.h"
21#include "compiler/ConstantUnion.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000022
23//
24// Operators used by the high-level (parse tree) representation.
25//
26enum TOperator {
alokp@chromium.org2cf17712010-03-30 20:33:18 +000027 EOpNull, // if in a node, should only mean a node is still being built
28 EOpSequence, // denotes a list of statements, or parameters, etc.
29 EOpFunctionCall,
30 EOpFunction, // For function definition
31 EOpParameters, // an aggregate listing the parameters to a function
daniel@transgaming.comd1acd1e2010-04-13 03:25:57 +000032
alokp@chromium.org2cf17712010-03-30 20:33:18 +000033 EOpDeclaration,
daniel@transgaming.comd1acd1e2010-04-13 03:25:57 +000034 EOpPrototype,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000035
alokp@chromium.org2cf17712010-03-30 20:33:18 +000036 //
37 // Unary operators
38 //
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000039
alokp@chromium.org2cf17712010-03-30 20:33:18 +000040 EOpNegative,
41 EOpLogicalNot,
42 EOpVectorLogicalNot,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000043
alokp@chromium.org2cf17712010-03-30 20:33:18 +000044 EOpPostIncrement,
45 EOpPostDecrement,
46 EOpPreIncrement,
47 EOpPreDecrement,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000048
alokp@chromium.org2cf17712010-03-30 20:33:18 +000049 EOpConvIntToBool,
50 EOpConvFloatToBool,
51 EOpConvBoolToFloat,
52 EOpConvIntToFloat,
53 EOpConvFloatToInt,
54 EOpConvBoolToInt,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000055
alokp@chromium.org2cf17712010-03-30 20:33:18 +000056 //
57 // binary operations
58 //
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000059
alokp@chromium.org2cf17712010-03-30 20:33:18 +000060 EOpAdd,
61 EOpSub,
62 EOpMul,
63 EOpDiv,
64 EOpEqual,
65 EOpNotEqual,
66 EOpVectorEqual,
67 EOpVectorNotEqual,
68 EOpLessThan,
69 EOpGreaterThan,
70 EOpLessThanEqual,
71 EOpGreaterThanEqual,
72 EOpComma,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000073
alokp@chromium.org2cf17712010-03-30 20:33:18 +000074 EOpVectorTimesScalar,
75 EOpVectorTimesMatrix,
76 EOpMatrixTimesVector,
77 EOpMatrixTimesScalar,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000078
alokp@chromium.org2cf17712010-03-30 20:33:18 +000079 EOpLogicalOr,
80 EOpLogicalXor,
81 EOpLogicalAnd,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000082
alokp@chromium.org2cf17712010-03-30 20:33:18 +000083 EOpIndexDirect,
84 EOpIndexIndirect,
85 EOpIndexDirectStruct,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000086
alokp@chromium.org2cf17712010-03-30 20:33:18 +000087 EOpVectorSwizzle,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000088
alokp@chromium.org2cf17712010-03-30 20:33:18 +000089 //
90 // Built-in functions potentially mapped to operators
91 //
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000092
alokp@chromium.org2cf17712010-03-30 20:33:18 +000093 EOpRadians,
94 EOpDegrees,
95 EOpSin,
96 EOpCos,
97 EOpTan,
98 EOpAsin,
99 EOpAcos,
100 EOpAtan,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000101
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000102 EOpPow,
103 EOpExp,
104 EOpLog,
105 EOpExp2,
106 EOpLog2,
107 EOpSqrt,
108 EOpInverseSqrt,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000109
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000110 EOpAbs,
111 EOpSign,
112 EOpFloor,
113 EOpCeil,
114 EOpFract,
115 EOpMod,
116 EOpMin,
117 EOpMax,
118 EOpClamp,
119 EOpMix,
120 EOpStep,
121 EOpSmoothStep,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000122
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000123 EOpLength,
124 EOpDistance,
125 EOpDot,
126 EOpCross,
127 EOpNormalize,
128 EOpFaceForward,
129 EOpReflect,
130 EOpRefract,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000131
alokp@chromium.org06098892010-08-26 19:36:42 +0000132 EOpDFdx, // Fragment only, OES_standard_derivatives extension
133 EOpDFdy, // Fragment only, OES_standard_derivatives extension
134 EOpFwidth, // Fragment only, OES_standard_derivatives extension
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000135
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000136 EOpMatrixTimesMatrix,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000137
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000138 EOpAny,
139 EOpAll,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000140
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000141 //
142 // Branch
143 //
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000144
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000145 EOpKill, // Fragment only
146 EOpReturn,
147 EOpBreak,
148 EOpContinue,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000149
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000150 //
151 // Constructors
152 //
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000153
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000154 EOpConstructInt,
155 EOpConstructBool,
156 EOpConstructFloat,
157 EOpConstructVec2,
158 EOpConstructVec3,
159 EOpConstructVec4,
160 EOpConstructBVec2,
161 EOpConstructBVec3,
162 EOpConstructBVec4,
163 EOpConstructIVec2,
164 EOpConstructIVec3,
165 EOpConstructIVec4,
166 EOpConstructMat2,
167 EOpConstructMat3,
168 EOpConstructMat4,
169 EOpConstructStruct,
170
171 //
172 // moves
173 //
174
175 EOpAssign,
176 EOpInitialize,
177 EOpAddAssign,
178 EOpSubAssign,
179 EOpMulAssign,
180 EOpVectorTimesMatrixAssign,
181 EOpVectorTimesScalarAssign,
182 EOpMatrixTimesScalarAssign,
183 EOpMatrixTimesMatrixAssign,
184 EOpDivAssign,
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000185};
186
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000187extern const char* getOperatorString(TOperator op);
188
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000189class TIntermTraverser;
190class TIntermAggregate;
191class TIntermBinary;
daniel@transgaming.com4a35ef22010-04-08 03:51:06 +0000192class TIntermUnary;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000193class TIntermConstantUnion;
194class TIntermSelection;
195class TIntermTyped;
196class TIntermSymbol;
alokp@chromium.orgd88b7732010-05-26 15:13:14 +0000197class TIntermLoop;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000198class TInfoSink;
199
200//
201// Base class for the tree nodes
202//
203class TIntermNode {
204public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000205 POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000206
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000207 TIntermNode() : line(0) {}
alokp@chromium.org58e54292010-08-24 21:40:03 +0000208
209 TSourceLoc getLine() const { return line; }
210 void setLine(TSourceLoc l) { line = l; }
211
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000212 virtual void traverse(TIntermTraverser*) = 0;
alokp@chromium.orgd88b7732010-05-26 15:13:14 +0000213 virtual TIntermTyped* getAsTyped() { return 0; }
214 virtual TIntermConstantUnion* getAsConstantUnion() { return 0; }
215 virtual TIntermAggregate* getAsAggregate() { return 0; }
216 virtual TIntermBinary* getAsBinaryNode() { return 0; }
217 virtual TIntermUnary* getAsUnaryNode() { return 0; }
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000218 virtual TIntermSelection* getAsSelectionNode() { return 0; }
alokp@chromium.orgd88b7732010-05-26 15:13:14 +0000219 virtual TIntermSymbol* getAsSymbolNode() { return 0; }
220 virtual TIntermLoop* getAsLoopNode() { return 0; }
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000221 virtual ~TIntermNode() { }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000222
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000223protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000224 TSourceLoc line;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000225};
226
227//
228// This is just to help yacc.
229//
230struct TIntermNodePair {
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000231 TIntermNode* node1;
232 TIntermNode* node2;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000233};
234
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000235//
236// Intermediate class for nodes that have a type.
237//
238class TIntermTyped : public TIntermNode {
239public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000240 TIntermTyped(const TType& t) : type(t) { }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000241 virtual TIntermTyped* getAsTyped() { return this; }
alokp@chromium.orgdd037b22010-03-30 18:47:20 +0000242
alokp@chromium.org58e54292010-08-24 21:40:03 +0000243 void setType(const TType& t) { type = t; }
244 const TType& getType() const { return type; }
245 TType* getTypePointer() { return &type; }
246
247 TBasicType getBasicType() const { return type.getBasicType(); }
248 TQualifier getQualifier() const { return type.getQualifier(); }
249 TPrecision getPrecision() const { return type.getPrecision(); }
250 int getNominalSize() const { return type.getNominalSize(); }
251
252 bool isMatrix() const { return type.isMatrix(); }
253 bool isArray() const { return type.isArray(); }
254 bool isVector() const { return type.isVector(); }
255 bool isScalar() const { return type.isScalar(); }
256 const char* getBasicString() const { return type.getBasicString(); }
257 const char* getQualifierString() const { return type.getQualifierString(); }
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000258 TString getCompleteString() const { return type.getCompleteString(); }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000259
260protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000261 TType type;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000262};
263
264//
265// Handle for, do-while, and while loops.
266//
alokp@chromium.org52813552010-11-16 18:36:09 +0000267enum TLoopType {
268 ELoopFor,
269 ELoopWhile,
270 ELoopDoWhile,
271};
272
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000273class TIntermLoop : public TIntermNode {
274public:
alokp@chromium.org52813552010-11-16 18:36:09 +0000275 TIntermLoop(TLoopType aType,
276 TIntermNode *aInit, TIntermTyped* aCond, TIntermTyped* aExpr,
277 TIntermNode* aBody) :
278 type(aType),
279 init(aInit),
280 cond(aCond),
281 expr(aExpr),
282 body(aBody) { }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000283
alokp@chromium.orgd88b7732010-05-26 15:13:14 +0000284 virtual TIntermLoop* getAsLoopNode() { return this; }
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000285 virtual void traverse(TIntermTraverser*);
alokp@chromium.org58e54292010-08-24 21:40:03 +0000286
alokp@chromium.org52813552010-11-16 18:36:09 +0000287 TLoopType getType() const { return type; }
288 TIntermNode* getInit() { return init; }
289 TIntermTyped* getCondition() { return cond; }
290 TIntermTyped* getExpression() { return expr; }
291 TIntermNode* getBody() { return body; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000292
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000293protected:
alokp@chromium.org52813552010-11-16 18:36:09 +0000294 TLoopType type;
295 TIntermNode* init; // for-loop initialization
296 TIntermTyped* cond; // loop exit condition
297 TIntermTyped* expr; // for-loop expression
298 TIntermNode* body; // loop body
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000299};
300
301//
302// Handle break, continue, return, and kill.
303//
304class TIntermBranch : public TIntermNode {
305public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000306 TIntermBranch(TOperator op, TIntermTyped* e) :
307 flowOp(op),
308 expression(e) { }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000309
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000310 virtual void traverse(TIntermTraverser*);
alokp@chromium.org58e54292010-08-24 21:40:03 +0000311
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000312 TOperator getFlowOp() { return flowOp; }
313 TIntermTyped* getExpression() { return expression; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000314
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000315protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000316 TOperator flowOp;
317 TIntermTyped* expression; // non-zero except for "return exp;" statements
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000318};
319
320//
321// Nodes that correspond to symbols or constants in the source code.
322//
323class TIntermSymbol : public TIntermTyped {
324public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000325 // if symbol is initialized as symbol(sym), the memory comes from the poolallocator of sym. If sym comes from
326 // per process globalpoolallocator, then it causes increased memory usage per compile
327 // it is essential to use "symbol = sym" to assign to symbol
328 TIntermSymbol(int i, const TString& sym, const TType& t) :
329 TIntermTyped(t), id(i) { symbol = sym;}
alokp@chromium.org58e54292010-08-24 21:40:03 +0000330
331 int getId() const { return id; }
332 const TString& getSymbol() const { return symbol; }
333
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000334 virtual void traverse(TIntermTraverser*);
335 virtual TIntermSymbol* getAsSymbolNode() { return this; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000336
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000337protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000338 int id;
339 TString symbol;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000340};
341
342class TIntermConstantUnion : public TIntermTyped {
343public:
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000344 TIntermConstantUnion(ConstantUnion *unionPointer, const TType& t) : TIntermTyped(t), unionArrayPointer(unionPointer) { }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000345
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000346 ConstantUnion* getUnionArrayPointer() const { return unionArrayPointer; }
347 void setUnionArrayPointer(ConstantUnion *c) { unionArrayPointer = c; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000348
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000349 virtual TIntermConstantUnion* getAsConstantUnion() { return this; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000350 virtual void traverse(TIntermTraverser*);
351
352 TIntermTyped* fold(TOperator, TIntermTyped*, TInfoSink&);
353
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000354protected:
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000355 ConstantUnion *unionArrayPointer;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000356};
357
358//
359// Intermediate class for node types that hold operators.
360//
361class TIntermOperator : public TIntermTyped {
362public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000363 TOperator getOp() const { return op; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000364 void setOp(TOperator o) { op = o; }
365
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000366 bool modifiesState() const;
367 bool isConstructor() const;
alokp@chromium.org58e54292010-08-24 21:40:03 +0000368
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000369protected:
daniel@transgaming.coma5d76232010-05-17 09:58:47 +0000370 TIntermOperator(TOperator o) : TIntermTyped(TType(EbtFloat, EbpUndefined)), op(o) {}
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000371 TIntermOperator(TOperator o, TType& t) : TIntermTyped(t), op(o) {}
372 TOperator op;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000373};
374
375//
376// Nodes for all the basic binary math operators.
377//
378class TIntermBinary : public TIntermOperator {
379public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000380 TIntermBinary(TOperator o) : TIntermOperator(o) {}
alokp@chromium.org58e54292010-08-24 21:40:03 +0000381
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000382 virtual TIntermBinary* getAsBinaryNode() { return this; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000383 virtual void traverse(TIntermTraverser*);
384
385 void setLeft(TIntermTyped* n) { left = n; }
386 void setRight(TIntermTyped* n) { right = n; }
387 TIntermTyped* getLeft() const { return left; }
388 TIntermTyped* getRight() const { return right; }
389 bool promote(TInfoSink&);
390
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000391protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000392 TIntermTyped* left;
393 TIntermTyped* right;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000394};
395
396//
397// Nodes for unary math operators.
398//
399class TIntermUnary : public TIntermOperator {
400public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000401 TIntermUnary(TOperator o, TType& t) : TIntermOperator(o, t), operand(0) {}
402 TIntermUnary(TOperator o) : TIntermOperator(o), operand(0) {}
alokp@chromium.org58e54292010-08-24 21:40:03 +0000403
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000404 virtual void traverse(TIntermTraverser*);
daniel@transgaming.com4a35ef22010-04-08 03:51:06 +0000405 virtual TIntermUnary* getAsUnaryNode() { return this; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000406
407 void setOperand(TIntermTyped* o) { operand = o; }
408 TIntermTyped* getOperand() { return operand; }
409 bool promote(TInfoSink&);
410
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000411protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000412 TIntermTyped* operand;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000413};
414
415typedef TVector<TIntermNode*> TIntermSequence;
416typedef TVector<int> TQualifierList;
alokp@chromium.orgad771eb2010-09-07 17:36:23 +0000417typedef TMap<TString, TString> TPragmaTable;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000418//
419// Nodes that operate on an arbitrary sized set of children.
420//
421class TIntermAggregate : public TIntermOperator {
422public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000423 TIntermAggregate() : TIntermOperator(EOpNull), userDefined(false), pragmaTable(0) { }
424 TIntermAggregate(TOperator o) : TIntermOperator(o), pragmaTable(0) { }
425 ~TIntermAggregate() { delete pragmaTable; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000426
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000427 virtual TIntermAggregate* getAsAggregate() { return this; }
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000428 virtual void traverse(TIntermTraverser*);
alokp@chromium.org58e54292010-08-24 21:40:03 +0000429
430 TIntermSequence& getSequence() { return sequence; }
alokp@chromium.orgb19403a2010-09-08 17:56:26 +0000431
alokp@chromium.org58e54292010-08-24 21:40:03 +0000432 void setName(const TString& n) { name = n; }
433 const TString& getName() const { return name; }
434
435 void setUserDefined() { userDefined = true; }
436 bool isUserDefined() { return userDefined; }
alokp@chromium.orgb19403a2010-09-08 17:56:26 +0000437
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000438 void setOptimize(bool o) { optimize = o; }
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000439 bool getOptimize() { return optimize; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000440 void setDebug(bool d) { debug = d; }
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000441 bool getDebug() { return debug; }
442 void addToPragmaTable(const TPragmaTable& pTable);
443 const TPragmaTable& getPragmaTable() const { return *pragmaTable; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000444
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000445protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000446 TIntermAggregate(const TIntermAggregate&); // disallow copy constructor
447 TIntermAggregate& operator=(const TIntermAggregate&); // disallow assignment operator
448 TIntermSequence sequence;
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000449 TString name;
450 bool userDefined; // used for user defined function names
alokp@chromium.orgb19403a2010-09-08 17:56:26 +0000451
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000452 bool optimize;
453 bool debug;
454 TPragmaTable *pragmaTable;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000455};
456
457//
458// For if tests. Simplified since there is no switch statement.
459//
460class TIntermSelection : public TIntermTyped {
461public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000462 TIntermSelection(TIntermTyped* cond, TIntermNode* trueB, TIntermNode* falseB) :
daniel@transgaming.coma5d76232010-05-17 09:58:47 +0000463 TIntermTyped(TType(EbtVoid, EbpUndefined)), condition(cond), trueBlock(trueB), falseBlock(falseB) {}
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000464 TIntermSelection(TIntermTyped* cond, TIntermNode* trueB, TIntermNode* falseB, const TType& type) :
465 TIntermTyped(type), condition(cond), trueBlock(trueB), falseBlock(falseB) {}
alokp@chromium.org58e54292010-08-24 21:40:03 +0000466
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000467 virtual void traverse(TIntermTraverser*);
alokp@chromium.org58e54292010-08-24 21:40:03 +0000468
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000469 bool usesTernaryOperator() const { return getBasicType() != EbtVoid; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000470 TIntermNode* getCondition() const { return condition; }
471 TIntermNode* getTrueBlock() const { return trueBlock; }
472 TIntermNode* getFalseBlock() const { return falseBlock; }
473 TIntermSelection* getAsSelectionNode() { return this; }
474
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000475protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000476 TIntermTyped* condition;
477 TIntermNode* trueBlock;
478 TIntermNode* falseBlock;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000479};
480
481enum Visit
482{
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000483 PreVisit,
484 InVisit,
485 PostVisit
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000486};
487
488//
489// For traversing the tree. User should derive from this,
490// put their traversal specific data in it, and then pass
491// it to a Traverse method.
492//
493// When using this, just fill in the methods for nodes you want visited.
494// Return false from a pre-visit to skip visiting that node's subtree.
495//
496class TIntermTraverser
497{
498public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000499 POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000500
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000501 TIntermTraverser(bool preVisit = true, bool inVisit = false, bool postVisit = false, bool rightToLeft = false) :
502 preVisit(preVisit),
503 inVisit(inVisit),
504 postVisit(postVisit),
505 rightToLeft(rightToLeft),
506 depth(0) {}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000507
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000508 virtual void visitSymbol(TIntermSymbol*) {}
509 virtual void visitConstantUnion(TIntermConstantUnion*) {}
510 virtual bool visitBinary(Visit visit, TIntermBinary*) {return true;}
511 virtual bool visitUnary(Visit visit, TIntermUnary*) {return true;}
512 virtual bool visitSelection(Visit visit, TIntermSelection*) {return true;}
513 virtual bool visitAggregate(Visit visit, TIntermAggregate*) {return true;}
514 virtual bool visitLoop(Visit visit, TIntermLoop*) {return true;}
515 virtual bool visitBranch(Visit visit, TIntermBranch*) {return true;}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000516
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000517 void incrementDepth() {depth++;}
518 void decrementDepth() {depth--;}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000519
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000520 const bool preVisit;
521 const bool inVisit;
522 const bool postVisit;
523 const bool rightToLeft;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000524
525protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000526 int depth;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000527};
528
529#endif // __INTERMEDIATE_H