13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 3.0 Module
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * -------------------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Shader operators tests.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es3fShaderOperatorTests.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsShaderRenderCase.hpp"
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluShaderUtil.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuStringTemplate.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuVectorUtil.hpp"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwFunctions.hpp"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp"
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deStringUtil.hpp"
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deInt32.h"
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMemory.h"
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <map>
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <limits>
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace tcu;
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace glu;
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace deqp::gls;
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::map;
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::pair;
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::vector;
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::string;
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::ostringstream;
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles3
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#if defined(abs)
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#	undef abs
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing de::min;
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing de::max;
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing de::clamp;
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// \note VS2013 gets confused without these
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::asinh;
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::acosh;
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::atanh;
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::exp2;
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::log2;
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::trunc;
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float abs		(float v)			{ return deFloatAbs(v); }
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline bool logicalAnd	(bool a, bool b)	{ return (a && b); }
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline bool logicalOr	(bool a, bool b)	{ return (a || b); }
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline bool logicalXor	(bool a, bool b)	{ return (a != b); }
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// \note stdlib.h defines div() that is not compatible with the macros.
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline T div (T a, T b) { return a / b; }
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline T leftShift (T value, int amount) { return value << amount; }
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline deUint32	rightShift (deUint32 value, int amount)		{ return value >> amount; }
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline int		rightShift (int value, int amount)			{ return (value >> amount) | (value >= 0 ? 0 : ~(~0U >> amount)); } // \note Arithmetic shift.
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size> Vector<T, Size> leftShift (const Vector<T, Size>& value, const Vector<int, Size>& amount)
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vector<T, Size> result;
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < Size; i++)
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		result[i] = leftShift(value[i], amount[i]);
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return result;
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size> Vector<T, Size> rightShift (const Vector<T, Size>& value, const Vector<int, Size>& amount)
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vector<T, Size> result;
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < Size; i++)
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		result[i] = rightShift(value[i], amount[i]);
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return result;
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size> Vector<T, Size> leftShiftVecScalar	(const Vector<T, Size>& value, int amount) { return leftShift(value, Vector<int, Size>(amount)); }
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size> Vector<T, Size> rightShiftVecScalar	(const Vector<T, Size>& value, int amount) { return rightShift(value, Vector<int, Size>(amount)); }
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size>
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<T, Size> minVecScalar (const Vector<T, Size>& v, T s)
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vector<T, Size> res;
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < Size; i++)
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		res[i] = min(v[i], s);
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return res;
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size>
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<T, Size> maxVecScalar (const Vector<T, Size>& v, T s)
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vector<T, Size> res;
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < Size; i++)
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		res[i] = max(v[i], s);
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return res;
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size>
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<T, Size> clampVecScalarScalar (const Vector<T, Size>& v, T s0, T s1)
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vector<T, Size> res;
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < Size; i++)
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		res[i] = clamp(v[i], s0, s1);
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return res;
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size>
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<T, Size> mixVecVecScalar (const Vector<T, Size>& v0, const Vector<T, Size>& v1, T s)
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vector<T, Size> res;
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < Size; i++)
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		res[i] = mix(v0[i], v1[i], s);
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return res;
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size>
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<T, Size> stepScalarVec (T s, const Vector<T, Size>& v)
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vector<T, Size> res;
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < Size; i++)
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		res[i] = step(s, v[i]);
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return res;
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size>
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vector<T, Size> smoothStepScalarScalarVec (T s0, T s1, const Vector<T, Size>& v)
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vector<T, Size> res;
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < Size; i++)
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		res[i] = smoothStep(s0, s1, v[i]);
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return res;
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float	addOne (float v)	{ return v + 1.0f; };
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float	subOne (float v)	{ return v - 1.0f; };
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline int		addOne (int v)		{ return v + 1; };
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline int		subOne (int v)		{ return v - 1; };
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline deUint32	addOne (deUint32 v)	{ return v + 1; };
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline deUint32	subOne (deUint32 v)	{ return v - 1; };
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<int Size> inline Vector<float, Size>		addOne (const Vector<float, Size>& v)		{ return v + 1.0f; };
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<int Size> inline Vector<float, Size>		subOne (const Vector<float, Size>& v)		{ return v - 1.0f; };
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<int Size> inline Vector<int, Size>			addOne (const Vector<int, Size>& v)			{ return v + 1; };
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<int Size> inline Vector<int, Size>			subOne (const Vector<int, Size>& v)			{ return v - 1; };
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<int Size> inline Vector<deUint32, Size>	addOne (const Vector<deUint32, Size>& v)	{ return v + 1U; };
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<int Size> inline Vector<deUint32, Size>	subOne (const Vector<deUint32, Size>& v)	{ return (v.asInt() - 1).asUint(); };
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline T selection	(bool cond, T a, T b)	{ return cond ? a : b; };
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Vec-scalar and scalar-vec binary operators.
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// \note This one is done separately due to how the overloaded minus operator is implemented for vector-scalar operands.
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<int Size>				inline Vector<deUint32, Size>	subVecScalar			(const Vector<deUint32, Size>& v, deUint32 s)	{ return (v.asInt() - (int)s).asUint(); };
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size>	inline Vector<T, Size>			addVecScalar			(const Vector<T, Size>& v, T s)					{ return v + s; };
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size>	inline Vector<T, Size>			subVecScalar			(const Vector<T, Size>& v, T s)					{ return v - s; };
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size>	inline Vector<T, Size>			mulVecScalar			(const Vector<T, Size>& v, T s)					{ return v * s; };
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size>	inline Vector<T, Size>			divVecScalar			(const Vector<T, Size>& v, T s)					{ return v / s; };
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size>	inline Vector<T, Size>			modVecScalar			(const Vector<T, Size>& v, T s)					{ return mod(v, Vector<T, Size>(s)); };
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size>	inline Vector<T, Size>			bitwiseAndVecScalar		(const Vector<T, Size>& v, T s)					{ return bitwiseAnd(v, Vector<T, Size>(s)); };
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size>	inline Vector<T, Size>			bitwiseOrVecScalar		(const Vector<T, Size>& v, T s)					{ return bitwiseOr(v, Vector<T, Size>(s)); };
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size>	inline Vector<T, Size>			bitwiseXorVecScalar		(const Vector<T, Size>& v, T s)					{ return bitwiseXor(v, Vector<T, Size>(s)); };
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size> inline Vector<T, Size>			addScalarVec			(T s, const Vector<T, Size>& v) 				{ return s + v; };
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size> inline Vector<T, Size>			subScalarVec			(T s, const Vector<T, Size>& v) 				{ return s - v; };
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size> inline Vector<T, Size>			mulScalarVec			(T s, const Vector<T, Size>& v) 				{ return s * v; };
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size> inline Vector<T, Size>			divScalarVec			(T s, const Vector<T, Size>& v) 				{ return s / v; };
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size> inline Vector<T, Size>			modScalarVec			(T s, const Vector<T, Size>& v)					{ return mod(Vector<T, Size>(s), v); };
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size> inline Vector<T, Size>			bitwiseAndScalarVec		(T s, const Vector<T, Size>& v)					{ return bitwiseAnd(Vector<T, Size>(s), v); };
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size> inline Vector<T, Size>			bitwiseOrScalarVec		(T s, const Vector<T, Size>& v)					{ return bitwiseOr(Vector<T, Size>(s), v); };
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T, int Size> inline Vector<T, Size>			bitwiseXorScalarVec		(T s, const Vector<T, Size>& v)					{ return bitwiseXor(Vector<T, Size>(s), v); };
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Reference functions for specific sequence operations for the sequence operator tests.
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Reference for expression "in0, in2 + in1, in1 + in0"
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4		sequenceNoSideEffCase0 (const Vec4& in0, const Vec4& in1, const Vec4& in2)		{ DE_UNREF(in2); return in1 + in0; }
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Reference for expression "in0, in2 + in1, in1 + in0"
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline deUint32	sequenceNoSideEffCase1 (float in0, deUint32 in1, float in2)						{ DE_UNREF(in0); DE_UNREF(in2); return in1 + in1; }
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Reference for expression "in0 && in1, in0, ivec2(vec2(in0) + in2)"
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline IVec2	sequenceNoSideEffCase2 (bool in0, bool in1, const Vec2& in2)					{ DE_UNREF(in1); return IVec2((int)((float)in0 + in2.x()), (int)((float)in0 + in2.y())); }
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Reference for expression "in0 + vec4(in1), in2, in1"
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline IVec4	sequenceNoSideEffCase3 (const Vec4& in0, const IVec4& in1, const BVec4& in2)	{ DE_UNREF(in0); DE_UNREF(in2); return in1; }
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Reference for expression "in0++, in1 = in0 + in2, in2 = in1"
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4		sequenceSideEffCase0 (const Vec4& in0, const Vec4& in1, const Vec4& in2)		{ DE_UNREF(in1); return in0 + 1.0f + in2; }
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Reference for expression "in1++, in0 = float(in1), in1 = uint(in0 + in2)"
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline deUint32	sequenceSideEffCase1 (float in0, deUint32 in1, float in2)						{ DE_UNREF(in0); return (deUint32)(in1 + 1.0f + in2); }
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Reference for expression "in1 = in0, in2++, in2 = in2 + vec2(in1), ivec2(in2)"
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline IVec2	sequenceSideEffCase2 (bool in0, bool in1, const Vec2& in2)						{ DE_UNREF(in1); return (in2 + Vec2(1.0f) + Vec2((float)in0)).asInt(); }
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Reference for expression "in0 = in0 + vec4(in2), in1 = in1 + ivec4(in0), in1++"
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline IVec4	sequenceSideEffCase3 (const Vec4& in0, const IVec4& in1, const BVec4& in2)		{ return in1 + (in0 + Vec4((float)in2.x(), (float)in2.y(), (float)in2.z(), (float)in2.w())).asInt(); }
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// ShaderEvalFunc-type wrappers for the above functions.
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid evalSequenceNoSideEffCase0	(ShaderEvalContext& ctx) { ctx.color		= sequenceNoSideEffCase0		(ctx.in[0].swizzle(1, 2, 3, 0),	ctx.in[1].swizzle(3, 2, 1, 0),			ctx.in[2].swizzle(0, 3, 2, 1)); }
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid evalSequenceNoSideEffCase1	(ShaderEvalContext& ctx) { ctx.color.x()	= (float)sequenceNoSideEffCase1	(ctx.in[0].z(),					(deUint32)ctx.in[1].x(),				ctx.in[2].y()); }
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid evalSequenceNoSideEffCase2	(ShaderEvalContext& ctx) { ctx.color.yz()	= sequenceNoSideEffCase2		(ctx.in[0].z() > 0.0f,			ctx.in[1].x() > 0.0f,					ctx.in[2].swizzle(2, 1)).asFloat(); }
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid evalSequenceNoSideEffCase3	(ShaderEvalContext& ctx) { ctx.color		= sequenceNoSideEffCase3		(ctx.in[0].swizzle(1, 2, 3, 0),	ctx.in[1].swizzle(3, 2, 1, 0).asInt(),	greaterThan(ctx.in[2].swizzle(0, 3, 2, 1), Vec4(0.0f, 0.0f, 0.0f, 0.0f))).asFloat(); }
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid evalSequenceSideEffCase0	(ShaderEvalContext& ctx) { ctx.color		= sequenceSideEffCase0			(ctx.in[0].swizzle(1, 2, 3, 0),	ctx.in[1].swizzle(3, 2, 1, 0),			ctx.in[2].swizzle(0, 3, 2, 1)); }
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid evalSequenceSideEffCase1	(ShaderEvalContext& ctx) { ctx.color.x()	= (float)sequenceSideEffCase1	(ctx.in[0].z(),					(deUint32)ctx.in[1].x(),				ctx.in[2].y()); }
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid evalSequenceSideEffCase2	(ShaderEvalContext& ctx) { ctx.color.yz()	= sequenceSideEffCase2			(ctx.in[0].z() > 0.0f,			ctx.in[1].x() > 0.0f,					ctx.in[2].swizzle(2, 1)).asFloat(); }
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid evalSequenceSideEffCase3	(ShaderEvalContext& ctx) { ctx.color		= sequenceSideEffCase3			(ctx.in[0].swizzle(1, 2, 3, 0),	ctx.in[1].swizzle(3, 2, 1, 0).asInt(),	greaterThan(ctx.in[2].swizzle(0, 3, 2, 1), Vec4(0.0f, 0.0f, 0.0f, 0.0f))).asFloat(); }
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic string stringJoin (const vector<string>& elems, const string& delim)
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	string result;
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < (int)elems.size(); i++)
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		result += (i > 0 ? delim : "") + elems[i];
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return result;
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic string twoValuedVec4 (const string& first, const string& second, const BVec4& firstMask)
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<string> elems(4);
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < 4; i++)
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elems[i] = firstMask[i] ? first : second;
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return "vec4(" + stringJoin(elems, ", ") + ")";
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	MAX_INPUTS = 3
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum PrecisionMask
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	PRECMASK_NA				= 0,						//!< Precision not applicable (booleans)
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	PRECMASK_LOWP			= (1<<PRECISION_LOWP),
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	PRECMASK_MEDIUMP		= (1<<PRECISION_MEDIUMP),
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	PRECMASK_HIGHP			= (1<<PRECISION_HIGHP),
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	PRECMASK_LOWP_MEDIUMP	= PRECMASK_LOWP | PRECMASK_MEDIUMP,
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	PRECMASK_MEDIUMP_HIGHP	= PRECMASK_MEDIUMP | PRECMASK_HIGHP,
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	PRECMASK_ALL			= PRECMASK_LOWP | PRECMASK_MEDIUMP | PRECMASK_HIGHP
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum ValueType
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VALUE_NONE			= 0,
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VALUE_FLOAT			= (1<<0),	// float scalar
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VALUE_FLOAT_VEC		= (1<<1),	// float vector
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VALUE_FLOAT_GENTYPE	= (1<<2),	// float scalar/vector
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VALUE_VEC3			= (1<<3),	// vec3 only
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VALUE_MATRIX		= (1<<4),	// matrix
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VALUE_BOOL			= (1<<5),	// boolean scalar
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VALUE_BOOL_VEC		= (1<<6),	// boolean vector
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VALUE_BOOL_GENTYPE	= (1<<7),	// boolean scalar/vector
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VALUE_INT			= (1<<8),	// int scalar
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VALUE_INT_VEC		= (1<<9),	// int vector
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VALUE_INT_GENTYPE	= (1<<10),	// int scalar/vector
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VALUE_UINT			= (1<<11),	// uint scalar
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VALUE_UINT_VEC		= (1<<12),	// uint vector
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VALUE_UINT_GENTYPE	= (1<<13),	// uint scalar/vector
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Shorthands.
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	F				= VALUE_FLOAT,
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FV				= VALUE_FLOAT_VEC,
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GT				= VALUE_FLOAT_GENTYPE,
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	V3				= VALUE_VEC3,
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	M				= VALUE_MATRIX,
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	B				= VALUE_BOOL,
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BV				= VALUE_BOOL_VEC,
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BGT				= VALUE_BOOL_GENTYPE,
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	I				= VALUE_INT,
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	IV				= VALUE_INT_VEC,
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	IGT				= VALUE_INT_GENTYPE,
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	U				= VALUE_UINT,
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UV				= VALUE_UINT_VEC,
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UGT				= VALUE_UINT_GENTYPE
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline bool isScalarType (ValueType type)
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return type == VALUE_FLOAT || type == VALUE_BOOL || type == VALUE_INT || type == VALUE_UINT;
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline bool isFloatType (ValueType type)
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return (type & (VALUE_FLOAT | VALUE_FLOAT_VEC | VALUE_FLOAT_GENTYPE)) != 0;
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline bool isIntType (ValueType type)
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return (type & (VALUE_INT | VALUE_INT_VEC | VALUE_INT_GENTYPE)) != 0;
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline bool isUintType (ValueType type)
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return (type & (VALUE_UINT | VALUE_UINT_VEC | VALUE_UINT_GENTYPE)) != 0;
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline bool isBoolType (ValueType type)
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return (type & (VALUE_BOOL | VALUE_BOOL_VEC | VALUE_BOOL_GENTYPE)) != 0;
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline float getGLSLUintMaxAsFloat (const glw::Functions& gl, ShaderType shaderType, Precision uintPrecision)
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 intPrecisionGL;
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 shaderTypeGL;
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (uintPrecision)
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case PRECISION_LOWP:		intPrecisionGL = GL_LOW_INT;		break;
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case PRECISION_MEDIUMP:		intPrecisionGL = GL_MEDIUM_INT;		break;
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case PRECISION_HIGHP:		intPrecisionGL = GL_HIGH_INT;		break;
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(false);
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			intPrecisionGL = 0;
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (shaderType)
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case SHADERTYPE_VERTEX:		shaderTypeGL = GL_VERTEX_SHADER;	break;
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case SHADERTYPE_FRAGMENT:	shaderTypeGL = GL_FRAGMENT_SHADER;	break;
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(false);
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			shaderTypeGL = 0;
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glw::GLint range[2]		= { -1, -1 };
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glw::GLint precision	= -1;
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	gl.getShaderPrecisionFormat(shaderTypeGL, intPrecisionGL, &range[0], &precision);
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderPrecisionFormat failed");
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TCU_CHECK(de::inBounds(range[0], 8, 32));
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const int numBitsInType = range[0] + 1;
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return (float)((1ull << numBitsInType) - 1);
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Float scalar that can be either constant or a symbol that can be evaluated later.
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass FloatScalar
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum Symbol
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SYMBOL_LOWP_UINT_MAX = 0,
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SYMBOL_MEDIUMP_UINT_MAX,
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SYMBOL_LOWP_UINT_MAX_RECIPROCAL,
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SYMBOL_MEDIUMP_UINT_MAX_RECIPROCAL,
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SYMBOL_ONE_MINUS_UINT32MAX_DIV_LOWP_UINT_MAX,
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SYMBOL_ONE_MINUS_UINT32MAX_DIV_MEDIUMP_UINT_MAX,
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SYMBOL_LAST
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar (float c)	: m_isConstant(true),	m_value(c) {}
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar (Symbol s)	: m_isConstant(false),	m_value(s) {}
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float getValue (const glw::Functions& gl, ShaderType shaderType) const
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_isConstant)
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return m_value.constant;
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			switch (m_value.symbol)
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case SYMBOL_LOWP_UINT_MAX:								return getGLSLUintMaxAsFloat(gl, shaderType, PRECISION_LOWP);
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case SYMBOL_MEDIUMP_UINT_MAX:							return getGLSLUintMaxAsFloat(gl, shaderType, PRECISION_MEDIUMP);
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case SYMBOL_LOWP_UINT_MAX_RECIPROCAL:					return 1.0f / getGLSLUintMaxAsFloat(gl, shaderType, PRECISION_LOWP);
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case SYMBOL_MEDIUMP_UINT_MAX_RECIPROCAL:				return 1.0f / getGLSLUintMaxAsFloat(gl, shaderType, PRECISION_MEDIUMP);
3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case SYMBOL_ONE_MINUS_UINT32MAX_DIV_LOWP_UINT_MAX:		return 1.0f - (float)std::numeric_limits<deUint32>::max() / getGLSLUintMaxAsFloat(gl, shaderType, PRECISION_LOWP);
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case SYMBOL_ONE_MINUS_UINT32MAX_DIV_MEDIUMP_UINT_MAX:	return 1.0f - (float)std::numeric_limits<deUint32>::max() / getGLSLUintMaxAsFloat(gl, shaderType, PRECISION_MEDIUMP);
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				default:
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					DE_ASSERT(false);
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					return 0.0f;
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool m_isConstant;
4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	union ConstantOrSymbol
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		float	constant;
4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Symbol	symbol;
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ConstantOrSymbol (float c)	: constant	(c) {}
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ConstantOrSymbol (Symbol s)	: symbol	(s) {}
4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} m_value;
4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct Value
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Value (ValueType valueType_, const FloatScalar& rangeMin_, const FloatScalar& rangeMax_)
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: valueType	(valueType_)
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, rangeMin	(rangeMin_)
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, rangeMax	(rangeMax_)
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ValueType		valueType;
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar		rangeMin;
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar		rangeMax;
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum OperationType
4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FUNCTION = 0,
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	OPERATOR,
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	SIDE_EFFECT_OPERATOR // Test the side-effect (as opposed to the result) of a side-effect operator.
4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct BuiltinFuncInfo
4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BuiltinFuncInfo (const char* caseName_, const char* shaderFuncName_, ValueType outValue_,
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					 Value input0_, Value input1_, Value input2_,
4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					 const FloatScalar& resultScale_, const FloatScalar& resultBias_,
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					 deUint32 precisionMask_,
4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					 ShaderEvalFunc evalFuncScalar_, ShaderEvalFunc evalFuncVec2_, ShaderEvalFunc evalFuncVec3_, ShaderEvalFunc evalFuncVec4_,
4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					 OperationType type_=FUNCTION, bool isUnaryPrefix_=true)
4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: caseName			(caseName_)
4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, shaderFuncName	(shaderFuncName_)
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, outValue			(outValue_)
4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, input0			(input0_)
4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, input1			(input1_)
4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, input2			(input2_)
4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, resultScale		(resultScale_)
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, resultBias		(resultBias_)
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, referenceScale	(resultScale_)
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, referenceBias		(resultBias_)
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, precisionMask		(precisionMask_)
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, evalFuncScalar	(evalFuncScalar_)
4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, evalFuncVec2		(evalFuncVec2_)
4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, evalFuncVec3		(evalFuncVec3_)
4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, evalFuncVec4		(evalFuncVec4_)
4593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, type				(type_)
4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, isUnaryPrefix		(isUnaryPrefix_)
4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BuiltinFuncInfo (const char* caseName_, const char* shaderFuncName_, ValueType outValue_,
4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					 Value input0_, Value input1_, Value input2_,
4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					 const FloatScalar& resultScale_, const FloatScalar& resultBias_, const FloatScalar& referenceScale_, const FloatScalar& referenceBias_,
4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					 deUint32 precisionMask_,
4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					 ShaderEvalFunc evalFuncScalar_, ShaderEvalFunc evalFuncVec2_, ShaderEvalFunc evalFuncVec3_, ShaderEvalFunc evalFuncVec4_,
4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					 OperationType type_=FUNCTION, bool isUnaryPrefix_=true)
4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: caseName			(caseName_)
4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, shaderFuncName	(shaderFuncName_)
4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, outValue			(outValue_)
4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, input0			(input0_)
4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, input1			(input1_)
4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, input2			(input2_)
4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, resultScale		(resultScale_)
4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, resultBias		(resultBias_)
4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, referenceScale	(referenceScale_)
4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, referenceBias		(referenceBias_)
4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, precisionMask		(precisionMask_)
4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, evalFuncScalar	(evalFuncScalar_)
4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, evalFuncVec2		(evalFuncVec2_)
4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, evalFuncVec3		(evalFuncVec3_)
4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, evalFuncVec4		(evalFuncVec4_)
4853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, type				(type_)
4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, isUnaryPrefix		(isUnaryPrefix_)
4873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char*		caseName;			//!< Name of case.
4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char*		shaderFuncName;		//!< Name in shading language.
4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ValueType		outValue;
4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Value			input0;
4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Value			input1;
4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Value			input2;
4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar		resultScale;
4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar		resultBias;
4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar		referenceScale;
4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar		referenceBias;
5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32		precisionMask;
5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ShaderEvalFunc	evalFuncScalar;
5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ShaderEvalFunc	evalFuncVec2;
5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ShaderEvalFunc	evalFuncVec3;
5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ShaderEvalFunc	evalFuncVec4;
5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	OperationType	type;
5063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool			isUnaryPrefix;		//!< Whether a unary operator is a prefix operator; redundant unless unary.
5073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
5083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5093c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline BuiltinFuncInfo BuiltinOperInfo (const char* caseName_, const char* shaderFuncName_, ValueType outValue_, Value input0_, Value input1_, Value input2_, const FloatScalar& resultScale_, const FloatScalar& resultBias_, deUint32 precisionMask_, ShaderEvalFunc evalFuncScalar_, ShaderEvalFunc evalFuncVec2_, ShaderEvalFunc evalFuncVec3_, ShaderEvalFunc evalFuncVec4_)
5103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return BuiltinFuncInfo(caseName_, shaderFuncName_, outValue_, input0_, input1_, input2_, resultScale_, resultBias_, resultScale_, resultBias_, precisionMask_, evalFuncScalar_, evalFuncVec2_, evalFuncVec3_, evalFuncVec4_, OPERATOR);
5123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline BuiltinFuncInfo BuiltinOperInfoSeparateRefScaleBias (const char* caseName_, const char* shaderFuncName_, ValueType outValue_, Value input0_, Value input1_, Value input2_, const FloatScalar& resultScale_, const FloatScalar& resultBias_, deUint32 precisionMask_, ShaderEvalFunc evalFuncScalar_, ShaderEvalFunc evalFuncVec2_, ShaderEvalFunc evalFuncVec3_, ShaderEvalFunc evalFuncVec4_, const FloatScalar& referenceScale_, const FloatScalar& referenceBias_)
5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return BuiltinFuncInfo(caseName_, shaderFuncName_, outValue_, input0_, input1_, input2_, resultScale_, resultBias_, referenceScale_, referenceBias_, precisionMask_, evalFuncScalar_, evalFuncVec2_, evalFuncVec3_, evalFuncVec4_, OPERATOR);
5173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// For postfix (unary) operators.
5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline BuiltinFuncInfo BuiltinPostOperInfo (const char* caseName_, const char* shaderFuncName_, ValueType outValue_, Value input0_, Value input1_, Value input2_, const FloatScalar& resultScale_, const FloatScalar& resultBias_, deUint32 precisionMask_, ShaderEvalFunc evalFuncScalar_, ShaderEvalFunc evalFuncVec2_, ShaderEvalFunc evalFuncVec3_, ShaderEvalFunc evalFuncVec4_)
5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return BuiltinFuncInfo(caseName_, shaderFuncName_, outValue_, input0_, input1_, input2_, resultScale_, resultBias_, resultScale_, resultBias_, precisionMask_, evalFuncScalar_, evalFuncVec2_, evalFuncVec3_, evalFuncVec4_, OPERATOR, false);
5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline BuiltinFuncInfo BuiltinSideEffOperInfo (const char* caseName_, const char* shaderFuncName_, ValueType outValue_, Value input0_, Value input1_, Value input2_, const FloatScalar& resultScale_, const FloatScalar& resultBias_, deUint32 precisionMask_, ShaderEvalFunc evalFuncScalar_, ShaderEvalFunc evalFuncVec2_, ShaderEvalFunc evalFuncVec3_, ShaderEvalFunc evalFuncVec4_)
5263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return BuiltinFuncInfo(caseName_, shaderFuncName_, outValue_, input0_, input1_, input2_, resultScale_, resultBias_, resultScale_, resultBias_, precisionMask_, evalFuncScalar_, evalFuncVec2_, evalFuncVec3_, evalFuncVec4_, SIDE_EFFECT_OPERATOR);
5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// For postfix (unary) operators, testing side-effect.
5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline BuiltinFuncInfo BuiltinPostSideEffOperInfo (const char* caseName_, const char* shaderFuncName_, ValueType outValue_, Value input0_, Value input1_, Value input2_, const FloatScalar& resultScale_, const FloatScalar& resultBias_, deUint32 precisionMask_, ShaderEvalFunc evalFuncScalar_, ShaderEvalFunc evalFuncVec2_, ShaderEvalFunc evalFuncVec3_, ShaderEvalFunc evalFuncVec4_)
5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return BuiltinFuncInfo(caseName_, shaderFuncName_, outValue_, input0_, input1_, input2_, resultScale_, resultBias_, resultScale_, resultBias_, precisionMask_, evalFuncScalar_, evalFuncVec2_, evalFuncVec3_, evalFuncVec4_, SIDE_EFFECT_OPERATOR, false);
5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// BuiltinFuncGroup
5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct BuiltinFuncGroup
5393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						BuiltinFuncGroup	(const char* name_, const char* description_) : name(name_), description(description_) {}
5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BuiltinFuncGroup&	operator<<			(const BuiltinFuncInfo& info) { funcInfos.push_back(info); return *this; }
5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char*						name;
5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char*						description;
5453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<BuiltinFuncInfo>	funcInfos;
5463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5483c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const char* s_inSwizzles[MAX_INPUTS][4] =
5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{ "z", "wy", "zxy", "yzwx" },
5513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{ "x", "yx", "yzx", "wzyx" },
5523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{ "y", "zy", "wyz", "xwzy" }
5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5553c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const char* s_outSwizzles[]	= { "x", "yz", "xyz", "xyzw" };
5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const BVec4 s_outSwizzleChannelMasks[] =
5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BVec4(true,  false, false, false),
5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BVec4(false, true,  true,  false),
5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BVec4(true,  true,  true,  false),
5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BVec4(true,  true,  true,  true )
5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// OperatorShaderEvaluator
5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5673c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass OperatorShaderEvaluator : public ShaderEvaluator
5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	OperatorShaderEvaluator (const glw::Functions& gl, ShaderType shaderType, ShaderEvalFunc evalFunc, const FloatScalar& scale, const FloatScalar& bias, int resultScalarSize)
5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: m_gl							(gl)
5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_shaderType					(shaderType)
5733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_evalFunc					(evalFunc)
5743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_scale						(scale)
5753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_bias						(bias)
5763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_resultScalarSize			(resultScalarSize)
5773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_areScaleAndBiasEvaluated	(false)
5783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_evaluatedScale				(-1.0f)
5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, m_evaluatedBias				(-1.0f)
5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(de::inRange(resultScalarSize, 1, 4));
5823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual ~OperatorShaderEvaluator (void)
5853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void evaluate (ShaderEvalContext& ctx)
5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_evalFunc(ctx);
5913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (!m_areScaleAndBiasEvaluated)
5933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_evaluatedScale	= m_scale.getValue(m_gl, m_shaderType);
5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_evaluatedBias		= m_bias.getValue(m_gl, m_shaderType);
5963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_areScaleAndBiasEvaluated = true;
5973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
5983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int i = 0; i < 4; i++)
6003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (s_outSwizzleChannelMasks[m_resultScalarSize-1][i])
6013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				ctx.color[i] = ctx.color[i] * m_evaluatedScale + m_evaluatedBias;
6023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
6053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const glw::Functions&	m_gl;
6063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ShaderType				m_shaderType;
6073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ShaderEvalFunc			m_evalFunc;
6083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar				m_scale;
6093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar				m_bias;
6103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						m_resultScalarSize;
6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool					m_areScaleAndBiasEvaluated;
6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float					m_evaluatedScale;
6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float					m_evaluatedBias;
6153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
6163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Concrete value.
6183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct ShaderValue
6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ShaderValue (DataType type_, const FloatScalar& rangeMin_, const FloatScalar& rangeMax_)
6223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: type		(type_)
6233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, rangeMin	(rangeMin_)
6243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, rangeMax	(rangeMax_)
6253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ShaderValue (void)
6293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: type		(TYPE_LAST)
6303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, rangeMin	(0.0f)
6313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, rangeMax	(0.0f)
6323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DataType		type;
6363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar		rangeMin;
6373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar		rangeMax;
6383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
6393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6403c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct ShaderDataSpec
6413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ShaderDataSpec (void)
6433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: resultScale		(1.0f)
6443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, resultBias		(0.0f)
6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, referenceScale	(1.0f)
6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, referenceBias		(0.0f)
6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, precision			(PRECISION_LAST)
6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, output			(TYPE_LAST)
6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, numInputs			(0)
6503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar		resultScale;
6543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar		resultBias;
6553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar		referenceScale;
6563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar		referenceBias;
6573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Precision		precision;
6583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DataType		output;
6593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int				numInputs;
6603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ShaderValue		inputs[MAX_INPUTS];
6613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
6623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// ShaderOperatorCase
6643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6653c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ShaderOperatorCase : public ShaderRenderCase
6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6673c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								ShaderOperatorCase		(Context& context, const char* caseName, const char* description, bool isVertexCase, ShaderEvalFunc evalFunc, const string& shaderOp, const ShaderDataSpec& spec);
6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual						~ShaderOperatorCase		(void);
6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6713c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
6723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void						setupShaderData			(void);
6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6743c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
6753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								ShaderOperatorCase		(const ShaderOperatorCase&);	// not allowed!
6763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ShaderOperatorCase&			operator=				(const ShaderOperatorCase&);	// not allowed!
6773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ShaderDataSpec				m_spec;
6793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	string						m_shaderOp;
6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	OperatorShaderEvaluator		m_evaluator;
6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
6823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6833c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderOperatorCase::ShaderOperatorCase (Context& context, const char* caseName, const char* description, bool isVertexCase, ShaderEvalFunc evalFunc, const string& shaderOp, const ShaderDataSpec& spec)
6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: ShaderRenderCase	(context.getTestContext(), context.getRenderContext(), context.getContextInfo(), caseName, description, isVertexCase, m_evaluator)
6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_spec			(spec)
6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_shaderOp		(shaderOp)
6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_evaluator		(m_renderCtx.getFunctions(), isVertexCase ? SHADERTYPE_VERTEX : SHADERTYPE_FRAGMENT, evalFunc, spec.referenceScale, spec.referenceBias, getDataTypeScalarSize(spec.output))
6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ShaderOperatorCase::setupShaderData (void)
6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ShaderType		shaderType	= m_isVertexCase ? SHADERTYPE_VERTEX : SHADERTYPE_FRAGMENT;
6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char*		precision	= m_spec.precision != PRECISION_LAST ? getPrecisionName(m_spec.precision) : DE_NULL;
6953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char*		inputPrecision[MAX_INPUTS];
6963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ostringstream	vtx;
6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ostringstream	frag;
6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ostringstream&	op			= m_isVertexCase ? vtx : frag;
7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vtx << "#version 300 es\n";
7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	frag << "#version 300 es\n";
7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Compute precision for inputs.
7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < m_spec.numInputs; i++)
7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool		isBoolVal	= de::inRange<int>(m_spec.inputs[i].type, TYPE_BOOL, TYPE_BOOL_VEC4);
7083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool		isIntVal	= de::inRange<int>(m_spec.inputs[i].type, TYPE_INT, TYPE_INT_VEC4);
7093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool		isUintVal	= de::inRange<int>(m_spec.inputs[i].type, TYPE_UINT, TYPE_UINT_VEC4);
7103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// \note Mediump interpolators are used for booleans, and highp for integers.
7113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Precision	prec		= isBoolVal	? PRECISION_MEDIUMP
7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								: isIntVal || isUintVal ? PRECISION_HIGHP
7133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								: m_spec.precision;
7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inputPrecision[i] = getPrecisionName(prec);
7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Attributes.
7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vtx << "in highp vec4 a_position;\n";
7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < m_spec.numInputs; i++)
7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		vtx << "in " << inputPrecision[i] << " vec4 a_in" << i << ";\n";
7213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Color output.
7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	frag << "layout(location = 0) out mediump vec4 o_color;\n";
7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_isVertexCase)
7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		vtx << "out mediump vec4 v_color;\n";
7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		frag << "in mediump vec4 v_color;\n";
7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int i = 0; i < m_spec.numInputs; i++)
7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			vtx << "out " << inputPrecision[i] << " vec4 v_in" << i << ";\n";
7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			frag << "in " << inputPrecision[i] << " vec4 v_in" << i << ";\n";
7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vtx << "\n";
7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vtx << "void main()\n";
7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vtx << "{\n";
7423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vtx << "	gl_Position = a_position;\n";
7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	frag << "\n";
7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	frag << "void main()\n";
7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	frag << "{\n";
7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Expression inputs.
7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	string prefix = m_isVertexCase ? "a_" : "v_";
7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < m_spec.numInputs; i++)
7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DataType		inType		= m_spec.inputs[i].type;
7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int				inSize		= getDataTypeScalarSize(inType);
7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool			isInt		= de::inRange<int>(inType, TYPE_INT, TYPE_INT_VEC4);
7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool			isUint		= de::inRange<int>(inType, TYPE_UINT, TYPE_UINT_VEC4);
7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool			isBool		= de::inRange<int>(inType, TYPE_BOOL, TYPE_BOOL_VEC4);
7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*		typeName	= getDataTypeName(inType);
7583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*		swizzle		= s_inSwizzles[i][inSize-1];
7593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		op << "\t";
7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (precision && !isBool) op << precision << " ";
7623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		op << typeName << " in" << i << " = ";
7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (isBool)
7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (inSize == 1)	op << "(";
7683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else				op << "greaterThan(";
7693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
7703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (isInt || isUint)
7713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			op << typeName << "(";
7723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		op << prefix << "in" << i << "." << swizzle;
7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (isBool)
7763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (inSize == 1)	op << " > 0.0)";
7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else				op << ", vec" << inSize << "(0.0))";
7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (isInt || isUint)
7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			op << ")";
7823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		op << ";\n";
7843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Result variable.
7873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* outTypeName = getDataTypeName(m_spec.output);
7893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool		isBoolOut	= de::inRange<int>(m_spec.output, TYPE_BOOL, TYPE_BOOL_VEC4);
7903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		op << "\t";
7923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (precision && !isBoolOut) op << precision << " ";
7933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		op << outTypeName << " res = " << outTypeName << "(0.0);\n\n";
7943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Expression.
7973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	op << "\t" << m_shaderOp << "\n\n";
7983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Convert to color.
8003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool	isResFloatVec	= de::inRange<int>(m_spec.output, TYPE_FLOAT, TYPE_FLOAT_VEC4);
8013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int		outScalarSize	= getDataTypeScalarSize(m_spec.output);
8023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	op << "\thighp vec4 color = vec4(0.0, 0.0, 0.0, 1.0);\n";
8043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	op << "\tcolor." << s_outSwizzles[outScalarSize-1] << " = ";
8053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!isResFloatVec && outScalarSize == 1)
8073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		op << "float(res)";
8083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (!isResFloatVec)
8093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		op << "vec" << outScalarSize << "(res)";
8103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
8113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		op << "res";
8123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	op << ";\n";
8143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Scale & bias.
8163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float	resultScale		= m_spec.resultScale.getValue(m_renderCtx.getFunctions(), shaderType);
8173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float	resultBias		= m_spec.resultBias.getValue(m_renderCtx.getFunctions(), shaderType);
8183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if ((resultScale != 1.0f) || (resultBias != 0.0f))
8193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		op << "\tcolor = color";
8213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (resultScale != 1.0f) op << " * " << twoValuedVec4(de::toString(resultScale),		"1.0", s_outSwizzleChannelMasks[outScalarSize-1]);
8223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (resultBias != 0.0f)  op << " + " << twoValuedVec4(de::floatToString(resultBias, 2),	"0.0", s_outSwizzleChannelMasks[outScalarSize-1]);
8233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		op << ";\n";
8243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// ..
8273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_isVertexCase)
8283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		vtx << "	v_color = color;\n";
8303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		frag << "	o_color = v_color;\n";
8313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
8333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int i = 0; i < m_spec.numInputs; i++)
8353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		vtx << "	v_in" << i << " = a_in" << i << ";\n";
8363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		frag << "	o_color = color;\n";
8373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vtx << "}\n";
8403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	frag << "}\n";
8413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_vertShaderSource = vtx.str();
8433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_fragShaderSource = frag.str();
8443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Setup the user attributes.
8463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_userAttribTransforms.resize(m_spec.numInputs);
8473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int inputNdx = 0; inputNdx < m_spec.numInputs; inputNdx++)
8483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const ShaderValue& v = m_spec.inputs[inputNdx];
8503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(v.type != TYPE_LAST);
8513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		float rangeMin	= v.rangeMin.getValue(m_renderCtx.getFunctions(), shaderType);
8533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		float rangeMax	= v.rangeMax.getValue(m_renderCtx.getFunctions(), shaderType);
8543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		float scale		= rangeMax - rangeMin;
8553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		float minBias	= rangeMin;
8563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		float maxBias	= rangeMax;
8573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Mat4  attribMatrix;
8583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int rowNdx = 0; rowNdx < 4; rowNdx++)
8603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			Vec4 row;
8623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			switch ((rowNdx + inputNdx) % 4)
8643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
8653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case 0:	row = Vec4(scale, 0.0f, 0.0f, minBias);		break;
8663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case 1:	row = Vec4(0.0f, scale, 0.0f, minBias);		break;
8673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case 2:	row = Vec4(-scale, 0.0f, 0.0f, maxBias);	break;
8683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case 3:	row = Vec4(0.0f, -scale, 0.0f, maxBias);	break;
8693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				default: DE_ASSERT(false);
8703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
8713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			attribMatrix.setRow(rowNdx, row);
8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_userAttribTransforms[inputNdx] = attribMatrix;
8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8793c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderOperatorCase::~ShaderOperatorCase (void)
8803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// ShaderOperatorTests.
8843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8853c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderOperatorTests::ShaderOperatorTests(Context& context)
8863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCaseGroup(context, "operator", "Operator tests.")
8873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8903c827367444ee418f129b2c238299f49d3264554Jarkko PoyryShaderOperatorTests::~ShaderOperatorTests (void)
8913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Vector math functions.
8953c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T> inline T nop (T f) { return f; }
8963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8973c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename T, int Size>
8983c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVector<T, Size> nop (const Vector<T, Size>& v) { return v; }
8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_UNARY_GENTYPE_FUNCS(FUNC_NAME)																			\
9013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_float	(ShaderEvalContext& c) { c.color.x()	= FUNC_NAME(c.in[0].z()); }					\
9023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1)); }		\
9033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1)); }	\
9043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0)); }
9053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_BINARY_GENTYPE_FUNCS(FUNC_NAME)																											\
9073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_float	(ShaderEvalContext& c) { c.color.x()	= FUNC_NAME(c.in[0].z(),                 c.in[1].x()); }					\
9083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1),       c.in[1].swizzle(1, 0)); }			\
9093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1),    c.in[1].swizzle(1, 2, 0)); }		\
9103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0), c.in[1].swizzle(3, 2, 1, 0)); }
9113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_TERNARY_GENTYPE_FUNCS(FUNC_NAME)																																	\
9133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_float	(ShaderEvalContext& c) { c.color.x()	= FUNC_NAME(c.in[0].z(),                 c.in[1].x(),                 c.in[2].y()); }					\
9143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1),       c.in[1].swizzle(1, 0),       c.in[2].swizzle(2, 1)); }			\
9153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1),    c.in[1].swizzle(1, 2, 0),    c.in[2].swizzle(3, 1, 2)); }		\
9163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0), c.in[1].swizzle(3, 2, 1, 0), c.in[2].swizzle(0, 3, 2, 1)); }
9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_UNARY_SCALAR_GENTYPE_FUNCS(FUNC_NAME)																	\
9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_float	(ShaderEvalContext& c) { c.color.x()	= FUNC_NAME(c.in[0].z()); }					\
9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec2	(ShaderEvalContext& c) { c.color.x()	= FUNC_NAME(c.in[0].swizzle(3, 1)); }		\
9213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec3	(ShaderEvalContext& c) { c.color.x()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1)); }	\
9223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec4	(ShaderEvalContext& c) { c.color.x()	= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0)); }
9233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_BINARY_SCALAR_GENTYPE_FUNCS(FUNC_NAME)																									\
9253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_float	(ShaderEvalContext& c) { c.color.x()	= FUNC_NAME(c.in[0].z(),                 c.in[1].x()); }					\
9263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec2	(ShaderEvalContext& c) { c.color.x()	= FUNC_NAME(c.in[0].swizzle(3, 1),       c.in[1].swizzle(1, 0)); }			\
9273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec3	(ShaderEvalContext& c) { c.color.x()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1),    c.in[1].swizzle(1, 2, 0)); }		\
9283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec4	(ShaderEvalContext& c) { c.color.x()	= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0), c.in[1].swizzle(3, 2, 1, 0)); }
9293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_BINARY_BOOL_FUNCS(FUNC_NAME)																		\
9313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_bool	(ShaderEvalContext& c) { c.color.x()	= (float)FUNC_NAME(c.in[0].z() > 0.0f, c.in[1].x() > 0.0f); }
9323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_UNARY_BOOL_GENTYPE_FUNCS(FUNC_NAME)																											\
9343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_bool	(ShaderEvalContext& c) { c.color.x()	= (float)FUNC_NAME(c.in[0].z() > 0.0f); }										\
9353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_bvec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(greaterThan(c.in[0].swizzle(3, 1), Vec2(0.0f))).asFloat(); }		\
9363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_bvec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(greaterThan(c.in[0].swizzle(2, 0, 1), Vec3(0.0f))).asFloat(); }		\
9373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_bvec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(greaterThan(c.in[0].swizzle(1, 2, 3, 0), Vec4(0.0f))).asFloat(); }
9383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_TERNARY_BOOL_GENTYPE_FUNCS(FUNC_NAME)																																																					\
9403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_bool	(ShaderEvalContext& c) { c.color.x()	= (float)FUNC_NAME(c.in[0].z() > 0.0f,                            c.in[1].x() > 0.0f,                                   c.in[2].y() > 0.0f); }												\
9413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_bvec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(greaterThan(c.in[0].swizzle(3, 1), Vec2(0.0f)),       greaterThan(c.in[1].swizzle(1, 0), Vec2(0.0f)),       greaterThan(c.in[2].swizzle(2, 1), Vec2(0.0f))).asFloat(); }		\
9423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_bvec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(greaterThan(c.in[0].swizzle(2, 0, 1), Vec3(0.0f)),    greaterThan(c.in[1].swizzle(1, 2, 0), Vec3(0.0f)),    greaterThan(c.in[2].swizzle(3, 1, 2), Vec3(0.0f))).asFloat(); }		\
9433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_bvec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(greaterThan(c.in[0].swizzle(1, 2, 3, 0), Vec4(0.0f)), greaterThan(c.in[1].swizzle(3, 2, 1, 0), Vec4(0.0f)), greaterThan(c.in[2].swizzle(0, 3, 2, 1), Vec4(0.0f))).asFloat(); }
9443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_UNARY_INT_GENTYPE_FUNCS(FUNC_NAME)																						\
9463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_int		(ShaderEvalContext& c) { c.color.x()	= (float)FUNC_NAME((int)c.in[0].z()); }						\
9473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1).asInt()).asFloat(); }		\
9483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1).asInt()).asFloat(); }	\
9493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asInt()).asFloat(); }
9503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_BINARY_INT_GENTYPE_FUNCS(FUNC_NAME)																																\
9523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_int		(ShaderEvalContext& c) { c.color.x()	= (float)FUNC_NAME((int)c.in[0].z(),				(int)c.in[1].x()); }							\
9533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1).asInt(),			c.in[1].swizzle(1, 0).asInt()).asFloat(); }		\
9543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1).asInt(),		c.in[1].swizzle(1, 2, 0).asInt()).asFloat(); }	\
9553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asInt(),	c.in[1].swizzle(3, 2, 1, 0).asInt()).asFloat(); }
9563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_UNARY_UINT_GENTYPE_FUNCS(FUNC_NAME)																						\
9583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uint	(ShaderEvalContext& c) { c.color.x()	= (float)FUNC_NAME((deUint32)c.in[0].z()); }				\
9593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1).asUint()).asFloat(); }	\
9603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint()).asFloat(); }	\
9613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint()).asFloat(); }
9623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_BINARY_UINT_GENTYPE_FUNCS(FUNC_NAME)																															\
9643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uint	(ShaderEvalContext& c) { c.color.x()	= (float)FUNC_NAME((deUint32)c.in[0].z(),			(deUint32)c.in[1].x()); }						\
9653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1).asUint(),			c.in[1].swizzle(1, 0).asUint()).asFloat(); }	\
9663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint(),		c.in[1].swizzle(1, 2, 0).asUint()).asFloat(); }	\
9673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint(),	c.in[1].swizzle(3, 2, 1, 0).asUint()).asFloat(); }
9683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_TERNARY_INT_GENTYPE_FUNCS(FUNC_NAME)																																								\
9703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_int		(ShaderEvalContext& c) { c.color.x()	= (float)FUNC_NAME((int)c.in[0].z(),				(int)c.in[1].x(),					(int)c.in[2].y()); }							\
9713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1).asInt(),			c.in[1].swizzle(1, 0).asInt(),       c.in[2].swizzle(2, 1).asInt()).asFloat(); }	\
9723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1).asInt(),		c.in[1].swizzle(1, 2, 0).asInt(),    c.in[2].swizzle(3, 1, 2).asInt()).asFloat(); }	\
9733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asInt(),	c.in[1].swizzle(3, 2, 1, 0).asInt(), c.in[2].swizzle(0, 3, 2, 1).asInt()).asFloat(); }
9743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_TERNARY_UINT_GENTYPE_FUNCS(FUNC_NAME)																																									\
9763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uint	(ShaderEvalContext& c) { c.color.x()	= (float)FUNC_NAME((deUint32)c.in[0].z(),			(deUint32)c.in[1].x(),					(deUint32)c.in[2].y()); }						\
9773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1).asUint(),			c.in[1].swizzle(1, 0).asUint(),			c.in[2].swizzle(2, 1).asUint()).asFloat(); }	\
9783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint(),		c.in[1].swizzle(1, 2, 0).asUint(),		c.in[2].swizzle(3, 1, 2).asUint()).asFloat(); }	\
9793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint(),	c.in[1].swizzle(3, 2, 1, 0).asUint(),	c.in[2].swizzle(0, 3, 2, 1).asUint()).asFloat(); }
9803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_VEC_FLOAT_FUNCS(FUNC_NAME)																								\
9823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1),			c.in[1].x()); } \
9833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1),		c.in[1].x()); } \
9843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0),	c.in[1].x()); }
9853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_VEC_FLOAT_FLOAT_FUNCS(FUNC_NAME) \
9873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1),			c.in[1].x(), c.in[2].y()); } \
9883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1),		c.in[1].x(), c.in[2].y()); } \
9893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0),	c.in[1].x(), c.in[2].y()); }
9903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_VEC_VEC_FLOAT_FUNCS(FUNC_NAME) \
9923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1),			c.in[1].swizzle(1, 0),			c.in[2].y()); } \
9933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1),		c.in[1].swizzle(1, 2, 0),		c.in[2].y()); } \
9943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0),	c.in[1].swizzle(3, 2, 1, 0),	c.in[2].y()); }
9953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_FLOAT_FLOAT_VEC_FUNCS(FUNC_NAME) \
9973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].z(), c.in[1].x(), c.in[2].swizzle(2, 1)); }			\
9983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].z(), c.in[1].x(), c.in[2].swizzle(3, 1, 2)); }		\
9993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].z(), c.in[1].x(), c.in[2].swizzle(0, 3, 2, 1)); }
10003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_FLOAT_VEC_FUNCS(FUNC_NAME)																												\
10023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].z(),					c.in[1].swizzle(1, 0)); }		\
10033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].z(),					c.in[1].swizzle(1, 2, 0)); }	\
10043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].z(),					c.in[1].swizzle(3, 2, 1, 0)); }
10053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_IVEC_INT_FUNCS(FUNC_NAME)																														\
10073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1).asInt(),			(int)c.in[1].x()).asFloat(); }	\
10083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1).asInt(),		(int)c.in[1].x()).asFloat(); }	\
10093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asInt(),	(int)c.in[1].x()).asFloat(); }
10103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_IVEC_INT_INT_FUNCS(FUNC_NAME) \
10123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1).asInt(),			(int)c.in[1].x(), (int)c.in[2].y()).asFloat(); } \
10133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1).asInt(),		(int)c.in[1].x(), (int)c.in[2].y()).asFloat(); } \
10143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asInt(),	(int)c.in[1].x(), (int)c.in[2].y()).asFloat(); }
10153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_INT_IVEC_FUNCS(FUNC_NAME)																																	\
10173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME((int)c.in[0].z(),					c.in[1].swizzle(1, 0).asInt()).asFloat(); }		\
10183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME((int)c.in[0].z(),					c.in[1].swizzle(1, 2, 0).asInt()).asFloat(); }	\
10193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME((int)c.in[0].z(),					c.in[1].swizzle(3, 2, 1, 0).asInt()).asFloat(); }
10203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_UVEC_UINT_FUNCS(FUNC_NAME)																															\
10223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1).asUint(),			(deUint32)c.in[1].x()).asFloat(); }	\
10233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint(),		(deUint32)c.in[1].x()).asFloat(); }	\
10243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint(),	(deUint32)c.in[1].x()).asFloat(); }
10253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_UVEC_UINT_UINT_FUNCS(FUNC_NAME) \
10273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1).asUint(),			(deUint32)c.in[1].x(), (deUint32)c.in[2].y()).asFloat(); } \
10283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint(),		(deUint32)c.in[1].x(), (deUint32)c.in[2].y()).asFloat(); } \
10293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint(),	(deUint32)c.in[1].x(), (deUint32)c.in[2].y()).asFloat(); }
10303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_UINT_UVEC_FUNCS(FUNC_NAME)																																		\
10323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME((deUint32)c.in[0].z(),					c.in[1].swizzle(1, 0).asUint()).asFloat(); }	\
10333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME((deUint32)c.in[0].z(),					c.in[1].swizzle(1, 2, 0).asUint()).asFloat(); }	\
10343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME((deUint32)c.in[0].z(),					c.in[1].swizzle(3, 2, 1, 0).asUint()).asFloat(); }
10353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_BINARY_INT_VEC_FUNCS(FUNC_NAME)																																	\
10373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1).asInt(),			c.in[1].swizzle(1, 0).asInt()).asFloat(); }		\
10383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1).asInt(),		c.in[1].swizzle(1, 2, 0).asInt()).asFloat(); }	\
10393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asInt(),	c.in[1].swizzle(3, 2, 1, 0).asInt()).asFloat(); }
10403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_BINARY_UINT_VEC_FUNCS(FUNC_NAME)																																\
10423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1).asUint(),			c.in[1].swizzle(1, 0).asUint()).asFloat(); }	\
10433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint(),		c.in[1].swizzle(1, 2, 0).asUint()).asFloat(); }	\
10443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint(),	c.in[1].swizzle(3, 2, 1, 0).asUint()).asFloat(); }
10453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_UINT_INT_GENTYPE_FUNCS(FUNC_NAME)																																\
10473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uint	(ShaderEvalContext& c) { c.color.x()	= (float)FUNC_NAME((deUint32)c.in[0].z(),			(int)c.in[1].x()); }							\
10483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1).asUint(),			c.in[1].swizzle(1, 0).asInt()).asFloat(); }		\
10493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint(),		c.in[1].swizzle(1, 2, 0).asInt()).asFloat(); }	\
10503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint(),	c.in[1].swizzle(3, 2, 1, 0).asInt()).asFloat(); }
10513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_UVEC_INT_FUNCS(FUNC_NAME)																														\
10533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1).asUint(),			(int)c.in[1].x()).asFloat(); }	\
10543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint(),		(int)c.in[1].x()).asFloat(); }	\
10553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint(),	(int)c.in[1].x()).asFloat(); }
10563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Operators.
10593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10603c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(nop)
10613c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(negate)
10623c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(addOne)
10633c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(subOne)
10643c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_GENTYPE_FUNCS(add)
10653c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_GENTYPE_FUNCS(sub)
10663c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_GENTYPE_FUNCS(mul)
10673c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_GENTYPE_FUNCS(div)
10683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10693c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_selection_float	(ShaderEvalContext& c) { c.color.x()	= selection(c.in[0].z() > 0.0f,		c.in[1].x(),					c.in[2].y()); }
10703c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_selection_vec2	(ShaderEvalContext& c) { c.color.yz()	= selection(c.in[0].z() > 0.0f,		c.in[1].swizzle(1, 0),			c.in[2].swizzle(2, 1)); }
10713c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_selection_vec3	(ShaderEvalContext& c) { c.color.xyz()	= selection(c.in[0].z() > 0.0f,		c.in[1].swizzle(1, 2, 0),		c.in[2].swizzle(3, 1, 2)); }
10723c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_selection_vec4	(ShaderEvalContext& c) { c.color		= selection(c.in[0].z() > 0.0f,		c.in[1].swizzle(3, 2, 1, 0),	c.in[2].swizzle(0, 3, 2, 1)); }
10733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10743c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_INT_GENTYPE_FUNCS(nop)
10753c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_INT_GENTYPE_FUNCS(negate)
10763c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_INT_GENTYPE_FUNCS(addOne)
10773c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_INT_GENTYPE_FUNCS(subOne)
10783c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_INT_GENTYPE_FUNCS(bitwiseNot)
10793c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_INT_GENTYPE_FUNCS(add)
10803c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_INT_GENTYPE_FUNCS(sub)
10813c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_INT_GENTYPE_FUNCS(mul)
10823c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_INT_GENTYPE_FUNCS(div)
10833c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_INT_GENTYPE_FUNCS(mod)
10843c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_INT_GENTYPE_FUNCS(bitwiseAnd)
10853c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_INT_GENTYPE_FUNCS(bitwiseOr)
10863c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_INT_GENTYPE_FUNCS(bitwiseXor)
10873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10883c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_leftShift_int		(ShaderEvalContext& c) { c.color.x()	= (float)leftShift((int)c.in[0].z(),				(int)c.in[1].x()); }
10893c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_INT_VEC_FUNCS(leftShift)
10903c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_rightShift_int	(ShaderEvalContext& c) { c.color.x()	= (float)rightShift((int)c.in[0].z(),				(int)c.in[1].x()); }
10913c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_INT_VEC_FUNCS(rightShift)
10923c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_IVEC_INT_FUNCS(leftShiftVecScalar)
10933c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_IVEC_INT_FUNCS(rightShiftVecScalar)
10943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_selection_int		(ShaderEvalContext& c) { c.color.x()	= (float)selection(c.in[0].z() > 0.0f,	(int)c.in[1].x(),						(int)c.in[2].y()); }
10963c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_selection_ivec2	(ShaderEvalContext& c) { c.color.yz()	= selection(c.in[0].z() > 0.0f,			c.in[1].swizzle(1, 0).asInt(),			c.in[2].swizzle(2, 1).asInt()).asFloat(); }
10973c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_selection_ivec3	(ShaderEvalContext& c) { c.color.xyz()	= selection(c.in[0].z() > 0.0f,			c.in[1].swizzle(1, 2, 0).asInt(),		c.in[2].swizzle(3, 1, 2).asInt()).asFloat(); }
10983c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_selection_ivec4	(ShaderEvalContext& c) { c.color		= selection(c.in[0].z() > 0.0f,			c.in[1].swizzle(3, 2, 1, 0).asInt(),	c.in[2].swizzle(0, 3, 2, 1).asInt()).asFloat(); }
10993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11003c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_UINT_GENTYPE_FUNCS(nop)
11013c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_UINT_GENTYPE_FUNCS(negate)
11023c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_UINT_GENTYPE_FUNCS(bitwiseNot)
11033c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_UINT_GENTYPE_FUNCS(addOne)
11043c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_UINT_GENTYPE_FUNCS(subOne)
11053c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_UINT_GENTYPE_FUNCS(add)
11063c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_UINT_GENTYPE_FUNCS(sub)
11073c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_UINT_GENTYPE_FUNCS(mul)
11083c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_UINT_GENTYPE_FUNCS(div)
11093c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_UINT_GENTYPE_FUNCS(mod)
11103c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_UINT_GENTYPE_FUNCS(bitwiseAnd)
11113c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_UINT_GENTYPE_FUNCS(bitwiseOr)
11123c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_UINT_GENTYPE_FUNCS(bitwiseXor)
11133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11143c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UINT_INT_GENTYPE_FUNCS(leftShift)
11153c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UINT_INT_GENTYPE_FUNCS(rightShift)
11163c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UVEC_INT_FUNCS(leftShiftVecScalar)
11173c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UVEC_INT_FUNCS(rightShiftVecScalar)
11183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11193c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_selection_uint	(ShaderEvalContext& c) { c.color.x()	= (float)selection(c.in[0].z() > 0.0f,	(deUint32)c.in[1].x(),					(deUint32)c.in[2].y()); }
11203c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_selection_uvec2	(ShaderEvalContext& c) { c.color.yz()	= selection(c.in[0].z() > 0.0f,			c.in[1].swizzle(1, 0).asUint(),			c.in[2].swizzle(2, 1).asUint()).asFloat(); }
11213c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_selection_uvec3	(ShaderEvalContext& c) { c.color.xyz()	= selection(c.in[0].z() > 0.0f,			c.in[1].swizzle(1, 2, 0).asUint(),		c.in[2].swizzle(3, 1, 2).asUint()).asFloat(); }
11223c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_selection_uvec4	(ShaderEvalContext& c) { c.color		= selection(c.in[0].z() > 0.0f,			c.in[1].swizzle(3, 2, 1, 0).asUint(),	c.in[2].swizzle(0, 3, 2, 1).asUint()).asFloat(); }
11233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11243c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_BOOL_GENTYPE_FUNCS(boolNot)
11253c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_BOOL_FUNCS(logicalAnd)
11263c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_BOOL_FUNCS(logicalOr)
11273c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_BOOL_FUNCS(logicalXor)
11283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11293c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_selection_bool	(ShaderEvalContext& c) { c.color.x()	= (float)selection(c.in[0].z() > 0.0f,	c.in[1].x() > 0.0f,														c.in[2].y() > 0.0f); }
11303c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_selection_bvec2	(ShaderEvalContext& c) { c.color.yz()	= selection(c.in[0].z() > 0.0f,			greaterThan(c.in[1].swizzle(1, 0), Vec2(0.0f, 0.0f)),					greaterThan(c.in[2].swizzle(2, 1), Vec2(0.0f, 0.0f))).asFloat(); }
11313c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_selection_bvec3	(ShaderEvalContext& c) { c.color.xyz()	= selection(c.in[0].z() > 0.0f,			greaterThan(c.in[1].swizzle(1, 2, 0), Vec3(0.0f, 0.0f, 0.0f)),			greaterThan(c.in[2].swizzle(3, 1, 2), Vec3(0.0f, 0.0f, 0.0f))).asFloat(); }
11323c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_selection_bvec4	(ShaderEvalContext& c) { c.color		= selection(c.in[0].z() > 0.0f,			greaterThan(c.in[1].swizzle(3, 2, 1, 0), Vec4(0.0f, 0.0f, 0.0f, 0.0f)),	greaterThan(c.in[2].swizzle(0, 3, 2, 1), Vec4(0.0f, 0.0f, 0.0f, 0.0f))).asFloat(); }
11333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11343c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_VEC_FLOAT_FUNCS(addVecScalar)
11353c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_VEC_FLOAT_FUNCS(subVecScalar)
11363c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_VEC_FLOAT_FUNCS(mulVecScalar)
11373c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_VEC_FLOAT_FUNCS(divVecScalar)
11383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11393c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_FLOAT_VEC_FUNCS(addScalarVec)
11403c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_FLOAT_VEC_FUNCS(subScalarVec)
11413c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_FLOAT_VEC_FUNCS(mulScalarVec)
11423c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_FLOAT_VEC_FUNCS(divScalarVec)
11433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11443c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_IVEC_INT_FUNCS(addVecScalar)
11453c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_IVEC_INT_FUNCS(subVecScalar)
11463c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_IVEC_INT_FUNCS(mulVecScalar)
11473c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_IVEC_INT_FUNCS(divVecScalar)
11483c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_IVEC_INT_FUNCS(modVecScalar)
11493c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_IVEC_INT_FUNCS(bitwiseAndVecScalar)
11503c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_IVEC_INT_FUNCS(bitwiseOrVecScalar)
11513c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_IVEC_INT_FUNCS(bitwiseXorVecScalar)
11523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11533c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_INT_IVEC_FUNCS(addScalarVec)
11543c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_INT_IVEC_FUNCS(subScalarVec)
11553c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_INT_IVEC_FUNCS(mulScalarVec)
11563c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_INT_IVEC_FUNCS(divScalarVec)
11573c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_INT_IVEC_FUNCS(modScalarVec)
11583c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_INT_IVEC_FUNCS(bitwiseAndScalarVec)
11593c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_INT_IVEC_FUNCS(bitwiseOrScalarVec)
11603c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_INT_IVEC_FUNCS(bitwiseXorScalarVec)
11613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11623c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UVEC_UINT_FUNCS(addVecScalar)
11633c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UVEC_UINT_FUNCS(subVecScalar)
11643c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UVEC_UINT_FUNCS(mulVecScalar)
11653c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UVEC_UINT_FUNCS(divVecScalar)
11663c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UVEC_UINT_FUNCS(modVecScalar)
11673c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UVEC_UINT_FUNCS(bitwiseAndVecScalar)
11683c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UVEC_UINT_FUNCS(bitwiseOrVecScalar)
11693c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UVEC_UINT_FUNCS(bitwiseXorVecScalar)
11703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11713c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UINT_UVEC_FUNCS(addScalarVec)
11723c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UINT_UVEC_FUNCS(subScalarVec)
11733c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UINT_UVEC_FUNCS(mulScalarVec)
11743c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UINT_UVEC_FUNCS(divScalarVec)
11753c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UINT_UVEC_FUNCS(modScalarVec)
11763c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UINT_UVEC_FUNCS(bitwiseAndScalarVec)
11773c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UINT_UVEC_FUNCS(bitwiseOrScalarVec)
11783c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UINT_UVEC_FUNCS(bitwiseXorScalarVec)
11793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Built-in functions.
11813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11823c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(radians)
11833c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(degrees)
11843c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(sin)
11853c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(cos)
11863c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(tan)
11873c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(asin)
11883c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(acos)
11893c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(atan)
11903c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_GENTYPE_FUNCS(atan2)
11913c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(sinh)
11923c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(cosh)
11933c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(tanh)
11943c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(asinh)
11953c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(acosh)
11963c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(atanh)
11973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11983c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_GENTYPE_FUNCS(pow)
11993c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(exp)
12003c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(log)
12013c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(exp2)
12023c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(log2)
12033c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(sqrt)
12043c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(inverseSqrt)
12053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12063c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(abs)
12073c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(sign)
12083c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(floor)
12093c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(trunc)
12103c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(roundToEven)
12113c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(ceil)
12123c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(fract)
12133c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_GENTYPE_FUNCS(mod)
12143c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_VEC_FLOAT_FUNCS(modVecScalar)
12153c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_GENTYPE_FUNCS(min)
12163c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_VEC_FLOAT_FUNCS(minVecScalar)
12173c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_INT_GENTYPE_FUNCS(min)
12183c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_IVEC_INT_FUNCS(minVecScalar)
12193c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_UINT_GENTYPE_FUNCS(min)
12203c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UVEC_UINT_FUNCS(minVecScalar)
12213c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_GENTYPE_FUNCS(max)
12223c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_VEC_FLOAT_FUNCS(maxVecScalar)
12233c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_INT_GENTYPE_FUNCS(max)
12243c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_IVEC_INT_FUNCS(maxVecScalar)
12253c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_UINT_GENTYPE_FUNCS(max)
12263c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UVEC_UINT_FUNCS(maxVecScalar)
12273c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_TERNARY_GENTYPE_FUNCS(clamp)
12283c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_VEC_FLOAT_FLOAT_FUNCS(clampVecScalarScalar)
12293c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_TERNARY_INT_GENTYPE_FUNCS(clamp)
12303c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_IVEC_INT_INT_FUNCS(clampVecScalarScalar)
12313c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_TERNARY_UINT_GENTYPE_FUNCS(clamp)
12323c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UVEC_UINT_UINT_FUNCS(clampVecScalarScalar)
12333c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_TERNARY_GENTYPE_FUNCS(mix)
12343c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_VEC_VEC_FLOAT_FUNCS(mixVecVecScalar)
12353c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_GENTYPE_FUNCS(step)
12363c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_FLOAT_VEC_FUNCS(stepScalarVec)
12373c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_TERNARY_GENTYPE_FUNCS(smoothStep)
12383c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_FLOAT_FLOAT_VEC_FUNCS(smoothStepScalarScalarVec)
12393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12403c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_SCALAR_GENTYPE_FUNCS(length)
12413c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_SCALAR_GENTYPE_FUNCS(distance)
12423c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_SCALAR_GENTYPE_FUNCS(dot)
12433c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_cross_vec3 (ShaderEvalContext& c) { c.color.xyz()	= cross(c.in[0].swizzle(2, 0, 1), c.in[1].swizzle(1, 2, 0)); }
12443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12453c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_GENTYPE_FUNCS(normalize)
12463c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_TERNARY_GENTYPE_FUNCS(faceForward)
12473c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BINARY_GENTYPE_FUNCS(reflect)
12483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12493c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_refract_float	(ShaderEvalContext& c) { c.color.x()	= refract(c.in[0].z(),                 c.in[1].x(),                 c.in[2].y()); }
12503c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_refract_vec2	(ShaderEvalContext& c) { c.color.yz()	= refract(c.in[0].swizzle(3, 1),       c.in[1].swizzle(1, 0),       c.in[2].y()); }
12513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_refract_vec3	(ShaderEvalContext& c) { c.color.xyz()	= refract(c.in[0].swizzle(2, 0, 1),    c.in[1].swizzle(1, 2, 0),    c.in[2].y()); }
12523c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid eval_refract_vec4	(ShaderEvalContext& c) { c.color		= refract(c.in[0].swizzle(1, 2, 3, 0), c.in[1].swizzle(3, 2, 1, 0), c.in[2].y()); }
12533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Compare functions.
12553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_FLOAT_COMPARE_FUNCS(FUNC_NAME)																											\
12573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_float	(ShaderEvalContext& c) { c.color.x() = (float)FUNC_NAME(c.in[0].z(),          c.in[1].x()); }						\
12583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec2	(ShaderEvalContext& c) { c.color.x() = (float)FUNC_NAME(c.in[0].swizzle(3, 1),       c.in[1].swizzle(1, 0)); }		\
12593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec3	(ShaderEvalContext& c) { c.color.x() = (float)FUNC_NAME(c.in[0].swizzle(2, 0, 1),    c.in[1].swizzle(1, 2, 0)); }	\
12603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec4	(ShaderEvalContext& c) { c.color.x() = (float)FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0), c.in[1].swizzle(3, 2, 1, 0)); }
12613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_FLOAT_CWISE_COMPARE_FUNCS(FUNC_NAME)																											\
12633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_float	(ShaderEvalContext& c) { c.color.x()	= (float)FUNC_NAME(c.in[0].z(),          c.in[1].x()); }							\
12643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1),       c.in[1].swizzle(1, 0)).asFloat(); }		\
12653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1),    c.in[1].swizzle(1, 2, 0)).asFloat(); }		\
12663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_vec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0), c.in[1].swizzle(3, 2, 1, 0)).asFloat(); }
12673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_INT_COMPARE_FUNCS(FUNC_NAME)																																	\
12693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_int		(ShaderEvalContext& c) { c.color.x() = (float)FUNC_NAME(chopToInt(c.in[0].z()), chopToInt(c.in[1].x())); }									\
12703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec2	(ShaderEvalContext& c) { c.color.x() = (float)FUNC_NAME(chopToInt(c.in[0].swizzle(3, 1)),       chopToInt(c.in[1].swizzle(1, 0))); }		\
12713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec3	(ShaderEvalContext& c) { c.color.x() = (float)FUNC_NAME(chopToInt(c.in[0].swizzle(2, 0, 1)),    chopToInt(c.in[1].swizzle(1, 2, 0))); }		\
12723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec4	(ShaderEvalContext& c) { c.color.x() = (float)FUNC_NAME(chopToInt(c.in[0].swizzle(1, 2, 3, 0)), chopToInt(c.in[1].swizzle(3, 2, 1, 0))); }
12733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_INT_CWISE_COMPARE_FUNCS(FUNC_NAME)																																	\
12753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_int		(ShaderEvalContext& c) { c.color.x()	= (float)FUNC_NAME(chopToInt(c.in[0].z()), chopToInt(c.in[1].x())); }									\
12763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(chopToInt(c.in[0].swizzle(3, 1)),       chopToInt(c.in[1].swizzle(1, 0))).asFloat(); }		\
12773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(chopToInt(c.in[0].swizzle(2, 0, 1)),    chopToInt(c.in[1].swizzle(1, 2, 0))).asFloat(); }	\
12783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_ivec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(chopToInt(c.in[0].swizzle(1, 2, 3, 0)), chopToInt(c.in[1].swizzle(3, 2, 1, 0))).asFloat(); }
12793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_UINT_COMPARE_FUNCS(FUNC_NAME)																																\
12813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uint	(ShaderEvalContext& c) { c.color.x() = (float)FUNC_NAME((deUint32)c.in[0].z(), (deUint32)c.in[1].x()); }								\
12823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec2	(ShaderEvalContext& c) { c.color.x() = (float)FUNC_NAME(c.in[0].swizzle(3, 1).asUint(),       c.in[1].swizzle(1, 0).asUint()); }		\
12833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec3	(ShaderEvalContext& c) { c.color.x() = (float)FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint(),    c.in[1].swizzle(1, 2, 0).asUint()); }		\
12843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec4	(ShaderEvalContext& c) { c.color.x() = (float)FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint(), c.in[1].swizzle(3, 2, 1, 0).asUint()); }
12853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_UINT_CWISE_COMPARE_FUNCS(FUNC_NAME)																																\
12873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uint	(ShaderEvalContext& c) { c.color.x()	= (float)FUNC_NAME((deUint32)c.in[0].z(), (deUint32)c.in[1].x()); }									\
12883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(c.in[0].swizzle(3, 1).asUint(),       c.in[1].swizzle(1, 0).asUint()).asFloat(); }		\
12893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(c.in[0].swizzle(2, 0, 1).asUint(),    c.in[1].swizzle(1, 2, 0).asUint()).asFloat(); }	\
12903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_uvec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(c.in[0].swizzle(1, 2, 3, 0).asUint(), c.in[1].swizzle(3, 2, 1, 0).asUint()).asFloat(); }
12913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_BOOL_COMPARE_FUNCS(FUNC_NAME)																																								\
12933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_bool	(ShaderEvalContext& c) { c.color.x() = (float)FUNC_NAME(c.in[0].z() > 0.0f, c.in[1].x() > 0.0f); }																		\
12943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_bvec2	(ShaderEvalContext& c) { c.color.x() = (float)FUNC_NAME(greaterThan(c.in[0].swizzle(3, 1), Vec2(0.0f)),       greaterThan(c.in[1].swizzle(1, 0), Vec2(0.0f))); }		\
12953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_bvec3	(ShaderEvalContext& c) { c.color.x() = (float)FUNC_NAME(greaterThan(c.in[0].swizzle(2, 0, 1), Vec3(0.0f)),    greaterThan(c.in[1].swizzle(1, 2, 0), Vec3(0.0f))); }		\
12963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_bvec4	(ShaderEvalContext& c) { c.color.x() = (float)FUNC_NAME(greaterThan(c.in[0].swizzle(1, 2, 3, 0), Vec4(0.0f)), greaterThan(c.in[1].swizzle(3, 2, 1, 0), Vec4(0.0f))); }
12973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_BOOL_CWISE_COMPARE_FUNCS(FUNC_NAME)																																								\
12993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_bool	(ShaderEvalContext& c) { c.color.x()	= (float)FUNC_NAME(c.in[0].z() > 0.0f, c.in[1].x() > 0.0f); }																		\
13003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_bvec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(greaterThan(c.in[0].swizzle(3, 1), Vec2(0.0f)),       greaterThan(c.in[1].swizzle(1, 0), Vec2(0.0f))).asFloat(); }		\
13013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_bvec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(greaterThan(c.in[0].swizzle(2, 0, 1), Vec3(0.0f)),    greaterThan(c.in[1].swizzle(1, 2, 0), Vec3(0.0f))).asFloat(); }	\
13023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##FUNC_NAME##_bvec4	(ShaderEvalContext& c) { c.color		= FUNC_NAME(greaterThan(c.in[0].swizzle(1, 2, 3, 0), Vec4(0.0f)), greaterThan(c.in[1].swizzle(3, 2, 1, 0), Vec4(0.0f))).asFloat(); }
13033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13043c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_FLOAT_COMPARE_FUNCS(allEqual)
13053c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_FLOAT_COMPARE_FUNCS(anyNotEqual)
13063c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_FLOAT_CWISE_COMPARE_FUNCS(lessThan)
13073c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_FLOAT_CWISE_COMPARE_FUNCS(lessThanEqual)
13083c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_FLOAT_CWISE_COMPARE_FUNCS(greaterThan)
13093c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_FLOAT_CWISE_COMPARE_FUNCS(greaterThanEqual)
13103c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_FLOAT_CWISE_COMPARE_FUNCS(equal)
13113c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_FLOAT_CWISE_COMPARE_FUNCS(notEqual)
13123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13133c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_INT_COMPARE_FUNCS(allEqual)
13143c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_INT_COMPARE_FUNCS(anyNotEqual)
13153c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_INT_CWISE_COMPARE_FUNCS(lessThan)
13163c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_INT_CWISE_COMPARE_FUNCS(lessThanEqual)
13173c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_INT_CWISE_COMPARE_FUNCS(greaterThan)
13183c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_INT_CWISE_COMPARE_FUNCS(greaterThanEqual)
13193c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_INT_CWISE_COMPARE_FUNCS(equal)
13203c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_INT_CWISE_COMPARE_FUNCS(notEqual)
13213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13223c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UINT_COMPARE_FUNCS(allEqual)
13233c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UINT_COMPARE_FUNCS(anyNotEqual)
13243c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UINT_CWISE_COMPARE_FUNCS(lessThan)
13253c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UINT_CWISE_COMPARE_FUNCS(lessThanEqual)
13263c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UINT_CWISE_COMPARE_FUNCS(greaterThan)
13273c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UINT_CWISE_COMPARE_FUNCS(greaterThanEqual)
13283c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UINT_CWISE_COMPARE_FUNCS(equal)
13293c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UINT_CWISE_COMPARE_FUNCS(notEqual)
13303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13313c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BOOL_COMPARE_FUNCS(allEqual)
13323c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BOOL_COMPARE_FUNCS(anyNotEqual)
13333c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BOOL_CWISE_COMPARE_FUNCS(equal)
13343c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_BOOL_CWISE_COMPARE_FUNCS(notEqual)
13353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Boolean functions.
13373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_UNARY_SCALAR_BVEC_FUNCS(GLSL_NAME, FUNC_NAME)																							\
13393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##GLSL_NAME##_bvec2	(ShaderEvalContext& c) { c.color.x()	= float(FUNC_NAME(greaterThan(c.in[0].swizzle(3, 1), Vec2(0.0f)))); }		\
13403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##GLSL_NAME##_bvec3	(ShaderEvalContext& c) { c.color.x()	= float(FUNC_NAME(greaterThan(c.in[0].swizzle(2, 0, 1), Vec3(0.0f)))); }	\
13413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##GLSL_NAME##_bvec4	(ShaderEvalContext& c) { c.color.x()	= float(FUNC_NAME(greaterThan(c.in[0].swizzle(1, 2, 3, 0), Vec4(0.0f)))); }
13423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define DECLARE_UNARY_BVEC_BVEC_FUNCS(GLSL_NAME, FUNC_NAME)																								\
13443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##GLSL_NAME##_bvec2	(ShaderEvalContext& c) { c.color.yz()	= FUNC_NAME(greaterThan(c.in[0].swizzle(3, 1), Vec2(0.0f))).asFloat(); }	\
13453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##GLSL_NAME##_bvec3	(ShaderEvalContext& c) { c.color.xyz()	= FUNC_NAME(greaterThan(c.in[0].swizzle(2, 0, 1), Vec3(0.0f))).asFloat(); }	\
13463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void eval_##GLSL_NAME##_bvec4	(ShaderEvalContext& c) { c.color.xyzw()	= FUNC_NAME(greaterThan(c.in[0].swizzle(1, 2, 3, 0), Vec4(0.0f))).asFloat(); }
13473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13483c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_SCALAR_BVEC_FUNCS(any, boolAny);
13493c827367444ee418f129b2c238299f49d3264554Jarkko PoyryDECLARE_UNARY_SCALAR_BVEC_FUNCS(all, boolAll);
13503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ShaderOperatorTests::init (void)
13523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
13533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	#define BOOL_FUNCS(FUNC_NAME)			eval_##FUNC_NAME##_bool, DE_NULL, DE_NULL, DE_NULL
13543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	#define FLOAT_VEC_FUNCS(FUNC_NAME)		DE_NULL, eval_##FUNC_NAME##_vec2, eval_##FUNC_NAME##_vec3, eval_##FUNC_NAME##_vec4
13563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	#define INT_VEC_FUNCS(FUNC_NAME)		DE_NULL, eval_##FUNC_NAME##_ivec2, eval_##FUNC_NAME##_ivec3, eval_##FUNC_NAME##_ivec4
13573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	#define UINT_VEC_FUNCS(FUNC_NAME)		DE_NULL, eval_##FUNC_NAME##_uvec2, eval_##FUNC_NAME##_uvec3, eval_##FUNC_NAME##_uvec4
13583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	#define BOOL_VEC_FUNCS(FUNC_NAME)		DE_NULL, eval_##FUNC_NAME##_bvec2, eval_##FUNC_NAME##_bvec3, eval_##FUNC_NAME##_bvec4
13593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	#define FLOAT_GENTYPE_FUNCS(FUNC_NAME)	eval_##FUNC_NAME##_float, eval_##FUNC_NAME##_vec2, eval_##FUNC_NAME##_vec3, eval_##FUNC_NAME##_vec4
13613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	#define INT_GENTYPE_FUNCS(FUNC_NAME)	eval_##FUNC_NAME##_int, eval_##FUNC_NAME##_ivec2, eval_##FUNC_NAME##_ivec3, eval_##FUNC_NAME##_ivec4
13623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	#define UINT_GENTYPE_FUNCS(FUNC_NAME)	eval_##FUNC_NAME##_uint, eval_##FUNC_NAME##_uvec2, eval_##FUNC_NAME##_uvec3, eval_##FUNC_NAME##_uvec4
13633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	#define BOOL_GENTYPE_FUNCS(FUNC_NAME)	eval_##FUNC_NAME##_bool, eval_##FUNC_NAME##_bvec2, eval_##FUNC_NAME##_bvec3, eval_##FUNC_NAME##_bvec4
13643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Shorthands.
13663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Value					notUsed		= Value(VALUE_NONE, 0.0f, 0.0f);
13673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar::Symbol		lUMax		= FloatScalar::SYMBOL_LOWP_UINT_MAX;
13683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar::Symbol		mUMax		= FloatScalar::SYMBOL_MEDIUMP_UINT_MAX;
13693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar::Symbol		lUMaxR		= FloatScalar::SYMBOL_LOWP_UINT_MAX_RECIPROCAL;
13703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FloatScalar::Symbol		mUMaxR		= FloatScalar::SYMBOL_MEDIUMP_UINT_MAX_RECIPROCAL;
13713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<BuiltinFuncGroup> funcInfoGroups;
13733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Unary operators.
13753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	funcInfoGroups.push_back(
13763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		BuiltinFuncGroup("unary_operator", "Unary operator tests")
13773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo						("plus",			"+",	GT,		Value(GT,  -1.0f, 1.0f),	notUsed,	notUsed,	0.5f,	0.5f,	PRECMASK_ALL,		FLOAT_GENTYPE_FUNCS(nop))
13783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo						("plus",			"+",	IGT,	Value(IGT, -5.0f, 5.0f),	notUsed,	notUsed,	0.1f,	0.5f,	PRECMASK_ALL,		INT_GENTYPE_FUNCS(nop))
13793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo						("plus",			"+",	UGT,	Value(UGT,  0.0f, 2e2f),	notUsed,	notUsed,	5e-3f,	0.0f,	PRECMASK_ALL,		UINT_GENTYPE_FUNCS(nop))
13803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo						("minus",			"-",	GT,		Value(GT,  -1.0f, 1.0f),	notUsed,	notUsed,	0.5f,	0.5f,	PRECMASK_ALL,		FLOAT_GENTYPE_FUNCS(negate))
13813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo						("minus",			"-",	IGT,	Value(IGT, -5.0f, 5.0f),	notUsed,	notUsed,	0.1f,	0.5f,	PRECMASK_ALL,		INT_GENTYPE_FUNCS(negate))
13823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfoSeparateRefScaleBias	("minus",			"-",	UGT,	Value(UGT,  0.0f, lUMax),	notUsed,	notUsed,	lUMaxR,	0.0f,	PRECMASK_LOWP,		UINT_GENTYPE_FUNCS(negate), lUMaxR, FloatScalar::SYMBOL_ONE_MINUS_UINT32MAX_DIV_LOWP_UINT_MAX)
13833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfoSeparateRefScaleBias	("minus",			"-",	UGT,	Value(UGT,  0.0f, mUMax),	notUsed,	notUsed,	mUMaxR,	0.0f,	PRECMASK_MEDIUMP,	UINT_GENTYPE_FUNCS(negate), mUMaxR, FloatScalar::SYMBOL_ONE_MINUS_UINT32MAX_DIV_MEDIUMP_UINT_MAX)
13843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo						("minus",			"-",	UGT,	Value(UGT,  0.0f, 4e9f),	notUsed,	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,		UINT_GENTYPE_FUNCS(negate))
13853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo						("not",				"!",	B,		Value(B,   -1.0f, 1.0f),	notUsed,	notUsed,	1.0f,	0.0f,	PRECMASK_NA,		eval_boolNot_bool, DE_NULL, DE_NULL, DE_NULL)
13863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo						("bitwise_not",		"~",	IGT,	Value(IGT, -1e5f, 1e5f),	notUsed,	notUsed,	5e-5f,	0.5f,	PRECMASK_HIGHP,		INT_GENTYPE_FUNCS(bitwiseNot))
13873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo						("bitwise_not",		"~",	UGT,	Value(UGT,  0.0f, 2e9f),	notUsed,	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,		UINT_GENTYPE_FUNCS(bitwiseNot))
13883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Pre/post incr/decr side effect cases.
13903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinSideEffOperInfo		("pre_increment_effect",	"++",	GT,		Value(GT,	-1.0f, 1.0f),	notUsed,	notUsed,	0.5f, 0.0f,		PRECMASK_ALL,	FLOAT_GENTYPE_FUNCS(addOne))
13913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinSideEffOperInfo		("pre_increment_effect",	"++",	IGT,	Value(IGT,	-6.0f, 4.0f),	notUsed,	notUsed,	0.1f, 0.5f,		PRECMASK_ALL,	INT_GENTYPE_FUNCS(addOne))
13923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinSideEffOperInfo		("pre_increment_effect",	"++",	UGT,	Value(UGT,	 0.0f, 9.0f),	notUsed,	notUsed,	0.1f, 0.0f,		PRECMASK_ALL,	UINT_GENTYPE_FUNCS(addOne))
13933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinSideEffOperInfo		("pre_decrement_effect",	"--",	GT,		Value(GT,	-1.0f, 1.0f),	notUsed,	notUsed,	0.5f, 1.0f,		PRECMASK_ALL,	FLOAT_GENTYPE_FUNCS(subOne))
13943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinSideEffOperInfo		("pre_decrement_effect",	"--",	IGT,	Value(IGT,	-4.0f, 6.0f),	notUsed,	notUsed,	0.1f, 0.5f,		PRECMASK_ALL,	INT_GENTYPE_FUNCS(subOne))
13953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinSideEffOperInfo		("pre_decrement_effect",	"--",	UGT,	Value(UGT,	 1.0f, 10.0f),	notUsed,	notUsed,	0.1f, 0.0f,		PRECMASK_ALL,	UINT_GENTYPE_FUNCS(subOne))
13963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinPostSideEffOperInfo	("post_increment_effect",	"++",	GT,		Value(GT,	-1.0f, 1.0f),	notUsed,	notUsed,	0.5f, 0.0f,		PRECMASK_ALL,	FLOAT_GENTYPE_FUNCS(addOne))
13973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinPostSideEffOperInfo	("post_increment_effect",	"++",	IGT,	Value(IGT,	-6.0f, 4.0f),	notUsed,	notUsed,	0.1f, 0.5f,		PRECMASK_ALL,	INT_GENTYPE_FUNCS(addOne))
13983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinPostSideEffOperInfo	("post_increment_effect",	"++",	UGT,	Value(UGT,	 0.0f, 9.0f),	notUsed,	notUsed,	0.1f, 0.0f,		PRECMASK_ALL,	UINT_GENTYPE_FUNCS(addOne))
13993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinPostSideEffOperInfo	("post_decrement_effect",	"--",	GT,		Value(GT,	-1.0f, 1.0f),	notUsed,	notUsed,	0.5f, 1.0f,		PRECMASK_ALL,	FLOAT_GENTYPE_FUNCS(subOne))
14003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinPostSideEffOperInfo	("post_decrement_effect",	"--",	IGT,	Value(IGT,	-4.0f, 6.0f),	notUsed,	notUsed,	0.1f, 0.5f,		PRECMASK_ALL,	INT_GENTYPE_FUNCS(subOne))
14013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinPostSideEffOperInfo	("post_decrement_effect",	"--",	UGT,	Value(UGT,	 1.0f, 10.0f),	notUsed,	notUsed,	0.1f, 0.0f,		PRECMASK_ALL,	UINT_GENTYPE_FUNCS(subOne))
14023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Pre/post incr/decr result cases.
14043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo				("pre_increment_result",	"++",	GT,		Value(GT,	-1.0f, 1.0f),	notUsed,	notUsed,	0.5f, 0.0f,		PRECMASK_ALL,	FLOAT_GENTYPE_FUNCS(addOne))
14053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo				("pre_increment_result",	"++",	IGT,	Value(IGT,	-6.0f, 4.0f),	notUsed,	notUsed,	0.1f, 0.5f,		PRECMASK_ALL,	INT_GENTYPE_FUNCS(addOne))
14063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo				("pre_increment_result",	"++",	UGT,	Value(UGT,	 0.0f, 9.0f),	notUsed,	notUsed,	0.1f, 0.0f,		PRECMASK_ALL,	UINT_GENTYPE_FUNCS(addOne))
14073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo				("pre_decrement_result",	"--",	GT,		Value(GT,	-1.0f, 1.0f),	notUsed,	notUsed,	0.5f, 1.0f,		PRECMASK_ALL,	FLOAT_GENTYPE_FUNCS(subOne))
14083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo				("pre_decrement_result",	"--",	IGT,	Value(IGT,	-4.0f, 6.0f),	notUsed,	notUsed,	0.1f, 0.5f,		PRECMASK_ALL,	INT_GENTYPE_FUNCS(subOne))
14093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo				("pre_decrement_result",	"--",	UGT,	Value(UGT,	 1.0f, 10.0f),	notUsed,	notUsed,	0.1f, 0.0f,		PRECMASK_ALL,	UINT_GENTYPE_FUNCS(subOne))
14103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinPostOperInfo			("post_increment_result",	"++",	GT,		Value(GT,	-1.0f, 1.0f),	notUsed,	notUsed,	0.5f, 0.5f,		PRECMASK_ALL,	FLOAT_GENTYPE_FUNCS(nop))
14113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinPostOperInfo			("post_increment_result",	"++",	IGT,	Value(IGT,	-5.0f, 5.0f),	notUsed,	notUsed,	0.1f, 0.5f,		PRECMASK_ALL,	INT_GENTYPE_FUNCS(nop))
14123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinPostOperInfo			("post_increment_result",	"++",	UGT,	Value(UGT,	 0.0f, 9.0f),	notUsed,	notUsed,	0.1f, 0.0f,		PRECMASK_ALL,	UINT_GENTYPE_FUNCS(nop))
14133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinPostOperInfo			("post_decrement_result",	"--",	GT,		Value(GT,	-1.0f, 1.0f),	notUsed,	notUsed,	0.5f, 0.5f,		PRECMASK_ALL,	FLOAT_GENTYPE_FUNCS(nop))
14143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinPostOperInfo			("post_decrement_result",	"--",	IGT,	Value(IGT,	-5.0f, 5.0f),	notUsed,	notUsed,	0.1f, 0.5f,		PRECMASK_ALL,	INT_GENTYPE_FUNCS(nop))
14153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinPostOperInfo			("post_decrement_result",	"--",	UGT,	Value(UGT,	 1.0f, 10.0f),	notUsed,	notUsed,	0.1f, 0.0f,		PRECMASK_ALL,	UINT_GENTYPE_FUNCS(nop))
14163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	);
14173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BuiltinFuncGroup binaryOpGroup("binary_operator", "Binary operator tests");
14193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Normal binary operations and their corresponding assignment operations have lots in common; generate both in the following loop.
14213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int binaryOperatorType = 0; binaryOperatorType <= 2; binaryOperatorType++) // 0: normal op test, 1: assignment op side-effect test, 2: assignment op result test
14233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
14243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool		isNormalOp		= binaryOperatorType == 0;
14253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool		isAssignEff		= binaryOperatorType == 1;
14263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool		isAssignRes		= binaryOperatorType == 2;
14273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(isNormalOp || isAssignEff || isAssignRes);
14293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_UNREF(isAssignRes);
14303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	addName			= isNormalOp ? "add"			: isAssignEff ? "add_assign_effect"			: "add_assign_result";
14323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	subName			= isNormalOp ? "sub"			: isAssignEff ? "sub_assign_effect"			: "sub_assign_result";
14333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	mulName			= isNormalOp ? "mul"			: isAssignEff ? "mul_assign_effect"			: "mul_assign_result";
14343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	divName			= isNormalOp ? "div"			: isAssignEff ? "div_assign_effect"			: "div_assign_result";
14353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* modName			= isNormalOp ? "mod"			: isAssignEff ? "mod_assign_effect"			: "mod_assign_result";
14363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* andName			= isNormalOp ? "bitwise_and"	: isAssignEff ? "bitwise_and_assign_effect"	: "bitwise_and_assign_result";
14373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* orName			= isNormalOp ? "bitwise_or"		: isAssignEff ? "bitwise_or_assign_effect"	: "bitwise_or_assign_result";
14383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* xorName			= isNormalOp ? "bitwise_xor"	: isAssignEff ? "bitwise_xor_assign_effect"	: "bitwise_xor_assign_result";
14393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* leftShiftName	= isNormalOp ? "left_shift"		: isAssignEff ? "left_shift_assign_effect"	: "left_shift_assign_result";
14403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char* rightShiftName	= isNormalOp ? "right_shift"	: isAssignEff ? "right_shift_assign_effect"	: "right_shift_assign_result";
14413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	addOp			= isNormalOp ? "+" : "+=";
14423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	subOp			= isNormalOp ? "-" : "-=";
14433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	mulOp			= isNormalOp ? "*" : "*=";
14443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	divOp			= isNormalOp ? "/" : "/=";
14453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	modOp			= isNormalOp ? "%" : "%=";
14463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	andOp			= isNormalOp ? "&" : "&=";
14473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	orOp			= isNormalOp ? "|" : "|=";
14483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	xorOp			= isNormalOp ? "^" : "^=";
14493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	leftShiftOp		= isNormalOp ? "<<" : "<<=";
14503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*	rightShiftOp	= isNormalOp ? ">>" : ">>=";
14513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Pointer to appropriate OperInfo function.
14533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		BuiltinFuncInfo (*operInfoFunc)(const char*, const char*, ValueType, Value, Value, Value, const FloatScalar&, const FloatScalar&, deUint32, ShaderEvalFunc, ShaderEvalFunc, ShaderEvalFunc, ShaderEvalFunc) =
14543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			isAssignEff ? BuiltinSideEffOperInfo : BuiltinOperInfo;
14553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(operInfoFunc != DE_NULL);
14573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// The following cases will be added for each operator, precision and fundamental type (float, int, uint) combination, where applicable:
14593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// gentype <op> gentype
14603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// vector <op> scalar
14613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// For normal (non-assigning) operators only:
14623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		//   scalar <op> vector
14633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// The add operator.
14653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		binaryOpGroup
14673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(addName,	addOp,	GT,		Value(GT,  -1.0f, 1.0f),	Value(GT,  -1.0f, 1.0f),	notUsed,	1.0f,	0.0f,	PRECMASK_ALL,			FLOAT_GENTYPE_FUNCS(add))
14683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(addName,	addOp,	IGT,	Value(IGT, -4.0f, 6.0f),	Value(IGT, -6.0f, 5.0f),	notUsed,	0.1f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_GENTYPE_FUNCS(add))
14693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(addName,	addOp,	IGT,	Value(IGT, -2e9f, 2e9f),	Value(IGT, -2e9f, 2e9f),	notUsed,	4e-10f,	0.5f,	PRECMASK_HIGHP,			INT_GENTYPE_FUNCS(add))
14703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(addName,	addOp,	UGT,	Value(UGT,  0.0f, 1e2f),	Value(UGT,  0.0f, 1e2f),	notUsed,	5e-3f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_GENTYPE_FUNCS(add))
14713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(addName,	addOp,	UGT,	Value(UGT,  0.0f, 4e9f),	Value(UGT,  0.0f, 4e9f),	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,			UINT_GENTYPE_FUNCS(add))
14723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(addName,	addOp,	FV,		Value(FV,  -1.0f, 1.0f),	Value(F,   -1.0f, 1.0f),	notUsed,	1.0f,	0.0f,	PRECMASK_ALL,			FLOAT_VEC_FUNCS(addVecScalar))
14733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(addName,	addOp,	IV,		Value(IV,  -4.0f, 6.0f),	Value(I,   -6.0f, 5.0f),	notUsed,	0.1f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_VEC_FUNCS(addVecScalar))
14743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(addName,	addOp,	IV,		Value(IV,  -2e9f, 2e9f),	Value(I,   -2e9f, 2e9f),	notUsed,	4e-10f,	0.5f,	PRECMASK_HIGHP,			INT_VEC_FUNCS(addVecScalar))
14753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(addName,	addOp,	UV,		Value(UV,   0.0f, 1e2f),	Value(U,    0.0f, 1e2f),	notUsed,	5e-3f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_VEC_FUNCS(addVecScalar))
14763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(addName,	addOp,	UV,		Value(UV,   0.0f, 4e9f),	Value(U,    0.0f, 4e9f),	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,			UINT_VEC_FUNCS(addVecScalar));
14773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (isNormalOp)
14793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			binaryOpGroup
14803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(addName,	addOp,	FV,		Value(F,   -1.0f, 1.0f),	Value(FV,  -1.0f, 1.0f),	notUsed,	1.0f,	0.0f,	PRECMASK_ALL,			FLOAT_VEC_FUNCS(addScalarVec))
14813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(addName,	addOp,	IV,		Value(I,   -4.0f, 6.0f),	Value(IV,  -6.0f, 5.0f),	notUsed,	0.1f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_VEC_FUNCS(addScalarVec))
14823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(addName,	addOp,	IV,		Value(I,   -2e9f, 2e9f),	Value(IV,  -2e9f, 2e9f),	notUsed,	4e-10f,	0.5f,	PRECMASK_HIGHP,			INT_VEC_FUNCS(addScalarVec))
14833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(addName,	addOp,	UV,		Value(U,    0.0f, 1e2f),	Value(UV,   0.0f, 1e2f),	notUsed,	5e-3f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_VEC_FUNCS(addScalarVec))
14843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(addName,	addOp,	UV,		Value(U,    0.0f, 4e9f),	Value(UV,   0.0f, 4e9f),	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,			UINT_VEC_FUNCS(addScalarVec));
14853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// The subtract operator.
14873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		binaryOpGroup
14893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(subName,	subOp,	GT,		Value(GT,  -1.0f, 1.0f),	Value(GT,  -1.0f, 1.0f),	notUsed,	1.0f,	0.0f,	PRECMASK_ALL,			FLOAT_GENTYPE_FUNCS(sub))
14903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(subName,	subOp,	IGT,	Value(IGT, -4.0f, 6.0f),	Value(IGT, -6.0f, 5.0f),	notUsed,	0.1f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_GENTYPE_FUNCS(sub))
14913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(subName,	subOp,	IGT,	Value(IGT, -2e9f, 2e9f),	Value(IGT, -2e9f, 2e9f),	notUsed,	4e-10f,	0.5f,	PRECMASK_HIGHP,			INT_GENTYPE_FUNCS(sub))
14923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(subName,	subOp,	UGT,	Value(UGT,  1e2f, 2e2f),	Value(UGT,  0.0f, 1e2f),	notUsed,	5e-3f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_GENTYPE_FUNCS(sub))
14933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(subName,	subOp,	UGT,	Value(UGT,  .5e9f, 3.7e9f),	Value(UGT,  0.0f, 3.9e9f),	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,			UINT_GENTYPE_FUNCS(sub))
14943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(subName,	subOp,	FV,		Value(FV,  -1.0f, 1.0f),	Value(F,   -1.0f, 1.0f),	notUsed,	1.0f,	0.0f,	PRECMASK_ALL,			FLOAT_VEC_FUNCS(subVecScalar))
14953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(subName,	subOp,	IV,		Value(IV,  -4.0f, 6.0f),	Value(I,   -6.0f, 5.0f),	notUsed,	0.1f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_VEC_FUNCS(subVecScalar))
14963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(subName,	subOp,	IV,		Value(IV,  -2e9f, 2e9f),	Value(I,   -2e9f, 2e9f),	notUsed,	4e-10f,	0.5f,	PRECMASK_HIGHP,			INT_VEC_FUNCS(subVecScalar))
14973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(subName,	subOp,	UV,		Value(UV,   1e2f, 2e2f),	Value(U,    0.0f, 1e2f),	notUsed,	5e-3f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_VEC_FUNCS(subVecScalar))
14983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(subName,	subOp,	UV,		Value(UV,   0.0f, 4e9f),	Value(U,    0.0f, 4e9f),	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,			UINT_VEC_FUNCS(subVecScalar));
14993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (isNormalOp)
15013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			binaryOpGroup
15023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(subName,	subOp,	FV,		Value(F,   -1.0f, 1.0f),	Value(FV,  -1.0f, 1.0f),	notUsed,	1.0f,	0.0f,	PRECMASK_ALL,			FLOAT_VEC_FUNCS(subScalarVec))
15033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(subName,	subOp,	IV,		Value(I,   -4.0f, 6.0f),	Value(IV,  -6.0f, 5.0f),	notUsed,	0.1f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_VEC_FUNCS(subScalarVec))
15043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(subName,	subOp,	IV,		Value(I,   -2e9f, 2e9f),	Value(IV,  -2e9f, 2e9f),	notUsed,	4e-10f,	0.5f,	PRECMASK_HIGHP,			INT_VEC_FUNCS(subScalarVec))
15053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(subName,	subOp,	UV,		Value(U,    1e2f, 2e2f),	Value(UV,    0.0f, 1e2f),	notUsed,	5e-3f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_VEC_FUNCS(subScalarVec))
15063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(subName,	subOp,	UV,		Value(U,    0.0f, 4e9f),	Value(UV,    0.0f, 4e9f),	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,			UINT_VEC_FUNCS(subScalarVec));
15073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// The multiply operator.
15093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		binaryOpGroup
15113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(mulName,	mulOp,	GT,		Value(GT,  -1.0f, 1.0f),	Value(GT,  -1.0f, 1.0f),	notUsed,	1.0f,	0.0f,	PRECMASK_ALL,			FLOAT_GENTYPE_FUNCS(mul))
15123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(mulName,	mulOp,	IGT,	Value(IGT, -4.0f, 6.0f),	Value(IGT, -6.0f, 5.0f),	notUsed,	0.1f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_GENTYPE_FUNCS(mul))
15133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(mulName,	mulOp,	IGT,	Value(IGT, -3e5f, 3e5f),	Value(IGT, -3e4f, 3e4f),	notUsed,	4e-10f,	0.5f,	PRECMASK_HIGHP,			INT_GENTYPE_FUNCS(mul))
15143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(mulName,	mulOp,	UGT,	Value(UGT,  0.0f, 16.0f),	Value(UGT,  0.0f, 16.0f),	notUsed,	4e-3f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_GENTYPE_FUNCS(mul))
15153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(mulName,	mulOp,	UGT,	Value(UGT,  0.0f, 6e5f),	Value(UGT,  0.0f, 6e4f),	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,			UINT_GENTYPE_FUNCS(mul))
15163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(mulName,	mulOp,	FV,		Value(FV,  -1.0f, 1.0f),	Value(F,   -1.0f,  1.0f),	notUsed,	1.0f,	0.0f,	PRECMASK_ALL,			FLOAT_VEC_FUNCS(mulVecScalar))
15173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(mulName,	mulOp,	IV,		Value(IV,  -4.0f, 6.0f),	Value(I,   -6.0f,  5.0f),	notUsed,	0.1f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_VEC_FUNCS(mulVecScalar))
15183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(mulName,	mulOp,	IV,		Value(IV,  -3e5f, 3e5f),	Value(I,   -3e4f,  3e4f),	notUsed,	4e-10f,	0.5f,	PRECMASK_HIGHP,			INT_VEC_FUNCS(mulVecScalar))
15193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(mulName,	mulOp,	UV,		Value(UV,   0.0f, 16.0f),	Value(U,    0.0f, 16.0f),	notUsed,	4e-3f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_VEC_FUNCS(mulVecScalar))
15203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(mulName,	mulOp,	UV,		Value(UV,   0.0f, 6e5f),	Value(U,    0.0f, 6e4f),	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,			UINT_VEC_FUNCS(mulVecScalar));
15213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (isNormalOp)
15233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			binaryOpGroup
15243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(mulName,	mulOp,	FV,		Value(F,   -1.0f, 1.0f),	Value(FV,  -1.0f,  1.0f),	notUsed,	1.0f,	0.0f,	PRECMASK_ALL,			FLOAT_VEC_FUNCS(mulScalarVec))
15253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(mulName,	mulOp,	IV,		Value(I,   -4.0f, 6.0f),	Value(IV,  -6.0f,  5.0f),	notUsed,	0.1f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_VEC_FUNCS(mulScalarVec))
15263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(mulName,	mulOp,	IV,		Value(I,   -3e5f, 3e5f),	Value(IV,  -3e4f,  3e4f),	notUsed,	4e-10f,	0.5f,	PRECMASK_HIGHP,			INT_VEC_FUNCS(mulScalarVec))
15273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(mulName,	mulOp,	UV,		Value(U,    0.0f, 16.0f),	Value(UV,   0.0f, 16.0f),	notUsed,	4e-3f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_VEC_FUNCS(mulScalarVec))
15283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(mulName,	mulOp,	UV,		Value(U,    0.0f, 6e5f),	Value(UV,   0.0f, 6e4f),	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,			UINT_VEC_FUNCS(mulScalarVec));
15293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// The divide operator.
15313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		binaryOpGroup
15333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(divName,	divOp,	GT,		Value(GT,  -1.0f,    1.0f),		Value(GT,  -2.0f, -0.5f),	notUsed,	1.0f,	0.0f,	PRECMASK_ALL,			FLOAT_GENTYPE_FUNCS(div))
15343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(divName,	divOp,	IGT,	Value(IGT, 24.0f,    24.0f),	Value(IGT, -4.0f, -1.0f),	notUsed,	0.04f,	1.0f,	PRECMASK_LOWP_MEDIUMP,	INT_GENTYPE_FUNCS(div))
15353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(divName,	divOp,	IGT,	Value(IGT, 40320.0f, 40320.0f),	Value(IGT, -8.0f, -1.0f),	notUsed,	1e-5f,	0.5f,	PRECMASK_HIGHP,			INT_GENTYPE_FUNCS(div))
15363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(divName,	divOp,	UGT,	Value(UGT,  0.0f,    24.0f),	Value(UGT,  1.0f,  4.0f),	notUsed,	0.04f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_GENTYPE_FUNCS(div))
15373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(divName,	divOp,	UGT,	Value(UGT,  0.0f,    40320.0f),	Value(UGT,  1.0f,  8.0f),	notUsed,	1e-5f,	0.0f,	PRECMASK_HIGHP,			UINT_GENTYPE_FUNCS(div))
15383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(divName,	divOp,	FV,		Value(FV,  -1.0f,    1.0f),		Value(F,   -2.0f, -0.5f),	notUsed,	1.0f,	0.0f,	PRECMASK_ALL,			FLOAT_VEC_FUNCS(divVecScalar))
15393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(divName,	divOp,	IV,		Value(IV,  24.0f,    24.0f),	Value(I,   -4.0f, -1.0f),	notUsed,	0.04f,	1.0f,	PRECMASK_LOWP_MEDIUMP,	INT_VEC_FUNCS(divVecScalar))
15403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(divName,	divOp,	IV,		Value(IV,  40320.0f, 40320.0f),	Value(I,   -8.0f, -1.0f),	notUsed,	1e-5f,	0.5f,	PRECMASK_HIGHP,			INT_VEC_FUNCS(divVecScalar))
15413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(divName,	divOp,	UV,		Value(UV,   0.0f,    24.0f),	Value(U,    1.0f,  4.0f),	notUsed,	0.04f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_VEC_FUNCS(divVecScalar))
15423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(divName,	divOp,	UV,		Value(UV,   0.0f,    40320.0f),	Value(U,    1.0f,  8.0f),	notUsed,	1e-5f,	0.0f,	PRECMASK_HIGHP,			UINT_VEC_FUNCS(divVecScalar));
15433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (isNormalOp)
15453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			binaryOpGroup
15463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(divName,	divOp,	FV,		Value(F,   -1.0f,    1.0f),		Value(FV,  -2.0f, -0.5f),	notUsed,	1.0f,	0.0f,	PRECMASK_ALL,			FLOAT_VEC_FUNCS(divScalarVec))
15473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(divName,	divOp,	IV,		Value(I,   24.0f,    24.0f),	Value(IV,  -4.0f, -1.0f),	notUsed,	0.04f,	1.0f,	PRECMASK_LOWP_MEDIUMP,	INT_VEC_FUNCS(divScalarVec))
15483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(divName,	divOp,	IV,		Value(I,   40320.0f, 40320.0f),	Value(IV,  -8.0f, -1.0f),	notUsed,	1e-5f,	0.5f,	PRECMASK_HIGHP,			INT_VEC_FUNCS(divScalarVec))
15493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(divName,	divOp,	UV,		Value(U,    0.0f,    24.0f),	Value(UV,   1.0f,  4.0f),	notUsed,	0.04f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_VEC_FUNCS(divScalarVec))
15503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(divName,	divOp,	UV,		Value(U,    0.0f,    40320.0f),	Value(UV,   1.0f,  8.0f),	notUsed,	1e-5f,	0.0f,	PRECMASK_HIGHP,			UINT_VEC_FUNCS(divScalarVec));
15513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// The modulus operator.
15533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		binaryOpGroup
15553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(modName,	modOp,	IGT,	Value(IGT,  0.0f, 6.0f),	Value(IGT,   1.1f,  6.1f),	notUsed,	0.25f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_GENTYPE_FUNCS(mod))
15563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(modName,	modOp,	IGT,	Value(IGT,  0.0f, 14.0f),	Value(IGT,   1.1f, 11.1f),	notUsed,	0.1f,	0.5f,	PRECMASK_HIGHP,			INT_GENTYPE_FUNCS(mod))
15573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(modName,	modOp,	UGT,	Value(UGT,  0.0f, 6.0f),	Value(UGT,   1.1f,  6.1f),	notUsed,	0.25f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_GENTYPE_FUNCS(mod))
15583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(modName,	modOp,	UGT,	Value(UGT,  0.0f, 24.0f),	Value(UGT,   1.1f, 11.1f),	notUsed,	0.1f,	0.0f,	PRECMASK_HIGHP,			UINT_GENTYPE_FUNCS(mod))
15593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(modName,	modOp,	IV,		Value(IV,   0.0f, 6.0f),	Value(I,     1.1f,  6.1f),	notUsed,	0.25f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_VEC_FUNCS(modVecScalar))
15603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(modName,	modOp,	IV,		Value(IV,   0.0f, 6.0f),	Value(I,     1.1f, 11.1f),	notUsed,	0.1f,	0.5f,	PRECMASK_HIGHP,			INT_VEC_FUNCS(modVecScalar))
15613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(modName,	modOp,	UV,		Value(UV,   0.0f, 6.0f),	Value(U,     1.1f,  6.1f),	notUsed,	0.25f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_VEC_FUNCS(modVecScalar))
15623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(modName,	modOp,	UV,		Value(UV,   0.0f, 24.0f),	Value(U,     1.1f, 11.1f),	notUsed,	0.1f,	0.0f,	PRECMASK_HIGHP,			UINT_VEC_FUNCS(modVecScalar));
15633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (isNormalOp)
15653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			binaryOpGroup
15663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(modName,	modOp,	IV,		Value(I,   0.0f, 6.0f),		Value(IV,     1.1f,  6.1f),	notUsed,	0.25f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_VEC_FUNCS(modScalarVec))
15673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(modName,	modOp,	IV,		Value(I,   0.0f, 6.0f),		Value(IV,     1.1f, 11.1f),	notUsed,	0.1f,	0.5f,	PRECMASK_HIGHP,			INT_VEC_FUNCS(modScalarVec))
15683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(modName,	modOp,	UV,		Value(U,   0.0f, 6.0f),		Value(UV,     1.1f,  6.1f),	notUsed,	0.25f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_VEC_FUNCS(modScalarVec))
15693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(modName,	modOp,	UV,		Value(U,   0.0f, 24.0f),	Value(UV,     1.1f, 11.1f),	notUsed,	0.1f,	0.0f,	PRECMASK_HIGHP,			UINT_VEC_FUNCS(modScalarVec));
15703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// The bitwise and operator.
15723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		binaryOpGroup
15743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(andName,	andOp,	IGT,	Value(IGT, -16.0f, 16.0f),	Value(IGT, -16.0f, 16.0f),	notUsed,	 0.03f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_GENTYPE_FUNCS(bitwiseAnd))
15753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(andName,	andOp,	IGT,	Value(IGT,  -2e9f,  2e9f),	Value(IGT,  -2e9f,  2e9f),	notUsed,	4e-10f,	0.5f,	PRECMASK_HIGHP,			INT_GENTYPE_FUNCS(bitwiseAnd))
15763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(andName,	andOp,	UGT,	Value(UGT,   0.0f, 32.0f),	Value(UGT,   0.0f, 32.0f),	notUsed,	 0.03f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_GENTYPE_FUNCS(bitwiseAnd))
15773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(andName,	andOp,	UGT,	Value(UGT,   0.0f,  4e9f),	Value(UGT,   0.0f,  4e9f),	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,			UINT_GENTYPE_FUNCS(bitwiseAnd))
15783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(andName,	andOp,	IV,		Value(IV, -16.0f, 16.0f),	Value(I, -16.0f, 16.0f),	notUsed,	 0.03f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_VEC_FUNCS(bitwiseAndVecScalar))
15793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(andName,	andOp,	IV,		Value(IV,  -2e9f,  2e9f),	Value(I,  -2e9f,  2e9f),	notUsed,	4e-10f,	0.5f,	PRECMASK_HIGHP,			INT_VEC_FUNCS(bitwiseAndVecScalar))
15803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(andName,	andOp,	UV,		Value(UV,   0.0f, 32.0f),	Value(U,   0.0f, 32.0f),	notUsed,	 0.03f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_VEC_FUNCS(bitwiseAndVecScalar))
15813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(andName,	andOp,	UV,		Value(UV,   0.0f,  4e9f),	Value(U,   0.0f,  4e9f),	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,			UINT_VEC_FUNCS(bitwiseAndVecScalar));
15823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (isNormalOp)
15843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			binaryOpGroup
15853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(andName,	andOp,	IV,		Value(I, -16.0f, 16.0f),	Value(IV, -16.0f, 16.0f),	notUsed,	 0.03f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_VEC_FUNCS(bitwiseAndScalarVec))
15863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(andName,	andOp,	IV,		Value(I,  -2e9f,  2e9f),	Value(IV,  -2e9f,  2e9f),	notUsed,	4e-10f,	0.5f,	PRECMASK_HIGHP,			INT_VEC_FUNCS(bitwiseAndScalarVec))
15873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(andName,	andOp,	UV,		Value(U,   0.0f, 32.0f),	Value(UV,   0.0f, 32.0f),	notUsed,	 0.03f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_VEC_FUNCS(bitwiseAndScalarVec))
15883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(andName,	andOp,	UV,		Value(U,   0.0f,  4e9f),	Value(UV,   0.0f,  4e9f),	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,			UINT_VEC_FUNCS(bitwiseAndScalarVec));
15893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// The bitwise or operator.
15913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		binaryOpGroup
15933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(orName,	orOp,	IGT,	Value(IGT, -16.0f, 16.0f),	Value(IGT, -16.0f, 16.0f),	notUsed,	 0.03f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_GENTYPE_FUNCS(bitwiseOr))
15943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(orName,	orOp,	IGT,	Value(IGT,  -2e9f,  2e9f),	Value(IGT,  -2e9f,  2e9f),	notUsed,	4e-10f,	0.5f,	PRECMASK_HIGHP,			INT_GENTYPE_FUNCS(bitwiseOr))
15953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(orName,	orOp,	UGT,	Value(UGT,   0.0f, 32.0f),	Value(UGT,   0.0f, 32.0f),	notUsed,	 0.03f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_GENTYPE_FUNCS(bitwiseOr))
15963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(orName,	orOp,	UGT,	Value(UGT,   0.0f,  4e9f),	Value(UGT,   0.0f,  4e9f),	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,			UINT_GENTYPE_FUNCS(bitwiseOr))
15973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(orName,	orOp,	IV,		Value(IV, -16.0f, 16.0f),	Value(I, -16.0f, 16.0f),	notUsed,	 0.03f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_VEC_FUNCS(bitwiseOrVecScalar))
15983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(orName,	orOp,	IV,		Value(IV,  -2e9f,  2e9f),	Value(I,  -2e9f,  2e9f),	notUsed,	4e-10f,	0.5f,	PRECMASK_HIGHP,			INT_VEC_FUNCS(bitwiseOrVecScalar))
15993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(orName,	orOp,	UV,		Value(UV,   0.0f, 32.0f),	Value(U,   0.0f, 32.0f),	notUsed,	 0.03f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_VEC_FUNCS(bitwiseOrVecScalar))
16003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(orName,	orOp,	UV,		Value(UV,   0.0f,  4e9f),	Value(U,   0.0f,  4e9f),	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,			UINT_VEC_FUNCS(bitwiseOrVecScalar));
16013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (isNormalOp)
16033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			binaryOpGroup
16043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(orName,	orOp,	IV,		Value(I, -16.0f, 16.0f),	Value(IV, -16.0f, 16.0f),	notUsed,	 0.03f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_VEC_FUNCS(bitwiseOrScalarVec))
16053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(orName,	orOp,	IV,		Value(I,  -2e9f,  2e9f),	Value(IV,  -2e9f,  2e9f),	notUsed,	4e-10f,	0.5f,	PRECMASK_HIGHP,			INT_VEC_FUNCS(bitwiseOrScalarVec))
16063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(orName,	orOp,	UV,		Value(U,   0.0f, 32.0f),	Value(UV,   0.0f, 32.0f),	notUsed,	 0.03f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_VEC_FUNCS(bitwiseOrScalarVec))
16073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(orName,	orOp,	UV,		Value(U,   0.0f,  4e9f),	Value(UV,   0.0f,  4e9f),	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,			UINT_VEC_FUNCS(bitwiseOrScalarVec));
16083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// The bitwise xor operator.
16103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		binaryOpGroup
16123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(xorName,	xorOp,	IGT,	Value(IGT, -16.0f, 16.0f),	Value(IGT, -16.0f, 16.0f),	notUsed,	 0.03f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_GENTYPE_FUNCS(bitwiseXor))
16133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(xorName,	xorOp,	IGT,	Value(IGT,  -2e9f,  2e9f),	Value(IGT,  -2e9f,  2e9f),	notUsed,	4e-10f,	0.5f,	PRECMASK_HIGHP,			INT_GENTYPE_FUNCS(bitwiseXor))
16143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(xorName,	xorOp,	UGT,	Value(UGT,   0.0f, 32.0f),	Value(UGT,   0.0f, 32.0f),	notUsed,	 0.03f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_GENTYPE_FUNCS(bitwiseXor))
16153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(xorName,	xorOp,	UGT,	Value(UGT,   0.0f,  4e9f),	Value(UGT,   0.0f,  4e9f),	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,			UINT_GENTYPE_FUNCS(bitwiseXor))
16163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(xorName,	xorOp,	IV,		Value(IV, -16.0f, 16.0f),	Value(I, -16.0f, 16.0f),	notUsed,	 0.03f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_VEC_FUNCS(bitwiseXorVecScalar))
16173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(xorName,	xorOp,	IV,		Value(IV,  -2e9f,  2e9f),	Value(I,  -2e9f,  2e9f),	notUsed,	4e-10f,	0.5f,	PRECMASK_HIGHP,			INT_VEC_FUNCS(bitwiseXorVecScalar))
16183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(xorName,	xorOp,	UV,		Value(UV,   0.0f, 32.0f),	Value(U,   0.0f, 32.0f),	notUsed,	 0.03f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_VEC_FUNCS(bitwiseXorVecScalar))
16193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< operInfoFunc(xorName,	xorOp,	UV,		Value(UV,   0.0f,  4e9f),	Value(U,   0.0f,  4e9f),	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,			UINT_VEC_FUNCS(bitwiseXorVecScalar));
16203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (isNormalOp)
16223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			binaryOpGroup
16233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(xorName,	xorOp,	IV,		Value(I, -16.0f, 16.0f),	Value(IV, -16.0f, 16.0f),	notUsed,	 0.03f,	0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_VEC_FUNCS(bitwiseXorScalarVec))
16243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(xorName,	xorOp,	IV,		Value(I,  -2e9f,  2e9f),	Value(IV,  -2e9f,  2e9f),	notUsed,	4e-10f,	0.5f,	PRECMASK_HIGHP,			INT_VEC_FUNCS(bitwiseXorScalarVec))
16253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(xorName,	xorOp,	UV,		Value(U,   0.0f, 32.0f),	Value(UV,   0.0f, 32.0f),	notUsed,	 0.03f,	0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_VEC_FUNCS(bitwiseXorScalarVec))
16263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(xorName,	xorOp,	UV,		Value(U,   0.0f,  4e9f),	Value(UV,   0.0f,  4e9f),	notUsed,	2e-10f,	0.0f,	PRECMASK_HIGHP,			UINT_VEC_FUNCS(bitwiseXorScalarVec));
16273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// The left shift operator. Second operand (shift amount) can be either int or uint, even for uint and int first operand, respectively.
16293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int isSignedAmount = 0; isSignedAmount <= 1; isSignedAmount++)
16313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
16323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			ValueType gType = isSignedAmount == 0 ? UGT	: IGT;
16333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			ValueType sType = isSignedAmount == 0 ? U	: I;
16343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			binaryOpGroup
16353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(leftShiftName,	leftShiftOp,	IGT,	Value(IGT, -7.0f, 7.0f),	Value(gType, 0.0f, 4.0f),	notUsed,	4e-3f,  0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_GENTYPE_FUNCS(leftShift))
16363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(leftShiftName,	leftShiftOp,	IGT,	Value(IGT, -7.0f, 7.0f),	Value(gType, 0.0f, 27.0f),	notUsed,	5e-10f, 0.5f,	PRECMASK_HIGHP,			INT_GENTYPE_FUNCS(leftShift))
16373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(leftShiftName,	leftShiftOp,	UGT,	Value(UGT,  0.0f, 7.0f),	Value(gType, 0.0f, 5.0f),	notUsed,	4e-3f,  0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_GENTYPE_FUNCS(leftShift))
16383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(leftShiftName,	leftShiftOp,	UGT,	Value(UGT,  0.0f, 7.0f),	Value(gType, 0.0f, 28.0f),	notUsed,	5e-10f, 0.0f,	PRECMASK_HIGHP,			UINT_GENTYPE_FUNCS(leftShift))
16393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(leftShiftName,	leftShiftOp,	IV,		Value(IV,  -7.0f, 7.0f),	Value(sType, 0.0f, 4.0f),	notUsed,	4e-3f,  0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_VEC_FUNCS(leftShiftVecScalar))
16403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(leftShiftName,	leftShiftOp,	IV,		Value(IV,  -7.0f, 7.0f),	Value(sType, 0.0f, 27.0f),	notUsed,	5e-10f, 0.5f,	PRECMASK_HIGHP,			INT_VEC_FUNCS(leftShiftVecScalar))
16413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(leftShiftName,	leftShiftOp,	UV,		Value(UV,   0.0f, 7.0f),	Value(sType, 0.0f, 5.0f),	notUsed,	4e-3f,  0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_VEC_FUNCS(leftShiftVecScalar))
16423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(leftShiftName,	leftShiftOp,	UV,		Value(UV,   0.0f, 7.0f),	Value(sType, 0.0f, 28.0f),	notUsed,	5e-10f, 0.0f,	PRECMASK_HIGHP,			UINT_VEC_FUNCS(leftShiftVecScalar));
16433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
16443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// The right shift operator. Second operand (shift amount) can be either int or uint, even for uint and int first operand, respectively.
16463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int isSignedAmount = 0; isSignedAmount <= 1; isSignedAmount++)
16483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
16493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			ValueType gType = isSignedAmount == 0 ? UGT	: IGT;
16503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			ValueType sType = isSignedAmount == 0 ? U	: I;
16513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			binaryOpGroup
16523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(rightShiftName,	rightShiftOp,	IGT,	Value(IGT, -127.0f, 127.0f),	Value(gType, 0.0f, 8.0f),	notUsed,	4e-3f,  0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_GENTYPE_FUNCS(rightShift))
16533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(rightShiftName,	rightShiftOp,	IGT,	Value(IGT, -2e9f, 2e9f),		Value(gType, 0.0f, 31.0f),	notUsed,	5e-10f, 0.5f,	PRECMASK_HIGHP,			INT_GENTYPE_FUNCS(rightShift))
16543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(rightShiftName,	rightShiftOp,	UGT,	Value(UGT,  0.0f, 255.0f),		Value(gType, 0.0f, 8.0f),	notUsed,	4e-3f,  0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_GENTYPE_FUNCS(rightShift))
16553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(rightShiftName,	rightShiftOp,	UGT,	Value(UGT,  0.0f, 4e9f),		Value(gType, 0.0f, 31.0f),	notUsed,	5e-10f, 0.0f,	PRECMASK_HIGHP,			UINT_GENTYPE_FUNCS(rightShift))
16563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(rightShiftName,	rightShiftOp,	IV,		Value(IV,  -127.0f, 127.0f),	Value(sType, 0.0f, 8.0f),	notUsed,	4e-3f,  0.5f,	PRECMASK_LOWP_MEDIUMP,	INT_VEC_FUNCS(rightShiftVecScalar))
16573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(rightShiftName,	rightShiftOp,	IV,		Value(IV,  -2e9f, 2e9f),		Value(sType, 0.0f, 31.0f),	notUsed,	5e-10f, 0.5f,	PRECMASK_HIGHP,			INT_VEC_FUNCS(rightShiftVecScalar))
16583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(rightShiftName,	rightShiftOp,	UV,		Value(UV,   0.0f, 255.0f),		Value(sType, 0.0f, 8.0f),	notUsed,	4e-3f,  0.0f,	PRECMASK_LOWP_MEDIUMP,	UINT_VEC_FUNCS(rightShiftVecScalar))
16593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< operInfoFunc(rightShiftName,	rightShiftOp,	UV,		Value(UV,   0.0f, 4e9f),		Value(sType, 0.0f, 31.0f),	notUsed,	5e-10f, 0.0f,	PRECMASK_HIGHP,			UINT_VEC_FUNCS(rightShiftVecScalar));
16603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
16613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
16623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Rest of binary operators.
16643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	binaryOpGroup
16663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Scalar relational operators.
16673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("less",				"<",	B,		Value(F,   -1.0f, 1.0f),	Value(F,   -1.0f, 1.0f),	notUsed,	1.0f, 0.0f,		PRECMASK_ALL,	eval_lessThan_float,			DE_NULL, DE_NULL, DE_NULL)
16683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("less",				"<",	B,		Value(I,   -5.0f, 5.0f),	Value(I,   -5.0f, 5.0f),	notUsed,	1.0f, 0.0f,		PRECMASK_ALL,	eval_lessThan_int,				DE_NULL, DE_NULL, DE_NULL)
16693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("less",				"<",	B,		Value(U,    0.0f, 16.0f),	Value(U,    0.0f, 16.0f),	notUsed,	1.0f, 0.0f,		PRECMASK_ALL,	eval_lessThan_uint,				DE_NULL, DE_NULL, DE_NULL)
16703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("less_or_equal",		"<=",	B,		Value(F,   -1.0f, 1.0f),	Value(F,   -1.0f, 1.0f),	notUsed,	1.0f, 0.0f,		PRECMASK_ALL,	eval_lessThanEqual_float,		DE_NULL, DE_NULL, DE_NULL)
16713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("less_or_equal",		"<=",	B,		Value(I,   -5.0f, 5.0f),	Value(I,   -5.0f, 5.0f),	notUsed,	1.0f, 0.0f,		PRECMASK_ALL,	eval_lessThanEqual_int,			DE_NULL, DE_NULL, DE_NULL)
16723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("less_or_equal",		"<=",	B,		Value(U,    0.0f, 16.0f),	Value(U,    0.0f, 16.0f),	notUsed,	1.0f, 0.0f,		PRECMASK_ALL,	eval_lessThanEqual_uint,		DE_NULL, DE_NULL, DE_NULL)
16733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("greater",			">",	B,		Value(F,   -1.0f, 1.0f),	Value(F,   -1.0f, 1.0f),	notUsed,	1.0f, 0.0f,		PRECMASK_ALL,	eval_greaterThan_float,			DE_NULL, DE_NULL, DE_NULL)
16743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("greater",			">",	B,		Value(I,   -5.0f, 5.0f),	Value(I,   -5.0f, 5.0f),	notUsed,	1.0f, 0.0f,		PRECMASK_ALL,	eval_greaterThan_int,			DE_NULL, DE_NULL, DE_NULL)
16753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("greater",			">",	B,		Value(U,    0.0f, 16.0f),	Value(U,    0.0f, 16.0f),	notUsed,	1.0f, 0.0f,		PRECMASK_ALL,	eval_greaterThan_uint,			DE_NULL, DE_NULL, DE_NULL)
16763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("greater_or_equal",	">=",	B,		Value(F,   -1.0f, 1.0f),	Value(F,   -1.0f, 1.0f),	notUsed,	1.0f, 0.0f,		PRECMASK_ALL,	eval_greaterThanEqual_float,	DE_NULL, DE_NULL, DE_NULL)
16773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("greater_or_equal",	">=",	B,		Value(I,   -5.0f, 5.0f),	Value(I,   -5.0f, 5.0f),	notUsed,	1.0f, 0.0f,		PRECMASK_ALL,	eval_greaterThanEqual_int,		DE_NULL, DE_NULL, DE_NULL)
16783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("greater_or_equal",	">=",	B,		Value(U,    0.0f, 16.0f),	Value(U,    0.0f, 16.0f),	notUsed,	1.0f, 0.0f,		PRECMASK_ALL,	eval_greaterThanEqual_uint,		DE_NULL, DE_NULL, DE_NULL)
16793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Equality comparison operators.
16813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("equal",				"==",	B,		Value(GT,  -1.0f, 1.0f),	Value(GT,  -1.0f, 1.0f),	notUsed,	1.0f, 0.0f,		PRECMASK_ALL,	FLOAT_GENTYPE_FUNCS(allEqual))
16823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("equal",				"==",	B,		Value(IGT, -5.5f, 4.7f),	Value(IGT, -2.1f, 0.1f),	notUsed,	1.0f, 0.0f,		PRECMASK_ALL,	INT_GENTYPE_FUNCS(allEqual))
16833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("equal",				"==",	B,		Value(UGT,  0.0f, 8.0f),	Value(UGT,  3.5f, 4.5f),	notUsed,	1.0f, 0.0f,		PRECMASK_ALL,	UINT_GENTYPE_FUNCS(allEqual))
16843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("equal",				"==",	B,		Value(BGT, -2.1f, 2.1f),	Value(BGT, -1.1f, 3.0f),	notUsed,	1.0f, 0.0f,		PRECMASK_NA,	BOOL_GENTYPE_FUNCS(allEqual))
16853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("not_equal",			"!=",	B,		Value(GT,  -1.0f, 1.0f),	Value(GT,  -1.0f, 1.0f),	notUsed,	1.0f, 0.0f,		PRECMASK_ALL,	FLOAT_GENTYPE_FUNCS(anyNotEqual))
16863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("not_equal",			"!=",	B,		Value(IGT, -5.5f, 4.7f),	Value(IGT, -2.1f, 0.1f),	notUsed,	1.0f, 0.0f,		PRECMASK_ALL,	INT_GENTYPE_FUNCS(anyNotEqual))
16873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("not_equal",			"!=",	B,		Value(UGT,  0.0f, 8.0f),	Value(UGT,  3.5f, 4.5f),	notUsed,	1.0f, 0.0f,		PRECMASK_ALL,	UINT_GENTYPE_FUNCS(anyNotEqual))
16883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("not_equal",			"!=",	B,		Value(BGT, -2.1f, 2.1f),	Value(BGT, -1.1f, 3.0f),	notUsed,	1.0f, 0.0f,		PRECMASK_NA,	BOOL_GENTYPE_FUNCS(anyNotEqual))
16893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Logical operators.
16913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("logical_and",	"&&",	B,	Value(B, -1.0f, 1.0f),	Value(B, -1.0f, 1.0f),	notUsed,	1.0f, 0.0f,		PRECMASK_NA,	BOOL_FUNCS(logicalAnd))
16923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("logical_or",	"||",	B,	Value(B, -1.0f, 1.0f),	Value(B, -1.0f, 1.0f),	notUsed,	1.0f, 0.0f,		PRECMASK_NA,	BOOL_FUNCS(logicalOr))
16933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinOperInfo("logical_xor",	"^^",	B,	Value(B, -1.0f, 1.0f),	Value(B, -1.0f, 1.0f),	notUsed,	1.0f, 0.0f,		PRECMASK_NA,	BOOL_FUNCS(logicalXor));
16943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	funcInfoGroups.push_back(binaryOpGroup);
16963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// 8.1 Angle and Trigonometry Functions.
16983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	funcInfoGroups.push_back(
16993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		BuiltinFuncGroup("angle_and_trigonometry", "Angle and trigonometry function tests.")
17003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("radians",		"radians",		GT,	Value(GT, -1.0f, 1.0f),		notUsed,					notUsed,					25.0f, 0.5f,	PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(radians) )
17013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("degrees",		"degrees",		GT,	Value(GT, -1.0f, 1.0f),		notUsed,					notUsed,					0.04f, 0.5f,	PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(degrees) )
17023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("sin",			"sin",			GT,	Value(GT, -5.0f, 5.0f),		notUsed,					notUsed,					0.5f, 0.5f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(sin) )
17033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("sin",			"sin",			GT,	Value(GT, -1.5f, 1.5f),		notUsed,					notUsed,					0.5f, 0.5f,		PRECMASK_LOWP,				FLOAT_GENTYPE_FUNCS(sin) )
17043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("cos",			"cos",			GT,	Value(GT, -5.0f, 5.0f),		notUsed,					notUsed,					0.5f, 0.5f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(cos) )
17053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("cos",			"cos",			GT,	Value(GT, -1.5f, 1.5f),		notUsed,					notUsed,					0.5f, 0.5f,		PRECMASK_LOWP,				FLOAT_GENTYPE_FUNCS(cos) )
17063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("tan",			"tan",			GT,	Value(GT, -5.0f, 5.0f),		notUsed,					notUsed,					0.5f, 0.5f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(tan) )
17073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("tan",			"tan",			GT,	Value(GT, -1.5f, 5.5f),		notUsed,					notUsed,					0.5f, 0.5f,		PRECMASK_LOWP,				FLOAT_GENTYPE_FUNCS(tan) )
17083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("asin",			"asin",			GT,	Value(GT, -1.0f, 1.0f),		notUsed,					notUsed,					1.0f, 0.0f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(asin) )
17093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("acos",			"acos",			GT,	Value(GT, -1.0f, 1.0f),		notUsed,					notUsed,					1.0f, 0.0f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(acos) )
17103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("atan",			"atan",			GT,	Value(GT, -4.0f, 4.0f),		notUsed,					notUsed,					0.5f, 0.5f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(atan) )
17113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("atan2",			"atan",			GT,	Value(GT, -4.0f, 4.0f),		Value(GT, 0.5f, 2.0f),		notUsed,					0.5f, 0.5f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(atan2) )
17123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("sinh",			"sinh",			GT,	Value(GT, -5.0f, 5.0f),		notUsed,					notUsed,					0.5f, 0.5f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(sinh) )
17133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("sinh",			"sinh",			GT,	Value(GT, -1.5f, 1.5f),		notUsed,					notUsed,					0.5f, 0.5f,		PRECMASK_LOWP,				FLOAT_GENTYPE_FUNCS(sinh) )
17143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("cosh",			"cosh",			GT,	Value(GT, -5.0f, 5.0f),		notUsed,					notUsed,					0.5f, 0.5f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(cosh) )
17153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("cosh",			"cosh",			GT,	Value(GT, -1.5f, 1.5f),		notUsed,					notUsed,					0.5f, 0.5f,		PRECMASK_LOWP,				FLOAT_GENTYPE_FUNCS(cosh) )
17163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("tanh",			"tanh",			GT,	Value(GT, -5.0f, 5.0f),		notUsed,					notUsed,					0.5f, 0.5f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(tanh) )
17173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("tanh",			"tanh",			GT,	Value(GT, -1.5f, 5.5f),		notUsed,					notUsed,					0.5f, 0.5f,		PRECMASK_LOWP,				FLOAT_GENTYPE_FUNCS(tanh) )
17183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("asinh",			"asinh",		GT,	Value(GT, -1.0f, 1.0f),		notUsed,					notUsed,					1.0f, 0.0f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(asinh) )
17193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("acosh",			"acosh",		GT,	Value(GT, 1.0f, 2.2f),		notUsed,					notUsed,					1.0f, 0.0f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(acosh) )
17203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("atanh",			"atanh",		GT,	Value(GT, -1.0f, 1.0f),		notUsed,					notUsed,					1.0f, 0.0f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(atanh) )
17213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	);
17223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// 8.2 Exponential Functions.
17243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	funcInfoGroups.push_back(
17253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		BuiltinFuncGroup("exponential", "Exponential function tests")
17263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("pow",			"pow",			GT,	Value(GT, 0.1f, 8.0f),		Value(GT, -4.0f, 2.0f),		notUsed,					1.0f, 0.0f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(pow) )
17273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("exp",			"exp",			GT,	Value(GT, -6.0f, 3.0f),		notUsed,					notUsed,					0.5f, 0.0f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(exp) )
17283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("log",			"log",			GT,	Value(GT, 0.1f, 10.0f),		notUsed,					notUsed,					0.5f, 0.3f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(log) )
17293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("exp2",			"exp2",			GT,	Value(GT, -7.0f, 2.0f),		notUsed,					notUsed,					1.0f, 0.0f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(exp2) )
17303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("log2",			"log2",			GT,	Value(GT, 0.1f, 10.0f),		notUsed,					notUsed,					1.0f, 0.0f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(log2) )
17313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("sqrt",			"sqrt",			GT,	Value(GT, 0.0f, 10.0f),		notUsed,					notUsed,					0.3f, 0.0f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(sqrt) )
17323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("inversesqrt",	"inversesqrt",	GT,	Value(GT, 0.5f, 10.0f),		notUsed,					notUsed,					1.0f, 0.0f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(inverseSqrt) )
17333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	);
17343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// 8.3 Common Functions.
17363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	funcInfoGroups.push_back(
17373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		BuiltinFuncGroup("common_functions", "Common function tests.")
17383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("abs",			"abs",			GT,	Value(GT, -2.0f, 2.0f),		notUsed,					notUsed,					0.5f, 0.5f,		PRECMASK_ALL,				FLOAT_GENTYPE_FUNCS(abs) )
17393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("sign",			"sign",			GT,	Value(GT, -1.5f, 1.5f),		notUsed,					notUsed,					0.3f, 0.5f,		PRECMASK_ALL,				FLOAT_GENTYPE_FUNCS(sign) )
17403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("floor",			"floor",		GT,	Value(GT, -2.5f, 2.5f),		notUsed,					notUsed,					0.2f, 0.7f,		PRECMASK_ALL,				FLOAT_GENTYPE_FUNCS(floor) )
17413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("trunc",			"trunc",		GT,	Value(GT, -2.5f, 2.5f),		notUsed,					notUsed,					0.2f, 0.7f,		PRECMASK_ALL,				FLOAT_GENTYPE_FUNCS(trunc) )
17423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("round",			"round",		GT,	Value(GT, -2.5f, 2.5f),		notUsed,					notUsed,					0.2f, 0.7f,		PRECMASK_ALL,				FLOAT_GENTYPE_FUNCS(roundToEven) )
17433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("roundEven",		"roundEven",	GT,	Value(GT, -2.5f, 2.5f),		notUsed,					notUsed,					0.2f, 0.7f,		PRECMASK_ALL,				FLOAT_GENTYPE_FUNCS(roundToEven) )
17443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("ceil",			"ceil",			GT,	Value(GT, -2.5f, 2.5f),		notUsed,					notUsed,					0.2f, 0.5f,		PRECMASK_ALL,				FLOAT_GENTYPE_FUNCS(ceil) )
17453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("fract",			"fract",		GT,	Value(GT, -1.5f, 1.5f),		notUsed,					notUsed,					0.8f, 0.1f,		PRECMASK_ALL,				FLOAT_GENTYPE_FUNCS(fract) )
17463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("mod",			"mod",			GT,	Value(GT, -2.0f, 2.0f),		Value(GT, 0.9f, 6.0f),		notUsed,					0.5f, 0.5f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(mod) )
17473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("mod",			"mod",			GT,	Value(FV, -2.0f, 2.0f),		Value(F, 0.9f, 6.0f),		notUsed,					0.5f, 0.5f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_VEC_FUNCS(modVecScalar) )
17483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("min",			"min",			GT,	Value(GT, -1.0f, 1.0f),		Value(GT, -1.0f, 1.0f),		notUsed,					0.5f, 0.5f,		PRECMASK_ALL,				FLOAT_GENTYPE_FUNCS(min) )
17493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("min",			"min",			GT,	Value(FV, -1.0f, 1.0f),		Value(F, -1.0f, 1.0f),		notUsed,					0.5f, 0.5f,		PRECMASK_ALL,				FLOAT_VEC_FUNCS(minVecScalar) )
17503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("min",			"min",			IGT,Value(IGT, -4.0f, 4.0f),	Value(IGT, -4.0f, 4.0f),	notUsed,					0.125f, 0.5f,	PRECMASK_ALL,				INT_GENTYPE_FUNCS(min) )
17513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("min",			"min",			IGT,Value(IV,  -4.0f, 4.0f),	Value(I, -4.0f, 4.0f),		notUsed,					0.125f, 0.5f,	PRECMASK_ALL,				INT_VEC_FUNCS(minVecScalar) )
17523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("min",			"min",			UGT,Value(UGT, 0.0f, 8.0f),		Value(UGT, 0.0f, 8.0f),		notUsed,					0.125f, 0.0f,	PRECMASK_ALL,				UINT_GENTYPE_FUNCS(min) )
17533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("min",			"min",			UGT,Value(UV,  0.0f, 8.0f),		Value(U, 0.0f, 8.0f),		notUsed,					0.125f, 0.0f,	PRECMASK_ALL,				UINT_VEC_FUNCS(minVecScalar) )
17543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("max",			"max",			GT,	Value(GT, -1.0f, 1.0f),		Value(GT, -1.0f, 1.0f),		notUsed,					0.5f, 0.5f,		PRECMASK_ALL,				FLOAT_GENTYPE_FUNCS(max) )
17553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("max",			"max",			GT,	Value(FV, -1.0f, 1.0f),		Value(F, -1.0f, 1.0f),		notUsed,					0.5f, 0.5f,		PRECMASK_ALL,				FLOAT_VEC_FUNCS(maxVecScalar) )
17563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("max",			"max",			IGT,Value(IGT, -4.0f, 4.0f),	Value(IGT, -4.0f, 4.0f),	notUsed,					0.125f, 0.5f,	PRECMASK_ALL,				INT_GENTYPE_FUNCS(max) )
17573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("max",			"max",			IGT,Value(IV,  -4.0f, 4.0f),	Value(I, -4.0f, 4.0f),		notUsed,					0.125f, 0.5f,	PRECMASK_ALL,				INT_VEC_FUNCS(maxVecScalar) )
17583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("max",			"max",			UGT,Value(UGT, 0.0f, 8.0f),		Value(UGT, 0.0f, 8.0f),		notUsed,					0.125f, 0.0f,	PRECMASK_ALL,				UINT_GENTYPE_FUNCS(max) )
17593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("max",			"max",			UGT,Value(UV,  0.0f, 8.0f),		Value(U, 0.0f, 8.0f),		notUsed,					0.125f, 0.0f,	PRECMASK_ALL,				UINT_VEC_FUNCS(maxVecScalar) )
17603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("clamp",			"clamp",		GT,	Value(GT, -1.0f, 1.0f),		Value(GT, -0.5f, 0.5f),		Value(GT, 0.5f, 1.0f),		0.5f, 0.5f,		PRECMASK_ALL,				FLOAT_GENTYPE_FUNCS(clamp) )
17613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("clamp",			"clamp",		GT,	Value(FV, -1.0f, 1.0f),		Value(F, -0.5f, 0.5f),		Value(F, 0.5f, 1.0f),		0.5f, 0.5f,		PRECMASK_ALL,				FLOAT_VEC_FUNCS(clampVecScalarScalar) )
17623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("clamp",			"clamp",		IGT,Value(IGT, -4.0f, 4.0f),	Value(IGT, -2.0f, 2.0f),	Value(IGT, 2.0f, 4.0f),		0.125f, 0.5f,	PRECMASK_ALL,				INT_GENTYPE_FUNCS(clamp) )
17633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("clamp",			"clamp",		IGT,Value(IV,  -4.0f, 4.0f),	Value(I, -2.0f, 2.0f),		Value(I, 2.0f, 4.0f),		0.125f, 0.5f,	PRECMASK_ALL,				INT_VEC_FUNCS(clampVecScalarScalar) )
17643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("clamp",			"clamp",		UGT,Value(UGT, 0.0f, 8.0f),		Value(UGT, 2.0f, 6.0f),		Value(UGT, 6.0f, 8.0f),		0.125f, 0.0f,	PRECMASK_ALL,				UINT_GENTYPE_FUNCS(clamp) )
17653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("clamp",			"clamp",		UGT,Value(UV,  0.0f, 8.0f),		Value(U,   2.0f, 6.0f),		Value(U, 6.0f, 8.0f),		0.125f, 0.0f,	PRECMASK_ALL,				UINT_VEC_FUNCS(clampVecScalarScalar) )
17663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("mix",			"mix",			GT,	Value(GT, -1.0f, 1.0f),		Value(GT, -1.0f, 1.0f),		Value(GT, 0.0f, 1.0f),		0.5f, 0.5f,		PRECMASK_ALL,				FLOAT_GENTYPE_FUNCS(mix) )
17673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("mix",			"mix",			GT,	Value(FV, -1.0f, 1.0f),		Value(FV, -1.0f, 1.0f),		Value(F, 0.0f, 1.0f),		0.5f, 0.5f,		PRECMASK_ALL,				FLOAT_VEC_FUNCS(mixVecVecScalar) )
17683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("step",			"step",			GT,	Value(GT, -1.0f, 1.0f),		Value(GT, -1.0f, 0.0f),		notUsed,					0.5f, 0.25f,	PRECMASK_ALL,				FLOAT_GENTYPE_FUNCS(step) )
17693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("step",			"step",			GT,	Value(F, -1.0f, 1.0f),		Value(FV, -1.0f, 0.0f),		notUsed,					0.5f, 0.25f,	PRECMASK_ALL,				FLOAT_VEC_FUNCS(stepScalarVec) )
17703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("smoothstep",	"smoothstep",	GT,	Value(GT, -0.5f, 0.0f),		Value(GT, 0.1f, 1.0f),		Value(GT, -1.0f, 1.0f),		0.5f, 0.5f,		PRECMASK_ALL,				FLOAT_GENTYPE_FUNCS(smoothStep) )
17713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("smoothstep",	"smoothstep",	GT,	Value(F, -0.5f, 0.0f),		Value(F, 0.1f, 1.0f),		Value(FV, -1.0f, 1.0f),		0.5f, 0.5f,		PRECMASK_ALL,				FLOAT_VEC_FUNCS(smoothStepScalarScalarVec) )
17723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	);
17733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// 8.4 Geometric Functions.
17753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	funcInfoGroups.push_back(
17763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		BuiltinFuncGroup("geometric", "Geometric function tests.")
17773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("length",		"length",		F,	Value(GT, -5.0f, 5.0f),		notUsed,					notUsed,					0.1f, 0.5f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(length) )
17783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("distance",		"distance",		F,	Value(GT, -5.0f, 5.0f),		Value(GT, -5.0f, 5.0f),		notUsed,					0.1f, 0.5f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(distance) )
17793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("dot",			"dot",			F,	Value(GT, -5.0f, 5.0f),		Value(GT, -5.0f, 5.0f),		notUsed,					0.1f, 0.5f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(dot) )
17803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("cross",			"cross",		V3,	Value(GT, -5.0f, 5.0f),		Value(GT, -5.0f, 5.0f),		notUsed,					0.1f, 0.5f,		PRECMASK_MEDIUMP_HIGHP,		DE_NULL, DE_NULL, eval_cross_vec3, DE_NULL )
17813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("normalize",		"normalize",	GT,	Value(GT, 0.1f, 4.0f),		notUsed,					notUsed,					0.5f, 0.5f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(normalize) )
17823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("faceforward",	"faceforward",	GT,	Value(GT, -5.0f, 5.0f),		Value(GT, -5.0f, 5.0f),		Value(GT, -1.0f, 1.0f),		0.5f, 0.5f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(faceForward) )
17833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("reflect",		"reflect",		GT,	Value(GT, -0.8f, -0.5f),	Value(GT, 0.5f, 0.8f),		notUsed,					0.5f, 0.5f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(reflect) )
17843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("refract",		"refract",		GT,	Value(GT, -0.8f, 1.2f),		Value(GT, -1.1f, 0.5f),		Value(F, 0.2f, 1.5f),		0.5f, 0.5f,		PRECMASK_MEDIUMP_HIGHP,		FLOAT_GENTYPE_FUNCS(refract) )
17853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	);
17863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// 8.5 Matrix Functions.
17883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// separate matrix tests?
17893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	funcInfoGroups.push_back(
17903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//		BuiltinFuncGroup("matrix", "Matrix function tests.")
17913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//		<< BuiltinFuncInfo("matrixCompMult",	"matrixCompMult",	M, ... )
17923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	);
17933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// 8.6 Vector Relational Functions.
17953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	funcInfoGroups.push_back(
17963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		BuiltinFuncGroup("float_compare", "Floating point comparison tests.")
17973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("lessThan",			"lessThan",			BV,	Value(FV, -1.0f, 1.0f),		Value(FV, -1.0f, 1.0f),	notUsed, 1.0f, 0.0f, PRECMASK_ALL,	FLOAT_VEC_FUNCS(lessThan) )
17983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("lessThanEqual",		"lessThanEqual",	BV,	Value(FV, -1.0f, 1.0f),		Value(FV, -1.0f, 1.0f),	notUsed, 1.0f, 0.0f, PRECMASK_ALL,	FLOAT_VEC_FUNCS(lessThanEqual) )
17993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("greaterThan",		"greaterThan",		BV,	Value(FV, -1.0f, 1.0f),		Value(FV, -1.0f, 1.0f),	notUsed, 1.0f, 0.0f, PRECMASK_ALL,	FLOAT_VEC_FUNCS(greaterThan) )
18003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("greaterThanEqual",	"greaterThanEqual",	BV,	Value(FV, -1.0f, 1.0f),		Value(FV, -1.0f, 1.0f),	notUsed, 1.0f, 0.0f, PRECMASK_ALL,	FLOAT_VEC_FUNCS(greaterThanEqual) )
18013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("equal",				"equal",			BV,	Value(FV, -1.0f, 1.0f),		Value(FV, -1.0f, 1.0f),	notUsed, 1.0f, 0.0f, PRECMASK_ALL,	FLOAT_VEC_FUNCS(equal) )
18023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("notEqual",			"notEqual",			BV,	Value(FV, -1.0f, 1.0f),		Value(FV, -1.0f, 1.0f),	notUsed, 1.0f, 0.0f, PRECMASK_ALL,	FLOAT_VEC_FUNCS(notEqual) )
18033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	);
18043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	funcInfoGroups.push_back(
18063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		BuiltinFuncGroup("int_compare", "Integer comparison tests.")
18073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("lessThan",			"lessThan",			BV,	Value(IV, -5.2f, 4.9f),		Value(IV, -5.0f, 5.0f),	notUsed, 1.0f, 0.0f, PRECMASK_ALL,	INT_VEC_FUNCS(lessThan) )
18083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("lessThanEqual",		"lessThanEqual",	BV,	Value(IV, -5.2f, 4.9f),		Value(IV, -5.0f, 5.0f),	notUsed, 1.0f, 0.0f, PRECMASK_ALL,	INT_VEC_FUNCS(lessThanEqual) )
18093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("greaterThan",		"greaterThan",		BV,	Value(IV, -5.2f, 4.9f),		Value(IV, -5.0f, 5.0f),	notUsed, 1.0f, 0.0f, PRECMASK_ALL,	INT_VEC_FUNCS(greaterThan) )
18103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("greaterThanEqual",	"greaterThanEqual",	BV,	Value(IV, -5.2f, 4.9f),		Value(IV, -5.0f, 5.0f),	notUsed, 1.0f, 0.0f, PRECMASK_ALL,	INT_VEC_FUNCS(greaterThanEqual) )
18113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("equal",				"equal",			BV,	Value(IV, -5.2f, 4.9f),		Value(IV, -5.0f, 5.0f),	notUsed, 1.0f, 0.0f, PRECMASK_ALL,	INT_VEC_FUNCS(equal) )
18123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("notEqual",			"notEqual",			BV,	Value(IV, -5.2f, 4.9f),		Value(IV, -5.0f, 5.0f),	notUsed, 1.0f, 0.0f, PRECMASK_ALL,	INT_VEC_FUNCS(notEqual) )
18133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	);
18143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	funcInfoGroups.push_back(
18163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		BuiltinFuncGroup("bool_compare", "Boolean comparison tests.")
18173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("equal",				"equal",			BV,	Value(BV, -5.2f, 4.9f),		Value(BV, -5.0f, 5.0f),	notUsed, 1.0f, 0.0f, PRECMASK_NA,	BOOL_VEC_FUNCS(equal) )
18183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("notEqual",			"notEqual",			BV,	Value(BV, -5.2f, 4.9f),		Value(BV, -5.0f, 5.0f),	notUsed, 1.0f, 0.0f, PRECMASK_NA,	BOOL_VEC_FUNCS(notEqual) )
18193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("any",				"any",				B,	Value(BV, -1.0f, 0.3f),		notUsed,				notUsed, 1.0f, 0.0f, PRECMASK_NA,	BOOL_VEC_FUNCS(any) )
18203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("all",				"all",				B,	Value(BV, -0.3f, 1.0f),		notUsed,				notUsed, 1.0f, 0.0f, PRECMASK_NA,	BOOL_VEC_FUNCS(all) )
18213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< BuiltinFuncInfo("not",				"not",				BV,	Value(BV, -1.0f, 1.0f),		notUsed,				notUsed, 1.0f, 0.0f, PRECMASK_NA,	BOOL_VEC_FUNCS(boolNot) )
18223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	);
18233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const ShaderType s_shaderTypes[] =
18253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
18263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SHADERTYPE_VERTEX,
18273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SHADERTYPE_FRAGMENT
18283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
18293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const DataType s_floatTypes[] =
18313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
18323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TYPE_FLOAT,
18333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TYPE_FLOAT_VEC2,
18343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TYPE_FLOAT_VEC3,
18353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TYPE_FLOAT_VEC4
18363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
18373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const DataType s_intTypes[] =
18393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
18403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TYPE_INT,
18413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TYPE_INT_VEC2,
18423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TYPE_INT_VEC3,
18433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TYPE_INT_VEC4
18443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
18453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const DataType s_uintTypes[] =
18473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
18483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TYPE_UINT,
18493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TYPE_UINT_VEC2,
18503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TYPE_UINT_VEC3,
18513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TYPE_UINT_VEC4
18523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
18533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const DataType s_boolTypes[] =
18553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
18563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TYPE_BOOL,
18573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TYPE_BOOL_VEC2,
18583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TYPE_BOOL_VEC3,
18593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TYPE_BOOL_VEC4
18603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
18613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int outerGroupNdx = 0; outerGroupNdx < (int)funcInfoGroups.size(); outerGroupNdx++)
18633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
18643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Create outer group.
18653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const BuiltinFuncGroup& outerGroupInfo = funcInfoGroups[outerGroupNdx];
18663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* outerGroup = new TestCaseGroup(m_context, outerGroupInfo.name, outerGroupInfo.description);
18673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addChild(outerGroup);
18683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Only create new group if name differs from previous one.
18703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestCaseGroup* innerGroup = DE_NULL;
18713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int funcInfoNdx = 0; funcInfoNdx < (int)outerGroupInfo.funcInfos.size(); funcInfoNdx++)
18733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
18743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const BuiltinFuncInfo&	funcInfo 		= outerGroupInfo.funcInfos[funcInfoNdx];
18753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const char*				shaderFuncName	= funcInfo.shaderFuncName;
18763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bool					isBoolCase		= (funcInfo.precisionMask == PRECMASK_NA);
18773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bool					isBoolOut		= (funcInfo.outValue & (VALUE_BOOL | VALUE_BOOL_VEC | VALUE_BOOL_GENTYPE)) != 0;
18783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bool					isIntOut		= (funcInfo.outValue & (VALUE_INT | VALUE_INT_VEC | VALUE_INT_GENTYPE)) != 0;
18793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bool					isUintOut		= (funcInfo.outValue & (VALUE_UINT | VALUE_UINT_VEC | VALUE_UINT_GENTYPE)) != 0;
18803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bool					isFloatOut		= !isBoolOut && !isIntOut && !isUintOut;
18813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (!innerGroup || (string(innerGroup->getName()) != funcInfo.caseName))
18833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
18843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				string groupDesc = string("Built-in function ") + shaderFuncName + "() tests.";
18853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				innerGroup = new TestCaseGroup(m_context, funcInfo.caseName, groupDesc.c_str());
18863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				outerGroup->addChild(innerGroup);
18873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
18883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int inScalarSize = 1; inScalarSize <= 4; inScalarSize++)
18903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
18913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				int			outScalarSize	= ((funcInfo.outValue == VALUE_FLOAT) || (funcInfo.outValue == VALUE_BOOL)) ? 1 : inScalarSize; // \todo [petri] Int.
18923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				DataType	outDataType		= isFloatOut	? s_floatTypes[outScalarSize - 1]
18933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry											: isIntOut		? s_intTypes[outScalarSize - 1]
18943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry											: isUintOut		? s_uintTypes[outScalarSize - 1]
18953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry											: isBoolOut		? s_boolTypes[outScalarSize - 1]
18963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry											: TYPE_LAST;
18973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				ShaderEvalFunc evalFunc = DE_NULL;
18993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if      (inScalarSize == 1)	evalFunc = funcInfo.evalFuncScalar;
19003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else if (inScalarSize == 2)	evalFunc = funcInfo.evalFuncVec2;
19013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else if (inScalarSize == 3)	evalFunc = funcInfo.evalFuncVec3;
19023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else if (inScalarSize == 4)	evalFunc = funcInfo.evalFuncVec4;
19033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else DE_ASSERT(false);
19043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				// Skip if no valid eval func.
19063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				// \todo [petri] Better check for V3 only etc. cases?
19073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (evalFunc == DE_NULL)
19083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					continue;
19093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				for (int precision = 0; precision < PRECISION_LAST; precision++)
19113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
19123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					if ((funcInfo.precisionMask & (1<<precision)) ||
19133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						(funcInfo.precisionMask == PRECMASK_NA && precision == PRECISION_MEDIUMP)) // use mediump interpolators for booleans
19143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					{
19153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						const char*	precisionStr	= getPrecisionName((Precision)precision);
19163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						string		precisionPrefix	= isBoolCase ? "" : (string(precisionStr) + "_");
19173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						for (int shaderTypeNdx = 0; shaderTypeNdx < DE_LENGTH_OF_ARRAY(s_shaderTypes); shaderTypeNdx++)
19193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						{
19203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							ShaderType		shaderType		= s_shaderTypes[shaderTypeNdx];
19213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							ShaderDataSpec	shaderSpec;
19223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							const char*		shaderTypeName	= getShaderTypeName(shaderType);
19233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							bool			isVertexCase	= (ShaderType)shaderType == SHADERTYPE_VERTEX;
19243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							bool			isUnaryOp		= (funcInfo.input1.valueType == VALUE_NONE);
19253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							// \note Data type names will be added to description and name in a following loop.
19273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							string desc	= string("Built-in function ") + shaderFuncName + "(";
19283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							string name = precisionPrefix;
19293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							// Generate shader op.
19313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							string shaderOp = string("res = ");
19323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							// Setup shader data info.
19343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							shaderSpec.numInputs		= 0;
19353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							shaderSpec.precision		= isBoolCase ? PRECISION_LAST : (Precision)precision;
19363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							shaderSpec.output			= outDataType;
19373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							shaderSpec.resultScale		= funcInfo.resultScale;
19383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							shaderSpec.resultBias		= funcInfo.resultBias;
19393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							shaderSpec.referenceScale	= funcInfo.referenceScale;
19403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							shaderSpec.referenceBias	= funcInfo.referenceBias;
19413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							if (funcInfo.type == OPERATOR)
19433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							{
19443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								if (isUnaryOp && funcInfo.isUnaryPrefix)
19453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									shaderOp += shaderFuncName;
19463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							}
19473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							else if (funcInfo.type == FUNCTION)
19483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								shaderOp += string(shaderFuncName) + "(";
19493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							else // SIDE_EFFECT_OPERATOR
19503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								shaderOp += "in0;\n\t";
19513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							for (int inputNdx = 0; inputNdx < MAX_INPUTS; inputNdx++)
19533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							{
19543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								const Value&	prevV			= (inputNdx == 1) ? funcInfo.input0 : (inputNdx == 2) ? funcInfo.input1 : funcInfo.input2;
19553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								const Value&	v				= (inputNdx == 0) ? funcInfo.input0 : (inputNdx == 1) ? funcInfo.input1 : funcInfo.input2;
19563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								if (v.valueType == VALUE_NONE)
19583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									continue; // Skip unused input.
19593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								int				prevInScalarSize	= isScalarType(prevV.valueType) ? 1 : inScalarSize;
19613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								DataType		prevInDataType		= isFloatType(prevV.valueType)	? s_floatTypes[prevInScalarSize - 1]
19623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																	: isIntType(prevV.valueType)	? s_intTypes[prevInScalarSize - 1]
19633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																	: isUintType(prevV.valueType)	? s_uintTypes[prevInScalarSize - 1]
19643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																	: isBoolType(prevV.valueType)	? s_boolTypes[prevInScalarSize - 1]
19653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																	: TYPE_LAST;
19663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								int				curInScalarSize		= isScalarType(v.valueType) ? 1 : inScalarSize;
19683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								DataType		curInDataType		= isFloatType(v.valueType)	? s_floatTypes[curInScalarSize - 1]
19693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																	: isIntType(v.valueType)	? s_intTypes[curInScalarSize - 1]
19703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																	: isUintType(v.valueType)	? s_uintTypes[curInScalarSize - 1]
19713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																	: isBoolType(v.valueType)	? s_boolTypes[curInScalarSize - 1]
19723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																	: TYPE_LAST;
19733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								// Write input type(s) to case description and name.
19753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								if (inputNdx > 0)
19773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									desc += ", ";
19783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								desc += getDataTypeName(curInDataType);
19803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								if (inputNdx == 0 || prevInDataType != curInDataType) // \note Only write input type to case name if different from previous input type (avoid overly long names).
19823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									name += string("") + getDataTypeName(curInDataType) + "_";
19833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								// Generate op input source.
19853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								if (funcInfo.type == OPERATOR || funcInfo.type == FUNCTION)
19873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								{
19883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									if (inputNdx != 0)
19893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									{
19903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry										if (funcInfo.type == OPERATOR && !isUnaryOp)
19913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry											shaderOp += " " + string(shaderFuncName) + " ";
19923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry										else
19933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry											shaderOp += ", ";
19943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									}
19953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									shaderOp += "in" + de::toString(inputNdx);
19973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
19983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									if (funcInfo.type == OPERATOR && isUnaryOp && !funcInfo.isUnaryPrefix)
19993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry										shaderOp += string(shaderFuncName);
20003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								}
20013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								else
20023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								{
20033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									DE_ASSERT(funcInfo.type == SIDE_EFFECT_OPERATOR);
20043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									if (inputNdx != 0 || (isUnaryOp && funcInfo.isUnaryPrefix))
20063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry										shaderOp += string("") + (isUnaryOp ? "" : " ") + shaderFuncName + (isUnaryOp ? "" : " ");
20073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									shaderOp += inputNdx == 0 ? "res" : "in" + de::toString(inputNdx); // \note in0 has already been assigned to res, so start from in1.
20093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									if (isUnaryOp && !funcInfo.isUnaryPrefix)
20113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry										shaderOp += shaderFuncName;
20123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								}
20133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								// Fill in shader info.
20153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								shaderSpec.inputs[shaderSpec.numInputs++] = ShaderValue(curInDataType, v.rangeMin, v.rangeMax);
20163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							}
20173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							if (funcInfo.type == FUNCTION)
20193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								shaderOp += ")";
20203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							shaderOp += ";";
20223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							desc += ").";
20243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							name += shaderTypeName;
20253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							// Create the test case.
20273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							innerGroup->addChild(new ShaderOperatorCase(m_context, name.c_str(), desc.c_str(), isVertexCase, evalFunc, shaderOp, shaderSpec));
20283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						}
20293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					}
20303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
20313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
20323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
20333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
20343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// The ?: selection operator.
20363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const struct
20383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
20393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DataType		type; // The type of "Y" and "Z" operands in "X ? Y : Z" (X is always bool).
20403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ShaderEvalFunc	evalFunc;
20413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} s_selectionInfo[] =
20423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
20433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ TYPE_FLOAT,		eval_selection_float	},
20443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ TYPE_FLOAT_VEC2,	eval_selection_vec2		},
20453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ TYPE_FLOAT_VEC3,	eval_selection_vec3		},
20463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ TYPE_FLOAT_VEC4,	eval_selection_vec4		},
20473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ TYPE_INT,			eval_selection_int		},
20483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ TYPE_INT_VEC2,	eval_selection_ivec2	},
20493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ TYPE_INT_VEC3,	eval_selection_ivec3	},
20503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ TYPE_INT_VEC4,	eval_selection_ivec4	},
20513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ TYPE_UINT,		eval_selection_uint		},
20523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ TYPE_UINT_VEC2,	eval_selection_uvec2	},
20533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ TYPE_UINT_VEC3,	eval_selection_uvec3	},
20543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ TYPE_UINT_VEC4,	eval_selection_uvec4	},
20553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ TYPE_BOOL,		eval_selection_bool		},
20563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ TYPE_BOOL_VEC2,	eval_selection_bvec2	},
20573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ TYPE_BOOL_VEC3,	eval_selection_bvec3	},
20583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ TYPE_BOOL_VEC4,	eval_selection_bvec4	}
20593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
20603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestCaseGroup* selectionGroup = new TestCaseGroup(m_context, "selection", "Selection operator tests");
20623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(selectionGroup);
20633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(s_selectionInfo); typeNdx++)
20653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
20663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DataType		curType			= s_selectionInfo[typeNdx].type;
20673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ShaderEvalFunc	evalFunc		= s_selectionInfo[typeNdx].evalFunc;
20683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool			isBoolCase		= isDataTypeBoolOrBVec(curType);
20693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool			isFloatCase		= isDataTypeFloatOrVec(curType);
20703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool			isIntCase		= isDataTypeIntOrIVec(curType);
20713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool			isUintCase		= isDataTypeUintOrUVec(curType);
20723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*		dataTypeStr		= getDataTypeName(curType);
20733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(isBoolCase || isFloatCase || isIntCase || isUintCase);
20753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_UNREF(isIntCase);
20763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int precision = 0; precision < (int)PRECISION_LAST; precision++)
20783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
20793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (isBoolCase && precision != PRECISION_MEDIUMP) // Use mediump interpolators for booleans.
20803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				continue;
20813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const char*	precisionStr	= getPrecisionName((Precision)precision);
20833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			string		precisionPrefix	= isBoolCase ? "" : (string(precisionStr) + "_");
20843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int shaderTypeNdx = 0; shaderTypeNdx < DE_LENGTH_OF_ARRAY(s_shaderTypes); shaderTypeNdx++)
20863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
20873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				ShaderType		shaderType		= s_shaderTypes[shaderTypeNdx];
20883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				ShaderDataSpec	shaderSpec;
20893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const char*		shaderTypeName	= getShaderTypeName(shaderType);
20903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				bool			isVertexCase	= (ShaderType)shaderType == SHADERTYPE_VERTEX;
20913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				string name	= precisionPrefix + dataTypeStr + "_" + shaderTypeName;
20933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				shaderSpec.numInputs		= 3;
20953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				shaderSpec.precision		= isBoolCase ? PRECISION_LAST : (Precision)precision;
20963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				shaderSpec.output			= curType;
20973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				shaderSpec.resultScale		= isBoolCase ? 1.0f : isFloatCase ? 0.5f : isUintCase ? 0.5f : 0.1f;
20983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				shaderSpec.resultBias		= isBoolCase ? 0.0f : isFloatCase ? 0.5f : isUintCase ? 0.0f : 0.5f;
20993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				shaderSpec.referenceScale	= shaderSpec.resultScale;
21003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				shaderSpec.referenceBias	= shaderSpec.resultBias;
21013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				float rangeMin = isBoolCase ? -1.0f : isFloatCase ? -1.0f : isUintCase ? 0.0f : -5.0f;
21033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				float rangeMax = isBoolCase ?  1.0f : isFloatCase ?  1.0f : isUintCase ? 2.0f :  5.0f;
21043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				shaderSpec.inputs[0] = ShaderValue(TYPE_BOOL, -1.0f, 1.0f);
21063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				shaderSpec.inputs[1] = ShaderValue(curType, rangeMin, rangeMax);
21073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				shaderSpec.inputs[2] = ShaderValue(curType, rangeMin, rangeMax);
21083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				selectionGroup->addChild(new ShaderOperatorCase(m_context, name.c_str(), "", isVertexCase, evalFunc, "res = in0 ? in1 : in2;", shaderSpec));
21103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
21113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
21123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
21133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// The sequence operator (comma).
21153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestCaseGroup* sequenceGroup = new TestCaseGroup(m_context, "sequence", "Sequence operator tests");
21173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(sequenceGroup);
21183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestCaseGroup* sequenceNoSideEffGroup = new TestCaseGroup(m_context, "no_side_effects", "Sequence tests without side-effects");
21203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestCaseGroup* sequenceSideEffGroup = new TestCaseGroup(m_context, "side_effects", "Sequence tests with side-effects");
21213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	sequenceGroup->addChild(sequenceNoSideEffGroup);
21223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	sequenceGroup->addChild(sequenceSideEffGroup);
21233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const struct
21253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
21263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool			containsSideEffects;
21273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*		caseName;
21283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const char*		expressionStr;
21293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int				numInputs;
21303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DataType		inputTypes[MAX_INPUTS];
21313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DataType		resultType;
21323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ShaderEvalFunc	evalFunc;
21333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	} s_sequenceCases[] =
21343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
21353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ false,	"vec4",					"in0, in2 + in1, in1 + in0",							3,	{ TYPE_FLOAT_VEC4,	TYPE_FLOAT_VEC4,	TYPE_FLOAT_VEC4	},	TYPE_FLOAT_VEC4,	evalSequenceNoSideEffCase0 },
21363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ false,	"float_uint",			"in0 + in2, in1 + in1",									3,	{ TYPE_FLOAT,		TYPE_UINT,			TYPE_FLOAT		},	TYPE_UINT,			evalSequenceNoSideEffCase1 },
21373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ false,	"bool_vec2",			"in0 && in1, in0, ivec2(vec2(in0) + in2)",				3,	{ TYPE_BOOL,		TYPE_BOOL,			TYPE_FLOAT_VEC2	},	TYPE_INT_VEC2,		evalSequenceNoSideEffCase2 },
21383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ false,	"vec4_ivec4_bvec4",		"in0 + vec4(in1), in2, in1",							3,	{ TYPE_FLOAT_VEC4,	TYPE_INT_VEC4,		TYPE_BOOL_VEC4	},	TYPE_INT_VEC4,		evalSequenceNoSideEffCase3 },
21393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ true,		"vec4",					"in0++, in1 = in0 + in2, in2 = in1",					3,	{ TYPE_FLOAT_VEC4,	TYPE_FLOAT_VEC4,	TYPE_FLOAT_VEC4	},	TYPE_FLOAT_VEC4,	evalSequenceSideEffCase0 },
21413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ true,		"float_uint",			"in1++, in0 = float(in1), in1 = uint(in0 + in2)",		3,	{ TYPE_FLOAT,		TYPE_UINT,			TYPE_FLOAT		},	TYPE_UINT,			evalSequenceSideEffCase1 },
21423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ true,		"bool_vec2",			"in1 = in0, in2++, in2 = in2 + vec2(in1), ivec2(in2)",	3,	{ TYPE_BOOL,		TYPE_BOOL,			TYPE_FLOAT_VEC2	},	TYPE_INT_VEC2,		evalSequenceSideEffCase2 },
21433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{ true,		"vec4_ivec4_bvec4",		"in0 = in0 + vec4(in2), in1 = in1 + ivec4(in0), in1++",	3,	{ TYPE_FLOAT_VEC4,	TYPE_INT_VEC4,		TYPE_BOOL_VEC4	},	TYPE_INT_VEC4,		evalSequenceSideEffCase3 }
21443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
21453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(s_sequenceCases); caseNdx++)
21473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
21483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int precision = 0; precision < (int)PRECISION_LAST; precision++)
21493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
21503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int shaderTypeNdx = 0; shaderTypeNdx < DE_LENGTH_OF_ARRAY(s_shaderTypes); shaderTypeNdx++)
21513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
21523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				ShaderType		shaderType		= s_shaderTypes[shaderTypeNdx];
21533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				ShaderDataSpec	shaderSpec;
21543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const char*		shaderTypeName	= getShaderTypeName(shaderType);
21553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				bool			isVertexCase	= (ShaderType)shaderType == SHADERTYPE_VERTEX;
21563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				string name	= string("") + getPrecisionName((Precision)precision) + "_" + s_sequenceCases[caseNdx].caseName + "_" + shaderTypeName;
21583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				shaderSpec.numInputs		= s_sequenceCases[caseNdx].numInputs;
21603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				shaderSpec.precision		= (Precision)precision;
21613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				shaderSpec.output			= s_sequenceCases[caseNdx].resultType;
21623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				shaderSpec.resultScale		= 0.5f;
21633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				shaderSpec.resultBias		= 0.0f;
21643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				shaderSpec.referenceScale	= shaderSpec.resultScale;
21653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				shaderSpec.referenceBias	= shaderSpec.resultBias;
21663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				for (int inputNdx = 0; inputNdx < s_sequenceCases[caseNdx].numInputs; inputNdx++)
21683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
21693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					DataType	type		= s_sequenceCases[caseNdx].inputTypes[inputNdx];
21703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					float		rangeMin	= isDataTypeFloatOrVec(type) ? -0.5f : isDataTypeIntOrIVec(type) ? -2.0f : isDataTypeUintOrUVec(type) ? 0.0f : -1.0f;
21713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					float		rangeMax	= isDataTypeFloatOrVec(type) ?  0.5f : isDataTypeIntOrIVec(type) ?  2.0f : isDataTypeUintOrUVec(type) ? 2.0f :  1.0f;
21723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					shaderSpec.inputs[inputNdx] = ShaderValue(type, rangeMin, rangeMax);
21743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
21753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				string expression = string("") + "res = (" + s_sequenceCases[caseNdx].expressionStr + ");";
21773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				TestCaseGroup* group = s_sequenceCases[caseNdx].containsSideEffects ? sequenceSideEffGroup : sequenceNoSideEffGroup;
21793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				group->addChild(new ShaderOperatorCase(m_context, name.c_str(), "", isVertexCase, s_sequenceCases[caseNdx].evalFunc, expression.c_str(), shaderSpec));
21803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
21813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
21823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
21833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
21843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional
21863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles3
21873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
2188