1*35238bceSAndroid Build Coastguard Worker #ifndef _RSGSHADER_HPP 2*35238bceSAndroid Build Coastguard Worker #define _RSGSHADER_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 Shader Class. 24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/ 25*35238bceSAndroid Build Coastguard Worker 26*35238bceSAndroid Build Coastguard Worker #include "rsgDefs.hpp" 27*35238bceSAndroid Build Coastguard Worker #include "rsgVariable.hpp" 28*35238bceSAndroid Build Coastguard Worker #include "rsgStatement.hpp" 29*35238bceSAndroid Build Coastguard Worker #include "rsgVariableManager.hpp" 30*35238bceSAndroid Build Coastguard Worker #include "rsgToken.hpp" 31*35238bceSAndroid Build Coastguard Worker #include "rsgExecutionContext.hpp" 32*35238bceSAndroid Build Coastguard Worker 33*35238bceSAndroid Build Coastguard Worker #include <vector> 34*35238bceSAndroid Build Coastguard Worker #include <string> 35*35238bceSAndroid Build Coastguard Worker 36*35238bceSAndroid Build Coastguard Worker namespace rsg 37*35238bceSAndroid Build Coastguard Worker { 38*35238bceSAndroid Build Coastguard Worker 39*35238bceSAndroid Build Coastguard Worker class Function 40*35238bceSAndroid Build Coastguard Worker { 41*35238bceSAndroid Build Coastguard Worker public: 42*35238bceSAndroid Build Coastguard Worker Function(void); 43*35238bceSAndroid Build Coastguard Worker Function(const char *name); 44*35238bceSAndroid Build Coastguard Worker ~Function(void); 45*35238bceSAndroid Build Coastguard Worker getReturnType(void) const46*35238bceSAndroid Build Coastguard Worker const VariableType &getReturnType(void) const 47*35238bceSAndroid Build Coastguard Worker { 48*35238bceSAndroid Build Coastguard Worker return m_returnType; 49*35238bceSAndroid Build Coastguard Worker } setReturnType(const VariableType & type)50*35238bceSAndroid Build Coastguard Worker void setReturnType(const VariableType &type) 51*35238bceSAndroid Build Coastguard Worker { 52*35238bceSAndroid Build Coastguard Worker m_returnType = type; 53*35238bceSAndroid Build Coastguard Worker } 54*35238bceSAndroid Build Coastguard Worker 55*35238bceSAndroid Build Coastguard Worker void addParameter(Variable *variable); 56*35238bceSAndroid Build Coastguard Worker getBody(void)57*35238bceSAndroid Build Coastguard Worker BlockStatement &getBody(void) 58*35238bceSAndroid Build Coastguard Worker { 59*35238bceSAndroid Build Coastguard Worker return m_functionBlock; 60*35238bceSAndroid Build Coastguard Worker } getBody(void) const61*35238bceSAndroid Build Coastguard Worker const BlockStatement &getBody(void) const 62*35238bceSAndroid Build Coastguard Worker { 63*35238bceSAndroid Build Coastguard Worker return m_functionBlock; 64*35238bceSAndroid Build Coastguard Worker } 65*35238bceSAndroid Build Coastguard Worker 66*35238bceSAndroid Build Coastguard Worker void tokenize(GeneratorState &state, TokenStream &stream) const; 67*35238bceSAndroid Build Coastguard Worker 68*35238bceSAndroid Build Coastguard Worker private: 69*35238bceSAndroid Build Coastguard Worker std::string m_name; 70*35238bceSAndroid Build Coastguard Worker std::vector<Variable *> m_parameters; 71*35238bceSAndroid Build Coastguard Worker VariableType m_returnType; 72*35238bceSAndroid Build Coastguard Worker 73*35238bceSAndroid Build Coastguard Worker BlockStatement m_functionBlock; 74*35238bceSAndroid Build Coastguard Worker }; 75*35238bceSAndroid Build Coastguard Worker 76*35238bceSAndroid Build Coastguard Worker class ShaderInput 77*35238bceSAndroid Build Coastguard Worker { 78*35238bceSAndroid Build Coastguard Worker public: 79*35238bceSAndroid Build Coastguard Worker ShaderInput(const Variable *variable, ConstValueRangeAccess valueRange); ~ShaderInput(void)80*35238bceSAndroid Build Coastguard Worker ~ShaderInput(void) 81*35238bceSAndroid Build Coastguard Worker { 82*35238bceSAndroid Build Coastguard Worker } 83*35238bceSAndroid Build Coastguard Worker getVariable(void) const84*35238bceSAndroid Build Coastguard Worker const Variable *getVariable(void) const 85*35238bceSAndroid Build Coastguard Worker { 86*35238bceSAndroid Build Coastguard Worker return m_variable; 87*35238bceSAndroid Build Coastguard Worker } getValueRange(void) const88*35238bceSAndroid Build Coastguard Worker ConstValueRangeAccess getValueRange(void) const 89*35238bceSAndroid Build Coastguard Worker { 90*35238bceSAndroid Build Coastguard Worker return ConstValueRangeAccess(m_variable->getType(), &m_min[0], &m_max[0]); 91*35238bceSAndroid Build Coastguard Worker } getValueRange(void)92*35238bceSAndroid Build Coastguard Worker ValueRangeAccess getValueRange(void) 93*35238bceSAndroid Build Coastguard Worker { 94*35238bceSAndroid Build Coastguard Worker return ValueRangeAccess(m_variable->getType(), &m_min[0], &m_max[0]); 95*35238bceSAndroid Build Coastguard Worker } 96*35238bceSAndroid Build Coastguard Worker 97*35238bceSAndroid Build Coastguard Worker private: 98*35238bceSAndroid Build Coastguard Worker const Variable *m_variable; 99*35238bceSAndroid Build Coastguard Worker std::vector<Scalar> m_min; 100*35238bceSAndroid Build Coastguard Worker std::vector<Scalar> m_max; 101*35238bceSAndroid Build Coastguard Worker }; 102*35238bceSAndroid Build Coastguard Worker 103*35238bceSAndroid Build Coastguard Worker class Shader 104*35238bceSAndroid Build Coastguard Worker { 105*35238bceSAndroid Build Coastguard Worker public: 106*35238bceSAndroid Build Coastguard Worker enum Type 107*35238bceSAndroid Build Coastguard Worker { 108*35238bceSAndroid Build Coastguard Worker TYPE_VERTEX = 0, 109*35238bceSAndroid Build Coastguard Worker TYPE_FRAGMENT, 110*35238bceSAndroid Build Coastguard Worker 111*35238bceSAndroid Build Coastguard Worker TYPE_LAST 112*35238bceSAndroid Build Coastguard Worker }; 113*35238bceSAndroid Build Coastguard Worker 114*35238bceSAndroid Build Coastguard Worker Shader(Type type); 115*35238bceSAndroid Build Coastguard Worker ~Shader(void); 116*35238bceSAndroid Build Coastguard Worker getType(void) const117*35238bceSAndroid Build Coastguard Worker Type getType(void) const 118*35238bceSAndroid Build Coastguard Worker { 119*35238bceSAndroid Build Coastguard Worker return m_type; 120*35238bceSAndroid Build Coastguard Worker } getSource(void) const121*35238bceSAndroid Build Coastguard Worker const char *getSource(void) const 122*35238bceSAndroid Build Coastguard Worker { 123*35238bceSAndroid Build Coastguard Worker return m_source.c_str(); 124*35238bceSAndroid Build Coastguard Worker } 125*35238bceSAndroid Build Coastguard Worker 126*35238bceSAndroid Build Coastguard Worker void execute(ExecutionContext &execCtx) const; 127*35238bceSAndroid Build Coastguard Worker 128*35238bceSAndroid Build Coastguard Worker // For generator implementation only getMain(void)129*35238bceSAndroid Build Coastguard Worker Function &getMain(void) 130*35238bceSAndroid Build Coastguard Worker { 131*35238bceSAndroid Build Coastguard Worker return m_mainFunction; 132*35238bceSAndroid Build Coastguard Worker } 133*35238bceSAndroid Build Coastguard Worker Function &allocateFunction(void); 134*35238bceSAndroid Build Coastguard Worker getGlobalScope(void)135*35238bceSAndroid Build Coastguard Worker VariableScope &getGlobalScope(void) 136*35238bceSAndroid Build Coastguard Worker { 137*35238bceSAndroid Build Coastguard Worker return m_globalScope; 138*35238bceSAndroid Build Coastguard Worker } getGlobalStatements(void)139*35238bceSAndroid Build Coastguard Worker std::vector<Statement *> &getGlobalStatements(void) 140*35238bceSAndroid Build Coastguard Worker { 141*35238bceSAndroid Build Coastguard Worker return m_globalStatements; 142*35238bceSAndroid Build Coastguard Worker } 143*35238bceSAndroid Build Coastguard Worker 144*35238bceSAndroid Build Coastguard Worker void tokenize(GeneratorState &state, TokenStream &str) const; setSource(const char * source)145*35238bceSAndroid Build Coastguard Worker void setSource(const char *source) 146*35238bceSAndroid Build Coastguard Worker { 147*35238bceSAndroid Build Coastguard Worker m_source = source; 148*35238bceSAndroid Build Coastguard Worker } 149*35238bceSAndroid Build Coastguard Worker getInputs(void)150*35238bceSAndroid Build Coastguard Worker std::vector<ShaderInput *> &getInputs(void) 151*35238bceSAndroid Build Coastguard Worker { 152*35238bceSAndroid Build Coastguard Worker return m_inputs; 153*35238bceSAndroid Build Coastguard Worker } getUniforms(void)154*35238bceSAndroid Build Coastguard Worker std::vector<ShaderInput *> &getUniforms(void) 155*35238bceSAndroid Build Coastguard Worker { 156*35238bceSAndroid Build Coastguard Worker return m_uniforms; 157*35238bceSAndroid Build Coastguard Worker } 158*35238bceSAndroid Build Coastguard Worker 159*35238bceSAndroid Build Coastguard Worker // For executor getInputs(void) const160*35238bceSAndroid Build Coastguard Worker const std::vector<ShaderInput *> &getInputs(void) const 161*35238bceSAndroid Build Coastguard Worker { 162*35238bceSAndroid Build Coastguard Worker return m_inputs; 163*35238bceSAndroid Build Coastguard Worker } getUniforms(void) const164*35238bceSAndroid Build Coastguard Worker const std::vector<ShaderInput *> &getUniforms(void) const 165*35238bceSAndroid Build Coastguard Worker { 166*35238bceSAndroid Build Coastguard Worker return m_uniforms; 167*35238bceSAndroid Build Coastguard Worker } 168*35238bceSAndroid Build Coastguard Worker void getOutputs(std::vector<const Variable *> &outputs) const; 169*35238bceSAndroid Build Coastguard Worker 170*35238bceSAndroid Build Coastguard Worker private: 171*35238bceSAndroid Build Coastguard Worker Type m_type; 172*35238bceSAndroid Build Coastguard Worker 173*35238bceSAndroid Build Coastguard Worker VariableScope m_globalScope; 174*35238bceSAndroid Build Coastguard Worker std::vector<Statement *> m_globalStatements; 175*35238bceSAndroid Build Coastguard Worker 176*35238bceSAndroid Build Coastguard Worker std::vector<ShaderInput *> m_inputs; 177*35238bceSAndroid Build Coastguard Worker std::vector<ShaderInput *> m_uniforms; 178*35238bceSAndroid Build Coastguard Worker 179*35238bceSAndroid Build Coastguard Worker std::vector<Function *> m_functions; 180*35238bceSAndroid Build Coastguard Worker Function m_mainFunction; 181*35238bceSAndroid Build Coastguard Worker 182*35238bceSAndroid Build Coastguard Worker std::string m_source; 183*35238bceSAndroid Build Coastguard Worker }; 184*35238bceSAndroid Build Coastguard Worker 185*35238bceSAndroid Build Coastguard Worker } // namespace rsg 186*35238bceSAndroid Build Coastguard Worker 187*35238bceSAndroid Build Coastguard Worker #endif // _RSGSHADER_HPP 188