blob: e0193e39d2e8ba1a6d1015c91ac0dd0b0da84768 [file] [log] [blame]
Zhenyao Moac44cd22013-09-23 14:57:09 -04001//
2// Copyright (c) 2002-2013 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#include "compiler/InitializeGLPosition.h"
8#include "compiler/debug.h"
9
10bool InitializeGLPosition::visitAggregate(Visit visit, TIntermAggregate* node)
11{
12 bool visitChildren = !mCodeInserted;
13 switch (node->getOp())
14 {
15 case EOpSequence: break;
16 case EOpFunction:
17 {
18 // Function definition.
19 ASSERT(visit == PreVisit);
20 if (node->getName() == "main(")
21 {
22 TIntermSequence &sequence = node->getSequence();
23 ASSERT((sequence.size() == 1) || (sequence.size() == 2));
24 TIntermAggregate *body = NULL;
25 if (sequence.size() == 1)
26 {
27 body = new TIntermAggregate(EOpSequence);
28 sequence.push_back(body);
29 }
30 else
31 {
32 body = sequence[1]->getAsAggregate();
33 }
34 ASSERT(body);
35 insertCode(body->getSequence());
36 mCodeInserted = true;
37 }
38 break;
39 }
40 default: visitChildren = false; break;
41 }
42 return visitChildren;
43}
44
45void InitializeGLPosition::insertCode(TIntermSequence& sequence)
46{
47 TIntermBinary *binary = new TIntermBinary(EOpAssign);
48 sequence.insert(sequence.begin(), binary);
49
50 TIntermSymbol *left = new TIntermSymbol(
51 0, "gl_Position", TType(EbtFloat, EbpUndefined, EvqPosition, 4));
52 binary->setLeft(left);
53
54 ConstantUnion *u = new ConstantUnion[4];
55 for (int ii = 0; ii < 3; ++ii)
56 u[ii].setFConst(0.0f);
57 u[3].setFConst(1.0f);
58 TIntermConstantUnion *right = new TIntermConstantUnion(
59 u, TType(EbtFloat, EbpUndefined, EvqConst, 4));
60 binary->setRight(right);
61}