blob: 1b08d7382c49e220da4770299ba988ee059a756e [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
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;
alokp@chromium.orgd88b7732010-05-26 15:13:14 +0000195class TIntermLoop;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000196class TInfoSink;
197
198//
199// Base class for the tree nodes
200//
201class TIntermNode {
202public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000203 POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000204
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000205 TIntermNode() : line(0) {}
alokp@chromium.org58e54292010-08-24 21:40:03 +0000206
207 TSourceLoc getLine() const { return line; }
208 void setLine(TSourceLoc l) { line = l; }
209
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000210 virtual void traverse(TIntermTraverser*) = 0;
alokp@chromium.orgd88b7732010-05-26 15:13:14 +0000211 virtual TIntermTyped* getAsTyped() { return 0; }
212 virtual TIntermConstantUnion* getAsConstantUnion() { return 0; }
213 virtual TIntermAggregate* getAsAggregate() { return 0; }
214 virtual TIntermBinary* getAsBinaryNode() { return 0; }
215 virtual TIntermUnary* getAsUnaryNode() { return 0; }
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000216 virtual TIntermSelection* getAsSelectionNode() { return 0; }
alokp@chromium.orgd88b7732010-05-26 15:13:14 +0000217 virtual TIntermSymbol* getAsSymbolNode() { return 0; }
218 virtual TIntermLoop* getAsLoopNode() { return 0; }
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000219 virtual ~TIntermNode() { }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000220
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000221protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000222 TSourceLoc line;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000223};
224
225//
226// This is just to help yacc.
227//
228struct TIntermNodePair {
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000229 TIntermNode* node1;
230 TIntermNode* node2;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000231};
232
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000233//
234// Intermediate class for nodes that have a type.
235//
236class TIntermTyped : public TIntermNode {
237public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000238 TIntermTyped(const TType& t) : type(t) { }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000239 virtual TIntermTyped* getAsTyped() { return this; }
alokp@chromium.orgdd037b22010-03-30 18:47:20 +0000240
alokp@chromium.org58e54292010-08-24 21:40:03 +0000241 void setType(const TType& t) { type = t; }
242 const TType& getType() const { return type; }
243 TType* getTypePointer() { return &type; }
244
245 TBasicType getBasicType() const { return type.getBasicType(); }
246 TQualifier getQualifier() const { return type.getQualifier(); }
247 TPrecision getPrecision() const { return type.getPrecision(); }
248 int getNominalSize() const { return type.getNominalSize(); }
249
250 bool isMatrix() const { return type.isMatrix(); }
251 bool isArray() const { return type.isArray(); }
252 bool isVector() const { return type.isVector(); }
253 bool isScalar() const { return type.isScalar(); }
254 const char* getBasicString() const { return type.getBasicString(); }
255 const char* getQualifierString() const { return type.getQualifierString(); }
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000256 TString getCompleteString() const { return type.getCompleteString(); }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000257
258protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000259 TType type;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000260};
261
262//
263// Handle for, do-while, and while loops.
264//
alokp@chromium.org52813552010-11-16 18:36:09 +0000265enum TLoopType {
266 ELoopFor,
267 ELoopWhile,
268 ELoopDoWhile,
269};
270
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000271class TIntermLoop : public TIntermNode {
272public:
alokp@chromium.org52813552010-11-16 18:36:09 +0000273 TIntermLoop(TLoopType aType,
274 TIntermNode *aInit, TIntermTyped* aCond, TIntermTyped* aExpr,
275 TIntermNode* aBody) :
276 type(aType),
277 init(aInit),
278 cond(aCond),
279 expr(aExpr),
280 body(aBody) { }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000281
alokp@chromium.orgd88b7732010-05-26 15:13:14 +0000282 virtual TIntermLoop* getAsLoopNode() { return this; }
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000283 virtual void traverse(TIntermTraverser*);
alokp@chromium.org58e54292010-08-24 21:40:03 +0000284
alokp@chromium.org52813552010-11-16 18:36:09 +0000285 TLoopType getType() const { return type; }
286 TIntermNode* getInit() { return init; }
287 TIntermTyped* getCondition() { return cond; }
288 TIntermTyped* getExpression() { return expr; }
289 TIntermNode* getBody() { return body; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000290
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000291protected:
alokp@chromium.org52813552010-11-16 18:36:09 +0000292 TLoopType type;
293 TIntermNode* init; // for-loop initialization
294 TIntermTyped* cond; // loop exit condition
295 TIntermTyped* expr; // for-loop expression
296 TIntermNode* body; // loop body
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000297};
298
299//
300// Handle break, continue, return, and kill.
301//
302class TIntermBranch : public TIntermNode {
303public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000304 TIntermBranch(TOperator op, TIntermTyped* e) :
305 flowOp(op),
306 expression(e) { }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000307
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000308 virtual void traverse(TIntermTraverser*);
alokp@chromium.org58e54292010-08-24 21:40:03 +0000309
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000310 TOperator getFlowOp() { return flowOp; }
311 TIntermTyped* getExpression() { return expression; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000312
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000313protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000314 TOperator flowOp;
315 TIntermTyped* expression; // non-zero except for "return exp;" statements
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000316};
317
318//
319// Nodes that correspond to symbols or constants in the source code.
320//
321class TIntermSymbol : public TIntermTyped {
322public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000323 // if symbol is initialized as symbol(sym), the memory comes from the poolallocator of sym. If sym comes from
324 // per process globalpoolallocator, then it causes increased memory usage per compile
325 // it is essential to use "symbol = sym" to assign to symbol
326 TIntermSymbol(int i, const TString& sym, const TType& t) :
327 TIntermTyped(t), id(i) { symbol = sym;}
alokp@chromium.org58e54292010-08-24 21:40:03 +0000328
329 int getId() const { return id; }
330 const TString& getSymbol() const { return symbol; }
331
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000332 virtual void traverse(TIntermTraverser*);
333 virtual TIntermSymbol* getAsSymbolNode() { return this; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000334
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000335protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000336 int id;
337 TString symbol;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000338};
339
340class TIntermConstantUnion : public TIntermTyped {
341public:
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000342 TIntermConstantUnion(ConstantUnion *unionPointer, const TType& t) : TIntermTyped(t), unionArrayPointer(unionPointer) { }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000343
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000344 ConstantUnion* getUnionArrayPointer() const { return unionArrayPointer; }
345 void setUnionArrayPointer(ConstantUnion *c) { unionArrayPointer = c; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000346
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000347 virtual TIntermConstantUnion* getAsConstantUnion() { return this; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000348 virtual void traverse(TIntermTraverser*);
349
350 TIntermTyped* fold(TOperator, TIntermTyped*, TInfoSink&);
351
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000352protected:
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000353 ConstantUnion *unionArrayPointer;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000354};
355
356//
357// Intermediate class for node types that hold operators.
358//
359class TIntermOperator : public TIntermTyped {
360public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000361 TOperator getOp() const { return op; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000362 void setOp(TOperator o) { op = o; }
363
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000364 bool modifiesState() const;
365 bool isConstructor() const;
alokp@chromium.org58e54292010-08-24 21:40:03 +0000366
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000367protected:
daniel@transgaming.coma5d76232010-05-17 09:58:47 +0000368 TIntermOperator(TOperator o) : TIntermTyped(TType(EbtFloat, EbpUndefined)), op(o) {}
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000369 TIntermOperator(TOperator o, TType& t) : TIntermTyped(t), op(o) {}
370 TOperator op;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000371};
372
373//
374// Nodes for all the basic binary math operators.
375//
376class TIntermBinary : public TIntermOperator {
377public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000378 TIntermBinary(TOperator o) : TIntermOperator(o) {}
alokp@chromium.org58e54292010-08-24 21:40:03 +0000379
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000380 virtual TIntermBinary* getAsBinaryNode() { return this; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000381 virtual void traverse(TIntermTraverser*);
382
383 void setLeft(TIntermTyped* n) { left = n; }
384 void setRight(TIntermTyped* n) { right = n; }
385 TIntermTyped* getLeft() const { return left; }
386 TIntermTyped* getRight() const { return right; }
387 bool promote(TInfoSink&);
388
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000389protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000390 TIntermTyped* left;
391 TIntermTyped* right;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000392};
393
394//
395// Nodes for unary math operators.
396//
397class TIntermUnary : public TIntermOperator {
398public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000399 TIntermUnary(TOperator o, TType& t) : TIntermOperator(o, t), operand(0) {}
400 TIntermUnary(TOperator o) : TIntermOperator(o), operand(0) {}
alokp@chromium.org58e54292010-08-24 21:40:03 +0000401
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000402 virtual void traverse(TIntermTraverser*);
daniel@transgaming.com4a35ef22010-04-08 03:51:06 +0000403 virtual TIntermUnary* getAsUnaryNode() { return this; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000404
405 void setOperand(TIntermTyped* o) { operand = o; }
406 TIntermTyped* getOperand() { return operand; }
407 bool promote(TInfoSink&);
408
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000409protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000410 TIntermTyped* operand;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000411};
412
413typedef TVector<TIntermNode*> TIntermSequence;
414typedef TVector<int> TQualifierList;
alokp@chromium.orgad771eb2010-09-07 17:36:23 +0000415typedef TMap<TString, TString> TPragmaTable;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000416//
417// Nodes that operate on an arbitrary sized set of children.
418//
419class TIntermAggregate : public TIntermOperator {
420public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000421 TIntermAggregate() : TIntermOperator(EOpNull), userDefined(false), pragmaTable(0) { }
422 TIntermAggregate(TOperator o) : TIntermOperator(o), pragmaTable(0) { }
423 ~TIntermAggregate() { delete pragmaTable; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000424
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000425 virtual TIntermAggregate* getAsAggregate() { return this; }
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000426 virtual void traverse(TIntermTraverser*);
alokp@chromium.org58e54292010-08-24 21:40:03 +0000427
428 TIntermSequence& getSequence() { return sequence; }
alokp@chromium.orgb19403a2010-09-08 17:56:26 +0000429
alokp@chromium.org58e54292010-08-24 21:40:03 +0000430 void setName(const TString& n) { name = n; }
431 const TString& getName() const { return name; }
432
433 void setUserDefined() { userDefined = true; }
434 bool isUserDefined() { return userDefined; }
alokp@chromium.orgb19403a2010-09-08 17:56:26 +0000435
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000436 void setOptimize(bool o) { optimize = o; }
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000437 bool getOptimize() { return optimize; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000438 void setDebug(bool d) { debug = d; }
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000439 bool getDebug() { return debug; }
440 void addToPragmaTable(const TPragmaTable& pTable);
441 const TPragmaTable& getPragmaTable() const { return *pragmaTable; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000442
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000443protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000444 TIntermAggregate(const TIntermAggregate&); // disallow copy constructor
445 TIntermAggregate& operator=(const TIntermAggregate&); // disallow assignment operator
446 TIntermSequence sequence;
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000447 TString name;
448 bool userDefined; // used for user defined function names
alokp@chromium.orgb19403a2010-09-08 17:56:26 +0000449
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000450 bool optimize;
451 bool debug;
452 TPragmaTable *pragmaTable;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000453};
454
455//
456// For if tests. Simplified since there is no switch statement.
457//
458class TIntermSelection : public TIntermTyped {
459public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000460 TIntermSelection(TIntermTyped* cond, TIntermNode* trueB, TIntermNode* falseB) :
daniel@transgaming.coma5d76232010-05-17 09:58:47 +0000461 TIntermTyped(TType(EbtVoid, EbpUndefined)), condition(cond), trueBlock(trueB), falseBlock(falseB) {}
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000462 TIntermSelection(TIntermTyped* cond, TIntermNode* trueB, TIntermNode* falseB, const TType& type) :
463 TIntermTyped(type), condition(cond), trueBlock(trueB), falseBlock(falseB) {}
alokp@chromium.org58e54292010-08-24 21:40:03 +0000464
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000465 virtual void traverse(TIntermTraverser*);
alokp@chromium.org58e54292010-08-24 21:40:03 +0000466
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000467 bool usesTernaryOperator() const { return getBasicType() != EbtVoid; }
alokp@chromium.org58e54292010-08-24 21:40:03 +0000468 TIntermNode* getCondition() const { return condition; }
469 TIntermNode* getTrueBlock() const { return trueBlock; }
470 TIntermNode* getFalseBlock() const { return falseBlock; }
471 TIntermSelection* getAsSelectionNode() { return this; }
472
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000473protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000474 TIntermTyped* condition;
475 TIntermNode* trueBlock;
476 TIntermNode* falseBlock;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000477};
478
479enum Visit
480{
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000481 PreVisit,
482 InVisit,
483 PostVisit
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000484};
485
486//
487// For traversing the tree. User should derive from this,
488// put their traversal specific data in it, and then pass
489// it to a Traverse method.
490//
491// When using this, just fill in the methods for nodes you want visited.
492// Return false from a pre-visit to skip visiting that node's subtree.
493//
494class TIntermTraverser
495{
496public:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000497 POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000498
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000499 TIntermTraverser(bool preVisit = true, bool inVisit = false, bool postVisit = false, bool rightToLeft = false) :
500 preVisit(preVisit),
501 inVisit(inVisit),
502 postVisit(postVisit),
503 rightToLeft(rightToLeft),
504 depth(0) {}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000505
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000506 virtual void visitSymbol(TIntermSymbol*) {}
507 virtual void visitConstantUnion(TIntermConstantUnion*) {}
508 virtual bool visitBinary(Visit visit, TIntermBinary*) {return true;}
509 virtual bool visitUnary(Visit visit, TIntermUnary*) {return true;}
510 virtual bool visitSelection(Visit visit, TIntermSelection*) {return true;}
511 virtual bool visitAggregate(Visit visit, TIntermAggregate*) {return true;}
512 virtual bool visitLoop(Visit visit, TIntermLoop*) {return true;}
513 virtual bool visitBranch(Visit visit, TIntermBranch*) {return true;}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000514
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000515 void incrementDepth() {depth++;}
516 void decrementDepth() {depth--;}
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000517
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000518 const bool preVisit;
519 const bool inVisit;
520 const bool postVisit;
521 const bool rightToLeft;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000522
523protected:
alokp@chromium.org2cf17712010-03-30 20:33:18 +0000524 int depth;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000525};
526
527#endif // __INTERMEDIATE_H