TGraphFunctionCall* TDependencyGraph::createFunctionCall(TIntermAggregate* intermFunctionCall) { TGraphFunctionCall* functionCall = new TGraphFunctionCall(intermFunctionCall); mAllNodes.push_back(functionCall); if (functionCall->getIntermFunctionCall()->isUserDefined()) mUserDefinedFunctionCalls.push_back(functionCall); return functionCall; }
void RestrictFragmentShaderTiming::validateUserDefinedFunctionCallUsage(const TDependencyGraph& graph) { for (TFunctionCallVector::const_iterator iter = graph.beginUserDefinedFunctionCalls(); iter != graph.endUserDefinedFunctionCalls(); ++iter) { TGraphFunctionCall* functionCall = *iter; beginError(functionCall->getIntermFunctionCall()); mSink << "A call to a user defined function is not permitted.\n"; } }
bool TCompiler::limitExpressionComplexity(TIntermNode* root) { TIntermTraverser traverser; root->traverse(&traverser); TDependencyGraph graph(root); for (TFunctionCallVector::const_iterator iter = graph.beginUserDefinedFunctionCalls(); iter != graph.endUserDefinedFunctionCalls(); ++iter) { TGraphFunctionCall* samplerSymbol = *iter; TDependencyGraphTraverser graphTraverser; samplerSymbol->traverse(&graphTraverser); } if (traverser.getMaxDepth() > maxExpressionComplexity) { infoSink.info << "Expression too complex."; return false; } return true; }