1*35238bceSAndroid Build Coastguard Worker #ifndef _RSGEXPRESSION_HPP 2*35238bceSAndroid Build Coastguard Worker #define _RSGEXPRESSION_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 Expressions. 24*35238bceSAndroid Build Coastguard Worker * 25*35238bceSAndroid Build Coastguard Worker * Creating expressions: 26*35238bceSAndroid Build Coastguard Worker * + Children must be created in in reverse evaluation order. 27*35238bceSAndroid Build Coastguard Worker * - Must be tokenized / evaluated taking that order in account. 28*35238bceSAndroid Build Coastguard Worker * 29*35238bceSAndroid Build Coastguard Worker * Evaluation: 30*35238bceSAndroid Build Coastguard Worker * + Done recursively. (Do we have enough stack?) 31*35238bceSAndroid Build Coastguard Worker * + R-values: Nodes must implement getValue() in some way. Value 32*35238bceSAndroid Build Coastguard Worker * must be valid after evaluate(). 33*35238bceSAndroid Build Coastguard Worker * + L-values: Valid writable value access proxy must be returned after 34*35238bceSAndroid Build Coastguard Worker * evaluate(). 35*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/ 36*35238bceSAndroid Build Coastguard Worker 37*35238bceSAndroid Build Coastguard Worker #include "rsgDefs.hpp" 38*35238bceSAndroid Build Coastguard Worker #include "rsgGeneratorState.hpp" 39*35238bceSAndroid Build Coastguard Worker #include "rsgVariableValue.hpp" 40*35238bceSAndroid Build Coastguard Worker #include "rsgVariable.hpp" 41*35238bceSAndroid Build Coastguard Worker #include "rsgVariableManager.hpp" 42*35238bceSAndroid Build Coastguard Worker #include "rsgExecutionContext.hpp" 43*35238bceSAndroid Build Coastguard Worker 44*35238bceSAndroid Build Coastguard Worker namespace rsg 45*35238bceSAndroid Build Coastguard Worker { 46*35238bceSAndroid Build Coastguard Worker 47*35238bceSAndroid Build Coastguard Worker // \todo [2011-06-10 pyry] Declare in ShaderParameters? 48*35238bceSAndroid Build Coastguard Worker const float unusedValueWeight = 0.05f; 49*35238bceSAndroid Build Coastguard Worker 50*35238bceSAndroid Build Coastguard Worker class Expression 51*35238bceSAndroid Build Coastguard Worker { 52*35238bceSAndroid Build Coastguard Worker public: 53*35238bceSAndroid Build Coastguard Worker virtual ~Expression(void); 54*35238bceSAndroid Build Coastguard Worker 55*35238bceSAndroid Build Coastguard Worker // Shader generation API 56*35238bceSAndroid Build Coastguard Worker virtual Expression *createNextChild(GeneratorState &state) = DE_NULL; 57*35238bceSAndroid Build Coastguard Worker virtual void tokenize(GeneratorState &state, TokenStream &str) const = DE_NULL; 58*35238bceSAndroid Build Coastguard Worker 59*35238bceSAndroid Build Coastguard Worker // Execution API 60*35238bceSAndroid Build Coastguard Worker virtual void evaluate(ExecutionContext &ctx) = DE_NULL; 61*35238bceSAndroid Build Coastguard Worker virtual ExecConstValueAccess getValue(void) const = DE_NULL; getLValue(void) const62*35238bceSAndroid Build Coastguard Worker virtual ExecValueAccess getLValue(void) const 63*35238bceSAndroid Build Coastguard Worker { 64*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false); 65*35238bceSAndroid Build Coastguard Worker throw Exception("Expression::getLValue(): not L-value node"); 66*35238bceSAndroid Build Coastguard Worker } 67*35238bceSAndroid Build Coastguard Worker 68*35238bceSAndroid Build Coastguard Worker static Expression *createRandom(GeneratorState &state, ConstValueRangeAccess valueRange); 69*35238bceSAndroid Build Coastguard Worker static Expression *createRandomLValue(GeneratorState &state, ConstValueRangeAccess valueRange); 70*35238bceSAndroid Build Coastguard Worker }; 71*35238bceSAndroid Build Coastguard Worker 72*35238bceSAndroid Build Coastguard Worker class VariableAccess : public Expression 73*35238bceSAndroid Build Coastguard Worker { 74*35238bceSAndroid Build Coastguard Worker public: ~VariableAccess(void)75*35238bceSAndroid Build Coastguard Worker virtual ~VariableAccess(void) 76*35238bceSAndroid Build Coastguard Worker { 77*35238bceSAndroid Build Coastguard Worker } 78*35238bceSAndroid Build Coastguard Worker createNextChild(GeneratorState & state)79*35238bceSAndroid Build Coastguard Worker Expression *createNextChild(GeneratorState &state) 80*35238bceSAndroid Build Coastguard Worker { 81*35238bceSAndroid Build Coastguard Worker DE_UNREF(state); 82*35238bceSAndroid Build Coastguard Worker return DE_NULL; 83*35238bceSAndroid Build Coastguard Worker } tokenize(GeneratorState & state,TokenStream & str) const84*35238bceSAndroid Build Coastguard Worker void tokenize(GeneratorState &state, TokenStream &str) const 85*35238bceSAndroid Build Coastguard Worker { 86*35238bceSAndroid Build Coastguard Worker DE_UNREF(state); 87*35238bceSAndroid Build Coastguard Worker str << Token(m_variable->getName()); 88*35238bceSAndroid Build Coastguard Worker } 89*35238bceSAndroid Build Coastguard Worker 90*35238bceSAndroid Build Coastguard Worker void evaluate(ExecutionContext &ctx); getValue(void) const91*35238bceSAndroid Build Coastguard Worker ExecConstValueAccess getValue(void) const 92*35238bceSAndroid Build Coastguard Worker { 93*35238bceSAndroid Build Coastguard Worker return m_valueAccess; 94*35238bceSAndroid Build Coastguard Worker } getLValue(void) const95*35238bceSAndroid Build Coastguard Worker ExecValueAccess getLValue(void) const 96*35238bceSAndroid Build Coastguard Worker { 97*35238bceSAndroid Build Coastguard Worker return m_valueAccess; 98*35238bceSAndroid Build Coastguard Worker } 99*35238bceSAndroid Build Coastguard Worker 100*35238bceSAndroid Build Coastguard Worker protected: VariableAccess(void)101*35238bceSAndroid Build Coastguard Worker VariableAccess(void) : m_variable(DE_NULL) 102*35238bceSAndroid Build Coastguard Worker { 103*35238bceSAndroid Build Coastguard Worker } 104*35238bceSAndroid Build Coastguard Worker 105*35238bceSAndroid Build Coastguard Worker const Variable *m_variable; 106*35238bceSAndroid Build Coastguard Worker ExecValueAccess m_valueAccess; 107*35238bceSAndroid Build Coastguard Worker }; 108*35238bceSAndroid Build Coastguard Worker 109*35238bceSAndroid Build Coastguard Worker class VariableRead : public VariableAccess 110*35238bceSAndroid Build Coastguard Worker { 111*35238bceSAndroid Build Coastguard Worker public: 112*35238bceSAndroid Build Coastguard Worker VariableRead(GeneratorState &state, ConstValueRangeAccess valueRange); 113*35238bceSAndroid Build Coastguard Worker VariableRead(const Variable *variable); ~VariableRead(void)114*35238bceSAndroid Build Coastguard Worker virtual ~VariableRead(void) 115*35238bceSAndroid Build Coastguard Worker { 116*35238bceSAndroid Build Coastguard Worker } 117*35238bceSAndroid Build Coastguard Worker 118*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 119*35238bceSAndroid Build Coastguard Worker }; 120*35238bceSAndroid Build Coastguard Worker 121*35238bceSAndroid Build Coastguard Worker class VariableWrite : public VariableAccess 122*35238bceSAndroid Build Coastguard Worker { 123*35238bceSAndroid Build Coastguard Worker public: 124*35238bceSAndroid Build Coastguard Worker VariableWrite(GeneratorState &state, ConstValueRangeAccess valueRange); ~VariableWrite(void)125*35238bceSAndroid Build Coastguard Worker virtual ~VariableWrite(void) 126*35238bceSAndroid Build Coastguard Worker { 127*35238bceSAndroid Build Coastguard Worker } 128*35238bceSAndroid Build Coastguard Worker 129*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 130*35238bceSAndroid Build Coastguard Worker }; 131*35238bceSAndroid Build Coastguard Worker 132*35238bceSAndroid Build Coastguard Worker class FloatLiteral : public Expression 133*35238bceSAndroid Build Coastguard Worker { 134*35238bceSAndroid Build Coastguard Worker public: 135*35238bceSAndroid Build Coastguard Worker FloatLiteral(GeneratorState &state, ConstValueRangeAccess valueRange); 136*35238bceSAndroid Build Coastguard Worker FloatLiteral(float customValue); ~FloatLiteral(void)137*35238bceSAndroid Build Coastguard Worker virtual ~FloatLiteral(void) 138*35238bceSAndroid Build Coastguard Worker { 139*35238bceSAndroid Build Coastguard Worker } 140*35238bceSAndroid Build Coastguard Worker createNextChild(GeneratorState & state)141*35238bceSAndroid Build Coastguard Worker Expression *createNextChild(GeneratorState &state) 142*35238bceSAndroid Build Coastguard Worker { 143*35238bceSAndroid Build Coastguard Worker DE_UNREF(state); 144*35238bceSAndroid Build Coastguard Worker return DE_NULL; 145*35238bceSAndroid Build Coastguard Worker } 146*35238bceSAndroid Build Coastguard Worker void tokenize(GeneratorState &state, TokenStream &str) const; 147*35238bceSAndroid Build Coastguard Worker 148*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 149*35238bceSAndroid Build Coastguard Worker evaluate(ExecutionContext & ctx)150*35238bceSAndroid Build Coastguard Worker void evaluate(ExecutionContext &ctx) 151*35238bceSAndroid Build Coastguard Worker { 152*35238bceSAndroid Build Coastguard Worker DE_UNREF(ctx); 153*35238bceSAndroid Build Coastguard Worker } getValue(void) const154*35238bceSAndroid Build Coastguard Worker ExecConstValueAccess getValue(void) const 155*35238bceSAndroid Build Coastguard Worker { 156*35238bceSAndroid Build Coastguard Worker return m_value.getValue(VariableType::getScalarType(VariableType::TYPE_FLOAT)); 157*35238bceSAndroid Build Coastguard Worker } 158*35238bceSAndroid Build Coastguard Worker 159*35238bceSAndroid Build Coastguard Worker private: 160*35238bceSAndroid Build Coastguard Worker ExecValueStorage m_value; 161*35238bceSAndroid Build Coastguard Worker }; 162*35238bceSAndroid Build Coastguard Worker 163*35238bceSAndroid Build Coastguard Worker class IntLiteral : public Expression 164*35238bceSAndroid Build Coastguard Worker { 165*35238bceSAndroid Build Coastguard Worker public: 166*35238bceSAndroid Build Coastguard Worker IntLiteral(GeneratorState &state, ConstValueRangeAccess valueRange); ~IntLiteral(void)167*35238bceSAndroid Build Coastguard Worker virtual ~IntLiteral(void) 168*35238bceSAndroid Build Coastguard Worker { 169*35238bceSAndroid Build Coastguard Worker } 170*35238bceSAndroid Build Coastguard Worker createNextChild(GeneratorState & state)171*35238bceSAndroid Build Coastguard Worker Expression *createNextChild(GeneratorState &state) 172*35238bceSAndroid Build Coastguard Worker { 173*35238bceSAndroid Build Coastguard Worker DE_UNREF(state); 174*35238bceSAndroid Build Coastguard Worker return DE_NULL; 175*35238bceSAndroid Build Coastguard Worker } 176*35238bceSAndroid Build Coastguard Worker void tokenize(GeneratorState &state, TokenStream &str) const; 177*35238bceSAndroid Build Coastguard Worker 178*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 179*35238bceSAndroid Build Coastguard Worker evaluate(ExecutionContext & ctx)180*35238bceSAndroid Build Coastguard Worker void evaluate(ExecutionContext &ctx) 181*35238bceSAndroid Build Coastguard Worker { 182*35238bceSAndroid Build Coastguard Worker DE_UNREF(ctx); 183*35238bceSAndroid Build Coastguard Worker } getValue(void) const184*35238bceSAndroid Build Coastguard Worker ExecConstValueAccess getValue(void) const 185*35238bceSAndroid Build Coastguard Worker { 186*35238bceSAndroid Build Coastguard Worker return m_value.getValue(VariableType::getScalarType(VariableType::TYPE_INT)); 187*35238bceSAndroid Build Coastguard Worker } 188*35238bceSAndroid Build Coastguard Worker 189*35238bceSAndroid Build Coastguard Worker private: 190*35238bceSAndroid Build Coastguard Worker ExecValueStorage m_value; 191*35238bceSAndroid Build Coastguard Worker }; 192*35238bceSAndroid Build Coastguard Worker 193*35238bceSAndroid Build Coastguard Worker class BoolLiteral : public Expression 194*35238bceSAndroid Build Coastguard Worker { 195*35238bceSAndroid Build Coastguard Worker public: 196*35238bceSAndroid Build Coastguard Worker BoolLiteral(GeneratorState &state, ConstValueRangeAccess valueRange); 197*35238bceSAndroid Build Coastguard Worker BoolLiteral(bool customValue); ~BoolLiteral(void)198*35238bceSAndroid Build Coastguard Worker virtual ~BoolLiteral(void) 199*35238bceSAndroid Build Coastguard Worker { 200*35238bceSAndroid Build Coastguard Worker } 201*35238bceSAndroid Build Coastguard Worker createNextChild(GeneratorState & state)202*35238bceSAndroid Build Coastguard Worker Expression *createNextChild(GeneratorState &state) 203*35238bceSAndroid Build Coastguard Worker { 204*35238bceSAndroid Build Coastguard Worker DE_UNREF(state); 205*35238bceSAndroid Build Coastguard Worker return DE_NULL; 206*35238bceSAndroid Build Coastguard Worker } 207*35238bceSAndroid Build Coastguard Worker void tokenize(GeneratorState &state, TokenStream &str) const; 208*35238bceSAndroid Build Coastguard Worker 209*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 210*35238bceSAndroid Build Coastguard Worker evaluate(ExecutionContext & ctx)211*35238bceSAndroid Build Coastguard Worker void evaluate(ExecutionContext &ctx) 212*35238bceSAndroid Build Coastguard Worker { 213*35238bceSAndroid Build Coastguard Worker DE_UNREF(ctx); 214*35238bceSAndroid Build Coastguard Worker } getValue(void) const215*35238bceSAndroid Build Coastguard Worker ExecConstValueAccess getValue(void) const 216*35238bceSAndroid Build Coastguard Worker { 217*35238bceSAndroid Build Coastguard Worker return m_value.getValue(VariableType::getScalarType(VariableType::TYPE_BOOL)); 218*35238bceSAndroid Build Coastguard Worker } 219*35238bceSAndroid Build Coastguard Worker 220*35238bceSAndroid Build Coastguard Worker private: 221*35238bceSAndroid Build Coastguard Worker ExecValueStorage m_value; 222*35238bceSAndroid Build Coastguard Worker }; 223*35238bceSAndroid Build Coastguard Worker 224*35238bceSAndroid Build Coastguard Worker class ConstructorOp : public Expression 225*35238bceSAndroid Build Coastguard Worker { 226*35238bceSAndroid Build Coastguard Worker public: 227*35238bceSAndroid Build Coastguard Worker ConstructorOp(GeneratorState &state, ConstValueRangeAccess valueRange); 228*35238bceSAndroid Build Coastguard Worker virtual ~ConstructorOp(void); 229*35238bceSAndroid Build Coastguard Worker 230*35238bceSAndroid Build Coastguard Worker Expression *createNextChild(GeneratorState &state); 231*35238bceSAndroid Build Coastguard Worker void tokenize(GeneratorState &state, TokenStream &str) const; 232*35238bceSAndroid Build Coastguard Worker 233*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 234*35238bceSAndroid Build Coastguard Worker 235*35238bceSAndroid Build Coastguard Worker void evaluate(ExecutionContext &ctx); getValue(void) const236*35238bceSAndroid Build Coastguard Worker ExecConstValueAccess getValue(void) const 237*35238bceSAndroid Build Coastguard Worker { 238*35238bceSAndroid Build Coastguard Worker return m_value.getValue(m_valueRange.getType()); 239*35238bceSAndroid Build Coastguard Worker } 240*35238bceSAndroid Build Coastguard Worker 241*35238bceSAndroid Build Coastguard Worker private: 242*35238bceSAndroid Build Coastguard Worker ValueRange m_valueRange; 243*35238bceSAndroid Build Coastguard Worker ExecValueStorage m_value; 244*35238bceSAndroid Build Coastguard Worker 245*35238bceSAndroid Build Coastguard Worker std::vector<ValueRange> m_inputValueRanges; 246*35238bceSAndroid Build Coastguard Worker std::vector<Expression *> m_inputExpressions; 247*35238bceSAndroid Build Coastguard Worker }; 248*35238bceSAndroid Build Coastguard Worker 249*35238bceSAndroid Build Coastguard Worker class AssignOp : public Expression 250*35238bceSAndroid Build Coastguard Worker { 251*35238bceSAndroid Build Coastguard Worker public: 252*35238bceSAndroid Build Coastguard Worker AssignOp(GeneratorState &state, ConstValueRangeAccess valueRange); 253*35238bceSAndroid Build Coastguard Worker virtual ~AssignOp(void); 254*35238bceSAndroid Build Coastguard Worker 255*35238bceSAndroid Build Coastguard Worker Expression *createNextChild(GeneratorState &state); 256*35238bceSAndroid Build Coastguard Worker void tokenize(GeneratorState &state, TokenStream &str) const; 257*35238bceSAndroid Build Coastguard Worker 258*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 259*35238bceSAndroid Build Coastguard Worker 260*35238bceSAndroid Build Coastguard Worker // \todo [2011-02-28 pyry] LValue variant of AssignOp 261*35238bceSAndroid Build Coastguard Worker // static float getLValueWeight (const GeneratorState& state, ConstValueRangeAccess valueRange); 262*35238bceSAndroid Build Coastguard Worker 263*35238bceSAndroid Build Coastguard Worker void evaluate(ExecutionContext &ctx); getValue(void) const264*35238bceSAndroid Build Coastguard Worker ExecConstValueAccess getValue(void) const 265*35238bceSAndroid Build Coastguard Worker { 266*35238bceSAndroid Build Coastguard Worker return m_value.getValue(m_valueRange.getType()); 267*35238bceSAndroid Build Coastguard Worker } 268*35238bceSAndroid Build Coastguard Worker 269*35238bceSAndroid Build Coastguard Worker private: 270*35238bceSAndroid Build Coastguard Worker ValueRange m_valueRange; 271*35238bceSAndroid Build Coastguard Worker ExecValueStorage m_value; 272*35238bceSAndroid Build Coastguard Worker 273*35238bceSAndroid Build Coastguard Worker Expression *m_lvalueExpr; 274*35238bceSAndroid Build Coastguard Worker Expression *m_rvalueExpr; 275*35238bceSAndroid Build Coastguard Worker }; 276*35238bceSAndroid Build Coastguard Worker 277*35238bceSAndroid Build Coastguard Worker class ParenOp : public Expression 278*35238bceSAndroid Build Coastguard Worker { 279*35238bceSAndroid Build Coastguard Worker public: 280*35238bceSAndroid Build Coastguard Worker ParenOp(GeneratorState &state, ConstValueRangeAccess valueRange); 281*35238bceSAndroid Build Coastguard Worker virtual ~ParenOp(void); 282*35238bceSAndroid Build Coastguard Worker 283*35238bceSAndroid Build Coastguard Worker Expression *createNextChild(GeneratorState &state); 284*35238bceSAndroid Build Coastguard Worker void tokenize(GeneratorState &state, TokenStream &str) const; 285*35238bceSAndroid Build Coastguard Worker 286*35238bceSAndroid Build Coastguard Worker void setChild(Expression *expression); 287*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 288*35238bceSAndroid Build Coastguard Worker evaluate(ExecutionContext & execCtx)289*35238bceSAndroid Build Coastguard Worker void evaluate(ExecutionContext &execCtx) 290*35238bceSAndroid Build Coastguard Worker { 291*35238bceSAndroid Build Coastguard Worker m_child->evaluate(execCtx); 292*35238bceSAndroid Build Coastguard Worker } getValue(void) const293*35238bceSAndroid Build Coastguard Worker ExecConstValueAccess getValue(void) const 294*35238bceSAndroid Build Coastguard Worker { 295*35238bceSAndroid Build Coastguard Worker return m_child->getValue(); 296*35238bceSAndroid Build Coastguard Worker } 297*35238bceSAndroid Build Coastguard Worker 298*35238bceSAndroid Build Coastguard Worker private: 299*35238bceSAndroid Build Coastguard Worker ValueRange m_valueRange; 300*35238bceSAndroid Build Coastguard Worker Expression *m_child; 301*35238bceSAndroid Build Coastguard Worker }; 302*35238bceSAndroid Build Coastguard Worker 303*35238bceSAndroid Build Coastguard Worker class SwizzleOp : public Expression 304*35238bceSAndroid Build Coastguard Worker { 305*35238bceSAndroid Build Coastguard Worker public: 306*35238bceSAndroid Build Coastguard Worker SwizzleOp(GeneratorState &state, ConstValueRangeAccess valueRange); 307*35238bceSAndroid Build Coastguard Worker virtual ~SwizzleOp(void); 308*35238bceSAndroid Build Coastguard Worker 309*35238bceSAndroid Build Coastguard Worker Expression *createNextChild(GeneratorState &state); 310*35238bceSAndroid Build Coastguard Worker void tokenize(GeneratorState &state, TokenStream &str) const; 311*35238bceSAndroid Build Coastguard Worker 312*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 313*35238bceSAndroid Build Coastguard Worker 314*35238bceSAndroid Build Coastguard Worker void evaluate(ExecutionContext &execCtx); getValue(void) const315*35238bceSAndroid Build Coastguard Worker ExecConstValueAccess getValue(void) const 316*35238bceSAndroid Build Coastguard Worker { 317*35238bceSAndroid Build Coastguard Worker return m_value.getValue(m_outValueRange.getType()); 318*35238bceSAndroid Build Coastguard Worker } 319*35238bceSAndroid Build Coastguard Worker 320*35238bceSAndroid Build Coastguard Worker private: 321*35238bceSAndroid Build Coastguard Worker ValueRange m_outValueRange; 322*35238bceSAndroid Build Coastguard Worker int m_numInputElements; 323*35238bceSAndroid Build Coastguard Worker uint8_t m_swizzle[4]; 324*35238bceSAndroid Build Coastguard Worker Expression *m_child; 325*35238bceSAndroid Build Coastguard Worker ExecValueStorage m_value; 326*35238bceSAndroid Build Coastguard Worker }; 327*35238bceSAndroid Build Coastguard Worker 328*35238bceSAndroid Build Coastguard Worker class TexLookup : public Expression 329*35238bceSAndroid Build Coastguard Worker { 330*35238bceSAndroid Build Coastguard Worker public: 331*35238bceSAndroid Build Coastguard Worker TexLookup(GeneratorState &state, ConstValueRangeAccess valueRange); 332*35238bceSAndroid Build Coastguard Worker virtual ~TexLookup(void); 333*35238bceSAndroid Build Coastguard Worker 334*35238bceSAndroid Build Coastguard Worker Expression *createNextChild(GeneratorState &state); 335*35238bceSAndroid Build Coastguard Worker void tokenize(GeneratorState &state, TokenStream &str) const; 336*35238bceSAndroid Build Coastguard Worker 337*35238bceSAndroid Build Coastguard Worker static float getWeight(const GeneratorState &state, ConstValueRangeAccess valueRange); 338*35238bceSAndroid Build Coastguard Worker 339*35238bceSAndroid Build Coastguard Worker void evaluate(ExecutionContext &execCtx); getValue(void) const340*35238bceSAndroid Build Coastguard Worker ExecConstValueAccess getValue(void) const 341*35238bceSAndroid Build Coastguard Worker { 342*35238bceSAndroid Build Coastguard Worker return m_value.getValue(m_valueType); 343*35238bceSAndroid Build Coastguard Worker } 344*35238bceSAndroid Build Coastguard Worker 345*35238bceSAndroid Build Coastguard Worker private: 346*35238bceSAndroid Build Coastguard Worker enum Type 347*35238bceSAndroid Build Coastguard Worker { 348*35238bceSAndroid Build Coastguard Worker TYPE_TEXTURE2D, 349*35238bceSAndroid Build Coastguard Worker TYPE_TEXTURE2D_LOD, 350*35238bceSAndroid Build Coastguard Worker TYPE_TEXTURE2D_PROJ, 351*35238bceSAndroid Build Coastguard Worker TYPE_TEXTURE2D_PROJ_LOD, 352*35238bceSAndroid Build Coastguard Worker 353*35238bceSAndroid Build Coastguard Worker TYPE_TEXTURECUBE, 354*35238bceSAndroid Build Coastguard Worker TYPE_TEXTURECUBE_LOD, 355*35238bceSAndroid Build Coastguard Worker 356*35238bceSAndroid Build Coastguard Worker TYPE_LAST 357*35238bceSAndroid Build Coastguard Worker }; 358*35238bceSAndroid Build Coastguard Worker 359*35238bceSAndroid Build Coastguard Worker Type m_type; 360*35238bceSAndroid Build Coastguard Worker const Variable *m_sampler; 361*35238bceSAndroid Build Coastguard Worker Expression *m_coordExpr; 362*35238bceSAndroid Build Coastguard Worker Expression *m_lodBiasExpr; 363*35238bceSAndroid Build Coastguard Worker VariableType m_valueType; 364*35238bceSAndroid Build Coastguard Worker ExecValueStorage m_value; 365*35238bceSAndroid Build Coastguard Worker }; 366*35238bceSAndroid Build Coastguard Worker 367*35238bceSAndroid Build Coastguard Worker } // namespace rsg 368*35238bceSAndroid Build Coastguard Worker 369*35238bceSAndroid Build Coastguard Worker #endif // _RSGEXPRESSION_HPP 370