1*35238bceSAndroid Build Coastguard Worker #ifndef _RSGGENERATORSTATE_HPP 2*35238bceSAndroid Build Coastguard Worker #define _RSGGENERATORSTATE_HPP 3*35238bceSAndroid Build Coastguard Worker /*------------------------------------------------------------------------- 4*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program Random Shader Generator 5*35238bceSAndroid Build Coastguard Worker * ---------------------------------------------------- 6*35238bceSAndroid Build Coastguard Worker * 7*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project 8*35238bceSAndroid Build Coastguard Worker * 9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at 12*35238bceSAndroid Build Coastguard Worker * 13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 14*35238bceSAndroid Build Coastguard Worker * 15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 19*35238bceSAndroid Build Coastguard Worker * limitations under the License. 20*35238bceSAndroid Build Coastguard Worker * 21*35238bceSAndroid Build Coastguard Worker *//*! 22*35238bceSAndroid Build Coastguard Worker * \file 23*35238bceSAndroid Build Coastguard Worker * \brief Generator state. 24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/ 25*35238bceSAndroid Build Coastguard Worker 26*35238bceSAndroid Build Coastguard Worker #include "rsgDefs.hpp" 27*35238bceSAndroid Build Coastguard Worker #include "rsgParameters.hpp" 28*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp" 29*35238bceSAndroid Build Coastguard Worker #include "rsgNameAllocator.hpp" 30*35238bceSAndroid Build Coastguard Worker 31*35238bceSAndroid Build Coastguard Worker #include <vector> 32*35238bceSAndroid Build Coastguard Worker 33*35238bceSAndroid Build Coastguard Worker namespace rsg 34*35238bceSAndroid Build Coastguard Worker { 35*35238bceSAndroid Build Coastguard Worker 36*35238bceSAndroid Build Coastguard Worker class Shader; 37*35238bceSAndroid Build Coastguard Worker class VariableManager; 38*35238bceSAndroid Build Coastguard Worker class VariableType; 39*35238bceSAndroid Build Coastguard Worker class Statement; 40*35238bceSAndroid Build Coastguard Worker 41*35238bceSAndroid Build Coastguard Worker enum ExpressionFlags 42*35238bceSAndroid Build Coastguard Worker { 43*35238bceSAndroid Build Coastguard Worker CONST_EXPR = (1 << 0), 44*35238bceSAndroid Build Coastguard Worker NO_VAR_ALLOCATION = (1 << 1) 45*35238bceSAndroid Build Coastguard Worker }; 46*35238bceSAndroid Build Coastguard Worker 47*35238bceSAndroid Build Coastguard Worker enum 48*35238bceSAndroid Build Coastguard Worker { 49*35238bceSAndroid Build Coastguard Worker PRECEDENCE_MAX = 100 50*35238bceSAndroid Build Coastguard Worker }; 51*35238bceSAndroid Build Coastguard Worker 52*35238bceSAndroid Build Coastguard Worker class GeneratorState 53*35238bceSAndroid Build Coastguard Worker { 54*35238bceSAndroid Build Coastguard Worker public: 55*35238bceSAndroid Build Coastguard Worker GeneratorState(const ProgramParameters &programParams, de::Random &random); 56*35238bceSAndroid Build Coastguard Worker ~GeneratorState(void); 57*35238bceSAndroid Build Coastguard Worker getProgramParameters(void) const58*35238bceSAndroid Build Coastguard Worker const ProgramParameters &getProgramParameters(void) const 59*35238bceSAndroid Build Coastguard Worker { 60*35238bceSAndroid Build Coastguard Worker return m_programParams; 61*35238bceSAndroid Build Coastguard Worker } getRandom(void)62*35238bceSAndroid Build Coastguard Worker de::Random &getRandom(void) 63*35238bceSAndroid Build Coastguard Worker { 64*35238bceSAndroid Build Coastguard Worker return m_random; 65*35238bceSAndroid Build Coastguard Worker } 66*35238bceSAndroid Build Coastguard Worker getShaderParameters(void) const67*35238bceSAndroid Build Coastguard Worker const ShaderParameters &getShaderParameters(void) const 68*35238bceSAndroid Build Coastguard Worker { 69*35238bceSAndroid Build Coastguard Worker return *m_shaderParams; 70*35238bceSAndroid Build Coastguard Worker } getShader(void)71*35238bceSAndroid Build Coastguard Worker Shader &getShader(void) 72*35238bceSAndroid Build Coastguard Worker { 73*35238bceSAndroid Build Coastguard Worker return *m_shader; 74*35238bceSAndroid Build Coastguard Worker } 75*35238bceSAndroid Build Coastguard Worker 76*35238bceSAndroid Build Coastguard Worker void setShader(const ShaderParameters ¶ms, Shader &shader); 77*35238bceSAndroid Build Coastguard Worker getNameAllocator(void)78*35238bceSAndroid Build Coastguard Worker NameAllocator &getNameAllocator(void) 79*35238bceSAndroid Build Coastguard Worker { 80*35238bceSAndroid Build Coastguard Worker return m_nameAllocator; 81*35238bceSAndroid Build Coastguard Worker } getVariableManager(void)82*35238bceSAndroid Build Coastguard Worker VariableManager &getVariableManager(void) 83*35238bceSAndroid Build Coastguard Worker { 84*35238bceSAndroid Build Coastguard Worker return *m_varManager; 85*35238bceSAndroid Build Coastguard Worker } getVariableManager(void) const86*35238bceSAndroid Build Coastguard Worker const VariableManager &getVariableManager(void) const 87*35238bceSAndroid Build Coastguard Worker { 88*35238bceSAndroid Build Coastguard Worker return *m_varManager; 89*35238bceSAndroid Build Coastguard Worker } setVariableManager(VariableManager & varManager)90*35238bceSAndroid Build Coastguard Worker void setVariableManager(VariableManager &varManager) 91*35238bceSAndroid Build Coastguard Worker { 92*35238bceSAndroid Build Coastguard Worker m_varManager = &varManager; 93*35238bceSAndroid Build Coastguard Worker } 94*35238bceSAndroid Build Coastguard Worker 95*35238bceSAndroid Build Coastguard Worker // \todo [2011-06-10 pyry] Could we not expose whole statement stack to everyone? getStatementDepth(void) const96*35238bceSAndroid Build Coastguard Worker int getStatementDepth(void) const 97*35238bceSAndroid Build Coastguard Worker { 98*35238bceSAndroid Build Coastguard Worker return (int)m_statementStack->size(); 99*35238bceSAndroid Build Coastguard Worker } setStatementStack(std::vector<Statement * > & stack)100*35238bceSAndroid Build Coastguard Worker void setStatementStack(std::vector<Statement *> &stack) 101*35238bceSAndroid Build Coastguard Worker { 102*35238bceSAndroid Build Coastguard Worker m_statementStack = &stack; 103*35238bceSAndroid Build Coastguard Worker } getStatementStackEntry(int ndx) const104*35238bceSAndroid Build Coastguard Worker const Statement *getStatementStackEntry(int ndx) const 105*35238bceSAndroid Build Coastguard Worker { 106*35238bceSAndroid Build Coastguard Worker return m_statementStack->at(ndx); 107*35238bceSAndroid Build Coastguard Worker } 108*35238bceSAndroid Build Coastguard Worker getExpressionDepth(void) const109*35238bceSAndroid Build Coastguard Worker int getExpressionDepth(void) const 110*35238bceSAndroid Build Coastguard Worker { 111*35238bceSAndroid Build Coastguard Worker return m_expressionDepth; 112*35238bceSAndroid Build Coastguard Worker } setExpressionDepth(int depth)113*35238bceSAndroid Build Coastguard Worker void setExpressionDepth(int depth) 114*35238bceSAndroid Build Coastguard Worker { 115*35238bceSAndroid Build Coastguard Worker m_expressionDepth = depth; 116*35238bceSAndroid Build Coastguard Worker } 117*35238bceSAndroid Build Coastguard Worker 118*35238bceSAndroid Build Coastguard Worker // \todo [2011-03-21 pyry] A bit of a hack... Move to ValueRange? getExpressionFlags(void) const119*35238bceSAndroid Build Coastguard Worker uint32_t getExpressionFlags(void) const 120*35238bceSAndroid Build Coastguard Worker { 121*35238bceSAndroid Build Coastguard Worker return m_exprFlagStack.back(); 122*35238bceSAndroid Build Coastguard Worker } pushExpressionFlags(uint32_t flags)123*35238bceSAndroid Build Coastguard Worker void pushExpressionFlags(uint32_t flags) 124*35238bceSAndroid Build Coastguard Worker { 125*35238bceSAndroid Build Coastguard Worker m_exprFlagStack.push_back(flags); 126*35238bceSAndroid Build Coastguard Worker } popExpressionFlags(void)127*35238bceSAndroid Build Coastguard Worker void popExpressionFlags(void) 128*35238bceSAndroid Build Coastguard Worker { 129*35238bceSAndroid Build Coastguard Worker m_exprFlagStack.pop_back(); 130*35238bceSAndroid Build Coastguard Worker } 131*35238bceSAndroid Build Coastguard Worker getPrecedence(void) const132*35238bceSAndroid Build Coastguard Worker int getPrecedence(void) const 133*35238bceSAndroid Build Coastguard Worker { 134*35238bceSAndroid Build Coastguard Worker return m_precedenceStack.back(); 135*35238bceSAndroid Build Coastguard Worker } pushPrecedence(int precedence)136*35238bceSAndroid Build Coastguard Worker void pushPrecedence(int precedence) 137*35238bceSAndroid Build Coastguard Worker { 138*35238bceSAndroid Build Coastguard Worker m_precedenceStack.push_back(precedence); 139*35238bceSAndroid Build Coastguard Worker } popPrecedence(void)140*35238bceSAndroid Build Coastguard Worker void popPrecedence(void) 141*35238bceSAndroid Build Coastguard Worker { 142*35238bceSAndroid Build Coastguard Worker m_precedenceStack.pop_back(); 143*35238bceSAndroid Build Coastguard Worker } 144*35238bceSAndroid Build Coastguard Worker 145*35238bceSAndroid Build Coastguard Worker private: 146*35238bceSAndroid Build Coastguard Worker const ProgramParameters &m_programParams; 147*35238bceSAndroid Build Coastguard Worker de::Random &m_random; 148*35238bceSAndroid Build Coastguard Worker 149*35238bceSAndroid Build Coastguard Worker const ShaderParameters *m_shaderParams; 150*35238bceSAndroid Build Coastguard Worker Shader *m_shader; 151*35238bceSAndroid Build Coastguard Worker 152*35238bceSAndroid Build Coastguard Worker NameAllocator m_nameAllocator; 153*35238bceSAndroid Build Coastguard Worker VariableManager *m_varManager; 154*35238bceSAndroid Build Coastguard Worker 155*35238bceSAndroid Build Coastguard Worker std::vector<Statement *> *m_statementStack; 156*35238bceSAndroid Build Coastguard Worker int m_expressionDepth; 157*35238bceSAndroid Build Coastguard Worker std::vector<uint32_t> m_exprFlagStack; 158*35238bceSAndroid Build Coastguard Worker std::vector<int> m_precedenceStack; 159*35238bceSAndroid Build Coastguard Worker }; 160*35238bceSAndroid Build Coastguard Worker 161*35238bceSAndroid Build Coastguard Worker } // namespace rsg 162*35238bceSAndroid Build Coastguard Worker 163*35238bceSAndroid Build Coastguard Worker #endif // _RSGGENERATORSTATE_HPP 164