xref: /aosp_15_r20/external/deqp/framework/randomshaders/rsgExpression.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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