/*------------------------------------------------------------------------- * drawElements Quality Program Random Shader Generator * ---------------------------------------------------- * * Copyright 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *//*! * \file * \brief Expression generator. *//*--------------------------------------------------------------------*/ #include "rsgFunctionGenerator.hpp" #include "rsgUtils.hpp" using std::vector; namespace rsg { FunctionGenerator::FunctionGenerator (GeneratorState& state, Function& function) : m_state (state) , m_function (function) { } FunctionGenerator::~FunctionGenerator (void) { } void FunctionGenerator::generate (void) { std::vector statementStack; // Initialize m_state.setStatementStack(statementStack); statementStack.push_back(&m_function.getBody()); m_function.getBody().init(m_state); // Process until statement stack is empty while (!statementStack.empty()) { DE_ASSERT((int)statementStack.size() <= m_state.getShaderParameters().maxStatementDepth); Statement* curStatement = statementStack.back(); Statement* childStatement = curStatement->createNextChild(m_state); if (childStatement) statementStack.push_back(childStatement); else statementStack.pop_back(); } // Create assignments if variables have bound value range for (vector::iterator i = m_requiredAssignments.begin(); i != m_requiredAssignments.end(); i++) { Variable* variable = *i; const ValueEntry* entry = m_state.getVariableManager().getValue(variable); ValueRange valueRange(variable->getType()); valueRange.getMin() = entry->getValueRange().getMin().value(); valueRange.getMax() = entry->getValueRange().getMax().value(); // Remove value entry from this scope. After this entry ptr is invalid. m_state.getVariableManager().removeValueFromCurrentScope(variable); if (!isUndefinedValueRange(valueRange.asAccess())) m_function.getBody().addChild(new AssignStatement(m_state, variable, valueRange.asAccess())); } } } // rsg