blob: 435e32e09d793544662d3d109a315beaea52bb5a [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//
Olli Etuahof119a262016-08-19 15:54:22 +030019// Set of helper functions to help build the tree.
Jamie Madillb1a85f42014-08-19 15:23:24 -040020//
Jamie Madillb1a85f42014-08-19 15:23:24 -040021class TIntermediate
Zhenyao Moe40d1e92014-07-16 17:40:36 -070022{
23 public:
Alok Priyadarshi8156b6b2013-09-23 14:56:58 -040024 POOL_ALLOCATOR_NEW_DELETE();
Olli Etuahof119a262016-08-19 15:54:22 +030025 TIntermediate() {}
alokp@chromium.org58e54292010-08-24 21:40:03 +000026
Jamie Madillb1a85f42014-08-19 15:23:24 -040027 TIntermSymbol *addSymbol(
28 int id, const TString &, const TType &, const TSourceLoc &);
Olli Etuaho3272a6d2016-08-29 17:54:50 +030029 TIntermTyped *addIndex(TOperator op,
30 TIntermTyped *base,
31 TIntermTyped *index,
32 const TSourceLoc &line,
33 TDiagnostics *diagnostics);
Jamie Madillb1a85f42014-08-19 15:23:24 -040034 TIntermTyped *addUnaryMath(
Olli Etuahof6c694b2015-03-26 14:50:53 +020035 TOperator op, TIntermTyped *child, const TSourceLoc &line, const TType *funcReturnType);
Jamie Madillb1a85f42014-08-19 15:23:24 -040036 TIntermAggregate *growAggregate(
37 TIntermNode *left, TIntermNode *right, const TSourceLoc &);
38 TIntermAggregate *makeAggregate(TIntermNode *node, const TSourceLoc &);
Olli Etuaho7d7f8c42015-05-19 18:38:49 +030039 TIntermAggregate *ensureSequence(TIntermNode *node);
Jamie Madillb1a85f42014-08-19 15:23:24 -040040 TIntermAggregate *setAggregateOperator(TIntermNode *, TOperator, const TSourceLoc &);
Olli Etuaho57961272016-09-14 13:57:46 +030041 TIntermNode *addIfElse(TIntermTyped *cond, TIntermNodePair code, const TSourceLoc &line);
Olli Etuahod0bad2c2016-09-09 18:01:16 +030042 static TIntermTyped *AddTernarySelection(TIntermTyped *cond,
43 TIntermTyped *trueExpression,
44 TIntermTyped *falseExpression,
45 const TSourceLoc &line);
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);
Olli Etuaho15200042015-11-04 16:56:31 +020050 TIntermTyped *addComma(TIntermTyped *left,
51 TIntermTyped *right,
52 const TSourceLoc &line,
53 int shaderVersion);
Olli Etuaho5c0e0232015-11-11 15:55:59 +020054 TIntermConstantUnion *addConstantUnion(const TConstantUnion *constantUnion,
55 const TType &type,
56 const TSourceLoc &line);
Jamie Madillb1a85f42014-08-19 15:23:24 -040057 TIntermNode *addLoop(TLoopType, TIntermNode *, TIntermTyped *, TIntermTyped *,
58 TIntermNode *, const TSourceLoc &);
59 TIntermBranch *addBranch(TOperator, const TSourceLoc &);
60 TIntermBranch *addBranch(TOperator, TIntermTyped *, const TSourceLoc &);
61 TIntermTyped *addSwizzle(TVectorFields &, const TSourceLoc &);
Olli Etuahof119a262016-08-19 15:54:22 +030062 static TIntermAggregate *PostProcess(TIntermNode *root);
Olli Etuahoa3a5cc62015-02-13 13:12:22 +020063
64 static void outputTree(TIntermNode *, TInfoSinkBase &);
alokp@chromium.org58e54292010-08-24 21:40:03 +000065
Olli Etuahof119a262016-08-19 15:54:22 +030066 TIntermTyped *foldAggregateBuiltIn(TIntermAggregate *aggregate, TDiagnostics *diagnostics);
Arun Patole274f0702015-05-05 13:33:30 +053067
Jamie Madillb1a85f42014-08-19 15:23:24 -040068 private:
69 void operator=(TIntermediate &); // prevent assignments
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000070};
71
Geoff Lang0a73dd82014-11-19 16:18:08 -050072#endif // COMPILER_TRANSLATOR_INTERMEDIATE_H_