| // |
| // Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| |
| #pragma warning(disable: 4718) |
| |
| #include "compiler/depgraph/DependencyGraph.h" |
| #include "compiler/depgraph/DependencyGraphBuilder.h" |
| |
| TDependencyGraph::TDependencyGraph(TIntermNode* intermNode) |
| { |
| TDependencyGraphBuilder::build(intermNode, this); |
| } |
| |
| TDependencyGraph::~TDependencyGraph() |
| { |
| for (TGraphNodeVector::const_iterator iter = mAllNodes.begin(); iter != mAllNodes.end(); ++iter) |
| { |
| TGraphNode* node = *iter; |
| delete node; |
| } |
| } |
| |
| TGraphArgument* TDependencyGraph::createArgument(TIntermAggregate* intermFunctionCall, |
| int argumentNumber) |
| { |
| TGraphArgument* argument = new TGraphArgument(intermFunctionCall, argumentNumber); |
| mAllNodes.push_back(argument); |
| return argument; |
| } |
| |
| TGraphFunctionCall* TDependencyGraph::createFunctionCall(TIntermAggregate* intermFunctionCall) |
| { |
| TGraphFunctionCall* functionCall = new TGraphFunctionCall(intermFunctionCall); |
| mAllNodes.push_back(functionCall); |
| if (functionCall->getIntermFunctionCall()->isUserDefined()) |
| mUserDefinedFunctionCalls.push_back(functionCall); |
| return functionCall; |
| } |
| |
| TGraphSymbol* TDependencyGraph::getOrCreateSymbol(TIntermSymbol* intermSymbol) |
| { |
| TSymbolIdMap::const_iterator iter = mSymbolIdMap.find(intermSymbol->getId()); |
| |
| TGraphSymbol* symbol = NULL; |
| |
| if (iter != mSymbolIdMap.end()) { |
| TSymbolIdPair pair = *iter; |
| symbol = pair.second; |
| } else { |
| symbol = new TGraphSymbol(intermSymbol); |
| mAllNodes.push_back(symbol); |
| |
| TSymbolIdPair pair(intermSymbol->getId(), symbol); |
| mSymbolIdMap.insert(pair); |
| |
| // We save all sampler symbols in a collection, so we can start graph traversals from them quickly. |
| if (IsSampler(intermSymbol->getBasicType())) |
| mSamplerSymbols.push_back(symbol); |
| } |
| |
| return symbol; |
| } |
| |
| TGraphSelection* TDependencyGraph::createSelection(TIntermSelection* intermSelection) |
| { |
| TGraphSelection* selection = new TGraphSelection(intermSelection); |
| mAllNodes.push_back(selection); |
| return selection; |
| } |
| |
| TGraphLoop* TDependencyGraph::createLoop(TIntermLoop* intermLoop) |
| { |
| TGraphLoop* loop = new TGraphLoop(intermLoop); |
| mAllNodes.push_back(loop); |
| return loop; |
| } |
| |
| TGraphLogicalOp* TDependencyGraph::createLogicalOp(TIntermBinary* intermLogicalOp) |
| { |
| TGraphLogicalOp* logicalOp = new TGraphLogicalOp(intermLogicalOp); |
| mAllNodes.push_back(logicalOp); |
| return logicalOp; |
| } |
| |
| const char* TGraphLogicalOp::getOpString() const |
| { |
| const char* opString = NULL; |
| switch (getIntermLogicalOp()->getOp()) { |
| case EOpLogicalAnd: opString = "and"; break; |
| case EOpLogicalOr: opString = "or"; break; |
| default: opString = "unknown"; break; |
| } |
| return opString; |
| } |