1e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------- 2e5c31af7Sopenharmony_ci * drawElements Quality Program Random Shader Generator 3e5c31af7Sopenharmony_ci * ---------------------------------------------------- 4e5c31af7Sopenharmony_ci * 5e5c31af7Sopenharmony_ci * Copyright 2014 The Android Open Source Project 6e5c31af7Sopenharmony_ci * 7e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 8e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License. 9e5c31af7Sopenharmony_ci * You may obtain a copy of the License at 10e5c31af7Sopenharmony_ci * 11e5c31af7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 12e5c31af7Sopenharmony_ci * 13e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 14e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 15e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and 17e5c31af7Sopenharmony_ci * limitations under the License. 18e5c31af7Sopenharmony_ci * 19e5c31af7Sopenharmony_ci *//*! 20e5c31af7Sopenharmony_ci * \file 21e5c31af7Sopenharmony_ci * \brief Expression generator. 22e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/ 23e5c31af7Sopenharmony_ci 24e5c31af7Sopenharmony_ci#include "rsgExpressionGenerator.hpp" 25e5c31af7Sopenharmony_ci 26e5c31af7Sopenharmony_cinamespace rsg 27e5c31af7Sopenharmony_ci{ 28e5c31af7Sopenharmony_ci 29e5c31af7Sopenharmony_ciExpressionGenerator::ExpressionGenerator (GeneratorState& state) 30e5c31af7Sopenharmony_ci : m_state(state) 31e5c31af7Sopenharmony_ci{ 32e5c31af7Sopenharmony_ci} 33e5c31af7Sopenharmony_ci 34e5c31af7Sopenharmony_ciExpressionGenerator::~ExpressionGenerator (void) 35e5c31af7Sopenharmony_ci{ 36e5c31af7Sopenharmony_ci} 37e5c31af7Sopenharmony_ci 38e5c31af7Sopenharmony_ciExpression* ExpressionGenerator::generate (const ValueRange& valueRange, int initialDepth) 39e5c31af7Sopenharmony_ci{ 40e5c31af7Sopenharmony_ci // Create root 41e5c31af7Sopenharmony_ci m_state.setExpressionDepth(initialDepth); 42e5c31af7Sopenharmony_ci Expression* root = Expression::createRandom(m_state, valueRange); 43e5c31af7Sopenharmony_ci 44e5c31af7Sopenharmony_ci try 45e5c31af7Sopenharmony_ci { 46e5c31af7Sopenharmony_ci // Generate full expression 47e5c31af7Sopenharmony_ci generate(root); 48e5c31af7Sopenharmony_ci } 49e5c31af7Sopenharmony_ci catch (const std::exception&) 50e5c31af7Sopenharmony_ci { 51e5c31af7Sopenharmony_ci delete root; 52e5c31af7Sopenharmony_ci m_expressionStack.clear(); 53e5c31af7Sopenharmony_ci throw; 54e5c31af7Sopenharmony_ci } 55e5c31af7Sopenharmony_ci 56e5c31af7Sopenharmony_ci return root; 57e5c31af7Sopenharmony_ci} 58e5c31af7Sopenharmony_ci 59e5c31af7Sopenharmony_civoid ExpressionGenerator::generate (Expression* root) 60e5c31af7Sopenharmony_ci{ 61e5c31af7Sopenharmony_ci DE_ASSERT(m_expressionStack.empty()); 62e5c31af7Sopenharmony_ci 63e5c31af7Sopenharmony_ci // Initialize stack 64e5c31af7Sopenharmony_ci m_expressionStack.push_back(root); 65e5c31af7Sopenharmony_ci m_state.setExpressionDepth(m_state.getExpressionDepth()+1); 66e5c31af7Sopenharmony_ci 67e5c31af7Sopenharmony_ci // Process until done 68e5c31af7Sopenharmony_ci while (!m_expressionStack.empty()) 69e5c31af7Sopenharmony_ci { 70e5c31af7Sopenharmony_ci DE_ASSERT(m_state.getExpressionDepth() <= m_state.getShaderParameters().maxExpressionDepth); 71e5c31af7Sopenharmony_ci 72e5c31af7Sopenharmony_ci Expression* curExpr = m_expressionStack[m_expressionStack.size()-1]; 73e5c31af7Sopenharmony_ci Expression* child = curExpr->createNextChild(m_state); 74e5c31af7Sopenharmony_ci 75e5c31af7Sopenharmony_ci if (child) 76e5c31af7Sopenharmony_ci { 77e5c31af7Sopenharmony_ci m_expressionStack.push_back(child); 78e5c31af7Sopenharmony_ci m_state.setExpressionDepth(m_state.getExpressionDepth()+1); 79e5c31af7Sopenharmony_ci } 80e5c31af7Sopenharmony_ci else 81e5c31af7Sopenharmony_ci { 82e5c31af7Sopenharmony_ci m_expressionStack.pop_back(); 83e5c31af7Sopenharmony_ci m_state.setExpressionDepth(m_state.getExpressionDepth()-1); 84e5c31af7Sopenharmony_ci } 85e5c31af7Sopenharmony_ci } 86e5c31af7Sopenharmony_ci} 87e5c31af7Sopenharmony_ci 88e5c31af7Sopenharmony_ci} // rsg 89