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)" 211cff15864116080b023e12c0b4e73d02874b0a5a6Jarkko Pöyryinline deUint32 sequenceSideEffCase1 (float in0, deUint32 in1, float in2) { DE_UNREF(in0); return (deUint32)(float(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) \ 90165d04b9f591c99e654edfb1125f4b4b00f355c3aJarkko Pöyry void eval_##FUNC_NAME##_float (ShaderEvalContext& c) { c.color.x() = FUNC_NAME(c.in[0].swizzle(2)).x(); } \ 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) \ 90765d04b9f591c99e654edfb1125f4b4b00f355c3aJarkko Pöyry void eval_##FUNC_NAME##_float (ShaderEvalContext& c) { c.color.x() = FUNC_NAME(c.in[0].swizzle(2), c.in[1].swizzle(0)).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) \ 91365d04b9f591c99e654edfb1125f4b4b00f355c3aJarkko Pöyry void eval_##FUNC_NAME##_float (ShaderEvalContext& c) { c.color.x() = FUNC_NAME(c.in[0].swizzle(2), c.in[1].swizzle(0), c.in[2].swizzle(1)).x(); } \ 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) \ 91965d04b9f591c99e654edfb1125f4b4b00f355c3aJarkko Pöyry void eval_##FUNC_NAME##_float (ShaderEvalContext& c) { c.color.x() = FUNC_NAME(c.in[0].swizzle(2)); } \ 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) \ 92565d04b9f591c99e654edfb1125f4b4b00f355c3aJarkko Pöyry void eval_##FUNC_NAME##_float (ShaderEvalContext& c) { c.color.x() = FUNC_NAME(c.in[0].swizzle(2), c.in[1].swizzle(0)); } \ 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) ) 17201e13baf0dc189343e9e037aecfaf7e69d89f82aeJarkko Pöyry << BuiltinFuncInfo("atanh", "atanh", GT, Value(GT, -0.99f, 0.99f), 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