1//
2// Copyright (c) 2012 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#pragma warning(disable: 4718)
8
9#include "compiler/translator/depgraph/DependencyGraph.h"
10#include "compiler/translator/depgraph/DependencyGraphBuilder.h"
11
12TDependencyGraph::TDependencyGraph(TIntermNode* intermNode)
13{
14    TDependencyGraphBuilder::build(intermNode, this);
15}
16
17TDependencyGraph::~TDependencyGraph()
18{
19    for (TGraphNodeVector::const_iterator iter = mAllNodes.begin(); iter != mAllNodes.end(); ++iter)
20    {
21        TGraphNode* node = *iter;
22        delete node;
23    }
24}
25
26TGraphArgument* TDependencyGraph::createArgument(TIntermAggregate* intermFunctionCall,
27                                                 int argumentNumber)
28{
29    TGraphArgument* argument = new TGraphArgument(intermFunctionCall, argumentNumber);
30    mAllNodes.push_back(argument);
31    return argument;
32}
33
34TGraphFunctionCall* TDependencyGraph::createFunctionCall(TIntermAggregate* intermFunctionCall)
35{
36    TGraphFunctionCall* functionCall = new TGraphFunctionCall(intermFunctionCall);
37    mAllNodes.push_back(functionCall);
38    if (functionCall->getIntermFunctionCall()->isUserDefined())
39        mUserDefinedFunctionCalls.push_back(functionCall);
40    return functionCall;
41}
42
43TGraphSymbol* TDependencyGraph::getOrCreateSymbol(TIntermSymbol* intermSymbol)
44{
45    TSymbolIdMap::const_iterator iter = mSymbolIdMap.find(intermSymbol->getId());
46
47    TGraphSymbol* symbol = NULL;
48
49    if (iter != mSymbolIdMap.end()) {
50        TSymbolIdPair pair = *iter;
51        symbol = pair.second;
52    } else {
53        symbol = new TGraphSymbol(intermSymbol);
54        mAllNodes.push_back(symbol);
55
56        TSymbolIdPair pair(intermSymbol->getId(), symbol);
57        mSymbolIdMap.insert(pair);
58
59        // We save all sampler symbols in a collection, so we can start graph traversals from them quickly.
60        if (IsSampler(intermSymbol->getBasicType()))
61            mSamplerSymbols.push_back(symbol);
62    }
63
64    return symbol;
65}
66
67TGraphSelection* TDependencyGraph::createSelection(TIntermSelection* intermSelection)
68{
69    TGraphSelection* selection = new TGraphSelection(intermSelection);
70    mAllNodes.push_back(selection);
71    return selection;
72}
73
74TGraphLoop* TDependencyGraph::createLoop(TIntermLoop* intermLoop)
75{
76    TGraphLoop* loop = new TGraphLoop(intermLoop);
77    mAllNodes.push_back(loop);
78    return loop;
79}
80
81TGraphLogicalOp* TDependencyGraph::createLogicalOp(TIntermBinary* intermLogicalOp)
82{
83    TGraphLogicalOp* logicalOp = new TGraphLogicalOp(intermLogicalOp);
84    mAllNodes.push_back(logicalOp);
85    return logicalOp;
86}
87
88const char* TGraphLogicalOp::getOpString() const
89{
90    const char* opString = NULL;
91    switch (getIntermLogicalOp()->getOp()) {
92        case EOpLogicalAnd: opString = "and"; break;
93        case EOpLogicalOr: opString = "or"; break;
94        default: opString = "unknown"; break;
95    }
96    return opString;
97}
98