blob: b1241ca25cb99c94f6e52e854821a381640fa066 [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.org2cf17712010-03-30 20:33:18 +0000132 //EOpDPdx, // Fragment only, OES_standard_derivatives extension
133 //EOpDPdy, // 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
187class TIntermTraverser;
188class TIntermAggregate;
189class TIntermBinary;
daniel@transgaming.com4a35ef22010-04-08 03:51:06 +0000190class TIntermUnary;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000191class TIntermConstantUnion;
192class TIntermSelection;
193class TIntermTyped;
194class TIntermSymbol;
195class TInfoSink;
196
197//
198// Base class for the tree nodes
199//
200class TIntermNode {
201public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000202 POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000203
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000204 TIntermNode() : line(0) {}
205 virtual TSourceLoc getLine() const { return line; }
206 virtual void setLine(TSourceLoc l) { line = l; }
207 virtual void traverse(TIntermTraverser*) = 0;
208 virtual TIntermTyped* getAsTyped() { return 0; }
209 virtual TIntermConstantUnion* getAsConstantUnion() { return 0; }
210 virtual TIntermAggregate* getAsAggregate() { return 0; }
211 virtual TIntermBinary* getAsBinaryNode() { return 0; }
daniel@transgaming.com4a35ef22010-04-08 03:51:06 +0000212 virtual TIntermUnary* getAsUnaryNode() { return 0; }
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000213 virtual TIntermSelection* getAsSelectionNode() { return 0; }
214 virtual TIntermSymbol* getAsSymbolNode() { return 0; }
215 virtual ~TIntermNode() { }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000216protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000217 TSourceLoc line;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000218};
219
220//
221// This is just to help yacc.
222//
223struct TIntermNodePair {
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000224 TIntermNode* node1;
225 TIntermNode* node2;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000226};
227
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000228//
229// Intermediate class for nodes that have a type.
230//
231class TIntermTyped : public TIntermNode {
232public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000233 TIntermTyped(const TType& t) : type(t) { }
234 virtual TIntermTyped* getAsTyped() { return this; }
235 virtual void setType(const TType& t) { type = t; }
236 virtual const TType& getType() const { return type; }
237 virtual TType* getTypePointer() { return &type; }
alokp@chromium.orgdd037b22010-03-30 18:47:20 +0000238
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000239 virtual TBasicType getBasicType() const { return type.getBasicType(); }
240 virtual TQualifier getQualifier() const { return type.getQualifier(); }
daniel@transgaming.coma5d76232010-05-17 09:58:47 +0000241 virtual TPrecision getPrecision() const { return type.getPrecision(); }
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000242 virtual int getNominalSize() const { return type.getNominalSize(); }
243 virtual int getSize() const { return type.getInstanceSize(); }
244 virtual bool isMatrix() const { return type.isMatrix(); }
245 virtual bool isArray() const { return type.isArray(); }
246 virtual bool isVector() const { return type.isVector(); }
daniel@transgaming.comd91cfe72010-04-13 03:26:17 +0000247 virtual bool isScalar() const { return type.isScalar(); }
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000248 const char* getBasicString() const { return type.getBasicString(); }
249 const char* getQualifierString() const { return type.getQualifierString(); }
250 TString getCompleteString() const { return type.getCompleteString(); }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000251
252protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000253 TType type;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000254};
255
256//
257// Handle for, do-while, and while loops.
258//
259class TIntermLoop : public TIntermNode {
260public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000261 TIntermLoop(TIntermNode *init, TIntermNode* aBody, TIntermTyped* aTest, TIntermTyped* aTerminal, bool testFirst) :
262 init(init),
263 body(aBody),
264 test(aTest),
265 terminal(aTerminal),
266 first(testFirst) { }
267 virtual void traverse(TIntermTraverser*);
268 TIntermNode *getInit() { return init; }
269 TIntermNode *getBody() { return body; }
270 TIntermTyped *getTest() { return test; }
271 TIntermTyped *getTerminal() { return terminal; }
272 bool testFirst() { return first; }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000273protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000274 TIntermNode *init;
275 TIntermNode *body; // code to loop over
276 TIntermTyped *test; // exit condition associated with loop, could be 0 for 'for' loops
277 TIntermTyped *terminal; // exists for for-loops
278 bool first; // true for while and for, not for do-while
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000279};
280
281//
282// Handle break, continue, return, and kill.
283//
284class TIntermBranch : public TIntermNode {
285public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000286 TIntermBranch(TOperator op, TIntermTyped* e) :
287 flowOp(op),
288 expression(e) { }
289 virtual void traverse(TIntermTraverser*);
290 TOperator getFlowOp() { return flowOp; }
291 TIntermTyped* getExpression() { return expression; }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000292protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000293 TOperator flowOp;
294 TIntermTyped* expression; // non-zero except for "return exp;" statements
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000295};
296
297//
298// Nodes that correspond to symbols or constants in the source code.
299//
300class TIntermSymbol : public TIntermTyped {
301public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000302 // if symbol is initialized as symbol(sym), the memory comes from the poolallocator of sym. If sym comes from
303 // per process globalpoolallocator, then it causes increased memory usage per compile
304 // it is essential to use "symbol = sym" to assign to symbol
305 TIntermSymbol(int i, const TString& sym, const TType& t) :
306 TIntermTyped(t), id(i) { symbol = sym;}
307 virtual int getId() const { return id; }
308 virtual const TString& getSymbol() const { return symbol; }
309 virtual void traverse(TIntermTraverser*);
310 virtual TIntermSymbol* getAsSymbolNode() { return this; }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000311protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000312 int id;
313 TString symbol;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000314};
315
316class TIntermConstantUnion : public TIntermTyped {
317public:
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000318 TIntermConstantUnion(ConstantUnion *unionPointer, const TType& t) : TIntermTyped(t), unionArrayPointer(unionPointer) { }
319 ConstantUnion* getUnionArrayPointer() const { return unionArrayPointer; }
320 void setUnionArrayPointer(ConstantUnion *c) { unionArrayPointer = c; }
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000321 virtual TIntermConstantUnion* getAsConstantUnion() { return this; }
322 virtual void traverse(TIntermTraverser* );
323 virtual TIntermTyped* fold(TOperator, TIntermTyped*, TInfoSink&);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000324protected:
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000325 ConstantUnion *unionArrayPointer;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000326};
327
328//
329// Intermediate class for node types that hold operators.
330//
331class TIntermOperator : public TIntermTyped {
332public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000333 TOperator getOp() const { return op; }
334 bool modifiesState() const;
335 bool isConstructor() const;
336 virtual bool promote(TInfoSink&) { return true; }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000337protected:
daniel@transgaming.coma5d76232010-05-17 09:58:47 +0000338 TIntermOperator(TOperator o) : TIntermTyped(TType(EbtFloat, EbpUndefined)), op(o) {}
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000339 TIntermOperator(TOperator o, TType& t) : TIntermTyped(t), op(o) {}
340 TOperator op;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000341};
342
343//
344// Nodes for all the basic binary math operators.
345//
346class TIntermBinary : public TIntermOperator {
347public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000348 TIntermBinary(TOperator o) : TIntermOperator(o) {}
349 virtual void traverse(TIntermTraverser*);
350 virtual void setLeft(TIntermTyped* n) { left = n; }
351 virtual void setRight(TIntermTyped* n) { right = n; }
352 virtual TIntermTyped* getLeft() const { return left; }
353 virtual TIntermTyped* getRight() const { return right; }
354 virtual TIntermBinary* getAsBinaryNode() { return this; }
355 virtual bool promote(TInfoSink&);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000356protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000357 TIntermTyped* left;
358 TIntermTyped* right;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000359};
360
361//
362// Nodes for unary math operators.
363//
364class TIntermUnary : public TIntermOperator {
365public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000366 TIntermUnary(TOperator o, TType& t) : TIntermOperator(o, t), operand(0) {}
367 TIntermUnary(TOperator o) : TIntermOperator(o), operand(0) {}
368 virtual void traverse(TIntermTraverser*);
369 virtual void setOperand(TIntermTyped* o) { operand = o; }
370 virtual TIntermTyped* getOperand() { return operand; }
daniel@transgaming.com4a35ef22010-04-08 03:51:06 +0000371 virtual TIntermUnary* getAsUnaryNode() { return this; }
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000372 virtual bool promote(TInfoSink&);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000373protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000374 TIntermTyped* operand;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000375};
376
377typedef TVector<TIntermNode*> TIntermSequence;
378typedef TVector<int> TQualifierList;
379//
380// Nodes that operate on an arbitrary sized set of children.
381//
382class TIntermAggregate : public TIntermOperator {
383public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000384 TIntermAggregate() : TIntermOperator(EOpNull), userDefined(false), pragmaTable(0) { }
385 TIntermAggregate(TOperator o) : TIntermOperator(o), pragmaTable(0) { }
386 ~TIntermAggregate() { delete pragmaTable; }
387 virtual TIntermAggregate* getAsAggregate() { return this; }
388 virtual void setOperator(TOperator o) { op = o; }
389 virtual TIntermSequence& getSequence() { return sequence; }
390 virtual void setName(const TString& n) { name = n; }
391 virtual const TString& getName() const { return name; }
392 virtual void traverse(TIntermTraverser*);
393 virtual void setUserDefined() { userDefined = true; }
394 virtual bool isUserDefined() { return userDefined; }
395 virtual TQualifierList& getQualifier() { return qualifier; }
396 void setOptimize(bool o) { optimize = o; }
397 void setDebug(bool d) { debug = d; }
398 bool getOptimize() { return optimize; }
399 bool getDebug() { return debug; }
400 void addToPragmaTable(const TPragmaTable& pTable);
401 const TPragmaTable& getPragmaTable() const { return *pragmaTable; }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000402protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000403 TIntermAggregate(const TIntermAggregate&); // disallow copy constructor
404 TIntermAggregate& operator=(const TIntermAggregate&); // disallow assignment operator
405 TIntermSequence sequence;
406 TQualifierList qualifier;
407 TString name;
408 bool userDefined; // used for user defined function names
409 bool optimize;
410 bool debug;
411 TPragmaTable *pragmaTable;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000412};
413
414//
415// For if tests. Simplified since there is no switch statement.
416//
417class TIntermSelection : public TIntermTyped {
418public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000419 TIntermSelection(TIntermTyped* cond, TIntermNode* trueB, TIntermNode* falseB) :
daniel@transgaming.coma5d76232010-05-17 09:58:47 +0000420 TIntermTyped(TType(EbtVoid, EbpUndefined)), condition(cond), trueBlock(trueB), falseBlock(falseB) {}
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000421 TIntermSelection(TIntermTyped* cond, TIntermNode* trueB, TIntermNode* falseB, const TType& type) :
422 TIntermTyped(type), condition(cond), trueBlock(trueB), falseBlock(falseB) {}
423 virtual void traverse(TIntermTraverser*);
424 bool usesTernaryOperator() const { return getBasicType() != EbtVoid; }
425 virtual TIntermNode* getCondition() const { return condition; }
426 virtual TIntermNode* getTrueBlock() const { return trueBlock; }
427 virtual TIntermNode* getFalseBlock() const { return falseBlock; }
428 virtual TIntermSelection* getAsSelectionNode() { return this; }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000429protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000430 TIntermTyped* condition;
431 TIntermNode* trueBlock;
432 TIntermNode* falseBlock;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000433};
434
435enum Visit
436{
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000437 PreVisit,
438 InVisit,
439 PostVisit
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000440};
441
442//
443// For traversing the tree. User should derive from this,
444// put their traversal specific data in it, and then pass
445// it to a Traverse method.
446//
447// When using this, just fill in the methods for nodes you want visited.
448// Return false from a pre-visit to skip visiting that node's subtree.
449//
450class TIntermTraverser
451{
452public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000453 POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000454
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000455 TIntermTraverser(bool preVisit = true, bool inVisit = false, bool postVisit = false, bool rightToLeft = false) :
456 preVisit(preVisit),
457 inVisit(inVisit),
458 postVisit(postVisit),
459 rightToLeft(rightToLeft),
460 depth(0) {}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000461
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000462 virtual void visitSymbol(TIntermSymbol*) {}
463 virtual void visitConstantUnion(TIntermConstantUnion*) {}
464 virtual bool visitBinary(Visit visit, TIntermBinary*) {return true;}
465 virtual bool visitUnary(Visit visit, TIntermUnary*) {return true;}
466 virtual bool visitSelection(Visit visit, TIntermSelection*) {return true;}
467 virtual bool visitAggregate(Visit visit, TIntermAggregate*) {return true;}
468 virtual bool visitLoop(Visit visit, TIntermLoop*) {return true;}
469 virtual bool visitBranch(Visit visit, TIntermBranch*) {return true;}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000470
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000471 void incrementDepth() {depth++;}
472 void decrementDepth() {depth--;}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000473
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000474 const bool preVisit;
475 const bool inVisit;
476 const bool postVisit;
477 const bool rightToLeft;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000478
479protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000480 int depth;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000481};
482
483#endif // __INTERMEDIATE_H