• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _RSGEXPRESSION_HPP
2 #define _RSGEXPRESSION_HPP
3 /*-------------------------------------------------------------------------
4  * drawElements Quality Program Random Shader Generator
5  * ----------------------------------------------------
6  *
7  * Copyright 2014 The Android Open Source Project
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  *//*!
22  * \file
23  * \brief Expressions.
24  *
25  * Creating expressions:
26  *  + Children must be created in in reverse evaluation order.
27  *    - Must be tokenized / evaluated taking that order in account.
28  *
29  * Evaluation:
30  *  + Done recursively. (Do we have enough stack?)
31  *  + R-values: Nodes must implement getValue() in some way. Value
32  *    must be valid after evaluate().
33  *  + L-values: Valid writable value access proxy must be returned after
34  *    evaluate().
35  *//*--------------------------------------------------------------------*/
36 
37 #include "rsgDefs.hpp"
38 #include "rsgGeneratorState.hpp"
39 #include "rsgVariableValue.hpp"
40 #include "rsgVariable.hpp"
41 #include "rsgVariableManager.hpp"
42 #include "rsgExecutionContext.hpp"
43 
44 namespace rsg
45 {
46 
47 // \todo [2011-06-10 pyry] Declare in ShaderParameters?
48 const float unusedValueWeight = 0.05f;
49 
50 class Expression
51 {
52 public:
53 	virtual							~Expression			(void);
54 
55 	// Shader generation API
56 	virtual Expression*				createNextChild		(GeneratorState& state) = DE_NULL;
57 	virtual void					tokenize			(GeneratorState& state, TokenStream& str) const	= DE_NULL;
58 
59 	// Execution API
60 	virtual void					evaluate			(ExecutionContext& ctx)	= DE_NULL;
61 	virtual ExecConstValueAccess	getValue			(void) const			= DE_NULL;
getLValue(void) const62 	virtual ExecValueAccess			getLValue			(void) const { DE_ASSERT(DE_FALSE); throw Exception("Expression::getLValue(): not L-value node"); }
63 
64 	static Expression*				createRandom		(GeneratorState& state, ConstValueRangeAccess valueRange);
65 	static Expression*				createRandomLValue	(GeneratorState& state, ConstValueRangeAccess valueRange);
66 };
67 
68 class VariableAccess : public Expression
69 {
70 public:
~VariableAccess(void)71 	virtual						~VariableAccess		(void) {}
72 
createNextChild(GeneratorState & state)73 	Expression*					createNextChild		(GeneratorState& state)							{ DE_UNREF(state); return DE_NULL;						}
tokenize(GeneratorState & state,TokenStream & str) const74 	void						tokenize			(GeneratorState& state, TokenStream& str) const	{ DE_UNREF(state); str << Token(m_variable->getName());	}
75 
76 	void						evaluate			(ExecutionContext& ctx);
getValue(void) const77 	ExecConstValueAccess		getValue			(void) const									{ return m_valueAccess;									}
getLValue(void) const78 	ExecValueAccess				getLValue			(void) const									{ return m_valueAccess;									}
79 
80 protected:
VariableAccess(void)81 								VariableAccess		(void) : m_variable(DE_NULL) {}
82 
83 	const Variable*				m_variable;
84 	ExecValueAccess				m_valueAccess;
85 };
86 
87 class VariableRead : public VariableAccess
88 {
89 public:
90 								VariableRead		(GeneratorState& state, ConstValueRangeAccess valueRange);
91 								VariableRead		(const Variable* variable);
~VariableRead(void)92 	virtual						~VariableRead		(void) {}
93 
94 	static float				getWeight			(const GeneratorState& state, ConstValueRangeAccess valueRange);
95 };
96 
97 class VariableWrite : public VariableAccess
98 {
99 public:
100 								VariableWrite		(GeneratorState& state, ConstValueRangeAccess valueRange);
~VariableWrite(void)101 	virtual						~VariableWrite		(void) {}
102 
103 	static float				getWeight			(const GeneratorState& state, ConstValueRangeAccess valueRange);
104 };
105 
106 class FloatLiteral : public Expression
107 {
108 public:
109 								FloatLiteral		(GeneratorState& state, ConstValueRangeAccess valueRange);
110 								FloatLiteral		(float customValue);
~FloatLiteral(void)111 	virtual						~FloatLiteral		(void) {}
112 
createNextChild(GeneratorState & state)113 	Expression*					createNextChild		(GeneratorState& state) { DE_UNREF(state); return DE_NULL; }
114 	void						tokenize			(GeneratorState& state, TokenStream& str) const;
115 
116 	static float				getWeight			(const GeneratorState& state, ConstValueRangeAccess valueRange);
117 
evaluate(ExecutionContext & ctx)118 	void						evaluate			(ExecutionContext& ctx) { DE_UNREF(ctx); }
getValue(void) const119 	ExecConstValueAccess		getValue			(void) const { return m_value.getValue(VariableType::getScalarType(VariableType::TYPE_FLOAT)); }
120 
121 private:
122 	ExecValueStorage			m_value;
123 };
124 
125 class IntLiteral : public Expression
126 {
127 public:
128 								IntLiteral			(GeneratorState& state, ConstValueRangeAccess valueRange);
~IntLiteral(void)129 	virtual						~IntLiteral			(void) {}
130 
createNextChild(GeneratorState & state)131 	Expression*					createNextChild		(GeneratorState& state) { DE_UNREF(state); return DE_NULL; }
132 	void						tokenize			(GeneratorState& state, TokenStream& str) const;
133 
134 	static float				getWeight			(const GeneratorState& state, ConstValueRangeAccess valueRange);
135 
evaluate(ExecutionContext & ctx)136 	void						evaluate			(ExecutionContext& ctx) { DE_UNREF(ctx); }
getValue(void) const137 	ExecConstValueAccess		getValue			(void) const { return m_value.getValue(VariableType::getScalarType(VariableType::TYPE_INT)); }
138 
139 private:
140 	ExecValueStorage			m_value;
141 };
142 
143 class BoolLiteral : public Expression
144 {
145 public:
146 								BoolLiteral			(GeneratorState& state, ConstValueRangeAccess valueRange);
147 								BoolLiteral			(bool customValue);
~BoolLiteral(void)148 	virtual						~BoolLiteral		(void) {}
149 
createNextChild(GeneratorState & state)150 	Expression*					createNextChild		(GeneratorState& state) { DE_UNREF(state); return DE_NULL; }
151 	void						tokenize			(GeneratorState& state, TokenStream& str) const;
152 
153 	static float				getWeight			(const GeneratorState& state, ConstValueRangeAccess valueRange);
154 
evaluate(ExecutionContext & ctx)155 	void						evaluate			(ExecutionContext& ctx) { DE_UNREF(ctx); }
getValue(void) const156 	ExecConstValueAccess		getValue			(void) const { return m_value.getValue(VariableType::getScalarType(VariableType::TYPE_BOOL)); }
157 
158 private:
159 	ExecValueStorage			m_value;
160 };
161 
162 class ConstructorOp : public Expression
163 {
164 public:
165 								ConstructorOp		(GeneratorState& state, ConstValueRangeAccess valueRange);
166 	virtual						~ConstructorOp		(void);
167 
168 	Expression*					createNextChild		(GeneratorState& state);
169 	void						tokenize			(GeneratorState& state, TokenStream& str) const;
170 
171 	static float				getWeight			(const GeneratorState& state, ConstValueRangeAccess valueRange);
172 
173 	void						evaluate			(ExecutionContext& ctx);
getValue(void) const174 	ExecConstValueAccess		getValue			(void) const { return m_value.getValue(m_valueRange.getType()); }
175 
176 private:
177 	ValueRange					m_valueRange;
178 	ExecValueStorage			m_value;
179 
180 	std::vector<ValueRange>		m_inputValueRanges;
181 	std::vector<Expression*>	m_inputExpressions;
182 };
183 
184 class AssignOp : public Expression
185 {
186 public:
187 								AssignOp			(GeneratorState& state, ConstValueRangeAccess valueRange);
188 	virtual						~AssignOp			(void);
189 
190 	Expression*					createNextChild		(GeneratorState& state);
191 	void						tokenize			(GeneratorState& state, TokenStream& str) const;
192 
193 	static float				getWeight			(const GeneratorState& state, ConstValueRangeAccess valueRange);
194 
195 	// \todo [2011-02-28 pyry] LValue variant of AssignOp
196 //	static float				getLValueWeight		(const GeneratorState& state, ConstValueRangeAccess valueRange);
197 
198 	void						evaluate			(ExecutionContext& ctx);
getValue(void) const199 	ExecConstValueAccess		getValue			(void) const { return m_value.getValue(m_valueRange.getType()); }
200 
201 private:
202 	ValueRange					m_valueRange;
203 	ExecValueStorage			m_value;
204 
205 	Expression*					m_lvalueExpr;
206 	Expression*					m_rvalueExpr;
207 };
208 
209 class ParenOp : public Expression
210 {
211 public:
212 								ParenOp				(GeneratorState& state, ConstValueRangeAccess valueRange);
213 	virtual						~ParenOp			(void);
214 
215 	Expression*					createNextChild		(GeneratorState& state);
216 	void						tokenize			(GeneratorState& state, TokenStream& str) const;
217 
218 	void						setChild			(Expression* expression);
219 	static float				getWeight			(const GeneratorState& state, ConstValueRangeAccess valueRange);
220 
evaluate(ExecutionContext & execCtx)221 	void						evaluate			(ExecutionContext& execCtx)		{ m_child->evaluate(execCtx);	}
getValue(void) const222 	ExecConstValueAccess		getValue			(void) const					{ return m_child->getValue();	}
223 
224 private:
225 	ValueRange					m_valueRange;
226 	Expression*					m_child;
227 };
228 
229 class SwizzleOp : public Expression
230 {
231 public:
232 								SwizzleOp			(GeneratorState& state, ConstValueRangeAccess valueRange);
233 	virtual						~SwizzleOp			(void);
234 
235 	Expression*					createNextChild		(GeneratorState& state);
236 	void						tokenize			(GeneratorState& state, TokenStream& str) const;
237 
238 	static float				getWeight			(const GeneratorState& state, ConstValueRangeAccess valueRange);
239 
240 	void						evaluate			(ExecutionContext& execCtx);
getValue(void) const241 	ExecConstValueAccess		getValue			(void) const					{ return m_value.getValue(m_outValueRange.getType()); }
242 
243 private:
244 	ValueRange					m_outValueRange;
245 	int							m_numInputElements;
246 	deUint8						m_swizzle[4];
247 	Expression*					m_child;
248 	ExecValueStorage			m_value;
249 };
250 
251 class TexLookup : public Expression
252 {
253 public:
254 								TexLookup			(GeneratorState& state, ConstValueRangeAccess valueRange);
255 	virtual						~TexLookup			(void);
256 
257 	Expression*					createNextChild		(GeneratorState& state);
258 	void						tokenize			(GeneratorState& state, TokenStream& str) const;
259 
260 	static float				getWeight			(const GeneratorState& state, ConstValueRangeAccess valueRange);
261 
262 	void						evaluate			(ExecutionContext& execCtx);
getValue(void) const263 	ExecConstValueAccess		getValue			(void) const { return m_value.getValue(m_valueType); }
264 
265 private:
266 	enum Type
267 	{
268 		TYPE_TEXTURE2D,
269 		TYPE_TEXTURE2D_LOD,
270 		TYPE_TEXTURE2D_PROJ,
271 		TYPE_TEXTURE2D_PROJ_LOD,
272 
273 		TYPE_TEXTURECUBE,
274 		TYPE_TEXTURECUBE_LOD,
275 
276 		TYPE_LAST
277 	};
278 
279 	Type						m_type;
280 	const Variable*				m_sampler;
281 	Expression*					m_coordExpr;
282 	Expression*					m_lodBiasExpr;
283 	VariableType				m_valueType;
284 	ExecValueStorage			m_value;
285 };
286 
287 } // rsg
288 
289 #endif // _RSGEXPRESSION_HPP
290