blob: b6c24550f4d75ed00e6090533354122d5be5cde6 [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//
6
Geoff Lang0a73dd82014-11-19 16:18:08 -05007#ifndef COMPILER_TRANSLATOR_INTERMEDIATE_H_
8#define COMPILER_TRANSLATOR_INTERMEDIATE_H_
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009
Jamie Madillb1a85f42014-08-19 15:23:24 -040010#include "compiler/translator/IntermNode.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000011
Jamie Madillb1a85f42014-08-19 15:23:24 -040012struct TVectorFields
Zhenyao Moe40d1e92014-07-16 17:40:36 -070013{
Jamie Madillb1a85f42014-08-19 15:23:24 -040014 int offsets[4];
15 int num;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000016};
17
Jamie Madillb1a85f42014-08-19 15:23:24 -040018//
19// Set of helper functions to help parse and build the tree.
20//
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000021class TInfoSink;
Jamie Madillb1a85f42014-08-19 15:23:24 -040022class TIntermediate
Zhenyao Moe40d1e92014-07-16 17:40:36 -070023{
24 public:
Alok Priyadarshi8156b6b2013-09-23 14:56:58 -040025 POOL_ALLOCATOR_NEW_DELETE();
Jamie Madillb1a85f42014-08-19 15:23:24 -040026 TIntermediate(TInfoSink &i)
27 : mInfoSink(i) { }
alokp@chromium.org58e54292010-08-24 21:40:03 +000028
Jamie Madillb1a85f42014-08-19 15:23:24 -040029 TIntermSymbol *addSymbol(
30 int id, const TString &, const TType &, const TSourceLoc &);
31 TIntermTyped *addBinaryMath(
32 TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &);
33 TIntermTyped *addAssign(
34 TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &);
35 TIntermTyped *addIndex(
36 TOperator op, TIntermTyped *base, TIntermTyped *index, const TSourceLoc &);
37 TIntermTyped *addUnaryMath(
38 TOperator op, TIntermNode *child, const TSourceLoc &);
39 TIntermAggregate *growAggregate(
40 TIntermNode *left, TIntermNode *right, const TSourceLoc &);
41 TIntermAggregate *makeAggregate(TIntermNode *node, const TSourceLoc &);
42 TIntermAggregate *setAggregateOperator(TIntermNode *, TOperator, const TSourceLoc &);
43 TIntermNode *addSelection(TIntermTyped *cond, TIntermNodePair code, const TSourceLoc &);
44 TIntermTyped *addSelection(
45 TIntermTyped *cond, TIntermTyped *trueBlock, TIntermTyped *falseBlock, const TSourceLoc &);
Olli Etuahoa3a36662015-02-17 13:46:51 +020046 TIntermSwitch *addSwitch(
47 TIntermTyped *init, TIntermAggregate *statementList, const TSourceLoc &line);
48 TIntermCase *addCase(
49 TIntermTyped *condition, const TSourceLoc &line);
Jamie Madillb1a85f42014-08-19 15:23:24 -040050 TIntermTyped *addComma(
51 TIntermTyped *left, TIntermTyped *right, const TSourceLoc &);
52 TIntermConstantUnion *addConstantUnion(ConstantUnion *, const TType &, const TSourceLoc &);
53 // TODO(zmo): Get rid of default value.
54 bool parseConstTree(const TSourceLoc &, TIntermNode *, ConstantUnion *,
55 TOperator, TType, bool singleConstantParam = false);
56 TIntermNode *addLoop(TLoopType, TIntermNode *, TIntermTyped *, TIntermTyped *,
57 TIntermNode *, const TSourceLoc &);
58 TIntermBranch *addBranch(TOperator, const TSourceLoc &);
59 TIntermBranch *addBranch(TOperator, TIntermTyped *, const TSourceLoc &);
60 TIntermTyped *addSwizzle(TVectorFields &, const TSourceLoc &);
61 bool postProcess(TIntermNode *);
Olli Etuahoa3a5cc62015-02-13 13:12:22 +020062
63 static void outputTree(TIntermNode *, TInfoSinkBase &);
alokp@chromium.org58e54292010-08-24 21:40:03 +000064
Jamie Madillb1a85f42014-08-19 15:23:24 -040065 private:
66 void operator=(TIntermediate &); // prevent assignments
alokp@chromium.org58e54292010-08-24 21:40:03 +000067
Jamie Madillb1a85f42014-08-19 15:23:24 -040068 TInfoSink & mInfoSink;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000069};
70
Geoff Lang0a73dd82014-11-19 16:18:08 -050071#endif // COMPILER_TRANSLATOR_INTERMEDIATE_H_