| diff --git a/include/GLSLANG/ShaderLang.h b/include/GLSLANG/ShaderLang.h |
| index 1468bb146..2875c02ab 100644 |
| --- a/include/GLSLANG/ShaderLang.h |
| +++ b/include/GLSLANG/ShaderLang.h |
| @@ -8,7 +8,7 @@ |
| |
| #include <stddef.h> |
| |
| -#include "KHR/khrplatform.h" |
| +#include "khrplatform.h" |
| |
| #include <array> |
| #include <map> |
| diff --git a/include/GLSLANG/ShaderVars.h b/include/GLSLANG/ShaderVars.h |
| index 709428aeb..acd9c358f 100644 |
| --- a/include/GLSLANG/ShaderVars.h |
| +++ b/include/GLSLANG/ShaderVars.h |
| @@ -281,10 +281,17 @@ struct WorkGroupSize |
| { |
| // Must have a trivial default constructor since it is used in YYSTYPE. |
| WorkGroupSize() = default; |
| +#if defined(__clang__) |
| +#pragma clang diagnostic push |
| +#pragma clang diagnostic ignored "-Wmissing-braces" |
| +#endif |
| explicit constexpr WorkGroupSize(int initialSize) |
| : localSizeQualifiers{initialSize, initialSize, initialSize} |
| { |
| } |
| +#if defined(__clang__) |
| +#pragma clang diagnostic pop |
| +#endif |
| |
| void fill(int fillValue); |
| void setLocalSize(int localSizeX, int localSizeY, int localSizeZ); |
| diff --git a/include/KHR/khrplatform.h b/include/KHR/khrplatform.h |
| old mode 100755 |
| new mode 100644 |
| index 68fca4827..07b61b9bd |
| --- a/include/KHR/khrplatform.h |
| +++ b/include/KHR/khrplatform.h |
| @@ -282,4 +282,4 @@ typedef enum { |
| KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM |
| } khronos_boolean_enum_t; |
| |
| -#endif /* __khrplatform_h_ */ |
| \ No newline at end of file |
| +#endif /* __khrplatform_h_ */ |
| diff --git a/src/common/third_party/smhasher/src/PMurHash.cpp b/src/common/third_party/smhasher/src/PMurHash.cpp |
| index 071bc3153..2d608e97d 100644 |
| --- a/src/common/third_party/smhasher/src/PMurHash.cpp |
| +++ b/src/common/third_party/smhasher/src/PMurHash.cpp |
| @@ -74,6 +74,12 @@ on big endian machines, or a byte-by-byte read if the endianess is unknown. |
| * ROTL32(x,r) Rotate x left by r bits |
| */ |
| |
| +#if !defined(__BYTE_ORDER) && defined(__GNUC__) |
| + #define __BIG_ENDIAN __ORDER_BIG_ENDIAN__ |
| + #define __LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__ |
| + #define __BYTE_ORDER __BYTE_ORDER__ |
| +#endif |
| + |
| /* Convention is to define __BYTE_ORDER == to one of these values */ |
| #if !defined(__BIG_ENDIAN) |
| #define __BIG_ENDIAN 4321 |
| @@ -84,7 +90,9 @@ on big endian machines, or a byte-by-byte read if the endianess is unknown. |
| |
| /* I386 */ |
| #if defined(_M_IX86) || defined(__i386__) || defined(__i386) || defined(i386) |
| - #define __BYTE_ORDER __LITTLE_ENDIAN |
| + #if !defined(__BYTE_ORDER) |
| + #define __BYTE_ORDER __LITTLE_ENDIAN |
| + #endif |
| #define UNALIGNED_SAFE |
| #endif |
| |
| @@ -111,7 +119,14 @@ on big endian machines, or a byte-by-byte read if the endianess is unknown. |
| /* Now find best way we can to READ_UINT32 */ |
| #if __BYTE_ORDER==__LITTLE_ENDIAN |
| /* CPU endian matches murmurhash algorithm, so read 32-bit word directly */ |
| +#if defined(__clang__) |
| +#pragma clang diagnostic push |
| +#pragma clang diagnostic ignored "-Wcast-align" |
| +#endif |
| #define READ_UINT32(ptr) (*((uint32_t*)(ptr))) |
| +#if defined(__clang__) |
| +#pragma clang diagnostic pop |
| +#endif |
| #elif __BYTE_ORDER==__BIG_ENDIAN |
| /* TODO: Add additional cases below where a compiler provided bswap32 is available */ |
| #if defined(__GNUC__) && (__GNUC__>4 || (__GNUC__==4 && __GNUC_MINOR__>=3)) |
| @@ -218,14 +233,28 @@ void PMurHash32_Process(uint32_t *ph1, uint32_t *pcarry, const void *key, int le |
| switch(n) { /* how many bytes in c */ |
| case 0: /* c=[----] w=[3210] b=[3210]=w c'=[----] */ |
| for( ; ptr < end ; ptr+=4) { |
| +#if defined(__clang__) |
| +#pragma clang diagnostic push |
| +#pragma clang diagnostic ignored "-Wcast-align" |
| +#endif |
| uint32_t k1 = READ_UINT32(ptr); |
| +#if defined(__clang__) |
| +#pragma clang diagnostic pop |
| +#endif |
| DOBLOCK(h1, k1); |
| } |
| break; |
| case 1: /* c=[0---] w=[4321] b=[3210]=c>>24|w<<8 c'=[4---] */ |
| for( ; ptr < end ; ptr+=4) { |
| uint32_t k1 = c>>24; |
| +#if defined(__clang__) |
| +#pragma clang diagnostic push |
| +#pragma clang diagnostic ignored "-Wcast-align" |
| +#endif |
| c = READ_UINT32(ptr); |
| +#if defined(__clang__) |
| +#pragma clang diagnostic pop |
| +#endif |
| k1 |= c<<8; |
| DOBLOCK(h1, k1); |
| } |
| @@ -233,7 +262,14 @@ void PMurHash32_Process(uint32_t *ph1, uint32_t *pcarry, const void *key, int le |
| case 2: /* c=[10--] w=[5432] b=[3210]=c>>16|w<<16 c'=[54--] */ |
| for( ; ptr < end ; ptr+=4) { |
| uint32_t k1 = c>>16; |
| +#if defined(__clang__) |
| +#pragma clang diagnostic push |
| +#pragma clang diagnostic ignored "-Wcast-align" |
| +#endif |
| c = READ_UINT32(ptr); |
| +#if defined(__clang__) |
| +#pragma clang diagnostic pop |
| +#endif |
| k1 |= c<<16; |
| DOBLOCK(h1, k1); |
| } |
| @@ -241,7 +277,14 @@ void PMurHash32_Process(uint32_t *ph1, uint32_t *pcarry, const void *key, int le |
| case 3: /* c=[210-] w=[6543] b=[3210]=c>>8|w<<24 c'=[654-] */ |
| for( ; ptr < end ; ptr+=4) { |
| uint32_t k1 = c>>8; |
| +#if defined(__clang__) |
| +#pragma clang diagnostic push |
| +#pragma clang diagnostic ignored "-Wcast-align" |
| +#endif |
| c = READ_UINT32(ptr); |
| +#if defined(__clang__) |
| +#pragma clang diagnostic pop |
| +#endif |
| k1 |= c<<24; |
| DOBLOCK(h1, k1); |
| } |
| diff --git a/src/compiler/preprocessor/ExpressionParser.cpp b/src/compiler/preprocessor/ExpressionParser.cpp |
| index ede334619..c0f8b9c97 100644 |
| --- a/src/compiler/preprocessor/ExpressionParser.cpp |
| +++ b/src/compiler/preprocessor/ExpressionParser.cpp |
| @@ -1,5 +1,7 @@ |
| /* A Bison parser, made by GNU Bison 3.0.4. */ |
| |
| +/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */ |
| + |
| /* Bison implementation for Yacc-like parsers in C |
| |
| Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. |
| diff --git a/src/compiler/preprocessor/Tokenizer.cpp b/src/compiler/preprocessor/Tokenizer.cpp |
| index d8a9b9a12..d7fad68f1 100644 |
| --- a/src/compiler/preprocessor/Tokenizer.cpp |
| +++ b/src/compiler/preprocessor/Tokenizer.cpp |
| @@ -1148,7 +1148,7 @@ static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner); |
| static int yy_flex_strlen ( const char * , yyscan_t yyscanner); |
| #endif |
| |
| -#ifndef YY_NO_INPUT |
| +#if 0 // #ifndef YY_NO_INPUT |
| #ifdef __cplusplus |
| static int yyinput ( yyscan_t yyscanner ); |
| #else |
| @@ -2049,7 +2049,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) |
| |
| #endif |
| |
| -#ifndef YY_NO_INPUT |
| +#if 0 // #ifndef YY_NO_INPUT |
| #ifdef __cplusplus |
| static int yyinput (yyscan_t yyscanner) |
| #else |
| diff --git a/src/compiler/translator/ParseContext.cpp b/src/compiler/translator/ParseContext.cpp |
| index c97f91d78..d0a4f6aeb 100644 |
| --- a/src/compiler/translator/ParseContext.cpp |
| +++ b/src/compiler/translator/ParseContext.cpp |
| @@ -3240,8 +3240,11 @@ TIntermFunctionPrototype *TParseContext::addFunctionPrototypeDeclaration( |
| } |
| function->setHasPrototypeDeclaration(); |
| |
| + // WebKit note: We currently pass true instead of false for the last parameter |
| + // here because some compilers have an issue with nameless parameters in function |
| + // declarations. |
| TIntermFunctionPrototype *prototype = |
| - createPrototypeNodeFromFunction(*function, location, false); |
| + createPrototypeNodeFromFunction(*function, location, true); |
| |
| symbolTable.pop(); |
| |
| diff --git a/src/compiler/translator/TranslatorHLSL.h b/src/compiler/translator/TranslatorHLSL.h |
| index d7005a603..e8436e98e 100644 |
| --- a/src/compiler/translator/TranslatorHLSL.h |
| +++ b/src/compiler/translator/TranslatorHLSL.h |
| @@ -16,7 +16,7 @@ class TranslatorHLSL : public TCompiler |
| { |
| public: |
| TranslatorHLSL(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output); |
| - TranslatorHLSL *getAsTranslatorHLSL() override { return this; } |
| + TranslatorHLSL *getAsTranslatorHLSL() { return this; } |
| |
| bool hasUniformBlock(const std::string &interfaceBlockName) const; |
| unsigned int getUniformBlockRegister(const std::string &interfaceBlockName) const; |
| diff --git a/src/compiler/translator/glslang_tab.cpp b/src/compiler/translator/glslang_tab.cpp |
| index ce4aacf40..14cd5360c 100644 |
| --- a/src/compiler/translator/glslang_tab.cpp |
| +++ b/src/compiler/translator/glslang_tab.cpp |
| @@ -1,5 +1,7 @@ |
| /* A Bison parser, made by GNU Bison 3.0.4. */ |
| |
| +/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */ |
| + |
| /* Bison implementation for Yacc-like parsers in C |
| |
| Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. |
| diff --git a/src/compiler/translator/glslang_tab.h b/src/compiler/translator/glslang_tab.h |
| index 1f5308551..cb43a46df 100644 |
| --- a/src/compiler/translator/glslang_tab.h |
| +++ b/src/compiler/translator/glslang_tab.h |
| @@ -1,5 +1,7 @@ |
| /* A Bison parser, made by GNU Bison 3.0.4. */ |
| |
| +/* Apple Note: For the avoidance of doubt, Apple elects to distribute this file under the terms of the BSD license. */ |
| + |
| /* Bison interface for Yacc-like parsers in C |
| |
| Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. |
| diff --git a/src/libANGLE/MemoryProgramCache.cpp b/src/libANGLE/MemoryProgramCache.cpp |
| index 9eec12e3e..2a9c6836a 100644 |
| --- a/src/libANGLE/MemoryProgramCache.cpp |
| +++ b/src/libANGLE/MemoryProgramCache.cpp |
| @@ -234,7 +234,10 @@ LinkResult MemoryProgramCache::Deserialize(const Context *context, |
| |
| static_assert(MAX_VERTEX_ATTRIBS <= sizeof(unsigned long) * 8, |
| "Too many vertex attribs for mask"); |
| +#pragma clang diagnostic push |
| +#pragma clang diagnostic ignored "-Wconversion" |
| state->mActiveAttribLocationsMask = stream.readInt<unsigned long>(); |
| +#pragma clang diagnostic pop |
| |
| unsigned int attribCount = stream.readInt<unsigned int>(); |
| ASSERT(state->mAttributes.empty()); |
| @@ -408,7 +411,10 @@ LinkResult MemoryProgramCache::Deserialize(const Context *context, |
| state->mAtomicCounterUniformRange = RangeUI(atomicCounterRangeLow, atomicCounterRangeHigh); |
| |
| static_assert(SHADER_TYPE_MAX <= sizeof(unsigned long) * 8, "Too many shader types"); |
| +#pragma clang diagnostic push |
| +#pragma clang diagnostic ignored "-Wconversion" |
| state->mLinkedShaderStages = stream.readInt<unsigned long>(); |
| +#pragma clang diagnostic pop |
| |
| return program->getImplementation()->load(context, infoLog, &stream); |
| } |
| diff --git a/src/libANGLE/Platform.cpp b/src/libANGLE/Platform.cpp |
| index 702091624..c51289423 100644 |
| --- a/src/libANGLE/Platform.cpp |
| +++ b/src/libANGLE/Platform.cpp |
| @@ -15,7 +15,14 @@ |
| namespace |
| { |
| // TODO(jmadill): Make methods owned by egl::Display. |
| -angle::PlatformMethods g_platformMethods; |
| +#if defined(__clang__) |
| +#pragma clang diagnostic push |
| +#pragma clang diagnostic ignored "-Wglobal-constructors" |
| +#endif |
| + angle::PlatformMethods g_platformMethods; |
| +#if defined(__clang__) |
| +#pragma clang diagnostic pop |
| +#endif |
| } // anonymous namespace |
| |
| angle::PlatformMethods::PlatformMethods() |
| diff --git a/src/tests/compiler_tests/QualificationOrder_test.cpp b/src/tests/compiler_tests/QualificationOrder_test.cpp |
| index c0249dbb9..c82acffd7 100644 |
| --- a/src/tests/compiler_tests/QualificationOrder_test.cpp |
| +++ b/src/tests/compiler_tests/QualificationOrder_test.cpp |
| @@ -429,7 +429,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersInvariant) |
| "}\n" |
| "void main()\n" |
| "{\n" |
| - " gl_FragColor = vec4(foo0(value));\n" |
| + " gl_FragColor = vec4(foo0(value));\n" |
| "}\n"; |
| |
| if (compile(shaderString)) |
| @@ -449,7 +449,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersAttribute) |
| "}\n" |
| "void main()\n" |
| "{\n" |
| - " gl_FragColor = vec4(foo0(value));\n" |
| + " gl_FragColor = vec4(foo0(value));\n" |
| "}\n"; |
| |
| if (compile(shaderString)) |
| @@ -469,7 +469,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersVarying) |
| "}\n" |
| "void main()\n" |
| "{\n" |
| - " gl_FragColor = vec4(foo0(value));\n" |
| + " gl_FragColor = vec4(foo0(value));\n" |
| "}\n"; |
| |
| if (compile(shaderString)) |
| @@ -491,7 +491,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersLayout) |
| "out vec4 colorOUT;\n" |
| "void main()\n" |
| "{\n" |
| - " colorOUT = vec4(foo0(value));\n" |
| + " colorOUT = vec4(foo0(value));\n" |
| "}\n"; |
| |
| if (compile(shaderString)) |
| @@ -513,7 +513,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersCentroidIn |
| "out vec4 colorOUT;\n" |
| "void main()\n" |
| "{\n" |
| - " colorOUT = vec4(foo0(value));\n" |
| + " colorOUT = vec4(foo0(value));\n" |
| "}\n"; |
| |
| if (compile(shaderString)) |
| @@ -535,7 +535,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersFlatIn) |
| "out vec4 colorOUT;\n" |
| "void main()\n" |
| "{\n" |
| - " colorOUT = vec4(foo0(value));\n" |
| + " colorOUT = vec4(foo0(value));\n" |
| "}\n"; |
| |
| if (compile(shaderString)) |
| diff --git a/src/tests/deqp_support/es2fShaderMatrixTests.cpp b/src/tests/deqp_support/es2fShaderMatrixTests.cpp |
| index 9feb4dcfa..54d8474fd 100644 |
| --- a/src/tests/deqp_support/es2fShaderMatrixTests.cpp |
| +++ b/src/tests/deqp_support/es2fShaderMatrixTests.cpp |
| @@ -69,77 +69,77 @@ using tcu::Mat4; |
| // Uniform / constant values for tests. |
| // \note Input1 should not contain 0 components as it is used as divisor in div cases. |
| // \todo [2012-02-14 pyry] Make these dynamic. |
| -static const float s_constInFloat[2] = { 0.5f, -0.2f }; |
| -static const Vec2 s_constInVec2[2] = { Vec2(1.2f, 0.5f), Vec2(0.5f, 1.0f) }; |
| -static const Vec3 s_constInVec3[2] = { Vec3(1.1f, 0.1f, 0.5f), Vec3(-0.2f, 0.5f, 0.8f) }; |
| -static const Vec4 s_constInVec4[2] = { Vec4(1.4f, 0.2f, -0.5f, 0.7f), Vec4(0.2f, -1.0f, 0.5f, 0.8f) }; |
| +static const float s_constInFloat[2] = { 0.5f, -0.2f }; |
| +static const Vec2 s_constInVec2[2] = { Vec2(1.2f, 0.5f), Vec2(0.5f, 1.0f) }; |
| +static const Vec3 s_constInVec3[2] = { Vec3(1.1f, 0.1f, 0.5f), Vec3(-0.2f, 0.5f, 0.8f) }; |
| +static const Vec4 s_constInVec4[2] = { Vec4(1.4f, 0.2f, -0.5f, 0.7f), Vec4(0.2f, -1.0f, 0.5f, 0.8f) }; |
| |
| static const float s_constInMat20[] = { 0.6f, -1.0f, 0.7f, 0.4f }; |
| static const float s_constInMat21[] = { -0.5f, -0.4f, 0.7f, -0.8f }; |
| |
| static const float s_constInMat31[] = |
| { |
| - 1.2f, 0.1f, -0.1f, |
| - 0.1f, 0.9f, 0.2f, |
| - 0.2f, -0.1f, 0.7f |
| + 1.2f, 0.1f, -0.1f, |
| + 0.1f, 0.9f, 0.2f, |
| + 0.2f, -0.1f, 0.7f |
| }; |
| static const float s_constInMat41[] = |
| { |
| - 1.2f, -0.2f, 0.4f, 0.1f, |
| - 0.1f, 0.8f, -0.1f, -0.2f, |
| - -0.2f, 0.1f, -1.1f, 0.3f, |
| - 0.1f, 0.2f, 0.3f, 0.9f |
| + 1.2f, -0.2f, 0.4f, 0.1f, |
| + 0.1f, 0.8f, -0.1f, -0.2f, |
| + -0.2f, 0.1f, -1.1f, 0.3f, |
| + 0.1f, 0.2f, 0.3f, 0.9f |
| }; |
| |
| -static const Mat2 s_constInMat2[2] = { tcu::Mat2(s_constInMat20), tcu::Mat2(s_constInMat21) }; |
| -static const Mat3 s_constInMat3[2] = { tcu::translationMatrix(tcu::Vec2(0.2f, -0.3f)), tcu::Mat3(s_constInMat31) }; |
| -static const Mat4 s_constInMat4[2] = { tcu::translationMatrix(tcu::Vec3(0.2f, -0.3f, 0.15f)), tcu::Mat4(s_constInMat41) }; |
| +static const Mat2 s_constInMat2[2] = { tcu::Mat2(s_constInMat20), tcu::Mat2(s_constInMat21) }; |
| +static const Mat3 s_constInMat3[2] = { tcu::translationMatrix(tcu::Vec2(0.2f, -0.3f)), tcu::Mat3(s_constInMat31) }; |
| +static const Mat4 s_constInMat4[2] = { tcu::translationMatrix(tcu::Vec3(0.2f, -0.3f, 0.15f)), tcu::Mat4(s_constInMat41) }; |
| |
| namespace MatrixCaseUtils |
| { |
| |
| enum InputType |
| { |
| - INPUTTYPE_CONST = 0, |
| - INPUTTYPE_UNIFORM, |
| - INPUTTYPE_DYNAMIC, |
| + INPUTTYPE_CONST = 0, |
| + INPUTTYPE_UNIFORM, |
| + INPUTTYPE_DYNAMIC, |
| |
| - INPUTTYPE_LAST |
| + INPUTTYPE_LAST |
| }; |
| |
| struct ShaderInput |
| { |
| - ShaderInput (InputType inputType_, DataType dataType_, Precision precision_) |
| - : inputType (inputType_) |
| - , dataType (dataType_) |
| - , precision (precision_) |
| - { |
| - } |
| - |
| - InputType inputType; |
| - DataType dataType; |
| - Precision precision; |
| + ShaderInput (InputType inputType_, DataType dataType_, Precision precision_) |
| + : inputType (inputType_) |
| + , dataType (dataType_) |
| + , precision (precision_) |
| + { |
| + } |
| + |
| + InputType inputType; |
| + DataType dataType; |
| + Precision precision; |
| }; |
| |
| enum MatrixOp |
| { |
| - OP_ADD = 0, |
| - OP_SUB, |
| - OP_MUL, |
| - OP_DIV, |
| - OP_COMP_MUL, |
| - OP_UNARY_PLUS, |
| - OP_NEGATION, |
| - OP_PRE_INCREMENT, |
| - OP_PRE_DECREMENT, |
| - OP_POST_INCREMENT, |
| - OP_POST_DECREMENT, |
| - OP_ADD_INTO, |
| - OP_SUBTRACT_FROM, |
| - OP_MULTIPLY_INTO, |
| - OP_DIVIDE_INTO, |
| - |
| - OP_LAST |
| + OP_ADD = 0, |
| + OP_SUB, |
| + OP_MUL, |
| + OP_DIV, |
| + OP_COMP_MUL, |
| + OP_UNARY_PLUS, |
| + OP_NEGATION, |
| + OP_PRE_INCREMENT, |
| + OP_PRE_DECREMENT, |
| + OP_POST_INCREMENT, |
| + OP_POST_DECREMENT, |
| + OP_ADD_INTO, |
| + OP_SUBTRACT_FROM, |
| + OP_MULTIPLY_INTO, |
| + OP_DIVIDE_INTO, |
| + |
| + OP_LAST |
| }; |
| |
| // Type traits. |
| @@ -147,16 +147,16 @@ enum MatrixOp |
| template <int DataT> |
| struct TypeTraits; |
| |
| -#define DECLARE_TYPE_TRAIT(DATATYPE, TYPE) \ |
| -template<> \ |
| -struct TypeTraits<DATATYPE> { \ |
| - typedef TYPE Type; \ |
| +#define DECLARE_TYPE_TRAIT(DATATYPE, TYPE) \ |
| +template<> \ |
| +struct TypeTraits<DATATYPE> { \ |
| + typedef TYPE Type; \ |
| } |
| |
| -DECLARE_TYPE_TRAIT(TYPE_FLOAT, float); |
| -DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC2, tcu::Vec2); |
| -DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC3, tcu::Vec3); |
| -DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC4, tcu::Vec4); |
| +DECLARE_TYPE_TRAIT(TYPE_FLOAT, float); |
| +DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC2, tcu::Vec2); |
| +DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC3, tcu::Vec3); |
| +DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC4, tcu::Vec4); |
| DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2, tcu::Mat2); |
| DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3, tcu::Mat3); |
| DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4, tcu::Mat4); |
| @@ -165,169 +165,169 @@ DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4, tcu::Mat4); |
| |
| enum OperationType |
| { |
| - OPERATIONTYPE_BINARY_OPERATOR = 0, |
| - OPERATIONTYPE_BINARY_FUNCTION, |
| - OPERATIONTYPE_UNARY_PREFIX_OPERATOR, |
| - OPERATIONTYPE_UNARY_POSTFIX_OPERATOR, |
| - OPERATIONTYPE_ASSIGNMENT, |
| + OPERATIONTYPE_BINARY_OPERATOR = 0, |
| + OPERATIONTYPE_BINARY_FUNCTION, |
| + OPERATIONTYPE_UNARY_PREFIX_OPERATOR, |
| + OPERATIONTYPE_UNARY_POSTFIX_OPERATOR, |
| + OPERATIONTYPE_ASSIGNMENT, |
| |
| - OPERATIONTYPE_LAST |
| + OPERATIONTYPE_LAST |
| }; |
| |
| static const char* getOperationName (MatrixOp op) |
| { |
| - switch (op) |
| - { |
| - case OP_ADD: return "+"; |
| - case OP_SUB: return "-"; |
| - case OP_MUL: return "*"; |
| - case OP_DIV: return "/"; |
| - case OP_COMP_MUL: return "matrixCompMult"; |
| - case OP_UNARY_PLUS: return "+"; |
| - case OP_NEGATION: return "-"; |
| - case OP_PRE_INCREMENT: return "++"; |
| - case OP_PRE_DECREMENT: return "--"; |
| - case OP_POST_INCREMENT: return "++"; |
| - case OP_POST_DECREMENT: return "--"; |
| - case OP_ADD_INTO: return "+="; |
| - case OP_SUBTRACT_FROM: return "-="; |
| - case OP_MULTIPLY_INTO: return "*="; |
| - case OP_DIVIDE_INTO: return "/="; |
| - default: |
| - DE_ASSERT(DE_FALSE); |
| - return ""; |
| - } |
| + switch (op) |
| + { |
| + case OP_ADD: return "+"; |
| + case OP_SUB: return "-"; |
| + case OP_MUL: return "*"; |
| + case OP_DIV: return "/"; |
| + case OP_COMP_MUL: return "matrixCompMult"; |
| + case OP_UNARY_PLUS: return "+"; |
| + case OP_NEGATION: return "-"; |
| + case OP_PRE_INCREMENT: return "++"; |
| + case OP_PRE_DECREMENT: return "--"; |
| + case OP_POST_INCREMENT: return "++"; |
| + case OP_POST_DECREMENT: return "--"; |
| + case OP_ADD_INTO: return "+="; |
| + case OP_SUBTRACT_FROM: return "-="; |
| + case OP_MULTIPLY_INTO: return "*="; |
| + case OP_DIVIDE_INTO: return "/="; |
| + default: |
| + DE_ASSERT(DE_FALSE); |
| + return ""; |
| + } |
| } |
| |
| static OperationType getOperationType (MatrixOp op) |
| { |
| - switch (op) |
| - { |
| - case OP_ADD: return OPERATIONTYPE_BINARY_OPERATOR; |
| - case OP_SUB: return OPERATIONTYPE_BINARY_OPERATOR; |
| - case OP_MUL: return OPERATIONTYPE_BINARY_OPERATOR; |
| - case OP_DIV: return OPERATIONTYPE_BINARY_OPERATOR; |
| - case OP_COMP_MUL: return OPERATIONTYPE_BINARY_FUNCTION; |
| - case OP_UNARY_PLUS: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; |
| - case OP_NEGATION: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; |
| - case OP_PRE_INCREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; |
| - case OP_PRE_DECREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; |
| - case OP_POST_INCREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; |
| - case OP_POST_DECREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; |
| - case OP_ADD_INTO: return OPERATIONTYPE_ASSIGNMENT; |
| - case OP_SUBTRACT_FROM: return OPERATIONTYPE_ASSIGNMENT; |
| - case OP_MULTIPLY_INTO: return OPERATIONTYPE_ASSIGNMENT; |
| - case OP_DIVIDE_INTO: return OPERATIONTYPE_ASSIGNMENT; |
| - default: |
| - DE_ASSERT(DE_FALSE); |
| - return OPERATIONTYPE_LAST; |
| - } |
| + switch (op) |
| + { |
| + case OP_ADD: return OPERATIONTYPE_BINARY_OPERATOR; |
| + case OP_SUB: return OPERATIONTYPE_BINARY_OPERATOR; |
| + case OP_MUL: return OPERATIONTYPE_BINARY_OPERATOR; |
| + case OP_DIV: return OPERATIONTYPE_BINARY_OPERATOR; |
| + case OP_COMP_MUL: return OPERATIONTYPE_BINARY_FUNCTION; |
| + case OP_UNARY_PLUS: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; |
| + case OP_NEGATION: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; |
| + case OP_PRE_INCREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; |
| + case OP_PRE_DECREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; |
| + case OP_POST_INCREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; |
| + case OP_POST_DECREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; |
| + case OP_ADD_INTO: return OPERATIONTYPE_ASSIGNMENT; |
| + case OP_SUBTRACT_FROM: return OPERATIONTYPE_ASSIGNMENT; |
| + case OP_MULTIPLY_INTO: return OPERATIONTYPE_ASSIGNMENT; |
| + case OP_DIVIDE_INTO: return OPERATIONTYPE_ASSIGNMENT; |
| + default: |
| + DE_ASSERT(DE_FALSE); |
| + return OPERATIONTYPE_LAST; |
| + } |
| } |
| |
| enum TestMatrixType |
| { |
| - TESTMATRIXTYPE_DEFAULT = 0, |
| - TESTMATRIXTYPE_NEGATED, |
| - TESTMATRIXTYPE_INCREMENTED, |
| - TESTMATRIXTYPE_DECREMENTED, |
| + TESTMATRIXTYPE_DEFAULT = 0, |
| + TESTMATRIXTYPE_NEGATED, |
| + TESTMATRIXTYPE_INCREMENTED, |
| + TESTMATRIXTYPE_DECREMENTED, |
| |
| - TESTMATRIXTYPE_LAST |
| + TESTMATRIXTYPE_LAST |
| }; |
| |
| static TestMatrixType getOperationTestMatrixType (MatrixOp op) |
| { |
| - switch(op) |
| - { |
| - case OP_ADD: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_SUB: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_MUL: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_DIV: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_COMP_MUL: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_UNARY_PLUS: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_NEGATION: return TESTMATRIXTYPE_NEGATED; |
| - case OP_PRE_INCREMENT: return TESTMATRIXTYPE_NEGATED; |
| - case OP_PRE_DECREMENT: return TESTMATRIXTYPE_INCREMENTED; |
| - case OP_POST_INCREMENT: return TESTMATRIXTYPE_NEGATED; |
| - case OP_POST_DECREMENT: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_ADD_INTO: return TESTMATRIXTYPE_DECREMENTED; |
| - case OP_SUBTRACT_FROM: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_MULTIPLY_INTO: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_DIVIDE_INTO: return TESTMATRIXTYPE_DEFAULT; |
| - |
| - default: |
| - DE_ASSERT(DE_FALSE); |
| - return TESTMATRIXTYPE_LAST; |
| - } |
| + switch(op) |
| + { |
| + case OP_ADD: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_SUB: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_MUL: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_DIV: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_COMP_MUL: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_UNARY_PLUS: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_NEGATION: return TESTMATRIXTYPE_NEGATED; |
| + case OP_PRE_INCREMENT: return TESTMATRIXTYPE_NEGATED; |
| + case OP_PRE_DECREMENT: return TESTMATRIXTYPE_INCREMENTED; |
| + case OP_POST_INCREMENT: return TESTMATRIXTYPE_NEGATED; |
| + case OP_POST_DECREMENT: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_ADD_INTO: return TESTMATRIXTYPE_DECREMENTED; |
| + case OP_SUBTRACT_FROM: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_MULTIPLY_INTO: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_DIVIDE_INTO: return TESTMATRIXTYPE_DEFAULT; |
| + |
| + default: |
| + DE_ASSERT(DE_FALSE); |
| + return TESTMATRIXTYPE_LAST; |
| + } |
| } |
| |
| static bool isOperationBinary (MatrixOp op) |
| { |
| - return getOperationType(op) == OPERATIONTYPE_BINARY_OPERATOR || |
| - getOperationType(op) == OPERATIONTYPE_BINARY_FUNCTION || |
| - getOperationType(op) == OPERATIONTYPE_ASSIGNMENT; |
| + return getOperationType(op) == OPERATIONTYPE_BINARY_OPERATOR || |
| + getOperationType(op) == OPERATIONTYPE_BINARY_FUNCTION || |
| + getOperationType(op) == OPERATIONTYPE_ASSIGNMENT; |
| } |
| |
| static bool isOperationMatrixScalar (MatrixOp op) |
| { |
| - return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV; |
| + return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV; |
| } |
| |
| static bool isOperationMatrixVector (MatrixOp op) |
| { |
| - return op == OP_MUL; |
| + return op == OP_MUL; |
| } |
| |
| static bool isOperationMatrixMatrix (MatrixOp op) |
| { |
| - return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV || op == OP_COMP_MUL; |
| + return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV || op == OP_COMP_MUL; |
| } |
| |
| static bool isOperationUnary (MatrixOp op) |
| { |
| - return op == OP_UNARY_PLUS || |
| - op == OP_NEGATION || |
| - op == OP_PRE_INCREMENT || |
| - op == OP_PRE_DECREMENT || |
| - op == OP_POST_INCREMENT || |
| - op == OP_POST_DECREMENT; |
| + return op == OP_UNARY_PLUS || |
| + op == OP_NEGATION || |
| + op == OP_PRE_INCREMENT || |
| + op == OP_PRE_DECREMENT || |
| + op == OP_POST_INCREMENT || |
| + op == OP_POST_DECREMENT; |
| } |
| |
| static bool isOperationValueModifying (MatrixOp op) |
| { |
| - return op == OP_PRE_INCREMENT || |
| - op == OP_PRE_DECREMENT || |
| - op == OP_POST_INCREMENT || |
| - op == OP_POST_DECREMENT; |
| + return op == OP_PRE_INCREMENT || |
| + op == OP_PRE_DECREMENT || |
| + op == OP_POST_INCREMENT || |
| + op == OP_POST_DECREMENT; |
| } |
| |
| static bool isOperationAssignment (MatrixOp op) |
| { |
| - return op == OP_ADD_INTO || |
| - op == OP_SUBTRACT_FROM || |
| - op == OP_MULTIPLY_INTO || |
| - op == OP_DIVIDE_INTO; |
| + return op == OP_ADD_INTO || |
| + op == OP_SUBTRACT_FROM || |
| + op == OP_MULTIPLY_INTO || |
| + op == OP_DIVIDE_INTO; |
| } |
| |
| // Operation nature |
| |
| enum OperationNature |
| { |
| - OPERATIONNATURE_PURE = 0, |
| - OPERATIONNATURE_MUTATING, |
| - OPERATIONNATURE_ASSIGNMENT, |
| + OPERATIONNATURE_PURE = 0, |
| + OPERATIONNATURE_MUTATING, |
| + OPERATIONNATURE_ASSIGNMENT, |
| |
| - OPERATIONNATURE_LAST |
| + OPERATIONNATURE_LAST |
| }; |
| |
| static OperationNature getOperationNature (MatrixOp op) |
| { |
| - if (isOperationAssignment(op)) |
| - return OPERATIONNATURE_ASSIGNMENT; |
| + if (isOperationAssignment(op)) |
| + return OPERATIONNATURE_ASSIGNMENT; |
| |
| - if (isOperationValueModifying(op)) |
| - return OPERATIONNATURE_MUTATING; |
| + if (isOperationValueModifying(op)) |
| + return OPERATIONNATURE_MUTATING; |
| |
| - return OPERATIONNATURE_PURE; |
| + return OPERATIONNATURE_PURE; |
| } |
| |
| // Input value loader. |
| @@ -335,47 +335,47 @@ static OperationNature getOperationNature (MatrixOp op) |
| template <int InputT, int DataT> |
| typename TypeTraits<DataT>::Type getInputValue (const ShaderEvalContext& evalCtx, int inputNdx); |
| |
| -template <> inline float getInputValue<INPUTTYPE_CONST, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInFloat[inputNdx]; } |
| -template <> inline tcu::Vec2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec2[inputNdx]; } |
| -template <> inline tcu::Vec3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec3[inputNdx]; } |
| -template <> inline tcu::Vec4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec4[inputNdx]; } |
| -template <> inline tcu::Mat2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInMat2[inputNdx]; } |
| -template <> inline tcu::Mat3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInMat3[inputNdx]; } |
| -template <> inline tcu::Mat4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInMat4[inputNdx]; } |
| +template <> inline float getInputValue<INPUTTYPE_CONST, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInFloat[inputNdx]; } |
| +template <> inline tcu::Vec2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec2[inputNdx]; } |
| +template <> inline tcu::Vec3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec3[inputNdx]; } |
| +template <> inline tcu::Vec4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec4[inputNdx]; } |
| +template <> inline tcu::Mat2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInMat2[inputNdx]; } |
| +template <> inline tcu::Mat3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInMat3[inputNdx]; } |
| +template <> inline tcu::Mat4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInMat4[inputNdx]; } |
| |
| -template <> inline float getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.x(); } |
| -template <> inline tcu::Vec2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1); } |
| -template <> inline tcu::Vec3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1, 2); } |
| -template <> inline tcu::Vec4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1, 2, 3); } |
| +template <> inline float getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.x(); } |
| +template <> inline tcu::Vec2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1); } |
| +template <> inline tcu::Vec3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1, 2); } |
| +template <> inline tcu::Vec4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1, 2, 3); } |
| |
| template <> inline tcu::Mat2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT2> (const ShaderEvalContext& evalCtx, int inputNdx) |
| { |
| - DE_UNREF(inputNdx); // Not used. |
| - tcu::Mat2 m; |
| - m.setColumn(0, evalCtx.in[0].swizzle(0,1)); |
| - m.setColumn(1, evalCtx.in[1].swizzle(0,1)); |
| - return m; |
| + DE_UNREF(inputNdx); // Not used. |
| + tcu::Mat2 m; |
| + m.setColumn(0, evalCtx.in[0].swizzle(0,1)); |
| + m.setColumn(1, evalCtx.in[1].swizzle(0,1)); |
| + return m; |
| } |
| |
| template <> inline tcu::Mat3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT3> (const ShaderEvalContext& evalCtx, int inputNdx) |
| { |
| - DE_UNREF(inputNdx); // Not used. |
| - tcu::Mat3 m; |
| - m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); |
| - m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); |
| - m.setColumn(2, evalCtx.in[2].swizzle(0,1,2)); |
| - return m; |
| + DE_UNREF(inputNdx); // Not used. |
| + tcu::Mat3 m; |
| + m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); |
| + m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); |
| + m.setColumn(2, evalCtx.in[2].swizzle(0,1,2)); |
| + return m; |
| } |
| |
| template <> inline tcu::Mat4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT4> (const ShaderEvalContext& evalCtx, int inputNdx) |
| { |
| - DE_UNREF(inputNdx); // Not used. |
| - tcu::Mat4 m; |
| - m.setColumn(0, evalCtx.in[0]); |
| - m.setColumn(1, evalCtx.in[1]); |
| - m.setColumn(2, evalCtx.in[2]); |
| - m.setColumn(3, evalCtx.in[3]); |
| - return m; |
| + DE_UNREF(inputNdx); // Not used. |
| + tcu::Mat4 m; |
| + m.setColumn(0, evalCtx.in[0]); |
| + m.setColumn(1, evalCtx.in[1]); |
| + m.setColumn(2, evalCtx.in[2]); |
| + m.setColumn(3, evalCtx.in[3]); |
| + return m; |
| } |
| |
| // Reduction from expression result to vec3. |
| @@ -392,13 +392,13 @@ inline tcu::Vec3 reduceToVec3 (const tcu::Mat4& value) { return value.getColumn( |
| template <typename T, int Rows, int Cols> |
| tcu::Matrix<T, Rows, Cols> matrixCompMult (const tcu::Matrix<T, Rows, Cols>& a, const tcu::Matrix<T, Rows, Cols>& b) |
| { |
| - tcu::Matrix<T, Rows, Cols> retVal; |
| + tcu::Matrix<T, Rows, Cols> retVal; |
| |
| - for (int r = 0; r < Rows; ++r) |
| - for (int c = 0; c < Cols; ++c) |
| - retVal(r,c) = a(r,c) * b(r, c); |
| + for (int r = 0; r < Rows; ++r) |
| + for (int c = 0; c < Cols; ++c) |
| + retVal(r,c) = a(r,c) * b(r, c); |
| |
| - return retVal; |
| + return retVal; |
| } |
| |
| // negate |
| @@ -406,13 +406,13 @@ tcu::Matrix<T, Rows, Cols> matrixCompMult (const tcu::Matrix<T, Rows, Cols>& a, |
| template <typename T, int Rows, int Cols> |
| tcu::Matrix<T, Rows, Cols> negate (const tcu::Matrix<T, Rows, Cols>& mat) |
| { |
| - tcu::Matrix<T, Rows, Cols> retVal; |
| + tcu::Matrix<T, Rows, Cols> retVal; |
| |
| - for (int r = 0; r < Rows; ++r) |
| - for (int c = 0; c < Cols; ++c) |
| - retVal(r,c) = -mat(r, c); |
| + for (int r = 0; r < Rows; ++r) |
| + for (int c = 0; c < Cols; ++c) |
| + retVal(r,c) = -mat(r, c); |
| |
| - return retVal; |
| + return retVal; |
| } |
| |
| // increment/decrement |
| @@ -420,25 +420,25 @@ tcu::Matrix<T, Rows, Cols> negate (const tcu::Matrix<T, Rows, Cols>& mat) |
| template <typename T, int Rows, int Cols> |
| tcu::Matrix<T, Rows, Cols> increment (const tcu::Matrix<T, Rows, Cols>& mat) |
| { |
| - tcu::Matrix<T, Rows, Cols> retVal; |
| + tcu::Matrix<T, Rows, Cols> retVal; |
| |
| - for (int r = 0; r < Rows; ++r) |
| - for (int c = 0; c < Cols; ++c) |
| - retVal(r,c) = mat(r, c) + 1.0f; |
| + for (int r = 0; r < Rows; ++r) |
| + for (int c = 0; c < Cols; ++c) |
| + retVal(r,c) = mat(r, c) + 1.0f; |
| |
| - return retVal; |
| + return retVal; |
| } |
| |
| template <typename T, int Rows, int Cols> |
| tcu::Matrix<T, Rows, Cols> decrement (const tcu::Matrix<T, Rows, Cols>& mat) |
| { |
| - tcu::Matrix<T, Rows, Cols> retVal; |
| + tcu::Matrix<T, Rows, Cols> retVal; |
| |
| - for (int r = 0; r < Rows; ++r) |
| - for (int c = 0; c < Cols; ++c) |
| - retVal(r,c) = mat(r, c) - 1.0f; |
| + for (int r = 0; r < Rows; ++r) |
| + for (int c = 0; c < Cols; ++c) |
| + retVal(r,c) = mat(r, c) - 1.0f; |
| |
| - return retVal; |
| + return retVal; |
| } |
| |
| // Evaluator template. |
| @@ -449,244 +449,244 @@ struct Evaluator; |
| template <int In0Type, int In0DataType, int In1Type, int In1DataType> |
| struct Evaluator<OP_ADD, In0Type, In0DataType, In1Type, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx) |
| - { |
| - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) + getInputValue<In1Type, In1DataType>(evalCtx, 1)); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx) |
| + { |
| + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) + getInputValue<In1Type, In1DataType>(evalCtx, 1)); |
| + } |
| }; |
| |
| template <int In0Type, int In0DataType, int In1Type, int In1DataType> |
| struct Evaluator<OP_SUB, In0Type, In0DataType, In1Type, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx) |
| - { |
| - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) - getInputValue<In1Type, In1DataType>(evalCtx, 1)); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx) |
| + { |
| + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) - getInputValue<In1Type, In1DataType>(evalCtx, 1)); |
| + } |
| }; |
| |
| template <int In0Type, int In0DataType, int In1Type, int In1DataType> |
| struct Evaluator<OP_MUL, In0Type, In0DataType, In1Type, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx) |
| - { |
| - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) * getInputValue<In1Type, In1DataType>(evalCtx, 1)); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx) |
| + { |
| + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) * getInputValue<In1Type, In1DataType>(evalCtx, 1)); |
| + } |
| }; |
| |
| template <int In0Type, int In0DataType, int In1Type, int In1DataType> |
| struct Evaluator<OP_DIV, In0Type, In0DataType, In1Type, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx) |
| - { |
| - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) / getInputValue<In1Type, In1DataType>(evalCtx, 1)); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx) |
| + { |
| + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) / getInputValue<In1Type, In1DataType>(evalCtx, 1)); |
| + } |
| }; |
| |
| template <int In0Type, int In0DataType, int In1Type, int In1DataType> |
| struct Evaluator<OP_COMP_MUL, In0Type, In0DataType, In1Type, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx) |
| - { |
| - evalCtx.color.xyz() = reduceToVec3(matrixCompMult(getInputValue<In0Type, In0DataType>(evalCtx, 0), getInputValue<In1Type, In1DataType>(evalCtx, 1))); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx) |
| + { |
| + evalCtx.color.xyz() = reduceToVec3(matrixCompMult(getInputValue<In0Type, In0DataType>(evalCtx, 0), getInputValue<In1Type, In1DataType>(evalCtx, 1))); |
| + } |
| }; |
| |
| template <int In0Type, int In0DataType, int In1Type, int In1DataType> |
| struct Evaluator<OP_UNARY_PLUS, In0Type, In0DataType, In1Type, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx) |
| - { |
| - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0)); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx) |
| + { |
| + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0)); |
| + } |
| }; |
| |
| template <int In0Type, int In0DataType, int In1Type, int In1DataType> |
| struct Evaluator<OP_NEGATION, In0Type, In0DataType, In1Type, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx) |
| - { |
| - evalCtx.color.xyz() = reduceToVec3(negate(getInputValue<In0Type, In0DataType>(evalCtx, 0))); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx) |
| + { |
| + evalCtx.color.xyz() = reduceToVec3(negate(getInputValue<In0Type, In0DataType>(evalCtx, 0))); |
| + } |
| }; |
| |
| template <int In0Type, int In0DataType, int In1Type, int In1DataType> |
| struct Evaluator<OP_PRE_INCREMENT, In0Type, In0DataType, In1Type, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx) |
| - { |
| - // modifying reduction: sum modified value too |
| - evalCtx.color.xyz() = reduceToVec3(increment(getInputValue<In0Type, In0DataType>(evalCtx, 0))) + reduceToVec3(increment(getInputValue<In0Type, In0DataType>(evalCtx, 0))); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx) |
| + { |
| + // modifying reduction: sum modified value too |
| + evalCtx.color.xyz() = reduceToVec3(increment(getInputValue<In0Type, In0DataType>(evalCtx, 0))) + reduceToVec3(increment(getInputValue<In0Type, In0DataType>(evalCtx, 0))); |
| + } |
| }; |
| |
| template <int In0Type, int In0DataType, int In1Type, int In1DataType> |
| struct Evaluator<OP_PRE_DECREMENT, In0Type, In0DataType, In1Type, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx) |
| - { |
| - // modifying reduction: sum modified value too |
| - evalCtx.color.xyz() = reduceToVec3(decrement(getInputValue<In0Type, In0DataType>(evalCtx, 0))) + reduceToVec3(decrement(getInputValue<In0Type, In0DataType>(evalCtx, 0))); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx) |
| + { |
| + // modifying reduction: sum modified value too |
| + evalCtx.color.xyz() = reduceToVec3(decrement(getInputValue<In0Type, In0DataType>(evalCtx, 0))) + reduceToVec3(decrement(getInputValue<In0Type, In0DataType>(evalCtx, 0))); |
| + } |
| }; |
| |
| template <int In0Type, int In0DataType, int In1Type, int In1DataType> |
| struct Evaluator<OP_POST_INCREMENT, In0Type, In0DataType, In1Type, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx) |
| - { |
| - // modifying reduction: sum modified value too |
| - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0)) + reduceToVec3(increment(getInputValue<In0Type, In0DataType>(evalCtx, 0))); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx) |
| + { |
| + // modifying reduction: sum modified value too |
| + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0)) + reduceToVec3(increment(getInputValue<In0Type, In0DataType>(evalCtx, 0))); |
| + } |
| }; |
| |
| template <int In0Type, int In0DataType, int In1Type, int In1DataType> |
| struct Evaluator<OP_POST_DECREMENT, In0Type, In0DataType, In1Type, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx) |
| - { |
| - // modifying reduction: sum modified value too |
| - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0)) + reduceToVec3(decrement(getInputValue<In0Type, In0DataType>(evalCtx, 0))); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx) |
| + { |
| + // modifying reduction: sum modified value too |
| + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0)) + reduceToVec3(decrement(getInputValue<In0Type, In0DataType>(evalCtx, 0))); |
| + } |
| }; |
| |
| template <int In0Type, int In0DataType, int In1Type, int In1DataType> |
| struct Evaluator<OP_ADD_INTO, In0Type, In0DataType, In1Type, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx) |
| - { |
| - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) + getInputValue<In1Type, In1DataType>(evalCtx, 1)); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx) |
| + { |
| + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) + getInputValue<In1Type, In1DataType>(evalCtx, 1)); |
| + } |
| }; |
| |
| template <int In0Type, int In0DataType, int In1Type, int In1DataType> |
| struct Evaluator<OP_SUBTRACT_FROM, In0Type, In0DataType, In1Type, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx) |
| - { |
| - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) - getInputValue<In1Type, In1DataType>(evalCtx, 1)); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx) |
| + { |
| + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) - getInputValue<In1Type, In1DataType>(evalCtx, 1)); |
| + } |
| }; |
| |
| template <int In0Type, int In0DataType, int In1Type, int In1DataType> |
| struct Evaluator<OP_MULTIPLY_INTO, In0Type, In0DataType, In1Type, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx) |
| - { |
| - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) * getInputValue<In1Type, In1DataType>(evalCtx, 1)); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx) |
| + { |
| + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) * getInputValue<In1Type, In1DataType>(evalCtx, 1)); |
| + } |
| }; |
| |
| template <int In0Type, int In0DataType, int In1Type, int In1DataType> |
| struct Evaluator<OP_DIVIDE_INTO, In0Type, In0DataType, In1Type, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx) |
| - { |
| - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) / getInputValue<In1Type, In1DataType>(evalCtx, 1)); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx) |
| + { |
| + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) / getInputValue<In1Type, In1DataType>(evalCtx, 1)); |
| + } |
| }; |
| |
| ShaderEvalFunc getEvalFunc (const ShaderInput& in0, const ShaderInput& in1, MatrixOp op) |
| { |
| - DE_STATIC_ASSERT(TYPE_LAST <= (1<<7)); |
| - DE_STATIC_ASSERT(OP_LAST <= (1<<4)); |
| - DE_STATIC_ASSERT(INPUTTYPE_LAST <= (1<<2)); |
| - |
| -#define PACK_EVAL_CASE(OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) (((OP) << 18) | ((IN0TYPE) << 16) | ((IN0DATATYPE) << 9) | ((IN1TYPE) << 7) | (IN1DATATYPE)) |
| - |
| -#define MAKE_EVAL_CASE(OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ |
| - case PACK_EVAL_CASE(OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE): \ |
| - return Evaluator<OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE>::evaluate |
| - |
| -#define SCALAR_OPS(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ |
| - MAKE_EVAL_CASE(OP_ADD, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_SUB, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_DIV, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) |
| - |
| -#define ALL_OPS(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ |
| - MAKE_EVAL_CASE(OP_ADD, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_SUB, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_DIV, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_COMP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); |
| - |
| -#define MUL_OP(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ |
| - MAKE_EVAL_CASE(OP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) |
| - |
| -#define MAKE_MAT_SCALAR_VEC_CASES(OP, TYPE0, TYPE1) \ |
| - OP(INPUTTYPE_CONST, TYPE0, INPUTTYPE_CONST, TYPE1); \ |
| - OP(INPUTTYPE_DYNAMIC, TYPE0, INPUTTYPE_CONST, TYPE1); \ |
| - OP(INPUTTYPE_CONST, TYPE0, INPUTTYPE_DYNAMIC, TYPE1); \ |
| - OP(INPUTTYPE_DYNAMIC, TYPE0, INPUTTYPE_DYNAMIC, TYPE1) |
| - |
| -#define MAKE_MAT_MAT_CASES(OP, MATTYPE) \ |
| - OP(INPUTTYPE_CONST, MATTYPE, INPUTTYPE_CONST, MATTYPE); \ |
| - OP(INPUTTYPE_DYNAMIC, MATTYPE, INPUTTYPE_CONST, MATTYPE) |
| - |
| -#define UNARY_OP(IN0TYPE, IN0DATATYPE) \ |
| - MAKE_EVAL_CASE(OP_UNARY_PLUS, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ |
| - MAKE_EVAL_CASE(OP_NEGATION, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ |
| - MAKE_EVAL_CASE(OP_PRE_INCREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ |
| - MAKE_EVAL_CASE(OP_PRE_DECREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ |
| - MAKE_EVAL_CASE(OP_POST_INCREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ |
| - MAKE_EVAL_CASE(OP_POST_DECREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST) |
| - |
| -#define MAKE_UNARY_CASES(OP, MATTYPE) \ |
| - OP(INPUTTYPE_CONST, MATTYPE); \ |
| - OP(INPUTTYPE_DYNAMIC, MATTYPE) |
| - |
| -#define ASSIGN_OP(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ |
| - MAKE_EVAL_CASE(OP_ADD_INTO, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_SUBTRACT_FROM, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_MULTIPLY_INTO, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_DIVIDE_INTO, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) |
| - |
| -#define MAKE_ASSIGNMENT_CASES(OP, MATTYPE) \ |
| - OP(INPUTTYPE_CONST, MATTYPE, INPUTTYPE_CONST, MATTYPE); \ |
| - OP(INPUTTYPE_DYNAMIC, MATTYPE, INPUTTYPE_CONST, MATTYPE); \ |
| - OP(INPUTTYPE_CONST, MATTYPE, INPUTTYPE_DYNAMIC, MATTYPE); \ |
| - OP(INPUTTYPE_DYNAMIC, MATTYPE, INPUTTYPE_DYNAMIC, MATTYPE) |
| - |
| - // \note At the moment there is no difference between uniform and const inputs. This saves binary size. |
| - InputType in0Type = in0.inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_DYNAMIC : INPUTTYPE_CONST; |
| - InputType in1Type = in1.inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_DYNAMIC : INPUTTYPE_CONST; |
| - |
| - switch (PACK_EVAL_CASE(op, in0Type, in0.dataType, in1Type, in1.dataType)) |
| - { |
| - // Matrix-scalar. |
| - MAKE_MAT_SCALAR_VEC_CASES(SCALAR_OPS, TYPE_FLOAT_MAT2, TYPE_FLOAT); |
| - MAKE_MAT_SCALAR_VEC_CASES(SCALAR_OPS, TYPE_FLOAT_MAT3, TYPE_FLOAT); |
| - MAKE_MAT_SCALAR_VEC_CASES(SCALAR_OPS, TYPE_FLOAT_MAT4, TYPE_FLOAT); |
| - |
| - // Matrix-vector. |
| - MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_MAT2, TYPE_FLOAT_VEC2); |
| - MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_MAT3, TYPE_FLOAT_VEC3); |
| - MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_MAT4, TYPE_FLOAT_VEC4); |
| - |
| - // Vector-matrix. |
| - MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT2); |
| - MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT3); |
| - MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT4); |
| - |
| - // Matrix-matrix. |
| - MAKE_MAT_MAT_CASES(ALL_OPS, TYPE_FLOAT_MAT2); |
| - MAKE_MAT_MAT_CASES(ALL_OPS, TYPE_FLOAT_MAT3); |
| - MAKE_MAT_MAT_CASES(ALL_OPS, TYPE_FLOAT_MAT4); |
| - |
| - // Unary matrix |
| - MAKE_UNARY_CASES(UNARY_OP, TYPE_FLOAT_MAT2); |
| - MAKE_UNARY_CASES(UNARY_OP, TYPE_FLOAT_MAT3); |
| - MAKE_UNARY_CASES(UNARY_OP, TYPE_FLOAT_MAT4); |
| - |
| - // Assignment matrix |
| - MAKE_ASSIGNMENT_CASES(ASSIGN_OP, TYPE_FLOAT_MAT2); |
| - MAKE_ASSIGNMENT_CASES(ASSIGN_OP, TYPE_FLOAT_MAT3); |
| - MAKE_ASSIGNMENT_CASES(ASSIGN_OP, TYPE_FLOAT_MAT4); |
| - |
| - default: |
| - DE_ASSERT(DE_FALSE); |
| - return DE_NULL; |
| - } |
| + DE_STATIC_ASSERT(TYPE_LAST <= (1<<7)); |
| + DE_STATIC_ASSERT(OP_LAST <= (1<<4)); |
| + DE_STATIC_ASSERT(INPUTTYPE_LAST <= (1<<2)); |
| + |
| +#define PACK_EVAL_CASE(OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) (((OP) << 18) | ((IN0TYPE) << 16) | ((IN0DATATYPE) << 9) | ((IN1TYPE) << 7) | (IN1DATATYPE)) |
| + |
| +#define MAKE_EVAL_CASE(OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ |
| + case PACK_EVAL_CASE(OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE): \ |
| + return Evaluator<OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE>::evaluate |
| + |
| +#define SCALAR_OPS(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ |
| + MAKE_EVAL_CASE(OP_ADD, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_SUB, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_DIV, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) |
| + |
| +#define ALL_OPS(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ |
| + MAKE_EVAL_CASE(OP_ADD, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_SUB, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_DIV, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_COMP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); |
| + |
| +#define MUL_OP(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ |
| + MAKE_EVAL_CASE(OP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) |
| + |
| +#define MAKE_MAT_SCALAR_VEC_CASES(OP, TYPE0, TYPE1) \ |
| + OP(INPUTTYPE_CONST, TYPE0, INPUTTYPE_CONST, TYPE1); \ |
| + OP(INPUTTYPE_DYNAMIC, TYPE0, INPUTTYPE_CONST, TYPE1); \ |
| + OP(INPUTTYPE_CONST, TYPE0, INPUTTYPE_DYNAMIC, TYPE1); \ |
| + OP(INPUTTYPE_DYNAMIC, TYPE0, INPUTTYPE_DYNAMIC, TYPE1) |
| + |
| +#define MAKE_MAT_MAT_CASES(OP, MATTYPE) \ |
| + OP(INPUTTYPE_CONST, MATTYPE, INPUTTYPE_CONST, MATTYPE); \ |
| + OP(INPUTTYPE_DYNAMIC, MATTYPE, INPUTTYPE_CONST, MATTYPE) |
| + |
| +#define UNARY_OP(IN0TYPE, IN0DATATYPE) \ |
| + MAKE_EVAL_CASE(OP_UNARY_PLUS, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ |
| + MAKE_EVAL_CASE(OP_NEGATION, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ |
| + MAKE_EVAL_CASE(OP_PRE_INCREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ |
| + MAKE_EVAL_CASE(OP_PRE_DECREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ |
| + MAKE_EVAL_CASE(OP_POST_INCREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ |
| + MAKE_EVAL_CASE(OP_POST_DECREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST) |
| + |
| +#define MAKE_UNARY_CASES(OP, MATTYPE) \ |
| + OP(INPUTTYPE_CONST, MATTYPE); \ |
| + OP(INPUTTYPE_DYNAMIC, MATTYPE) |
| + |
| +#define ASSIGN_OP(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ |
| + MAKE_EVAL_CASE(OP_ADD_INTO, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_SUBTRACT_FROM, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_MULTIPLY_INTO, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_DIVIDE_INTO, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) |
| + |
| +#define MAKE_ASSIGNMENT_CASES(OP, MATTYPE) \ |
| + OP(INPUTTYPE_CONST, MATTYPE, INPUTTYPE_CONST, MATTYPE); \ |
| + OP(INPUTTYPE_DYNAMIC, MATTYPE, INPUTTYPE_CONST, MATTYPE); \ |
| + OP(INPUTTYPE_CONST, MATTYPE, INPUTTYPE_DYNAMIC, MATTYPE); \ |
| + OP(INPUTTYPE_DYNAMIC, MATTYPE, INPUTTYPE_DYNAMIC, MATTYPE) |
| + |
| + // \note At the moment there is no difference between uniform and const inputs. This saves binary size. |
| + InputType in0Type = in0.inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_DYNAMIC : INPUTTYPE_CONST; |
| + InputType in1Type = in1.inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_DYNAMIC : INPUTTYPE_CONST; |
| + |
| + switch (PACK_EVAL_CASE(op, in0Type, in0.dataType, in1Type, in1.dataType)) |
| + { |
| + // Matrix-scalar. |
| + MAKE_MAT_SCALAR_VEC_CASES(SCALAR_OPS, TYPE_FLOAT_MAT2, TYPE_FLOAT); |
| + MAKE_MAT_SCALAR_VEC_CASES(SCALAR_OPS, TYPE_FLOAT_MAT3, TYPE_FLOAT); |
| + MAKE_MAT_SCALAR_VEC_CASES(SCALAR_OPS, TYPE_FLOAT_MAT4, TYPE_FLOAT); |
| + |
| + // Matrix-vector. |
| + MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_MAT2, TYPE_FLOAT_VEC2); |
| + MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_MAT3, TYPE_FLOAT_VEC3); |
| + MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_MAT4, TYPE_FLOAT_VEC4); |
| + |
| + // Vector-matrix. |
| + MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT2); |
| + MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT3); |
| + MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT4); |
| + |
| + // Matrix-matrix. |
| + MAKE_MAT_MAT_CASES(ALL_OPS, TYPE_FLOAT_MAT2); |
| + MAKE_MAT_MAT_CASES(ALL_OPS, TYPE_FLOAT_MAT3); |
| + MAKE_MAT_MAT_CASES(ALL_OPS, TYPE_FLOAT_MAT4); |
| + |
| + // Unary matrix |
| + MAKE_UNARY_CASES(UNARY_OP, TYPE_FLOAT_MAT2); |
| + MAKE_UNARY_CASES(UNARY_OP, TYPE_FLOAT_MAT3); |
| + MAKE_UNARY_CASES(UNARY_OP, TYPE_FLOAT_MAT4); |
| + |
| + // Assignment matrix |
| + MAKE_ASSIGNMENT_CASES(ASSIGN_OP, TYPE_FLOAT_MAT2); |
| + MAKE_ASSIGNMENT_CASES(ASSIGN_OP, TYPE_FLOAT_MAT3); |
| + MAKE_ASSIGNMENT_CASES(ASSIGN_OP, TYPE_FLOAT_MAT4); |
| + |
| + default: |
| + DE_ASSERT(DE_FALSE); |
| + return DE_NULL; |
| + } |
| |
| #undef PACK_EVAL_CASE |
| #undef MAKE_EVAL_CASE |
| @@ -701,35 +701,35 @@ ShaderEvalFunc getEvalFunc (const ShaderInput& in0, const ShaderInput& in1, Matr |
| template <int Size> |
| void writeVectorConstructor (std::ostream& str, const tcu::Vector<float, Size>& v) |
| { |
| - str << "vec" << Size << "("; |
| - for (int ndx = 0; ndx < Size; ndx++) |
| - { |
| - if (ndx != 0) |
| - str << ", "; |
| - str << de::floatToString(v[ndx], 1); |
| - } |
| - str << ")"; |
| + str << "vec" << Size << "("; |
| + for (int ndx = 0; ndx < Size; ndx++) |
| + { |
| + if (ndx != 0) |
| + str << ", "; |
| + str << de::floatToString(v[ndx], 1); |
| + } |
| + str << ")"; |
| } |
| |
| template <int Cols, int Rows> |
| void writeMatrixConstructor (std::ostream& str, const tcu::Matrix<float, Rows, Cols>& m) |
| { |
| - if (Rows == Cols) |
| - str << "mat" << Cols; |
| - else |
| - str << "mat" << Cols << "x" << Rows; |
| - |
| - str << "("; |
| - for (int colNdx = 0; colNdx < Cols; colNdx++) |
| - { |
| - for (int rowNdx = 0; rowNdx < Rows; rowNdx++) |
| - { |
| - if (rowNdx > 0 || colNdx > 0) |
| - str << ", "; |
| - str << de::floatToString(m(rowNdx, colNdx), 1); |
| - } |
| - } |
| - str << ")"; |
| + if (Rows == Cols) |
| + str << "mat" << Cols; |
| + else |
| + str << "mat" << Cols << "x" << Rows; |
| + |
| + str << "("; |
| + for (int colNdx = 0; colNdx < Cols; colNdx++) |
| + { |
| + for (int rowNdx = 0; rowNdx < Rows; rowNdx++) |
| + { |
| + if (rowNdx > 0 || colNdx > 0) |
| + str << ", "; |
| + str << de::floatToString(m(rowNdx, colNdx), 1); |
| + } |
| + } |
| + str << ")"; |
| } |
| |
| } // MatrixCaseUtils |
| @@ -739,26 +739,26 @@ using namespace MatrixCaseUtils; |
| class ShaderMatrixCase : public ShaderRenderCase |
| { |
| public: |
| - ShaderMatrixCase (Context& context, const char* name, const char* desc, const ShaderInput& in0, const ShaderInput& in1, MatrixOp op, bool isVertexCase); |
| - ~ShaderMatrixCase (void); |
| + ShaderMatrixCase (Context& context, const char* name, const char* desc, const ShaderInput& in0, const ShaderInput& in1, MatrixOp op, bool isVertexCase); |
| + ~ShaderMatrixCase (void); |
| |
| - void init (void); |
| + void init (void); |
| |
| protected: |
| - std::string genGLSLMatToVec3Reduction (const glu::DataType& matType, const char* varName); |
| - void setupUniforms (int programID, const tcu::Vec4& constCoords); |
| + std::string genGLSLMatToVec3Reduction (const glu::DataType& matType, const char* varName); |
| + void setupUniforms (int programID, const tcu::Vec4& constCoords); |
| |
| private: |
| - ShaderInput m_in0; |
| - ShaderInput m_in1; |
| - MatrixOp m_op; |
| + ShaderInput m_in0; |
| + ShaderInput m_in1; |
| + MatrixOp m_op; |
| }; |
| |
| ShaderMatrixCase::ShaderMatrixCase (Context& context, const char* name, const char* desc, const ShaderInput& in0, const ShaderInput& in1, MatrixOp op, bool isVertexCase) |
| - : ShaderRenderCase (context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name, desc, isVertexCase, getEvalFunc(in0, in1, op)) |
| - , m_in0 (in0) |
| - , m_in1 (in1) |
| - , m_op (op) |
| + : ShaderRenderCase (context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name, desc, isVertexCase, getEvalFunc(in0, in1, op)) |
| + , m_in0 (in0) |
| + , m_in1 (in1) |
| + , m_op (op) |
| { |
| } |
| |
| @@ -768,315 +768,315 @@ ShaderMatrixCase::~ShaderMatrixCase (void) |
| |
| void ShaderMatrixCase::init (void) |
| { |
| - std::ostringstream vtx; |
| - std::ostringstream frag; |
| - std::ostringstream& op = m_isVertexCase ? vtx : frag; |
| - |
| - bool isInDynMat0 = isDataTypeMatrix(m_in0.dataType) && m_in0.inputType == INPUTTYPE_DYNAMIC; |
| - bool isInDynMat1 = isDataTypeMatrix(m_in1.dataType) && m_in1.inputType == INPUTTYPE_DYNAMIC; |
| - string inValue0; |
| - string inValue1; |
| - DataType resultType = TYPE_LAST; |
| - Precision resultPrec = m_in0.precision; |
| - vector<string> passVars; |
| - int numInputs = (isOperationBinary(m_op)) ? (2) : (1); |
| - |
| - std::string operationValue0; |
| - std::string operationValue1; |
| - |
| - DE_ASSERT(!isInDynMat0 || !isInDynMat1); // Only single dynamic matrix input is allowed. |
| - DE_UNREF(isInDynMat0 && isInDynMat1); |
| - |
| - // Compute result type. |
| - if (isDataTypeMatrix(m_in0.dataType) && isDataTypeMatrix(m_in1.dataType)) |
| - { |
| - DE_ASSERT(m_in0.dataType == m_in1.dataType); |
| - resultType = m_in0.dataType; |
| - } |
| - else if (getOperationType(m_op) == OPERATIONTYPE_UNARY_PREFIX_OPERATOR || |
| - getOperationType(m_op) == OPERATIONTYPE_UNARY_POSTFIX_OPERATOR) |
| - { |
| - resultType = m_in0.dataType; |
| - } |
| - else |
| - { |
| - int matNdx = isDataTypeMatrix(m_in0.dataType) ? 0 : 1; |
| - DataType matrixType = matNdx == 0 ? m_in0.dataType : m_in1.dataType; |
| - DataType otherType = matNdx == 0 ? m_in1.dataType : m_in0.dataType; |
| - |
| - if (otherType == TYPE_FLOAT) |
| - resultType = matrixType; |
| - else |
| - { |
| - DE_ASSERT(isDataTypeVector(otherType)); |
| - resultType = otherType; |
| - } |
| - } |
| - |
| - vtx << "attribute highp vec4 a_position;\n"; |
| - if (m_isVertexCase) |
| - { |
| - vtx << "varying mediump vec4 v_color;\n"; |
| - frag << "varying mediump vec4 v_color;\n"; |
| - } |
| - |
| - // Input declarations. |
| - for (int inNdx = 0; inNdx < numInputs; inNdx++) |
| - { |
| - const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; |
| - const char* precName = getPrecisionName(in.precision); |
| - const char* typeName = getDataTypeName(in.dataType); |
| - string& inValue = inNdx > 0 ? inValue1 : inValue0; |
| - |
| - if (in.inputType == INPUTTYPE_DYNAMIC) |
| - { |
| - vtx << "attribute " << precName << " " << typeName << " a_"; |
| - |
| - if (isDataTypeMatrix(in.dataType)) |
| - { |
| - // a_matN, v_matN |
| - vtx << typeName << ";\n"; |
| - if (!m_isVertexCase) |
| - { |
| - vtx << "varying " << precName << " " << typeName << " v_" << typeName << ";\n"; |
| - frag << "varying " << precName << " " << typeName << " v_" << typeName << ";\n"; |
| - passVars.push_back(typeName); |
| - } |
| - |
| - inValue = string(m_isVertexCase ? "a_" : "v_") + getDataTypeName(in.dataType); |
| - } |
| - else |
| - { |
| - // a_coords, v_coords |
| - vtx << "coords;\n"; |
| - if (!m_isVertexCase) |
| - { |
| - vtx << "varying " << precName << " " << typeName << " v_coords;\n"; |
| - frag << "varying " << precName << " " << typeName << " v_coords;\n"; |
| - passVars.push_back("coords"); |
| - } |
| - |
| - inValue = m_isVertexCase ? "a_coords" : "v_coords"; |
| - } |
| - } |
| - else if (in.inputType == INPUTTYPE_UNIFORM) |
| - { |
| - op << "uniform " << precName << " " << typeName << " u_in" << inNdx << ";\n"; |
| - inValue = string("u_in") + de::toString(inNdx); |
| - } |
| - else if (in.inputType == INPUTTYPE_CONST) |
| - { |
| - op << "const " << precName << " " << typeName << " in" << inNdx << " = "; |
| - |
| - // Generate declaration. |
| - switch (in.dataType) |
| - { |
| - case TYPE_FLOAT: op << de::floatToString(s_constInFloat[inNdx], 1); break; |
| - case TYPE_FLOAT_VEC2: writeVectorConstructor<2>(op, s_constInVec2[inNdx]); break; |
| - case TYPE_FLOAT_VEC3: writeVectorConstructor<3>(op, s_constInVec3[inNdx]); break; |
| - case TYPE_FLOAT_VEC4: writeVectorConstructor<4>(op, s_constInVec4[inNdx]); break; |
| - case TYPE_FLOAT_MAT2: writeMatrixConstructor<2, 2>(op, Mat2(s_constInMat2[inNdx])); break; |
| - case TYPE_FLOAT_MAT3: writeMatrixConstructor<3, 3>(op, Mat3(s_constInMat3[inNdx])); break; |
| - case TYPE_FLOAT_MAT4: writeMatrixConstructor<4, 4>(op, Mat4(s_constInMat4[inNdx])); break; |
| - |
| - default: |
| - DE_ASSERT(DE_FALSE); |
| - } |
| - |
| - op << ";\n"; |
| - |
| - inValue = string("in") + de::toString(inNdx); |
| - } |
| - } |
| - |
| - vtx << "\n" |
| - << "void main (void)\n" |
| - << "{\n" |
| - << " gl_Position = a_position;\n"; |
| - frag << "\n" |
| - << "void main (void)\n" |
| - << "{\n"; |
| - |
| - if (m_isVertexCase) |
| - { |
| - frag << " gl_FragColor = v_color;\n"; |
| - } |
| - else |
| - { |
| - for (vector<string>::const_iterator copyIter = passVars.begin(); copyIter != passVars.end(); copyIter++) |
| - vtx << " v_" << *copyIter << " = " << "a_" << *copyIter << ";\n"; |
| - } |
| - |
| - // Operation. |
| - |
| - switch (getOperationNature(m_op)) |
| - { |
| - case OPERATIONNATURE_PURE: |
| - DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); |
| - |
| - operationValue0 = inValue0; |
| - operationValue1 = inValue1; |
| - break; |
| - |
| - case OPERATIONNATURE_MUTATING: |
| - DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); |
| - |
| - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " tmpValue = " << inValue0 << ";\n"; |
| - |
| - operationValue0 = "tmpValue"; |
| - operationValue1 = inValue1; |
| - break; |
| - |
| - case OPERATIONNATURE_ASSIGNMENT: |
| - DE_ASSERT(getOperationType(m_op) == OPERATIONTYPE_ASSIGNMENT); |
| - |
| - operationValue0 = inValue0; |
| - operationValue1 = inValue1; |
| - break; |
| - |
| - default: |
| - DE_ASSERT(DE_FALSE); |
| - } |
| - |
| - switch (getOperationType(m_op)) |
| - { |
| - case OPERATIONTYPE_BINARY_OPERATOR: |
| - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << " " << getOperationName(m_op) << " " << operationValue1 << ";\n"; |
| - break; |
| - |
| - case OPERATIONTYPE_UNARY_PREFIX_OPERATOR: |
| - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << operationValue0 << ";\n"; |
| - break; |
| - |
| - case OPERATIONTYPE_UNARY_POSTFIX_OPERATOR: |
| - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << getOperationName(m_op) << ";\n"; |
| - break; |
| - |
| - case OPERATIONTYPE_BINARY_FUNCTION: |
| - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << "(" << operationValue0 << ", " << operationValue1 << ");\n"; |
| - break; |
| - |
| - case OPERATIONTYPE_ASSIGNMENT: |
| - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << ";\n"; |
| - op << " res " << getOperationName(m_op) << " " << operationValue1 << ";\n"; |
| - break; |
| - |
| - default: |
| - DE_ASSERT(DE_FALSE); |
| - } |
| - |
| - // Reduction to vec3 (rgb). Check the used value too if it was modified. |
| - op << " " << (m_isVertexCase ? "v_color" : "gl_FragColor") << " = "; |
| - |
| - if (isOperationValueModifying(m_op)) |
| - op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0) + vec4(" << genGLSLMatToVec3Reduction(resultType, "tmpValue") << ", 0.0);\n"; |
| - else |
| - op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0);\n"; |
| - |
| - vtx << "}\n"; |
| - frag << "}\n"; |
| - |
| - m_vertShaderSource = vtx.str(); |
| - m_fragShaderSource = frag.str(); |
| - |
| - // \todo [2012-02-14 pyry] Compute better values for matrix tests. |
| - m_userAttribTransforms.resize(4); |
| - for (int attribNdx = 0; attribNdx < 4; attribNdx++) |
| - { |
| - m_userAttribTransforms[attribNdx] = Mat4(0.0f); |
| - m_userAttribTransforms[attribNdx]((0 + attribNdx) % 4, 0) = 1.0f; |
| - m_userAttribTransforms[attribNdx]((1 + attribNdx) % 4, 1) = 1.0f; |
| - m_userAttribTransforms[attribNdx]((2 + attribNdx) % 4, 2) = 1.0f; |
| - m_userAttribTransforms[attribNdx]((3 + attribNdx) % 4, 3) = 1.0f; |
| - } |
| - |
| - // prevent bad reference cases such as black result images by fine-tuning used matrices |
| - if (getOperationTestMatrixType(m_op) != TESTMATRIXTYPE_DEFAULT) |
| - { |
| - for (int attribNdx = 0; attribNdx < 4; attribNdx++) |
| - { |
| - for (int row = 0; row < 4; row++) |
| - for (int col = 0; col < 4; col++) |
| - { |
| - switch (getOperationTestMatrixType(m_op)) |
| - { |
| - case TESTMATRIXTYPE_NEGATED: |
| - m_userAttribTransforms[attribNdx](row, col) = -m_userAttribTransforms[attribNdx](row, col); |
| - break; |
| - case TESTMATRIXTYPE_INCREMENTED: |
| - m_userAttribTransforms[attribNdx](row, col) += 0.3f; |
| - break; |
| - case TESTMATRIXTYPE_DECREMENTED: |
| - m_userAttribTransforms[attribNdx](row, col) -= 0.1f; |
| - break; |
| - |
| - default: |
| - DE_ASSERT(DE_FALSE); |
| - break; |
| - } |
| - } |
| - } |
| - } |
| - |
| - ShaderRenderCase::init(); |
| + std::ostringstream vtx; |
| + std::ostringstream frag; |
| + std::ostringstream& op = m_isVertexCase ? vtx : frag; |
| + |
| + bool isInDynMat0 = isDataTypeMatrix(m_in0.dataType) && m_in0.inputType == INPUTTYPE_DYNAMIC; |
| + bool isInDynMat1 = isDataTypeMatrix(m_in1.dataType) && m_in1.inputType == INPUTTYPE_DYNAMIC; |
| + string inValue0; |
| + string inValue1; |
| + DataType resultType = TYPE_LAST; |
| + Precision resultPrec = m_in0.precision; |
| + vector<string> passVars; |
| + int numInputs = (isOperationBinary(m_op)) ? (2) : (1); |
| + |
| + std::string operationValue0; |
| + std::string operationValue1; |
| + |
| + DE_ASSERT(!isInDynMat0 || !isInDynMat1); // Only single dynamic matrix input is allowed. |
| + DE_UNREF(isInDynMat0 && isInDynMat1); |
| + |
| + // Compute result type. |
| + if (isDataTypeMatrix(m_in0.dataType) && isDataTypeMatrix(m_in1.dataType)) |
| + { |
| + DE_ASSERT(m_in0.dataType == m_in1.dataType); |
| + resultType = m_in0.dataType; |
| + } |
| + else if (getOperationType(m_op) == OPERATIONTYPE_UNARY_PREFIX_OPERATOR || |
| + getOperationType(m_op) == OPERATIONTYPE_UNARY_POSTFIX_OPERATOR) |
| + { |
| + resultType = m_in0.dataType; |
| + } |
| + else |
| + { |
| + int matNdx = isDataTypeMatrix(m_in0.dataType) ? 0 : 1; |
| + DataType matrixType = matNdx == 0 ? m_in0.dataType : m_in1.dataType; |
| + DataType otherType = matNdx == 0 ? m_in1.dataType : m_in0.dataType; |
| + |
| + if (otherType == TYPE_FLOAT) |
| + resultType = matrixType; |
| + else |
| + { |
| + DE_ASSERT(isDataTypeVector(otherType)); |
| + resultType = otherType; |
| + } |
| + } |
| + |
| + vtx << "attribute highp vec4 a_position;\n"; |
| + if (m_isVertexCase) |
| + { |
| + vtx << "varying mediump vec4 v_color;\n"; |
| + frag << "varying mediump vec4 v_color;\n"; |
| + } |
| + |
| + // Input declarations. |
| + for (int inNdx = 0; inNdx < numInputs; inNdx++) |
| + { |
| + const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; |
| + const char* precName = getPrecisionName(in.precision); |
| + const char* typeName = getDataTypeName(in.dataType); |
| + string& inValue = inNdx > 0 ? inValue1 : inValue0; |
| + |
| + if (in.inputType == INPUTTYPE_DYNAMIC) |
| + { |
| + vtx << "attribute " << precName << " " << typeName << " a_"; |
| + |
| + if (isDataTypeMatrix(in.dataType)) |
| + { |
| + // a_matN, v_matN |
| + vtx << typeName << ";\n"; |
| + if (!m_isVertexCase) |
| + { |
| + vtx << "varying " << precName << " " << typeName << " v_" << typeName << ";\n"; |
| + frag << "varying " << precName << " " << typeName << " v_" << typeName << ";\n"; |
| + passVars.push_back(typeName); |
| + } |
| + |
| + inValue = string(m_isVertexCase ? "a_" : "v_") + getDataTypeName(in.dataType); |
| + } |
| + else |
| + { |
| + // a_coords, v_coords |
| + vtx << "coords;\n"; |
| + if (!m_isVertexCase) |
| + { |
| + vtx << "varying " << precName << " " << typeName << " v_coords;\n"; |
| + frag << "varying " << precName << " " << typeName << " v_coords;\n"; |
| + passVars.push_back("coords"); |
| + } |
| + |
| + inValue = m_isVertexCase ? "a_coords" : "v_coords"; |
| + } |
| + } |
| + else if (in.inputType == INPUTTYPE_UNIFORM) |
| + { |
| + op << "uniform " << precName << " " << typeName << " u_in" << inNdx << ";\n"; |
| + inValue = string("u_in") + de::toString(inNdx); |
| + } |
| + else if (in.inputType == INPUTTYPE_CONST) |
| + { |
| + op << "const " << precName << " " << typeName << " in" << inNdx << " = "; |
| + |
| + // Generate declaration. |
| + switch (in.dataType) |
| + { |
| + case TYPE_FLOAT: op << de::floatToString(s_constInFloat[inNdx], 1); break; |
| + case TYPE_FLOAT_VEC2: writeVectorConstructor<2>(op, s_constInVec2[inNdx]); break; |
| + case TYPE_FLOAT_VEC3: writeVectorConstructor<3>(op, s_constInVec3[inNdx]); break; |
| + case TYPE_FLOAT_VEC4: writeVectorConstructor<4>(op, s_constInVec4[inNdx]); break; |
| + case TYPE_FLOAT_MAT2: writeMatrixConstructor<2, 2>(op, Mat2(s_constInMat2[inNdx])); break; |
| + case TYPE_FLOAT_MAT3: writeMatrixConstructor<3, 3>(op, Mat3(s_constInMat3[inNdx])); break; |
| + case TYPE_FLOAT_MAT4: writeMatrixConstructor<4, 4>(op, Mat4(s_constInMat4[inNdx])); break; |
| + |
| + default: |
| + DE_ASSERT(DE_FALSE); |
| + } |
| + |
| + op << ";\n"; |
| + |
| + inValue = string("in") + de::toString(inNdx); |
| + } |
| + } |
| + |
| + vtx << "\n" |
| + << "void main (void)\n" |
| + << "{\n" |
| + << " gl_Position = a_position;\n"; |
| + frag << "\n" |
| + << "void main (void)\n" |
| + << "{\n"; |
| + |
| + if (m_isVertexCase) |
| + { |
| + frag << " gl_FragColor = v_color;\n"; |
| + } |
| + else |
| + { |
| + for (vector<string>::const_iterator copyIter = passVars.begin(); copyIter != passVars.end(); copyIter++) |
| + vtx << " v_" << *copyIter << " = " << "a_" << *copyIter << ";\n"; |
| + } |
| + |
| + // Operation. |
| + |
| + switch (getOperationNature(m_op)) |
| + { |
| + case OPERATIONNATURE_PURE: |
| + DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); |
| + |
| + operationValue0 = inValue0; |
| + operationValue1 = inValue1; |
| + break; |
| + |
| + case OPERATIONNATURE_MUTATING: |
| + DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); |
| + |
| + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " tmpValue = " << inValue0 << ";\n"; |
| + |
| + operationValue0 = "tmpValue"; |
| + operationValue1 = inValue1; |
| + break; |
| + |
| + case OPERATIONNATURE_ASSIGNMENT: |
| + DE_ASSERT(getOperationType(m_op) == OPERATIONTYPE_ASSIGNMENT); |
| + |
| + operationValue0 = inValue0; |
| + operationValue1 = inValue1; |
| + break; |
| + |
| + default: |
| + DE_ASSERT(DE_FALSE); |
| + } |
| + |
| + switch (getOperationType(m_op)) |
| + { |
| + case OPERATIONTYPE_BINARY_OPERATOR: |
| + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << " " << getOperationName(m_op) << " " << operationValue1 << ";\n"; |
| + break; |
| + |
| + case OPERATIONTYPE_UNARY_PREFIX_OPERATOR: |
| + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << operationValue0 << ";\n"; |
| + break; |
| + |
| + case OPERATIONTYPE_UNARY_POSTFIX_OPERATOR: |
| + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << getOperationName(m_op) << ";\n"; |
| + break; |
| + |
| + case OPERATIONTYPE_BINARY_FUNCTION: |
| + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << "(" << operationValue0 << ", " << operationValue1 << ");\n"; |
| + break; |
| + |
| + case OPERATIONTYPE_ASSIGNMENT: |
| + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << ";\n"; |
| + op << " res " << getOperationName(m_op) << " " << operationValue1 << ";\n"; |
| + break; |
| + |
| + default: |
| + DE_ASSERT(DE_FALSE); |
| + } |
| + |
| + // Reduction to vec3 (rgb). Check the used value too if it was modified. |
| + op << " " << (m_isVertexCase ? "v_color" : "gl_FragColor") << " = "; |
| + |
| + if (isOperationValueModifying(m_op)) |
| + op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0) + vec4(" << genGLSLMatToVec3Reduction(resultType, "tmpValue") << ", 0.0);\n"; |
| + else |
| + op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0);\n"; |
| + |
| + vtx << "}\n"; |
| + frag << "}\n"; |
| + |
| + m_vertShaderSource = vtx.str(); |
| + m_fragShaderSource = frag.str(); |
| + |
| + // \todo [2012-02-14 pyry] Compute better values for matrix tests. |
| + m_userAttribTransforms.resize(4); |
| + for (int attribNdx = 0; attribNdx < 4; attribNdx++) |
| + { |
| + m_userAttribTransforms[attribNdx] = Mat4(0.0f); |
| + m_userAttribTransforms[attribNdx]((0 + attribNdx) % 4, 0) = 1.0f; |
| + m_userAttribTransforms[attribNdx]((1 + attribNdx) % 4, 1) = 1.0f; |
| + m_userAttribTransforms[attribNdx]((2 + attribNdx) % 4, 2) = 1.0f; |
| + m_userAttribTransforms[attribNdx]((3 + attribNdx) % 4, 3) = 1.0f; |
| + } |
| + |
| + // prevent bad reference cases such as black result images by fine-tuning used matrices |
| + if (getOperationTestMatrixType(m_op) != TESTMATRIXTYPE_DEFAULT) |
| + { |
| + for (int attribNdx = 0; attribNdx < 4; attribNdx++) |
| + { |
| + for (int row = 0; row < 4; row++) |
| + for (int col = 0; col < 4; col++) |
| + { |
| + switch (getOperationTestMatrixType(m_op)) |
| + { |
| + case TESTMATRIXTYPE_NEGATED: |
| + m_userAttribTransforms[attribNdx](row, col) = -m_userAttribTransforms[attribNdx](row, col); |
| + break; |
| + case TESTMATRIXTYPE_INCREMENTED: |
| + m_userAttribTransforms[attribNdx](row, col) += 0.3f; |
| + break; |
| + case TESTMATRIXTYPE_DECREMENTED: |
| + m_userAttribTransforms[attribNdx](row, col) -= 0.1f; |
| + break; |
| + |
| + default: |
| + DE_ASSERT(DE_FALSE); |
| + break; |
| + } |
| + } |
| + } |
| + } |
| + |
| + ShaderRenderCase::init(); |
| } |
| |
| std::string ShaderMatrixCase::genGLSLMatToVec3Reduction (const glu::DataType& matType, const char* varName) |
| { |
| - std::ostringstream op; |
| - |
| - switch (matType) |
| - { |
| - case TYPE_FLOAT: op << varName << ", " << varName << ", " << varName << ""; break; |
| - case TYPE_FLOAT_VEC2: op << varName << ".x, " << varName << ".y, " << varName << ".x"; break; |
| - case TYPE_FLOAT_VEC3: op << varName << ""; break; |
| - case TYPE_FLOAT_VEC4: op << varName << ".x, " << varName << ".y, " << varName << ".z+" << varName << ".w"; break; |
| - case TYPE_FLOAT_MAT2: op << varName << "[0][0], " << varName << "[1][0], " << varName << "[0][1]+" << varName << "[1][1]"; break; |
| - case TYPE_FLOAT_MAT3: op << varName << "[0]+" << varName << "[1]+" << varName << "[2]"; break; |
| - case TYPE_FLOAT_MAT4: op << varName << "[0].xyz+" << varName << "[1].yzw+" << varName << "[2].zwx+" << varName << "[3].wxy"; break; |
| - |
| - default: |
| - DE_ASSERT(DE_FALSE); |
| - } |
| - |
| - return op.str(); |
| + std::ostringstream op; |
| + |
| + switch (matType) |
| + { |
| + case TYPE_FLOAT: op << varName << ", " << varName << ", " << varName << ""; break; |
| + case TYPE_FLOAT_VEC2: op << varName << ".x, " << varName << ".y, " << varName << ".x"; break; |
| + case TYPE_FLOAT_VEC3: op << varName << ""; break; |
| + case TYPE_FLOAT_VEC4: op << varName << ".x, " << varName << ".y, " << varName << ".z+" << varName << ".w"; break; |
| + case TYPE_FLOAT_MAT2: op << varName << "[0][0], " << varName << "[1][0], " << varName << "[0][1]+" << varName << "[1][1]"; break; |
| + case TYPE_FLOAT_MAT3: op << varName << "[0]+" << varName << "[1]+" << varName << "[2]"; break; |
| + case TYPE_FLOAT_MAT4: op << varName << "[0].xyz+" << varName << "[1].yzw+" << varName << "[2].zwx+" << varName << "[3].wxy"; break; |
| + |
| + default: |
| + DE_ASSERT(DE_FALSE); |
| + } |
| + |
| + return op.str(); |
| } |
| |
| void ShaderMatrixCase::setupUniforms (int programID, const tcu::Vec4& constCoords) |
| { |
| - const glw::Functions& gl = m_renderCtx.getFunctions(); |
| - |
| - DE_UNREF(constCoords); |
| - |
| - for (int inNdx = 0; inNdx < 2; inNdx++) |
| - { |
| - const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; |
| - |
| - if (in.inputType == INPUTTYPE_UNIFORM) |
| - { |
| - int loc = gl.getUniformLocation(programID, (string("u_in") + de::toString(inNdx)).c_str()); |
| - |
| - if (loc < 0) |
| - continue; |
| - |
| - switch (in.dataType) |
| - { |
| - case TYPE_FLOAT: gl.uniform1f(loc, s_constInFloat[inNdx]); break; |
| - case TYPE_FLOAT_VEC2: gl.uniform2fv(loc, 1, s_constInVec2[inNdx].getPtr()); break; |
| - case TYPE_FLOAT_VEC3: gl.uniform3fv(loc, 1, s_constInVec3[inNdx].getPtr()); break; |
| - case TYPE_FLOAT_VEC4: gl.uniform4fv(loc, 1, s_constInVec4[inNdx].getPtr()); break; |
| - case TYPE_FLOAT_MAT2: gl.uniformMatrix2fv(loc, 1, GL_FALSE, s_constInMat2[inNdx].getColumnMajorData().getPtr()); break; |
| - case TYPE_FLOAT_MAT3: gl.uniformMatrix3fv(loc, 1, GL_FALSE, s_constInMat3[inNdx].getColumnMajorData().getPtr()); break; |
| - case TYPE_FLOAT_MAT4: gl.uniformMatrix4fv(loc, 1, GL_FALSE, s_constInMat4[inNdx].getColumnMajorData().getPtr()); break; |
| - default: |
| - DE_ASSERT(false); |
| - } |
| - } |
| - } |
| + const glw::Functions& gl = m_renderCtx.getFunctions(); |
| + |
| + DE_UNREF(constCoords); |
| + |
| + for (int inNdx = 0; inNdx < 2; inNdx++) |
| + { |
| + const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; |
| + |
| + if (in.inputType == INPUTTYPE_UNIFORM) |
| + { |
| + int loc = gl.getUniformLocation(programID, (string("u_in") + de::toString(inNdx)).c_str()); |
| + |
| + if (loc < 0) |
| + continue; |
| + |
| + switch (in.dataType) |
| + { |
| + case TYPE_FLOAT: gl.uniform1f(loc, s_constInFloat[inNdx]); break; |
| + case TYPE_FLOAT_VEC2: gl.uniform2fv(loc, 1, s_constInVec2[inNdx].getPtr()); break; |
| + case TYPE_FLOAT_VEC3: gl.uniform3fv(loc, 1, s_constInVec3[inNdx].getPtr()); break; |
| + case TYPE_FLOAT_VEC4: gl.uniform4fv(loc, 1, s_constInVec4[inNdx].getPtr()); break; |
| + case TYPE_FLOAT_MAT2: gl.uniformMatrix2fv(loc, 1, GL_FALSE, s_constInMat2[inNdx].getColumnMajorData().getPtr()); break; |
| + case TYPE_FLOAT_MAT3: gl.uniformMatrix3fv(loc, 1, GL_FALSE, s_constInMat3[inNdx].getColumnMajorData().getPtr()); break; |
| + case TYPE_FLOAT_MAT4: gl.uniformMatrix4fv(loc, 1, GL_FALSE, s_constInMat4[inNdx].getColumnMajorData().getPtr()); break; |
| + default: |
| + DE_ASSERT(false); |
| + } |
| + } |
| + } |
| } |
| |
| ShaderMatrixTests::ShaderMatrixTests (Context& context) |
| - : TestCaseGroup(context, "matrix", "Matrix Tests") |
| + : TestCaseGroup(context, "matrix", "Matrix Tests") |
| { |
| } |
| |
| @@ -1086,136 +1086,136 @@ ShaderMatrixTests::~ShaderMatrixTests (void) |
| |
| void ShaderMatrixTests::init (void) |
| { |
| - static const struct |
| - { |
| - const char* name; |
| - const char* desc; |
| - MatrixOp op; |
| - bool extendedInputTypeCases; // !< test with const and uniform types too |
| - } ops[] = |
| - { |
| - { "add", "Matrix addition tests", OP_ADD, true }, |
| - { "sub", "Matrix subtraction tests", OP_SUB, true }, |
| - { "mul", "Matrix multiplication tests", OP_MUL, true }, |
| - { "div", "Matrix division tests", OP_DIV, true }, |
| - { "matrixcompmult", "Matrix component-wise multiplication tests", OP_COMP_MUL, false }, |
| - { "unary_addition", "Matrix unary addition tests", OP_UNARY_PLUS, false }, |
| - { "negation", "Matrix negation tests", OP_NEGATION, false }, |
| - { "pre_increment", "Matrix prefix increment tests", OP_PRE_INCREMENT, false }, |
| - { "pre_decrement", "Matrix prefix decrement tests", OP_PRE_DECREMENT, false }, |
| - { "post_increment", "Matrix postfix increment tests", OP_POST_INCREMENT, false }, |
| - { "post_decrement", "Matrix postfix decrement tests", OP_POST_DECREMENT, false }, |
| - { "add_assign", "Matrix add into tests", OP_ADD_INTO, false }, |
| - { "sub_assign", "Matrix subtract from tests", OP_SUBTRACT_FROM, false }, |
| - { "mul_assign", "Matrix multiply into tests", OP_MULTIPLY_INTO, false }, |
| - { "div_assign", "Matrix divide into tests", OP_DIVIDE_INTO, false }, |
| - }; |
| - |
| - struct InputTypeSpec |
| - { |
| - const char* name; |
| - const char* desc; |
| - InputType type; |
| - }; |
| - static const InputTypeSpec extendedInputTypes[] = |
| - { |
| - { "const", "Constant matrix input", INPUTTYPE_CONST }, |
| - { "uniform", "Uniform matrix input", INPUTTYPE_UNIFORM }, |
| - { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } |
| - }; |
| - static const InputTypeSpec reducedInputTypes[] = |
| - { |
| - { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } |
| - }; |
| - |
| - static const DataType matrixTypes[] = |
| - { |
| - TYPE_FLOAT_MAT2, |
| - TYPE_FLOAT_MAT3, |
| - TYPE_FLOAT_MAT4 |
| - }; |
| - |
| - static const Precision precisions[] = |
| - { |
| - PRECISION_LOWP, |
| - PRECISION_MEDIUMP, |
| - PRECISION_HIGHP |
| - }; |
| - |
| - for (int opNdx = 0; opNdx < DE_LENGTH_OF_ARRAY(ops); opNdx++) |
| - { |
| - const InputTypeSpec* inTypeList = (ops[opNdx].extendedInputTypeCases) ? (extendedInputTypes) : (reducedInputTypes); |
| - const int inTypeListSize = (ops[opNdx].extendedInputTypeCases) ? (DE_LENGTH_OF_ARRAY(extendedInputTypes)) : (DE_LENGTH_OF_ARRAY(reducedInputTypes)); |
| - const MatrixOp op = ops[opNdx].op; |
| - tcu::TestCaseGroup* opGroup = new tcu::TestCaseGroup(m_testCtx, ops[opNdx].name, ops[opNdx].desc); |
| - |
| - addChild(opGroup); |
| - |
| - for (int inTypeNdx = 0; inTypeNdx < inTypeListSize; inTypeNdx++) |
| - { |
| - const InputType inputType = inTypeList[inTypeNdx].type; |
| - |
| - for (int matTypeNdx = 0; matTypeNdx < DE_LENGTH_OF_ARRAY(matrixTypes); matTypeNdx++) |
| - { |
| - DataType matType = matrixTypes[matTypeNdx]; |
| - const char* matTypeName = getDataTypeName(matType); |
| - |
| - for (int precNdx = 0; precNdx < DE_LENGTH_OF_ARRAY(precisions); precNdx++) |
| - { |
| - Precision precision = precisions[precNdx]; |
| - const char* precName = getPrecisionName(precision); |
| - string baseName = string(inTypeList[inTypeNdx].name) + "_" + precName + "_" + matTypeName + "_"; |
| - ShaderInput matIn (inputType, matType, precision); |
| - |
| - if (isOperationMatrixScalar(op)) |
| - { |
| - // Matrix-scalar \note For div cases we use uniform input. |
| - ShaderInput scalarIn(op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, TYPE_FLOAT, precision); |
| - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix-scalar case", matIn, scalarIn, op, true)); |
| - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix-scalar case", matIn, scalarIn, op, false)); |
| - } |
| - |
| - if (isOperationMatrixVector(op)) |
| - { |
| - // Matrix-vector. |
| - DataType vecType = getDataTypeFloatVec(getDataTypeMatrixNumColumns(matType)); |
| - ShaderInput vecIn (op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, vecType, precision); |
| - |
| - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(vecType) + "_vertex").c_str(), "Matrix-vector case", matIn, vecIn, op, true)); |
| - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(vecType) + "_fragment").c_str(), "Matrix-vector case", matIn, vecIn, op, false)); |
| - |
| - // Vector-matrix. |
| - string vecMatName = string(inTypeList[inTypeNdx].name) + "_" + precName + "_" + getDataTypeName(vecType) + "_" + matTypeName; |
| - opGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_vertex").c_str(), "Vector-matrix case", vecIn, matIn, op, true)); |
| - opGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_fragment").c_str(), "Vector-matrix case", vecIn, matIn, op, false)); |
| - } |
| - |
| - if (isOperationMatrixMatrix(op)) |
| - { |
| - // Matrix-matrix. |
| - ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); |
| - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_vertex").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, true)); |
| - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_fragment").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, false)); |
| - } |
| - |
| - if (isOperationUnary(op)) |
| - { |
| - // op matrix |
| - ShaderInput voidInput(INPUTTYPE_LAST, TYPE_LAST, PRECISION_LAST); |
| - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "vertex").c_str(), "Matrix case", matIn, voidInput, op, true)); |
| - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "fragment").c_str(), "Matrix case", matIn, voidInput, op, false)); |
| - } |
| - |
| - if (isOperationAssignment(op)) |
| - { |
| - ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); |
| - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "vertex").c_str(), "Matrix assignment case", matIn, otherMatIn, op, true)); |
| - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "fragment").c_str(), "Matrix assignment case", matIn, otherMatIn, op, false)); |
| - } |
| - } |
| - } |
| - } |
| - } |
| + static const struct |
| + { |
| + const char* name; |
| + const char* desc; |
| + MatrixOp op; |
| + bool extendedInputTypeCases; // !< test with const and uniform types too |
| + } ops[] = |
| + { |
| + { "add", "Matrix addition tests", OP_ADD, true }, |
| + { "sub", "Matrix subtraction tests", OP_SUB, true }, |
| + { "mul", "Matrix multiplication tests", OP_MUL, true }, |
| + { "div", "Matrix division tests", OP_DIV, true }, |
| + { "matrixcompmult", "Matrix component-wise multiplication tests", OP_COMP_MUL, false }, |
| + { "unary_addition", "Matrix unary addition tests", OP_UNARY_PLUS, false }, |
| + { "negation", "Matrix negation tests", OP_NEGATION, false }, |
| + { "pre_increment", "Matrix prefix increment tests", OP_PRE_INCREMENT, false }, |
| + { "pre_decrement", "Matrix prefix decrement tests", OP_PRE_DECREMENT, false }, |
| + { "post_increment", "Matrix postfix increment tests", OP_POST_INCREMENT, false }, |
| + { "post_decrement", "Matrix postfix decrement tests", OP_POST_DECREMENT, false }, |
| + { "add_assign", "Matrix add into tests", OP_ADD_INTO, false }, |
| + { "sub_assign", "Matrix subtract from tests", OP_SUBTRACT_FROM, false }, |
| + { "mul_assign", "Matrix multiply into tests", OP_MULTIPLY_INTO, false }, |
| + { "div_assign", "Matrix divide into tests", OP_DIVIDE_INTO, false }, |
| + }; |
| + |
| + struct InputTypeSpec |
| + { |
| + const char* name; |
| + const char* desc; |
| + InputType type; |
| + }; |
| + static const InputTypeSpec extendedInputTypes[] = |
| + { |
| + { "const", "Constant matrix input", INPUTTYPE_CONST }, |
| + { "uniform", "Uniform matrix input", INPUTTYPE_UNIFORM }, |
| + { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } |
| + }; |
| + static const InputTypeSpec reducedInputTypes[] = |
| + { |
| + { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } |
| + }; |
| + |
| + static const DataType matrixTypes[] = |
| + { |
| + TYPE_FLOAT_MAT2, |
| + TYPE_FLOAT_MAT3, |
| + TYPE_FLOAT_MAT4 |
| + }; |
| + |
| + static const Precision precisions[] = |
| + { |
| + PRECISION_LOWP, |
| + PRECISION_MEDIUMP, |
| + PRECISION_HIGHP |
| + }; |
| + |
| + for (int opNdx = 0; opNdx < DE_LENGTH_OF_ARRAY(ops); opNdx++) |
| + { |
| + const InputTypeSpec* inTypeList = (ops[opNdx].extendedInputTypeCases) ? (extendedInputTypes) : (reducedInputTypes); |
| + const int inTypeListSize = (ops[opNdx].extendedInputTypeCases) ? (DE_LENGTH_OF_ARRAY(extendedInputTypes)) : (DE_LENGTH_OF_ARRAY(reducedInputTypes)); |
| + const MatrixOp op = ops[opNdx].op; |
| + tcu::TestCaseGroup* opGroup = new tcu::TestCaseGroup(m_testCtx, ops[opNdx].name, ops[opNdx].desc); |
| + |
| + addChild(opGroup); |
| + |
| + for (int inTypeNdx = 0; inTypeNdx < inTypeListSize; inTypeNdx++) |
| + { |
| + const InputType inputType = inTypeList[inTypeNdx].type; |
| + |
| + for (int matTypeNdx = 0; matTypeNdx < DE_LENGTH_OF_ARRAY(matrixTypes); matTypeNdx++) |
| + { |
| + DataType matType = matrixTypes[matTypeNdx]; |
| + const char* matTypeName = getDataTypeName(matType); |
| + |
| + for (int precNdx = 0; precNdx < DE_LENGTH_OF_ARRAY(precisions); precNdx++) |
| + { |
| + Precision precision = precisions[precNdx]; |
| + const char* precName = getPrecisionName(precision); |
| + string baseName = string(inTypeList[inTypeNdx].name) + "_" + precName + "_" + matTypeName + "_"; |
| + ShaderInput matIn (inputType, matType, precision); |
| + |
| + if (isOperationMatrixScalar(op)) |
| + { |
| + // Matrix-scalar \note For div cases we use uniform input. |
| + ShaderInput scalarIn(op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, TYPE_FLOAT, precision); |
| + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix-scalar case", matIn, scalarIn, op, true)); |
| + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix-scalar case", matIn, scalarIn, op, false)); |
| + } |
| + |
| + if (isOperationMatrixVector(op)) |
| + { |
| + // Matrix-vector. |
| + DataType vecType = getDataTypeFloatVec(getDataTypeMatrixNumColumns(matType)); |
| + ShaderInput vecIn (op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, vecType, precision); |
| + |
| + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(vecType) + "_vertex").c_str(), "Matrix-vector case", matIn, vecIn, op, true)); |
| + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(vecType) + "_fragment").c_str(), "Matrix-vector case", matIn, vecIn, op, false)); |
| + |
| + // Vector-matrix. |
| + string vecMatName = string(inTypeList[inTypeNdx].name) + "_" + precName + "_" + getDataTypeName(vecType) + "_" + matTypeName; |
| + opGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_vertex").c_str(), "Vector-matrix case", vecIn, matIn, op, true)); |
| + opGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_fragment").c_str(), "Vector-matrix case", vecIn, matIn, op, false)); |
| + } |
| + |
| + if (isOperationMatrixMatrix(op)) |
| + { |
| + // Matrix-matrix. |
| + ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); |
| + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_vertex").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, true)); |
| + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_fragment").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, false)); |
| + } |
| + |
| + if (isOperationUnary(op)) |
| + { |
| + // op matrix |
| + ShaderInput voidInput(INPUTTYPE_LAST, TYPE_LAST, PRECISION_LAST); |
| + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "vertex").c_str(), "Matrix case", matIn, voidInput, op, true)); |
| + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "fragment").c_str(), "Matrix case", matIn, voidInput, op, false)); |
| + } |
| + |
| + if (isOperationAssignment(op)) |
| + { |
| + ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); |
| + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "vertex").c_str(), "Matrix assignment case", matIn, otherMatIn, op, true)); |
| + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "fragment").c_str(), "Matrix assignment case", matIn, otherMatIn, op, false)); |
| + } |
| + } |
| + } |
| + } |
| + } |
| } |
| |
| } // Functional |
| diff --git a/src/tests/deqp_support/es3fShaderMatrixTests.cpp b/src/tests/deqp_support/es3fShaderMatrixTests.cpp |
| index b18f8ba14..25784982c 100644 |
| --- a/src/tests/deqp_support/es3fShaderMatrixTests.cpp |
| +++ b/src/tests/deqp_support/es3fShaderMatrixTests.cpp |
| @@ -77,127 +77,127 @@ using tcu::Mat4; |
| // Uniform / constant values for tests. |
| // \note Input1 should not contain 0 components as it is used as divisor in div cases. |
| // \todo [2012-02-14 pyry] Make these dynamic. |
| -static const float s_constInFloat[2] = { 0.5f, -0.2f }; |
| -static const Vec2 s_constInVec2[2] = { Vec2(1.2f, 0.5f), Vec2(0.5f, 1.0f) }; |
| -static const Vec3 s_constInVec3[2] = { Vec3(1.1f, 0.1f, 0.5f), Vec3(-0.2f, 0.5f, 0.8f) }; |
| -static const Vec4 s_constInVec4[2] = { Vec4(1.4f, 0.2f, -0.5f, 0.7f), Vec4(0.2f, -1.0f, 0.5f, 0.8f) }; |
| +static const float s_constInFloat[2] = { 0.5f, -0.2f }; |
| +static const Vec2 s_constInVec2[2] = { Vec2(1.2f, 0.5f), Vec2(0.5f, 1.0f) }; |
| +static const Vec3 s_constInVec3[2] = { Vec3(1.1f, 0.1f, 0.5f), Vec3(-0.2f, 0.5f, 0.8f) }; |
| +static const Vec4 s_constInVec4[2] = { Vec4(1.4f, 0.2f, -0.5f, 0.7f), Vec4(0.2f, -1.0f, 0.5f, 0.8f) }; |
| |
| static const float s_constInMat2x2[2][4] = |
| { |
| - { |
| - -0.1f, 1.0f, |
| - -0.2f, 0.0f, |
| - }, |
| - { |
| - 0.8f, 0.1f, |
| - 0.5f, -0.9f, |
| - }, |
| + { |
| + -0.1f, 1.0f, |
| + -0.2f, 0.0f, |
| + }, |
| + { |
| + 0.8f, 0.1f, |
| + 0.5f, -0.9f, |
| + }, |
| }; |
| static const float s_constInMat3x2[2][6] = |
| { |
| - { |
| - 0.8f, -0.3f, 0.3f, |
| - 1.0f, 1.2f, -1.2f, |
| - }, |
| - { |
| - 1.2f, -1.0f, 0.5f, |
| - -0.8f, 1.1f, 0.3f, |
| - }, |
| + { |
| + 0.8f, -0.3f, 0.3f, |
| + 1.0f, 1.2f, -1.2f, |
| + }, |
| + { |
| + 1.2f, -1.0f, 0.5f, |
| + -0.8f, 1.1f, 0.3f, |
| + }, |
| }; |
| static const float s_constInMat4x2[2][8] = |
| { |
| - { |
| - -0.2f, 0.5f, 0.0f, -1.0f, |
| - 1.2f, -0.5f, 0.3f, -0.9f, |
| - }, |
| - { |
| - 1.0f, 0.1f, -1.1f, 0.6f, |
| - 0.8f, -1.2f, -1.1f, 0.7f, |
| - }, |
| + { |
| + -0.2f, 0.5f, 0.0f, -1.0f, |
| + 1.2f, -0.5f, 0.3f, -0.9f, |
| + }, |
| + { |
| + 1.0f, 0.1f, -1.1f, 0.6f, |
| + 0.8f, -1.2f, -1.1f, 0.7f, |
| + }, |
| }; |
| static const float s_constInMat2x3[2][6] = |
| { |
| - { |
| - -0.6f, -0.1f, |
| - -0.7f, -1.2f, |
| - -0.2f, 0.0f, |
| - }, |
| - { |
| - 1.1f, 0.6f, |
| - 0.8f, 1.0f, |
| - 0.7f, 0.1f, |
| - }, |
| + { |
| + -0.6f, -0.1f, |
| + -0.7f, -1.2f, |
| + -0.2f, 0.0f, |
| + }, |
| + { |
| + 1.1f, 0.6f, |
| + 0.8f, 1.0f, |
| + 0.7f, 0.1f, |
| + }, |
| }; |
| static const float s_constInMat3x3[2][9] = |
| { |
| - { |
| - -0.2f, 1.1f, 1.2f, |
| - -1.0f, 1.2f, 0.5f, |
| - 0.7f, -0.2f, 1.0f, |
| - }, |
| - { |
| - -0.1f, -0.1f, 0.1f, |
| - -0.1f, -0.2f, 1.0f, |
| - -0.5f, 0.1f, -0.4f, |
| - }, |
| + { |
| + -0.2f, 1.1f, 1.2f, |
| + -1.0f, 1.2f, 0.5f, |
| + 0.7f, -0.2f, 1.0f, |
| + }, |
| + { |
| + -0.1f, -0.1f, 0.1f, |
| + -0.1f, -0.2f, 1.0f, |
| + -0.5f, 0.1f, -0.4f, |
| + }, |
| }; |
| static const float s_constInMat4x3[2][12] = |
| { |
| - { |
| - -0.9f, 0.0f, 0.6f, 0.2f, |
| - 0.9f, -0.1f, -0.3f, -0.7f, |
| - -0.1f, 0.1f, 1.0f, 0.0f, |
| - }, |
| - { |
| - 0.5f, 0.7f, 0.7f, 1.2f, |
| - 1.1f, 0.1f, 1.0f, -1.0f, |
| - -0.2f, -0.2f, -0.3f, -0.5f, |
| - }, |
| + { |
| + -0.9f, 0.0f, 0.6f, 0.2f, |
| + 0.9f, -0.1f, -0.3f, -0.7f, |
| + -0.1f, 0.1f, 1.0f, 0.0f, |
| + }, |
| + { |
| + 0.5f, 0.7f, 0.7f, 1.2f, |
| + 1.1f, 0.1f, 1.0f, -1.0f, |
| + -0.2f, -0.2f, -0.3f, -0.5f, |
| + }, |
| }; |
| static const float s_constInMat2x4[2][8] = |
| { |
| - { |
| - -0.6f, -1.1f, |
| - -0.6f, -0.6f, |
| - -0.2f, -0.6f, |
| - -0.1f, -0.1f, |
| - }, |
| - { |
| - -1.2f, -1.0f, |
| - 0.7f, -1.0f, |
| - 0.7f, 0.7f, |
| - -0.4f, -0.3f, |
| - }, |
| + { |
| + -0.6f, -1.1f, |
| + -0.6f, -0.6f, |
| + -0.2f, -0.6f, |
| + -0.1f, -0.1f, |
| + }, |
| + { |
| + -1.2f, -1.0f, |
| + 0.7f, -1.0f, |
| + 0.7f, 0.7f, |
| + -0.4f, -0.3f, |
| + }, |
| }; |
| static const float s_constInMat3x4[2][12] = |
| { |
| - { |
| - 0.6f, -0.4f, 1.2f, |
| - 0.9f, 0.8f, 0.4f, |
| - 1.1f, 0.3f, 0.5f, |
| - -0.2f, 0.0f, 1.1f, |
| - }, |
| - { |
| - -0.8f, 1.2f, -0.2f, |
| - -1.1f, -0.9f, -0.5f, |
| - -1.2f, 1.0f, 1.2f, |
| - 0.1f, -0.7f, -0.5f, |
| - }, |
| + { |
| + 0.6f, -0.4f, 1.2f, |
| + 0.9f, 0.8f, 0.4f, |
| + 1.1f, 0.3f, 0.5f, |
| + -0.2f, 0.0f, 1.1f, |
| + }, |
| + { |
| + -0.8f, 1.2f, -0.2f, |
| + -1.1f, -0.9f, -0.5f, |
| + -1.2f, 1.0f, 1.2f, |
| + 0.1f, -0.7f, -0.5f, |
| + }, |
| }; |
| static const float s_constInMat4x4[2][16] = |
| { |
| - { |
| - 0.3f, 0.9f, -0.2f, 1.0f, |
| - -0.4f, -0.6f, 0.6f, -1.0f, |
| - -0.9f, -0.1f, 0.3f, -0.2f, |
| - -0.3f, -0.9f, 1.0f, 0.1f, |
| - }, |
| - { |
| - 0.4f, -0.7f, -0.8f, 0.7f, |
| - -0.4f, -0.8f, 0.6f, -0.3f, |
| - 0.7f, -1.0f, 0.1f, -0.3f, |
| - 0.2f, 0.6f, 0.4f, -1.0f, |
| - }, |
| + { |
| + 0.3f, 0.9f, -0.2f, 1.0f, |
| + -0.4f, -0.6f, 0.6f, -1.0f, |
| + -0.9f, -0.1f, 0.3f, -0.2f, |
| + -0.3f, -0.9f, 1.0f, 0.1f, |
| + }, |
| + { |
| + 0.4f, -0.7f, -0.8f, 0.7f, |
| + -0.4f, -0.8f, 0.6f, -0.3f, |
| + 0.7f, -1.0f, 0.1f, -0.3f, |
| + 0.2f, 0.6f, 0.4f, -1.0f, |
| + }, |
| }; |
| |
| namespace MatrixCaseUtils |
| @@ -205,49 +205,49 @@ namespace MatrixCaseUtils |
| |
| enum InputType |
| { |
| - INPUTTYPE_CONST = 0, |
| - INPUTTYPE_UNIFORM, |
| - INPUTTYPE_DYNAMIC, |
| + INPUTTYPE_CONST = 0, |
| + INPUTTYPE_UNIFORM, |
| + INPUTTYPE_DYNAMIC, |
| |
| - INPUTTYPE_LAST |
| + INPUTTYPE_LAST |
| }; |
| |
| struct ShaderInput |
| { |
| - ShaderInput (InputType inputType_, DataType dataType_, Precision precision_) |
| - : inputType (inputType_) |
| - , dataType (dataType_) |
| - , precision (precision_) |
| - { |
| - } |
| + ShaderInput (InputType inputType_, DataType dataType_, Precision precision_) |
| + : inputType (inputType_) |
| + , dataType (dataType_) |
| + , precision (precision_) |
| + { |
| + } |
| |
| - InputType inputType; |
| - DataType dataType; |
| - Precision precision; |
| + InputType inputType; |
| + DataType dataType; |
| + Precision precision; |
| }; |
| |
| enum MatrixOp |
| { |
| - OP_ADD = 0, |
| - OP_SUB, |
| - OP_MUL, |
| - OP_DIV, |
| - OP_COMP_MUL, |
| - OP_OUTER_PRODUCT, |
| - OP_TRANSPOSE, |
| - OP_INVERSE, |
| - OP_DETERMINANT, |
| - OP_UNARY_PLUS, |
| - OP_NEGATION, |
| - OP_PRE_INCREMENT, |
| - OP_PRE_DECREMENT, |
| - OP_POST_INCREMENT, |
| - OP_POST_DECREMENT, |
| - OP_ADD_INTO, |
| - OP_SUBTRACT_FROM, |
| - OP_MULTIPLY_INTO, |
| - OP_DIVIDE_INTO, |
| - OP_LAST |
| + OP_ADD = 0, |
| + OP_SUB, |
| + OP_MUL, |
| + OP_DIV, |
| + OP_COMP_MUL, |
| + OP_OUTER_PRODUCT, |
| + OP_TRANSPOSE, |
| + OP_INVERSE, |
| + OP_DETERMINANT, |
| + OP_UNARY_PLUS, |
| + OP_NEGATION, |
| + OP_PRE_INCREMENT, |
| + OP_PRE_DECREMENT, |
| + OP_POST_INCREMENT, |
| + OP_POST_DECREMENT, |
| + OP_ADD_INTO, |
| + OP_SUBTRACT_FROM, |
| + OP_MULTIPLY_INTO, |
| + OP_DIVIDE_INTO, |
| + OP_LAST |
| }; |
| |
| // Type traits. |
| @@ -255,237 +255,237 @@ enum MatrixOp |
| template <int DataT> |
| struct TypeTraits; |
| |
| -#define DECLARE_TYPE_TRAIT(DATATYPE, TYPE) \ |
| -template<> \ |
| -struct TypeTraits<DATATYPE> { \ |
| - typedef TYPE Type; \ |
| +#define DECLARE_TYPE_TRAIT(DATATYPE, TYPE) \ |
| +template<> \ |
| +struct TypeTraits<DATATYPE> { \ |
| + typedef TYPE Type; \ |
| } |
| |
| -DECLARE_TYPE_TRAIT(TYPE_FLOAT, float); |
| -DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC2, tcu::Vec2); |
| -DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC3, tcu::Vec3); |
| -DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC4, tcu::Vec4); |
| -DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2, tcu::Mat2); |
| -DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2X3, tcu::Mat2x3); |
| -DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2X4, tcu::Mat2x4); |
| -DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3X2, tcu::Mat3x2); |
| -DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3, tcu::Mat3); |
| -DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3X4, tcu::Mat3x4); |
| -DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4X2, tcu::Mat4x2); |
| -DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4X3, tcu::Mat4x3); |
| -DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4, tcu::Mat4); |
| +DECLARE_TYPE_TRAIT(TYPE_FLOAT, float); |
| +DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC2, tcu::Vec2); |
| +DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC3, tcu::Vec3); |
| +DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC4, tcu::Vec4); |
| +DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2, tcu::Mat2); |
| +DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2X3, tcu::Mat2x3); |
| +DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2X4, tcu::Mat2x4); |
| +DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3X2, tcu::Mat3x2); |
| +DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3, tcu::Mat3); |
| +DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3X4, tcu::Mat3x4); |
| +DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4X2, tcu::Mat4x2); |
| +DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4X3, tcu::Mat4x3); |
| +DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4, tcu::Mat4); |
| |
| // Operation info |
| |
| enum OperationType |
| { |
| - OPERATIONTYPE_BINARY_OPERATOR = 0, |
| - OPERATIONTYPE_BINARY_FUNCTION, |
| - OPERATIONTYPE_UNARY_PREFIX_OPERATOR, |
| - OPERATIONTYPE_UNARY_POSTFIX_OPERATOR, |
| - OPERATIONTYPE_UNARY_FUNCTION, |
| - OPERATIONTYPE_ASSIGNMENT, |
| + OPERATIONTYPE_BINARY_OPERATOR = 0, |
| + OPERATIONTYPE_BINARY_FUNCTION, |
| + OPERATIONTYPE_UNARY_PREFIX_OPERATOR, |
| + OPERATIONTYPE_UNARY_POSTFIX_OPERATOR, |
| + OPERATIONTYPE_UNARY_FUNCTION, |
| + OPERATIONTYPE_ASSIGNMENT, |
| |
| - OPERATIONTYPE_LAST |
| + OPERATIONTYPE_LAST |
| }; |
| |
| static const char* getOperationName (MatrixOp op) |
| { |
| - switch (op) |
| - { |
| - case OP_ADD: return "+"; |
| - case OP_SUB: return "-"; |
| - case OP_MUL: return "*"; |
| - case OP_DIV: return "/"; |
| - case OP_COMP_MUL: return "matrixCompMult"; |
| - case OP_OUTER_PRODUCT: return "outerProduct"; |
| - case OP_TRANSPOSE: return "transpose"; |
| - case OP_INVERSE: return "inverse"; |
| - case OP_DETERMINANT: return "determinant"; |
| - case OP_UNARY_PLUS: return "+"; |
| - case OP_NEGATION: return "-"; |
| - case OP_PRE_INCREMENT: return "++"; |
| - case OP_PRE_DECREMENT: return "--"; |
| - case OP_POST_INCREMENT: return "++"; |
| - case OP_POST_DECREMENT: return "--"; |
| - case OP_ADD_INTO: return "+="; |
| - case OP_SUBTRACT_FROM: return "-="; |
| - case OP_MULTIPLY_INTO: return "*="; |
| - case OP_DIVIDE_INTO: return "/="; |
| - |
| - default: |
| - DE_ASSERT(DE_FALSE); |
| - return ""; |
| - } |
| + switch (op) |
| + { |
| + case OP_ADD: return "+"; |
| + case OP_SUB: return "-"; |
| + case OP_MUL: return "*"; |
| + case OP_DIV: return "/"; |
| + case OP_COMP_MUL: return "matrixCompMult"; |
| + case OP_OUTER_PRODUCT: return "outerProduct"; |
| + case OP_TRANSPOSE: return "transpose"; |
| + case OP_INVERSE: return "inverse"; |
| + case OP_DETERMINANT: return "determinant"; |
| + case OP_UNARY_PLUS: return "+"; |
| + case OP_NEGATION: return "-"; |
| + case OP_PRE_INCREMENT: return "++"; |
| + case OP_PRE_DECREMENT: return "--"; |
| + case OP_POST_INCREMENT: return "++"; |
| + case OP_POST_DECREMENT: return "--"; |
| + case OP_ADD_INTO: return "+="; |
| + case OP_SUBTRACT_FROM: return "-="; |
| + case OP_MULTIPLY_INTO: return "*="; |
| + case OP_DIVIDE_INTO: return "/="; |
| + |
| + default: |
| + DE_ASSERT(DE_FALSE); |
| + return ""; |
| + } |
| } |
| |
| static OperationType getOperationType (MatrixOp op) |
| { |
| - switch (op) |
| - { |
| - case OP_ADD: return OPERATIONTYPE_BINARY_OPERATOR; |
| - case OP_SUB: return OPERATIONTYPE_BINARY_OPERATOR; |
| - case OP_MUL: return OPERATIONTYPE_BINARY_OPERATOR; |
| - case OP_DIV: return OPERATIONTYPE_BINARY_OPERATOR; |
| - case OP_COMP_MUL: return OPERATIONTYPE_BINARY_FUNCTION; |
| - case OP_OUTER_PRODUCT: return OPERATIONTYPE_BINARY_FUNCTION; |
| - case OP_TRANSPOSE: return OPERATIONTYPE_UNARY_FUNCTION; |
| - case OP_INVERSE: return OPERATIONTYPE_UNARY_FUNCTION; |
| - case OP_DETERMINANT: return OPERATIONTYPE_UNARY_FUNCTION; |
| - case OP_UNARY_PLUS: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; |
| - case OP_NEGATION: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; |
| - case OP_PRE_INCREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; |
| - case OP_PRE_DECREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; |
| - case OP_POST_INCREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; |
| - case OP_POST_DECREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; |
| - case OP_ADD_INTO: return OPERATIONTYPE_ASSIGNMENT; |
| - case OP_SUBTRACT_FROM: return OPERATIONTYPE_ASSIGNMENT; |
| - case OP_MULTIPLY_INTO: return OPERATIONTYPE_ASSIGNMENT; |
| - case OP_DIVIDE_INTO: return OPERATIONTYPE_ASSIGNMENT; |
| - default: |
| - DE_ASSERT(DE_FALSE); |
| - return OPERATIONTYPE_LAST; |
| - } |
| + switch (op) |
| + { |
| + case OP_ADD: return OPERATIONTYPE_BINARY_OPERATOR; |
| + case OP_SUB: return OPERATIONTYPE_BINARY_OPERATOR; |
| + case OP_MUL: return OPERATIONTYPE_BINARY_OPERATOR; |
| + case OP_DIV: return OPERATIONTYPE_BINARY_OPERATOR; |
| + case OP_COMP_MUL: return OPERATIONTYPE_BINARY_FUNCTION; |
| + case OP_OUTER_PRODUCT: return OPERATIONTYPE_BINARY_FUNCTION; |
| + case OP_TRANSPOSE: return OPERATIONTYPE_UNARY_FUNCTION; |
| + case OP_INVERSE: return OPERATIONTYPE_UNARY_FUNCTION; |
| + case OP_DETERMINANT: return OPERATIONTYPE_UNARY_FUNCTION; |
| + case OP_UNARY_PLUS: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; |
| + case OP_NEGATION: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; |
| + case OP_PRE_INCREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; |
| + case OP_PRE_DECREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; |
| + case OP_POST_INCREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; |
| + case OP_POST_DECREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; |
| + case OP_ADD_INTO: return OPERATIONTYPE_ASSIGNMENT; |
| + case OP_SUBTRACT_FROM: return OPERATIONTYPE_ASSIGNMENT; |
| + case OP_MULTIPLY_INTO: return OPERATIONTYPE_ASSIGNMENT; |
| + case OP_DIVIDE_INTO: return OPERATIONTYPE_ASSIGNMENT; |
| + default: |
| + DE_ASSERT(DE_FALSE); |
| + return OPERATIONTYPE_LAST; |
| + } |
| } |
| |
| enum TestMatrixType |
| { |
| - TESTMATRIXTYPE_DEFAULT = 0, |
| - TESTMATRIXTYPE_NEGATED, |
| - TESTMATRIXTYPE_INCREMENTED, |
| - TESTMATRIXTYPE_DECREMENTED, |
| - TESTMATRIXTYPE_NEGATED_INCREMENTED, |
| - TESTMATRIXTYPE_INCREMENTED_LESS, |
| + TESTMATRIXTYPE_DEFAULT = 0, |
| + TESTMATRIXTYPE_NEGATED, |
| + TESTMATRIXTYPE_INCREMENTED, |
| + TESTMATRIXTYPE_DECREMENTED, |
| + TESTMATRIXTYPE_NEGATED_INCREMENTED, |
| + TESTMATRIXTYPE_INCREMENTED_LESS, |
| |
| - TESTMATRIXTYPE_LAST |
| + TESTMATRIXTYPE_LAST |
| }; |
| |
| static TestMatrixType getOperationTestMatrixType (MatrixOp op) |
| { |
| - switch(op) |
| - { |
| - case OP_ADD: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_SUB: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_MUL: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_DIV: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_COMP_MUL: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_OUTER_PRODUCT: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_TRANSPOSE: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_INVERSE: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_DETERMINANT: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_UNARY_PLUS: return TESTMATRIXTYPE_DECREMENTED; |
| - case OP_NEGATION: return TESTMATRIXTYPE_NEGATED_INCREMENTED; |
| - case OP_PRE_INCREMENT: return TESTMATRIXTYPE_NEGATED; |
| - case OP_PRE_DECREMENT: return TESTMATRIXTYPE_INCREMENTED; |
| - case OP_POST_INCREMENT: return TESTMATRIXTYPE_NEGATED; |
| - case OP_POST_DECREMENT: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_ADD_INTO: return TESTMATRIXTYPE_DEFAULT; |
| - case OP_SUBTRACT_FROM: return TESTMATRIXTYPE_INCREMENTED_LESS; |
| - case OP_MULTIPLY_INTO: return TESTMATRIXTYPE_NEGATED; |
| - case OP_DIVIDE_INTO: return TESTMATRIXTYPE_DECREMENTED; |
| - |
| - default: |
| - DE_ASSERT(DE_FALSE); |
| - return TESTMATRIXTYPE_LAST; |
| - } |
| + switch(op) |
| + { |
| + case OP_ADD: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_SUB: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_MUL: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_DIV: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_COMP_MUL: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_OUTER_PRODUCT: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_TRANSPOSE: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_INVERSE: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_DETERMINANT: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_UNARY_PLUS: return TESTMATRIXTYPE_DECREMENTED; |
| + case OP_NEGATION: return TESTMATRIXTYPE_NEGATED_INCREMENTED; |
| + case OP_PRE_INCREMENT: return TESTMATRIXTYPE_NEGATED; |
| + case OP_PRE_DECREMENT: return TESTMATRIXTYPE_INCREMENTED; |
| + case OP_POST_INCREMENT: return TESTMATRIXTYPE_NEGATED; |
| + case OP_POST_DECREMENT: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_ADD_INTO: return TESTMATRIXTYPE_DEFAULT; |
| + case OP_SUBTRACT_FROM: return TESTMATRIXTYPE_INCREMENTED_LESS; |
| + case OP_MULTIPLY_INTO: return TESTMATRIXTYPE_NEGATED; |
| + case OP_DIVIDE_INTO: return TESTMATRIXTYPE_DECREMENTED; |
| + |
| + default: |
| + DE_ASSERT(DE_FALSE); |
| + return TESTMATRIXTYPE_LAST; |
| + } |
| } |
| |
| static bool isOperationBinary (MatrixOp op) |
| { |
| - return getOperationType(op) == OPERATIONTYPE_BINARY_OPERATOR || |
| - getOperationType(op) == OPERATIONTYPE_BINARY_FUNCTION || |
| - getOperationType(op) == OPERATIONTYPE_ASSIGNMENT; |
| + return getOperationType(op) == OPERATIONTYPE_BINARY_OPERATOR || |
| + getOperationType(op) == OPERATIONTYPE_BINARY_FUNCTION || |
| + getOperationType(op) == OPERATIONTYPE_ASSIGNMENT; |
| } |
| |
| static bool isOperationMatrixScalar (MatrixOp op) |
| { |
| - return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV; |
| + return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV; |
| } |
| |
| static bool isOperationMatrixVector (MatrixOp op) |
| { |
| - return op == OP_MUL; |
| + return op == OP_MUL; |
| } |
| |
| static bool isOperationArithmeticMatrixMatrix (MatrixOp op) |
| { |
| - return op == OP_MUL; |
| + return op == OP_MUL; |
| } |
| |
| static bool isOperationComponentwiseMatrixMatrix (MatrixOp op) |
| { |
| - return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV || op == OP_COMP_MUL; |
| + return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV || op == OP_COMP_MUL; |
| } |
| |
| static bool isOperationVectorVector (MatrixOp op) |
| { |
| - return op == OP_OUTER_PRODUCT; |
| + return op == OP_OUTER_PRODUCT; |
| } |
| |
| static bool isOperationUnaryAnyMatrix (MatrixOp op) |
| { |
| - return op == OP_TRANSPOSE || |
| - op == OP_UNARY_PLUS || |
| - op == OP_NEGATION || |
| - op == OP_PRE_INCREMENT || |
| - op == OP_PRE_DECREMENT || |
| - op == OP_POST_INCREMENT || |
| - op == OP_POST_DECREMENT; |
| + return op == OP_TRANSPOSE || |
| + op == OP_UNARY_PLUS || |
| + op == OP_NEGATION || |
| + op == OP_PRE_INCREMENT || |
| + op == OP_PRE_DECREMENT || |
| + op == OP_POST_INCREMENT || |
| + op == OP_POST_DECREMENT; |
| } |
| |
| static bool isOperationUnarySymmetricMatrix (MatrixOp op) |
| { |
| - return op == OP_INVERSE || op == OP_DETERMINANT; |
| + return op == OP_INVERSE || op == OP_DETERMINANT; |
| } |
| |
| static bool isOperationValueModifying (MatrixOp op) |
| { |
| - return op == OP_PRE_INCREMENT || |
| - op == OP_PRE_DECREMENT || |
| - op == OP_POST_INCREMENT || |
| - op == OP_POST_DECREMENT; |
| + return op == OP_PRE_INCREMENT || |
| + op == OP_PRE_DECREMENT || |
| + op == OP_POST_INCREMENT || |
| + op == OP_POST_DECREMENT; |
| } |
| |
| static bool isOperationAssignment (MatrixOp op) |
| { |
| - return op == OP_ADD_INTO || |
| - op == OP_SUBTRACT_FROM || |
| - op == OP_MULTIPLY_INTO || |
| - op == OP_DIVIDE_INTO; |
| + return op == OP_ADD_INTO || |
| + op == OP_SUBTRACT_FROM || |
| + op == OP_MULTIPLY_INTO || |
| + op == OP_DIVIDE_INTO; |
| } |
| |
| static bool isOperationAssignmentAnyMatrix (MatrixOp op) |
| { |
| - return op == OP_ADD_INTO || |
| - op == OP_SUBTRACT_FROM || |
| - op == OP_DIVIDE_INTO; |
| + return op == OP_ADD_INTO || |
| + op == OP_SUBTRACT_FROM || |
| + op == OP_DIVIDE_INTO; |
| } |
| |
| static bool isOperationAssignmentSymmetricMatrix (MatrixOp op) |
| { |
| - return op == OP_MULTIPLY_INTO; |
| + return op == OP_MULTIPLY_INTO; |
| } |
| |
| // Operation nature |
| |
| enum OperationNature |
| { |
| - OPERATIONNATURE_PURE = 0, |
| - OPERATIONNATURE_MUTATING, |
| - OPERATIONNATURE_ASSIGNMENT, |
| + OPERATIONNATURE_PURE = 0, |
| + OPERATIONNATURE_MUTATING, |
| + OPERATIONNATURE_ASSIGNMENT, |
| |
| - OPERATIONNATURE_LAST |
| + OPERATIONNATURE_LAST |
| }; |
| |
| static OperationNature getOperationNature (MatrixOp op) |
| { |
| - if (isOperationAssignment(op)) |
| - return OPERATIONNATURE_ASSIGNMENT; |
| + if (isOperationAssignment(op)) |
| + return OPERATIONNATURE_ASSIGNMENT; |
| |
| - if (isOperationValueModifying(op)) |
| - return OPERATIONNATURE_MUTATING; |
| + if (isOperationValueModifying(op)) |
| + return OPERATIONNATURE_MUTATING; |
| |
| - return OPERATIONNATURE_PURE; |
| + return OPERATIONNATURE_PURE; |
| } |
| |
| // Input value loader. |
| @@ -493,143 +493,143 @@ static OperationNature getOperationNature (MatrixOp op) |
| template <int InputT, int DataT> |
| typename TypeTraits<DataT>::Type getInputValue (const ShaderEvalContext& evalCtx, int inputNdx); |
| |
| -template <> inline float getInputValue<INPUTTYPE_CONST, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInFloat[inputNdx]; } |
| -template <> inline tcu::Vec2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec2[inputNdx]; } |
| -template <> inline tcu::Vec3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec3[inputNdx]; } |
| -template <> inline tcu::Vec4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec4[inputNdx]; } |
| - |
| -template <> inline tcu::Mat2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat2(s_constInMat2x2[inputNdx]); } |
| -template <> inline tcu::Mat2x3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2X3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat2x3(s_constInMat2x3[inputNdx]); } |
| -template <> inline tcu::Mat2x4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2X4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat2x4(s_constInMat2x4[inputNdx]); } |
| -template <> inline tcu::Mat3x2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3X2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat3x2(s_constInMat3x2[inputNdx]); } |
| -template <> inline tcu::Mat3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat3(s_constInMat3x3[inputNdx]); } |
| -template <> inline tcu::Mat3x4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3X4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat3x4(s_constInMat3x4[inputNdx]); } |
| -template <> inline tcu::Mat4x2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4X2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat4x2(s_constInMat4x2[inputNdx]); } |
| -template <> inline tcu::Mat4x3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4X3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat4x3(s_constInMat4x3[inputNdx]); } |
| -template <> inline tcu::Mat4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat4(s_constInMat4x4[inputNdx]); } |
| - |
| -template <> inline float getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.x(); } |
| -template <> inline tcu::Vec2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1); } |
| -template <> inline tcu::Vec3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1, 2); } |
| -template <> inline tcu::Vec4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1, 2, 3); } |
| +template <> inline float getInputValue<INPUTTYPE_CONST, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInFloat[inputNdx]; } |
| +template <> inline tcu::Vec2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec2[inputNdx]; } |
| +template <> inline tcu::Vec3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec3[inputNdx]; } |
| +template <> inline tcu::Vec4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec4[inputNdx]; } |
| + |
| +template <> inline tcu::Mat2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat2(s_constInMat2x2[inputNdx]); } |
| +template <> inline tcu::Mat2x3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2X3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat2x3(s_constInMat2x3[inputNdx]); } |
| +template <> inline tcu::Mat2x4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2X4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat2x4(s_constInMat2x4[inputNdx]); } |
| +template <> inline tcu::Mat3x2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3X2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat3x2(s_constInMat3x2[inputNdx]); } |
| +template <> inline tcu::Mat3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat3(s_constInMat3x3[inputNdx]); } |
| +template <> inline tcu::Mat3x4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3X4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat3x4(s_constInMat3x4[inputNdx]); } |
| +template <> inline tcu::Mat4x2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4X2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat4x2(s_constInMat4x2[inputNdx]); } |
| +template <> inline tcu::Mat4x3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4X3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat4x3(s_constInMat4x3[inputNdx]); } |
| +template <> inline tcu::Mat4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat4(s_constInMat4x4[inputNdx]); } |
| + |
| +template <> inline float getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.x(); } |
| +template <> inline tcu::Vec2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1); } |
| +template <> inline tcu::Vec3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1, 2); } |
| +template <> inline tcu::Vec4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1, 2, 3); } |
| |
| template <> inline tcu::Mat2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT2> (const ShaderEvalContext& evalCtx, int inputNdx) |
| { |
| - DE_UNREF(inputNdx); // Not used. |
| - tcu::Mat2 m; |
| - m.setColumn(0, evalCtx.in[0].swizzle(0,1)); |
| - m.setColumn(1, evalCtx.in[1].swizzle(0,1)); |
| - return m; |
| + DE_UNREF(inputNdx); // Not used. |
| + tcu::Mat2 m; |
| + m.setColumn(0, evalCtx.in[0].swizzle(0,1)); |
| + m.setColumn(1, evalCtx.in[1].swizzle(0,1)); |
| + return m; |
| } |
| |
| template <> inline tcu::Mat2x3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT2X3> (const ShaderEvalContext& evalCtx, int inputNdx) |
| { |
| - DE_UNREF(inputNdx); // Not used. |
| - tcu::Mat2x3 m; |
| - m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); |
| - m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); |
| - return m; |
| + DE_UNREF(inputNdx); // Not used. |
| + tcu::Mat2x3 m; |
| + m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); |
| + m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); |
| + return m; |
| } |
| |
| template <> inline tcu::Mat2x4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT2X4> (const ShaderEvalContext& evalCtx, int inputNdx) |
| { |
| - DE_UNREF(inputNdx); // Not used. |
| - tcu::Mat2x4 m; |
| - m.setColumn(0, evalCtx.in[0]); |
| - m.setColumn(1, evalCtx.in[1]); |
| - return m; |
| + DE_UNREF(inputNdx); // Not used. |
| + tcu::Mat2x4 m; |
| + m.setColumn(0, evalCtx.in[0]); |
| + m.setColumn(1, evalCtx.in[1]); |
| + return m; |
| } |
| |
| template <> inline tcu::Mat3x2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT3X2> (const ShaderEvalContext& evalCtx, int inputNdx) |
| { |
| - DE_UNREF(inputNdx); // Not used. |
| - tcu::Mat3x2 m; |
| - m.setColumn(0, evalCtx.in[0].swizzle(0,1)); |
| - m.setColumn(1, evalCtx.in[1].swizzle(0,1)); |
| - m.setColumn(2, evalCtx.in[2].swizzle(0,1)); |
| - return m; |
| + DE_UNREF(inputNdx); // Not used. |
| + tcu::Mat3x2 m; |
| + m.setColumn(0, evalCtx.in[0].swizzle(0,1)); |
| + m.setColumn(1, evalCtx.in[1].swizzle(0,1)); |
| + m.setColumn(2, evalCtx.in[2].swizzle(0,1)); |
| + return m; |
| } |
| |
| template <> inline tcu::Mat3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT3> (const ShaderEvalContext& evalCtx, int inputNdx) |
| { |
| - DE_UNREF(inputNdx); // Not used. |
| - tcu::Mat3 m; |
| - m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); |
| - m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); |
| - m.setColumn(2, evalCtx.in[2].swizzle(0,1,2)); |
| - return m; |
| + DE_UNREF(inputNdx); // Not used. |
| + tcu::Mat3 m; |
| + m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); |
| + m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); |
| + m.setColumn(2, evalCtx.in[2].swizzle(0,1,2)); |
| + return m; |
| } |
| |
| template <> inline tcu::Mat3x4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT3X4> (const ShaderEvalContext& evalCtx, int inputNdx) |
| { |
| - DE_UNREF(inputNdx); // Not used. |
| - tcu::Mat3x4 m; |
| - m.setColumn(0, evalCtx.in[0]); |
| - m.setColumn(1, evalCtx.in[1]); |
| - m.setColumn(2, evalCtx.in[2]); |
| - return m; |
| + DE_UNREF(inputNdx); // Not used. |
| + tcu::Mat3x4 m; |
| + m.setColumn(0, evalCtx.in[0]); |
| + m.setColumn(1, evalCtx.in[1]); |
| + m.setColumn(2, evalCtx.in[2]); |
| + return m; |
| } |
| |
| template <> inline tcu::Mat4x2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT4X2> (const ShaderEvalContext& evalCtx, int inputNdx) |
| { |
| - DE_UNREF(inputNdx); // Not used. |
| - tcu::Mat4x2 m; |
| - m.setColumn(0, evalCtx.in[0].swizzle(0,1)); |
| - m.setColumn(1, evalCtx.in[1].swizzle(0,1)); |
| - m.setColumn(2, evalCtx.in[2].swizzle(0,1)); |
| - m.setColumn(3, evalCtx.in[3].swizzle(0,1)); |
| - return m; |
| + DE_UNREF(inputNdx); // Not used. |
| + tcu::Mat4x2 m; |
| + m.setColumn(0, evalCtx.in[0].swizzle(0,1)); |
| + m.setColumn(1, evalCtx.in[1].swizzle(0,1)); |
| + m.setColumn(2, evalCtx.in[2].swizzle(0,1)); |
| + m.setColumn(3, evalCtx.in[3].swizzle(0,1)); |
| + return m; |
| } |
| |
| template <> inline tcu::Mat4x3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT4X3> (const ShaderEvalContext& evalCtx, int inputNdx) |
| { |
| - DE_UNREF(inputNdx); // Not used. |
| - tcu::Mat4x3 m; |
| - m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); |
| - m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); |
| - m.setColumn(2, evalCtx.in[2].swizzle(0,1,2)); |
| - m.setColumn(3, evalCtx.in[3].swizzle(0,1,2)); |
| - return m; |
| + DE_UNREF(inputNdx); // Not used. |
| + tcu::Mat4x3 m; |
| + m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); |
| + m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); |
| + m.setColumn(2, evalCtx.in[2].swizzle(0,1,2)); |
| + m.setColumn(3, evalCtx.in[3].swizzle(0,1,2)); |
| + return m; |
| } |
| |
| template <> inline tcu::Mat4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT4> (const ShaderEvalContext& evalCtx, int inputNdx) |
| { |
| - DE_UNREF(inputNdx); // Not used. |
| - tcu::Mat4 m; |
| - m.setColumn(0, evalCtx.in[0]); |
| - m.setColumn(1, evalCtx.in[1]); |
| - m.setColumn(2, evalCtx.in[2]); |
| - m.setColumn(3, evalCtx.in[3]); |
| - return m; |
| + DE_UNREF(inputNdx); // Not used. |
| + tcu::Mat4 m; |
| + m.setColumn(0, evalCtx.in[0]); |
| + m.setColumn(1, evalCtx.in[1]); |
| + m.setColumn(2, evalCtx.in[2]); |
| + m.setColumn(3, evalCtx.in[3]); |
| + return m; |
| } |
| |
| // Reduction from expression result to vec3. |
| |
| -inline tcu::Vec3 reduceToVec3 (const tcu::Vec2& value) { return value.swizzle(0,1,0); } |
| -inline tcu::Vec3 reduceToVec3 (const tcu::Vec3& value) { return value; } |
| -inline tcu::Vec3 reduceToVec3 (const tcu::Vec4& value) { return tcu::Vec3(value.x(), value.y(), value.z()+value.w()); } |
| -inline tcu::Vec3 reduceToVec3 (const tcu::Mat2& value) { return tcu::Vec3(value(0, 0), value(0, 1), value(1, 0)+value(1, 1)); } |
| -inline tcu::Vec3 reduceToVec3 (const tcu::Mat2x3& value) { return value.getColumn(0) + value.getColumn(1); } |
| -inline tcu::Vec3 reduceToVec3 (const tcu::Mat2x4& value) { return value.getColumn(0).swizzle(0,1,2) + value.getColumn(1).swizzle(1,2,3); } |
| -inline tcu::Vec3 reduceToVec3 (const tcu::Mat3x2& value) { return tcu::Vec3(value(0,0)+value(1,0), value(0,1)+value(1,1), value(0,2)+value(1,2)); } |
| -inline tcu::Vec3 reduceToVec3 (const tcu::Mat3& value) { return value.getColumn(0) + value.getColumn(1) + value.getColumn(2); } |
| -inline tcu::Vec3 reduceToVec3 (const tcu::Mat3x4& value) { return value.getColumn(0).swizzle(0,1,2) + value.getColumn(1).swizzle(1,2,3) + value.getColumn(2).swizzle(2,3,0); } |
| -inline tcu::Vec3 reduceToVec3 (const tcu::Mat4x2& value) { return tcu::Vec3(value(0,0)+value(1,0)+value(0,3), value(0,1)+value(1,1)+value(1,3), value(0,2)+value(1,2)); } |
| -inline tcu::Vec3 reduceToVec3 (const tcu::Mat4x3& value) { return value.getColumn(0) + value.getColumn(1) + value.getColumn(2) + value.getColumn(3); } |
| -inline tcu::Vec3 reduceToVec3 (const tcu::Mat4& value) { return value.getColumn(0).swizzle(0,1,2) + value.getColumn(1).swizzle(1,2,3) + value.getColumn(2).swizzle(2,3,0) + value.getColumn(3).swizzle(3,0,1); } |
| +inline tcu::Vec3 reduceToVec3 (const tcu::Vec2& value) { return value.swizzle(0,1,0); } |
| +inline tcu::Vec3 reduceToVec3 (const tcu::Vec3& value) { return value; } |
| +inline tcu::Vec3 reduceToVec3 (const tcu::Vec4& value) { return tcu::Vec3(value.x(), value.y(), value.z()+value.w()); } |
| +inline tcu::Vec3 reduceToVec3 (const tcu::Mat2& value) { return tcu::Vec3(value(0, 0), value(0, 1), value(1, 0)+value(1, 1)); } |
| +inline tcu::Vec3 reduceToVec3 (const tcu::Mat2x3& value) { return value.getColumn(0) + value.getColumn(1); } |
| +inline tcu::Vec3 reduceToVec3 (const tcu::Mat2x4& value) { return value.getColumn(0).swizzle(0,1,2) + value.getColumn(1).swizzle(1,2,3); } |
| +inline tcu::Vec3 reduceToVec3 (const tcu::Mat3x2& value) { return tcu::Vec3(value(0,0)+value(1,0), value(0,1)+value(1,1), value(0,2)+value(1,2)); } |
| +inline tcu::Vec3 reduceToVec3 (const tcu::Mat3& value) { return value.getColumn(0) + value.getColumn(1) + value.getColumn(2); } |
| +inline tcu::Vec3 reduceToVec3 (const tcu::Mat3x4& value) { return value.getColumn(0).swizzle(0,1,2) + value.getColumn(1).swizzle(1,2,3) + value.getColumn(2).swizzle(2,3,0); } |
| +inline tcu::Vec3 reduceToVec3 (const tcu::Mat4x2& value) { return tcu::Vec3(value(0,0)+value(1,0)+value(0,3), value(0,1)+value(1,1)+value(1,3), value(0,2)+value(1,2)); } |
| +inline tcu::Vec3 reduceToVec3 (const tcu::Mat4x3& value) { return value.getColumn(0) + value.getColumn(1) + value.getColumn(2) + value.getColumn(3); } |
| +inline tcu::Vec3 reduceToVec3 (const tcu::Mat4& value) { return value.getColumn(0).swizzle(0,1,2) + value.getColumn(1).swizzle(1,2,3) + value.getColumn(2).swizzle(2,3,0) + value.getColumn(3).swizzle(3,0,1); } |
| |
| // matrixCompMult |
| |
| template <typename T, int Rows, int Cols> |
| tcu::Matrix<T, Rows, Cols> matrixCompMult (const tcu::Matrix<T, Rows, Cols>& a, const tcu::Matrix<T, Rows, Cols>& b) |
| { |
| - tcu::Matrix<T, Rows, Cols> retVal; |
| + tcu::Matrix<T, Rows, Cols> retVal; |
| |
| - for (int r = 0; r < Rows; ++r) |
| - for (int c = 0; c < Cols; ++c) |
| - retVal(r,c) = a(r,c) * b(r, c); |
| + for (int r = 0; r < Rows; ++r) |
| + for (int c = 0; c < Cols; ++c) |
| + retVal(r,c) = a(r,c) * b(r, c); |
| |
| - return retVal; |
| + return retVal; |
| } |
| |
| // transpose |
| @@ -637,13 +637,13 @@ tcu::Matrix<T, Rows, Cols> matrixCompMult (const tcu::Matrix<T, Rows, Cols>& a, |
| template <typename T, int Rows, int Cols> |
| tcu::Matrix<T, Cols, Rows> transpose (const tcu::Matrix<T, Rows, Cols>& mat) |
| { |
| - tcu::Matrix<T, Cols, Rows> retVal; |
| + tcu::Matrix<T, Cols, Rows> retVal; |
| |
| - for (int r = 0; r < Rows; ++r) |
| - for (int c = 0; c < Cols; ++c) |
| - retVal(c, r) = mat(r, c); |
| + for (int r = 0; r < Rows; ++r) |
| + for (int c = 0; c < Cols; ++c) |
| + retVal(c, r) = mat(r, c); |
| |
| - return retVal; |
| + return retVal; |
| } |
| |
| // outerProduct |
| @@ -651,13 +651,13 @@ tcu::Matrix<T, Cols, Rows> transpose (const tcu::Matrix<T, Rows, Cols>& mat) |
| template <typename T, int Rows, int Cols> |
| tcu::Matrix<T, Cols, Rows> outerProduct (const tcu::Vector<T, Cols>& a, const tcu::Vector<T, Rows>& b) |
| { |
| - tcu::Matrix<T, Rows, Cols> retVal; |
| + tcu::Matrix<T, Rows, Cols> retVal; |
| |
| - for (int r = 0; r < Rows; ++r) |
| - for (int c = 0; c < Cols; ++c) |
| - retVal(r,c) = a[c] * b[r]; |
| + for (int r = 0; r < Rows; ++r) |
| + for (int c = 0; c < Cols; ++c) |
| + retVal(r,c) = a[c] * b[r]; |
| |
| - return transpose(retVal); // to gl-form (column-major) |
| + return transpose(retVal); // to gl-form (column-major) |
| } |
| |
| // Determinant |
| @@ -668,51 +668,51 @@ float determinant (const tcu::Matrix<float, Size, Size>& mat); |
| template <> |
| float determinant<2> (const tcu::Matrix<float, 2, 2>& mat) |
| { |
| - return mat(0,0) * mat(1,1) - mat(1,0) * mat(0,1); |
| + return mat(0,0) * mat(1,1) - mat(1,0) * mat(0,1); |
| } |
| |
| template <> |
| float determinant<3> (const tcu::Matrix<float, 3, 3>& mat) |
| { |
| - return + mat(0,0) * mat(1,1) * mat(2,2) |
| - + mat(0,1) * mat(1,2) * mat(2,0) |
| - + mat(0,2) * mat(1,0) * mat(2,1) |
| - - mat(0,0) * mat(1,2) * mat(2,1) |
| - - mat(0,1) * mat(1,0) * mat(2,2) |
| - - mat(0,2) * mat(1,1) * mat(2,0); |
| + return + mat(0,0) * mat(1,1) * mat(2,2) |
| + + mat(0,1) * mat(1,2) * mat(2,0) |
| + + mat(0,2) * mat(1,0) * mat(2,1) |
| + - mat(0,0) * mat(1,2) * mat(2,1) |
| + - mat(0,1) * mat(1,0) * mat(2,2) |
| + - mat(0,2) * mat(1,1) * mat(2,0); |
| } |
| |
| template <> |
| float determinant<4> (const tcu::Matrix<float, 4, 4>& mat) |
| { |
| - const float minorMatrices[4][3*3] = |
| - { |
| - { |
| - mat(1,1), mat(2,1), mat(3,1), |
| - mat(1,2), mat(2,2), mat(3,2), |
| - mat(1,3), mat(2,3), mat(3,3), |
| - }, |
| - { |
| - mat(1,0), mat(2,0), mat(3,0), |
| - mat(1,2), mat(2,2), mat(3,2), |
| - mat(1,3), mat(2,3), mat(3,3), |
| - }, |
| - { |
| - mat(1,0), mat(2,0), mat(3,0), |
| - mat(1,1), mat(2,1), mat(3,1), |
| - mat(1,3), mat(2,3), mat(3,3), |
| - }, |
| - { |
| - mat(1,0), mat(2,0), mat(3,0), |
| - mat(1,1), mat(2,1), mat(3,1), |
| - mat(1,2), mat(2,2), mat(3,2), |
| - } |
| - }; |
| - |
| - return + mat(0,0) * determinant(tcu::Mat3(minorMatrices[0])) |
| - - mat(0,1) * determinant(tcu::Mat3(minorMatrices[1])) |
| - + mat(0,2) * determinant(tcu::Mat3(minorMatrices[2])) |
| - - mat(0,3) * determinant(tcu::Mat3(minorMatrices[3])); |
| + const float minorMatrices[4][3*3] = |
| + { |
| + { |
| + mat(1,1), mat(2,1), mat(3,1), |
| + mat(1,2), mat(2,2), mat(3,2), |
| + mat(1,3), mat(2,3), mat(3,3), |
| + }, |
| + { |
| + mat(1,0), mat(2,0), mat(3,0), |
| + mat(1,2), mat(2,2), mat(3,2), |
| + mat(1,3), mat(2,3), mat(3,3), |
| + }, |
| + { |
| + mat(1,0), mat(2,0), mat(3,0), |
| + mat(1,1), mat(2,1), mat(3,1), |
| + mat(1,3), mat(2,3), mat(3,3), |
| + }, |
| + { |
| + mat(1,0), mat(2,0), mat(3,0), |
| + mat(1,1), mat(2,1), mat(3,1), |
| + mat(1,2), mat(2,2), mat(3,2), |
| + } |
| + }; |
| + |
| + return + mat(0,0) * determinant(tcu::Mat3(minorMatrices[0])) |
| + - mat(0,1) * determinant(tcu::Mat3(minorMatrices[1])) |
| + + mat(0,2) * determinant(tcu::Mat3(minorMatrices[2])) |
| + - mat(0,3) * determinant(tcu::Mat3(minorMatrices[3])); |
| } |
| |
| // Inverse |
| @@ -723,120 +723,120 @@ tcu::Matrix<float, Size, Size> inverse (const tcu::Matrix<float, Size, Size>& ma |
| template <> |
| tcu::Matrix<float, 2, 2> inverse<2> (const tcu::Matrix<float, 2, 2>& mat) |
| { |
| - const float det = determinant(mat); |
| - tcu::Matrix<float, 2, 2> retVal; |
| + const float det = determinant(mat); |
| + tcu::Matrix<float, 2, 2> retVal; |
| |
| - DE_ASSERT(det != 0.0f); |
| + DE_ASSERT(det != 0.0f); |
| |
| - retVal(0, 0) = mat(1, 1) / det; |
| - retVal(0, 1) = -mat(0, 1) / det; |
| - retVal(1, 0) = -mat(1, 0) / det; |
| - retVal(1, 1) = mat(0, 0) / det; |
| + retVal(0, 0) = mat(1, 1) / det; |
| + retVal(0, 1) = -mat(0, 1) / det; |
| + retVal(1, 0) = -mat(1, 0) / det; |
| + retVal(1, 1) = mat(0, 0) / det; |
| |
| - return retVal; |
| + return retVal; |
| } |
| |
| template <> |
| tcu::Matrix<float, 3, 3> inverse<3> (const tcu::Matrix<float, 3, 3>& mat) |
| { |
| - // Blockwise inversion |
| - |
| - DE_ASSERT(determinant(mat) != 0.0f); |
| - |
| - const float areaA[2*2] = |
| - { |
| - mat(0,0), mat(0,1), |
| - mat(1,0), mat(1,1) |
| - }; |
| - const float areaB[2] = |
| - { |
| - mat(0,2), |
| - mat(1,2), |
| - }; |
| - const float areaC[2] = |
| - { |
| - mat(2,0), mat(2,1), |
| - }; |
| - const float areaD[1] = |
| - { |
| - mat(2,2) |
| - }; |
| - const float nullField[4] = { 0.0f }; |
| - |
| - const tcu::Matrix<float, 2, 2> invA = inverse(tcu::Matrix<float, 2, 2>(areaA)); |
| - const tcu::Matrix<float, 2, 1> matB = tcu::Matrix<float, 2, 1>(areaB); |
| - const tcu::Matrix<float, 1, 2> matC = tcu::Matrix<float, 1, 2>(areaC); |
| - const tcu::Matrix<float, 1, 1> matD = tcu::Matrix<float, 1, 1>(areaD); |
| - |
| - const float schurComplement = 1.0f / (matD - matC*invA*matB)(0,0); |
| - const tcu::Matrix<float, 2, 2> zeroMat = Mat2(nullField); |
| - |
| - const tcu::Matrix<float, 2, 2> blockA = invA + invA*matB*schurComplement*matC*invA; |
| - const tcu::Matrix<float, 2, 1> blockB = (zeroMat-invA)*matB*schurComplement; |
| - const tcu::Matrix<float, 1, 2> blockC = matC*invA*(-schurComplement); |
| - const float blockD = schurComplement; |
| - |
| - const float result[3*3] = |
| - { |
| - blockA(0,0), blockA(0,1), blockB(0,0), |
| - blockA(1,0), blockA(1,1), blockB(1,0), |
| - blockC(0,0), blockC(0,1), blockD, |
| - }; |
| - |
| - return Mat3(result); |
| + // Blockwise inversion |
| + |
| + DE_ASSERT(determinant(mat) != 0.0f); |
| + |
| + const float areaA[2*2] = |
| + { |
| + mat(0,0), mat(0,1), |
| + mat(1,0), mat(1,1) |
| + }; |
| + const float areaB[2] = |
| + { |
| + mat(0,2), |
| + mat(1,2), |
| + }; |
| + const float areaC[2] = |
| + { |
| + mat(2,0), mat(2,1), |
| + }; |
| + const float areaD[1] = |
| + { |
| + mat(2,2) |
| + }; |
| + const float nullField[4] = { 0.0f }; |
| + |
| + const tcu::Matrix<float, 2, 2> invA = inverse(tcu::Matrix<float, 2, 2>(areaA)); |
| + const tcu::Matrix<float, 2, 1> matB = tcu::Matrix<float, 2, 1>(areaB); |
| + const tcu::Matrix<float, 1, 2> matC = tcu::Matrix<float, 1, 2>(areaC); |
| + const tcu::Matrix<float, 1, 1> matD = tcu::Matrix<float, 1, 1>(areaD); |
| + |
| + const float schurComplement = 1.0f / (matD - matC*invA*matB)(0,0); |
| + const tcu::Matrix<float, 2, 2> zeroMat = Mat2(nullField); |
| + |
| + const tcu::Matrix<float, 2, 2> blockA = invA + invA*matB*schurComplement*matC*invA; |
| + const tcu::Matrix<float, 2, 1> blockB = (zeroMat-invA)*matB*schurComplement; |
| + const tcu::Matrix<float, 1, 2> blockC = matC*invA*(-schurComplement); |
| + const float blockD = schurComplement; |
| + |
| + const float result[3*3] = |
| + { |
| + blockA(0,0), blockA(0,1), blockB(0,0), |
| + blockA(1,0), blockA(1,1), blockB(1,0), |
| + blockC(0,0), blockC(0,1), blockD, |
| + }; |
| + |
| + return Mat3(result); |
| } |
| |
| template <> |
| tcu::Matrix<float, 4, 4> inverse<4> (const tcu::Matrix<float, 4, 4>& mat) |
| { |
| - // Blockwise inversion |
| - |
| - DE_ASSERT(determinant(mat) != 0.0f); |
| - |
| - const float areaA[2*2] = |
| - { |
| - mat(0,0), mat(0,1), |
| - mat(1,0), mat(1,1) |
| - }; |
| - const float areaB[2*2] = |
| - { |
| - mat(0,2), mat(0,3), |
| - mat(1,2), mat(1,3) |
| - }; |
| - const float areaC[2*2] = |
| - { |
| - mat(2,0), mat(2,1), |
| - mat(3,0), mat(3,1) |
| - }; |
| - const float areaD[2*2] = |
| - { |
| - mat(2,2), mat(2,3), |
| - mat(3,2), mat(3,3) |
| - }; |
| - const float nullField[4] = { 0.0f }; |
| - |
| - const tcu::Matrix<float, 2, 2> invA = inverse(Mat2(areaA)); |
| - const tcu::Matrix<float, 2, 2> matB = Mat2(areaB); |
| - const tcu::Matrix<float, 2, 2> matC = Mat2(areaC); |
| - const tcu::Matrix<float, 2, 2> matD = Mat2(areaD); |
| - |
| - const tcu::Matrix<float, 2, 2> schurComplement = inverse(matD - matC*invA*matB); |
| - const tcu::Matrix<float, 2, 2> zeroMat = Mat2(nullField); |
| - |
| - const tcu::Matrix<float, 2, 2> blockA = invA + invA*matB*schurComplement*matC*invA; |
| - const tcu::Matrix<float, 2, 2> blockB = (zeroMat-invA)*matB*schurComplement; |
| - const tcu::Matrix<float, 2, 2> blockC = (zeroMat-schurComplement)*matC*invA; |
| - const tcu::Matrix<float, 2, 2> blockD = schurComplement; |
| - |
| - const float result[4*4] = |
| - { |
| - blockA(0,0), blockA(0,1), blockB(0,0), blockB(0,1), |
| - blockA(1,0), blockA(1,1), blockB(1,0), blockB(1,1), |
| - blockC(0,0), blockC(0,1), blockD(0,0), blockD(0,1), |
| - blockC(1,0), blockC(1,1), blockD(1,0), blockD(1,1), |
| - }; |
| - |
| - return Mat4(result); |
| + // Blockwise inversion |
| + |
| + DE_ASSERT(determinant(mat) != 0.0f); |
| + |
| + const float areaA[2*2] = |
| + { |
| + mat(0,0), mat(0,1), |
| + mat(1,0), mat(1,1) |
| + }; |
| + const float areaB[2*2] = |
| + { |
| + mat(0,2), mat(0,3), |
| + mat(1,2), mat(1,3) |
| + }; |
| + const float areaC[2*2] = |
| + { |
| + mat(2,0), mat(2,1), |
| + mat(3,0), mat(3,1) |
| + }; |
| + const float areaD[2*2] = |
| + { |
| + mat(2,2), mat(2,3), |
| + mat(3,2), mat(3,3) |
| + }; |
| + const float nullField[4] = { 0.0f }; |
| + |
| + const tcu::Matrix<float, 2, 2> invA = inverse(Mat2(areaA)); |
| + const tcu::Matrix<float, 2, 2> matB = Mat2(areaB); |
| + const tcu::Matrix<float, 2, 2> matC = Mat2(areaC); |
| + const tcu::Matrix<float, 2, 2> matD = Mat2(areaD); |
| + |
| + const tcu::Matrix<float, 2, 2> schurComplement = inverse(matD - matC*invA*matB); |
| + const tcu::Matrix<float, 2, 2> zeroMat = Mat2(nullField); |
| + |
| + const tcu::Matrix<float, 2, 2> blockA = invA + invA*matB*schurComplement*matC*invA; |
| + const tcu::Matrix<float, 2, 2> blockB = (zeroMat-invA)*matB*schurComplement; |
| + const tcu::Matrix<float, 2, 2> blockC = (zeroMat-schurComplement)*matC*invA; |
| + const tcu::Matrix<float, 2, 2> blockD = schurComplement; |
| + |
| + const float result[4*4] = |
| + { |
| + blockA(0,0), blockA(0,1), blockB(0,0), blockB(0,1), |
| + blockA(1,0), blockA(1,1), blockB(1,0), blockB(1,1), |
| + blockC(0,0), blockC(0,1), blockD(0,0), blockD(0,1), |
| + blockC(1,0), blockC(1,1), blockD(1,0), blockD(1,1), |
| + }; |
| + |
| + return Mat4(result); |
| } |
| |
| // negate |
| @@ -844,13 +844,13 @@ tcu::Matrix<float, 4, 4> inverse<4> (const tcu::Matrix<float, 4, 4>& mat) |
| template <typename T, int Rows, int Cols> |
| tcu::Matrix<T, Rows, Cols> negate (const tcu::Matrix<T, Rows, Cols>& mat) |
| { |
| - tcu::Matrix<T, Rows, Cols> retVal; |
| + tcu::Matrix<T, Rows, Cols> retVal; |
| |
| - for (int r = 0; r < Rows; ++r) |
| - for (int c = 0; c < Cols; ++c) |
| - retVal(r,c) = -mat(r, c); |
| + for (int r = 0; r < Rows; ++r) |
| + for (int c = 0; c < Cols; ++c) |
| + retVal(r,c) = -mat(r, c); |
| |
| - return retVal; |
| + return retVal; |
| } |
| |
| // increment/decrement |
| @@ -858,25 +858,25 @@ tcu::Matrix<T, Rows, Cols> negate (const tcu::Matrix<T, Rows, Cols>& mat) |
| template <typename T, int Rows, int Cols> |
| tcu::Matrix<T, Rows, Cols> increment (const tcu::Matrix<T, Rows, Cols>& mat) |
| { |
| - tcu::Matrix<T, Rows, Cols> retVal; |
| + tcu::Matrix<T, Rows, Cols> retVal; |
| |
| - for (int r = 0; r < Rows; ++r) |
| - for (int c = 0; c < Cols; ++c) |
| - retVal(r,c) = mat(r, c) + 1.0f; |
| + for (int r = 0; r < Rows; ++r) |
| + for (int c = 0; c < Cols; ++c) |
| + retVal(r,c) = mat(r, c) + 1.0f; |
| |
| - return retVal; |
| + return retVal; |
| } |
| |
| template <typename T, int Rows, int Cols> |
| tcu::Matrix<T, Rows, Cols> decrement (const tcu::Matrix<T, Rows, Cols>& mat) |
| { |
| - tcu::Matrix<T, Rows, Cols> retVal; |
| + tcu::Matrix<T, Rows, Cols> retVal; |
| |
| - for (int r = 0; r < Rows; ++r) |
| - for (int c = 0; c < Cols; ++c) |
| - retVal(r,c) = mat(r, c) - 1.0f; |
| + for (int r = 0; r < Rows; ++r) |
| + for (int c = 0; c < Cols; ++c) |
| + retVal(r,c) = mat(r, c) - 1.0f; |
| |
| - return retVal; |
| + return retVal; |
| } |
| |
| // Evaluator template. |
| @@ -889,423 +889,423 @@ struct Evaluator; |
| template <int In0DataType, int In1DataType> |
| struct Evaluator<OP_ADD, In0DataType, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| - { |
| - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| - evalCtx.color.xyz() = reduceToVec3(in0 + in1); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| + { |
| + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| + evalCtx.color.xyz() = reduceToVec3(in0 + in1); |
| + } |
| }; |
| |
| template <int In0DataType, int In1DataType> |
| struct Evaluator<OP_SUB, In0DataType, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| - { |
| - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| - evalCtx.color.xyz() = reduceToVec3(in0 - in1); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| + { |
| + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| + evalCtx.color.xyz() = reduceToVec3(in0 - in1); |
| + } |
| }; |
| |
| template <int In0DataType, int In1DataType> |
| struct Evaluator<OP_MUL, In0DataType, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| - { |
| - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| - evalCtx.color.xyz() = reduceToVec3(in0 * in1); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| + { |
| + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| + evalCtx.color.xyz() = reduceToVec3(in0 * in1); |
| + } |
| }; |
| |
| template <int In0DataType, int In1DataType> |
| struct Evaluator<OP_DIV, In0DataType, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| - { |
| - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| - evalCtx.color.xyz() = reduceToVec3(in0 / in1); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| + { |
| + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| + evalCtx.color.xyz() = reduceToVec3(in0 / in1); |
| + } |
| }; |
| |
| template <int In0DataType, int In1DataType> |
| struct Evaluator<OP_COMP_MUL, In0DataType, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| - { |
| - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| - evalCtx.color.xyz() = reduceToVec3(matrixCompMult(in0, in1)); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| + { |
| + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| + evalCtx.color.xyz() = reduceToVec3(matrixCompMult(in0, in1)); |
| + } |
| }; |
| |
| template <int In0DataType, int In1DataType> |
| struct Evaluator<OP_OUTER_PRODUCT, In0DataType, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| - { |
| - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| - evalCtx.color.xyz() = reduceToVec3(outerProduct(in0, in1)); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| + { |
| + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| + evalCtx.color.xyz() = reduceToVec3(outerProduct(in0, in1)); |
| + } |
| }; |
| |
| template <int In0DataType, int In1DataType> |
| struct Evaluator<OP_TRANSPOSE, In0DataType, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| - { |
| - DE_UNREF(in1Type); |
| - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| - evalCtx.color.xyz() = reduceToVec3(transpose(in0)); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| + { |
| + DE_UNREF(in1Type); |
| + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| + evalCtx.color.xyz() = reduceToVec3(transpose(in0)); |
| + } |
| }; |
| |
| template <int In0DataType, int In1DataType> |
| struct Evaluator<OP_INVERSE, In0DataType, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| - { |
| - DE_UNREF(in1Type); |
| - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| - evalCtx.color.xyz() = reduceToVec3(inverse(in0)); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| + { |
| + DE_UNREF(in1Type); |
| + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| + evalCtx.color.xyz() = reduceToVec3(inverse(in0)); |
| + } |
| }; |
| |
| template <int In0DataType, int In1DataType> |
| struct Evaluator<OP_DETERMINANT, In0DataType, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| - { |
| - DE_UNREF(in1Type); |
| - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| - evalCtx.color.xyz() = Vec3(determinant(in0)); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| + { |
| + DE_UNREF(in1Type); |
| + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| + evalCtx.color.xyz() = Vec3(determinant(in0)); |
| + } |
| }; |
| |
| template <int In0DataType, int In1DataType> |
| struct Evaluator<OP_UNARY_PLUS, In0DataType, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| - { |
| - DE_UNREF(in1Type); |
| - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| - evalCtx.color.xyz() = reduceToVec3(in0); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| + { |
| + DE_UNREF(in1Type); |
| + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| + evalCtx.color.xyz() = reduceToVec3(in0); |
| + } |
| }; |
| |
| template <int In0DataType, int In1DataType> |
| struct Evaluator<OP_NEGATION, In0DataType, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| - { |
| - DE_UNREF(in1Type); |
| - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| - evalCtx.color.xyz() = reduceToVec3(negate(in0)); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| + { |
| + DE_UNREF(in1Type); |
| + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| + evalCtx.color.xyz() = reduceToVec3(negate(in0)); |
| + } |
| }; |
| |
| template <int In0DataType, int In1DataType> |
| struct Evaluator<OP_PRE_INCREMENT, In0DataType, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| - { |
| - DE_UNREF(in1Type); |
| - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| + { |
| + DE_UNREF(in1Type); |
| + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| |
| - // modifying reduction: sum modified value too |
| - evalCtx.color.xyz() = reduceToVec3(increment(in0)) + reduceToVec3(increment(in0)); |
| - } |
| + // modifying reduction: sum modified value too |
| + evalCtx.color.xyz() = reduceToVec3(increment(in0)) + reduceToVec3(increment(in0)); |
| + } |
| }; |
| |
| template <int In0DataType, int In1DataType> |
| struct Evaluator<OP_PRE_DECREMENT, In0DataType, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| - { |
| - DE_UNREF(in1Type); |
| - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| + { |
| + DE_UNREF(in1Type); |
| + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| |
| - // modifying reduction: sum modified value too |
| - evalCtx.color.xyz() = reduceToVec3(decrement(in0)) + reduceToVec3(decrement(in0)); |
| - } |
| + // modifying reduction: sum modified value too |
| + evalCtx.color.xyz() = reduceToVec3(decrement(in0)) + reduceToVec3(decrement(in0)); |
| + } |
| }; |
| |
| template <int In0DataType, int In1DataType> |
| struct Evaluator<OP_POST_INCREMENT, In0DataType, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| - { |
| - DE_UNREF(in1Type); |
| - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| + { |
| + DE_UNREF(in1Type); |
| + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| |
| - // modifying reduction: sum modified value too |
| - evalCtx.color.xyz() = reduceToVec3(in0) + reduceToVec3(increment(in0)); |
| - } |
| + // modifying reduction: sum modified value too |
| + evalCtx.color.xyz() = reduceToVec3(in0) + reduceToVec3(increment(in0)); |
| + } |
| }; |
| |
| template <int In0DataType, int In1DataType> |
| struct Evaluator<OP_POST_DECREMENT, In0DataType, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| - { |
| - DE_UNREF(in1Type); |
| - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| + { |
| + DE_UNREF(in1Type); |
| + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| |
| - // modifying reduction: sum modified value too |
| - evalCtx.color.xyz() = reduceToVec3(in0) + reduceToVec3(decrement(in0)); |
| - } |
| + // modifying reduction: sum modified value too |
| + evalCtx.color.xyz() = reduceToVec3(in0) + reduceToVec3(decrement(in0)); |
| + } |
| }; |
| |
| template <int In0DataType, int In1DataType> |
| struct Evaluator<OP_ADD_INTO, In0DataType, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| - { |
| - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| - evalCtx.color.xyz() = reduceToVec3(in0 + in1); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| + { |
| + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| + evalCtx.color.xyz() = reduceToVec3(in0 + in1); |
| + } |
| }; |
| |
| template <int In0DataType, int In1DataType> |
| struct Evaluator<OP_SUBTRACT_FROM, In0DataType, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| - { |
| - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| - evalCtx.color.xyz() = reduceToVec3(in0 - in1); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| + { |
| + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| + evalCtx.color.xyz() = reduceToVec3(in0 - in1); |
| + } |
| }; |
| |
| template <int In0DataType, int In1DataType> |
| struct Evaluator<OP_MULTIPLY_INTO, In0DataType, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| - { |
| - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| - evalCtx.color.xyz() = reduceToVec3(in0 * in1); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| + { |
| + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| + evalCtx.color.xyz() = reduceToVec3(in0 * in1); |
| + } |
| }; |
| |
| template <int In0DataType, int In1DataType> |
| struct Evaluator<OP_DIVIDE_INTO, In0DataType, In1DataType> |
| { |
| - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| - { |
| - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| - evalCtx.color.xyz() = reduceToVec3(in0 / in1); |
| - } |
| + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) |
| + { |
| + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) |
| + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); |
| + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) |
| + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); |
| + evalCtx.color.xyz() = reduceToVec3(in0 / in1); |
| + } |
| }; |
| |
| MatrixShaderEvalFunc getEvalFunc (const ShaderInput& in0, const ShaderInput& in1, MatrixOp op) |
| { |
| - // Evaluator is selected based on op and input data types. |
| - // For efficient lookup the types and op enums are packed together to form a 19-bit key: |
| - // [18..14 OP] [13..7 TYPE0] [6..0 TYPE1] |
| - |
| - DE_STATIC_ASSERT(TYPE_LAST <= (1<<7)); |
| - DE_STATIC_ASSERT(OP_LAST <= (1<<5)); |
| - |
| -#define PACK_EVAL_CASE(OP, IN0DATATYPE, IN1DATATYPE) (((OP) << 14) | ((IN0DATATYPE) << 7) | (IN1DATATYPE)) |
| - |
| -#define MAKE_EVAL_CASE(OP, IN0DATATYPE, IN1DATATYPE) \ |
| - case PACK_EVAL_CASE(OP, IN0DATATYPE, IN1DATATYPE): \ |
| - return Evaluator<OP, IN0DATATYPE, IN1DATATYPE>::evaluate |
| - |
| -#define MAKE_SCALAR_OPS(IN0DATATYPE, IN1DATATYPE) \ |
| - MAKE_EVAL_CASE(OP_ADD, IN0DATATYPE, IN1DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_SUB, IN0DATATYPE, IN1DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_MUL, IN0DATATYPE, IN1DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_DIV, IN0DATATYPE, IN1DATATYPE) |
| - |
| -#define MAKE_CWISE_OPS(IN0DATATYPE, IN1DATATYPE) \ |
| - MAKE_EVAL_CASE(OP_ADD, IN0DATATYPE, IN1DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_SUB, IN0DATATYPE, IN1DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_DIV, IN0DATATYPE, IN1DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_COMP_MUL, IN0DATATYPE, IN1DATATYPE) |
| - |
| -#define MAKE_MUL_OP(IN0DATATYPE, IN1DATATYPE) \ |
| - MAKE_EVAL_CASE(OP_MUL, IN0DATATYPE, IN1DATATYPE) |
| - |
| -#define MAKE_VECVEC_OP(IN0DATATYPE, IN1DATATYPE) \ |
| - MAKE_EVAL_CASE(OP_OUTER_PRODUCT, IN0DATATYPE, IN1DATATYPE) |
| - |
| -#define MAKE_UNARY_OP(IN0DATATYPE) \ |
| - MAKE_EVAL_CASE(OP_TRANSPOSE, IN0DATATYPE, TYPE_LAST); \ |
| - MAKE_EVAL_CASE(OP_UNARY_PLUS, IN0DATATYPE, TYPE_LAST); \ |
| - MAKE_EVAL_CASE(OP_NEGATION, IN0DATATYPE, TYPE_LAST); \ |
| - MAKE_EVAL_CASE(OP_PRE_INCREMENT, IN0DATATYPE, TYPE_LAST); \ |
| - MAKE_EVAL_CASE(OP_PRE_DECREMENT, IN0DATATYPE, TYPE_LAST); \ |
| - MAKE_EVAL_CASE(OP_POST_INCREMENT, IN0DATATYPE, TYPE_LAST); \ |
| - MAKE_EVAL_CASE(OP_POST_DECREMENT, IN0DATATYPE, TYPE_LAST) |
| - |
| -#define MAKE_UNARY_SYMMETRIC_OP(IN0DATATYPE) \ |
| - MAKE_UNARY_OP(IN0DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_DETERMINANT, IN0DATATYPE, TYPE_LAST); \ |
| - MAKE_EVAL_CASE(OP_INVERSE, IN0DATATYPE, TYPE_LAST) |
| - |
| -#define MAKE_ASSIGNMENT_OP(IN0DATATYPE) \ |
| - MAKE_EVAL_CASE(OP_ADD_INTO, IN0DATATYPE, IN0DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_SUBTRACT_FROM, IN0DATATYPE, IN0DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_DIVIDE_INTO, IN0DATATYPE, IN0DATATYPE) |
| - |
| -#define MAKE_ASSIGNMENT_SYMMETRIC_OP(IN0DATATYPE) \ |
| - MAKE_ASSIGNMENT_OP(IN0DATATYPE); \ |
| - MAKE_EVAL_CASE(OP_MULTIPLY_INTO, IN0DATATYPE, IN0DATATYPE) |
| - |
| - switch (PACK_EVAL_CASE(op, in0.dataType, in1.dataType)) |
| - { |
| - // Matrix-scalar. |
| - MAKE_SCALAR_OPS(TYPE_FLOAT_MAT2, TYPE_FLOAT); |
| - MAKE_SCALAR_OPS(TYPE_FLOAT_MAT2X3, TYPE_FLOAT); |
| - MAKE_SCALAR_OPS(TYPE_FLOAT_MAT2X4, TYPE_FLOAT); |
| - MAKE_SCALAR_OPS(TYPE_FLOAT_MAT3X2, TYPE_FLOAT); |
| - MAKE_SCALAR_OPS(TYPE_FLOAT_MAT3, TYPE_FLOAT); |
| - MAKE_SCALAR_OPS(TYPE_FLOAT_MAT3X4, TYPE_FLOAT); |
| - MAKE_SCALAR_OPS(TYPE_FLOAT_MAT4X2, TYPE_FLOAT); |
| - MAKE_SCALAR_OPS(TYPE_FLOAT_MAT4X3, TYPE_FLOAT); |
| - MAKE_SCALAR_OPS(TYPE_FLOAT_MAT4, TYPE_FLOAT); |
| - |
| - // Matrix-vector. |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_VEC2); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_VEC2); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_VEC2); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_VEC3); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_VEC3); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_VEC3); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_VEC4); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_VEC4); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_VEC4); |
| - |
| - // Vector-matrix. |
| - MAKE_MUL_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT2); |
| - MAKE_MUL_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT2X3); |
| - MAKE_MUL_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT2X4); |
| - MAKE_MUL_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT3X2); |
| - MAKE_MUL_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT3); |
| - MAKE_MUL_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT3X4); |
| - MAKE_MUL_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT4X2); |
| - MAKE_MUL_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT4X3); |
| - MAKE_MUL_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT4); |
| - |
| - // Matrix-matrix. |
| - MAKE_CWISE_OPS(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT2); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT2); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT3X2); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT4X2); |
| - |
| - MAKE_CWISE_OPS(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT2X3); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT2); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT3X2); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT4X2); |
| - |
| - MAKE_CWISE_OPS(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT2X4); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT2); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT3X2); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT4X2); |
| - |
| - MAKE_CWISE_OPS(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT3X2); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT2X3); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT3); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT4X3); |
| - |
| - MAKE_CWISE_OPS(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT3); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT2X3); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT3); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT4X3); |
| - |
| - MAKE_CWISE_OPS(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT3X4); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT2X3); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT3); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT4X3); |
| - |
| - MAKE_CWISE_OPS(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT4X2); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT2X4); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT3X4); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT4); |
| - |
| - MAKE_CWISE_OPS(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT4X3); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT2X4); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT3X4); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT4); |
| - |
| - MAKE_CWISE_OPS(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT4); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT2X4); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT3X4); |
| - MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT4); |
| - |
| - // Vector-vector. |
| - MAKE_VECVEC_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC2); |
| - MAKE_VECVEC_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC3); |
| - MAKE_VECVEC_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC4); |
| - MAKE_VECVEC_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC2); |
| - MAKE_VECVEC_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC3); |
| - MAKE_VECVEC_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC4); |
| - MAKE_VECVEC_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC2); |
| - MAKE_VECVEC_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC3); |
| - MAKE_VECVEC_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC4); |
| - |
| - // Unary Matrix. |
| - MAKE_UNARY_SYMMETRIC_OP(TYPE_FLOAT_MAT2); |
| - MAKE_UNARY_OP(TYPE_FLOAT_MAT2X3); |
| - MAKE_UNARY_OP(TYPE_FLOAT_MAT2X4); |
| - MAKE_UNARY_OP(TYPE_FLOAT_MAT3X2); |
| - MAKE_UNARY_SYMMETRIC_OP(TYPE_FLOAT_MAT3); |
| - MAKE_UNARY_OP(TYPE_FLOAT_MAT3X4); |
| - MAKE_UNARY_OP(TYPE_FLOAT_MAT4X2); |
| - MAKE_UNARY_OP(TYPE_FLOAT_MAT4X3); |
| - MAKE_UNARY_SYMMETRIC_OP(TYPE_FLOAT_MAT4); |
| - |
| - // Assignments |
| - MAKE_ASSIGNMENT_SYMMETRIC_OP(TYPE_FLOAT_MAT2); |
| - MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT2X3); |
| - MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT2X4); |
| - MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT3X2); |
| - MAKE_ASSIGNMENT_SYMMETRIC_OP(TYPE_FLOAT_MAT3); |
| - MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT3X4); |
| - MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT4X2); |
| - MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT4X3); |
| - MAKE_ASSIGNMENT_SYMMETRIC_OP(TYPE_FLOAT_MAT4); |
| - |
| - default: |
| - DE_ASSERT(DE_FALSE); |
| - return DE_NULL; |
| - } |
| + // Evaluator is selected based on op and input data types. |
| + // For efficient lookup the types and op enums are packed together to form a 19-bit key: |
| + // [18..14 OP] [13..7 TYPE0] [6..0 TYPE1] |
| + |
| + DE_STATIC_ASSERT(TYPE_LAST <= (1<<7)); |
| + DE_STATIC_ASSERT(OP_LAST <= (1<<5)); |
| + |
| +#define PACK_EVAL_CASE(OP, IN0DATATYPE, IN1DATATYPE) (((OP) << 14) | ((IN0DATATYPE) << 7) | (IN1DATATYPE)) |
| + |
| +#define MAKE_EVAL_CASE(OP, IN0DATATYPE, IN1DATATYPE) \ |
| + case PACK_EVAL_CASE(OP, IN0DATATYPE, IN1DATATYPE): \ |
| + return Evaluator<OP, IN0DATATYPE, IN1DATATYPE>::evaluate |
| + |
| +#define MAKE_SCALAR_OPS(IN0DATATYPE, IN1DATATYPE) \ |
| + MAKE_EVAL_CASE(OP_ADD, IN0DATATYPE, IN1DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_SUB, IN0DATATYPE, IN1DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_MUL, IN0DATATYPE, IN1DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_DIV, IN0DATATYPE, IN1DATATYPE) |
| + |
| +#define MAKE_CWISE_OPS(IN0DATATYPE, IN1DATATYPE) \ |
| + MAKE_EVAL_CASE(OP_ADD, IN0DATATYPE, IN1DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_SUB, IN0DATATYPE, IN1DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_DIV, IN0DATATYPE, IN1DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_COMP_MUL, IN0DATATYPE, IN1DATATYPE) |
| + |
| +#define MAKE_MUL_OP(IN0DATATYPE, IN1DATATYPE) \ |
| + MAKE_EVAL_CASE(OP_MUL, IN0DATATYPE, IN1DATATYPE) |
| + |
| +#define MAKE_VECVEC_OP(IN0DATATYPE, IN1DATATYPE) \ |
| + MAKE_EVAL_CASE(OP_OUTER_PRODUCT, IN0DATATYPE, IN1DATATYPE) |
| + |
| +#define MAKE_UNARY_OP(IN0DATATYPE) \ |
| + MAKE_EVAL_CASE(OP_TRANSPOSE, IN0DATATYPE, TYPE_LAST); \ |
| + MAKE_EVAL_CASE(OP_UNARY_PLUS, IN0DATATYPE, TYPE_LAST); \ |
| + MAKE_EVAL_CASE(OP_NEGATION, IN0DATATYPE, TYPE_LAST); \ |
| + MAKE_EVAL_CASE(OP_PRE_INCREMENT, IN0DATATYPE, TYPE_LAST); \ |
| + MAKE_EVAL_CASE(OP_PRE_DECREMENT, IN0DATATYPE, TYPE_LAST); \ |
| + MAKE_EVAL_CASE(OP_POST_INCREMENT, IN0DATATYPE, TYPE_LAST); \ |
| + MAKE_EVAL_CASE(OP_POST_DECREMENT, IN0DATATYPE, TYPE_LAST) |
| + |
| +#define MAKE_UNARY_SYMMETRIC_OP(IN0DATATYPE) \ |
| + MAKE_UNARY_OP(IN0DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_DETERMINANT, IN0DATATYPE, TYPE_LAST); \ |
| + MAKE_EVAL_CASE(OP_INVERSE, IN0DATATYPE, TYPE_LAST) |
| + |
| +#define MAKE_ASSIGNMENT_OP(IN0DATATYPE) \ |
| + MAKE_EVAL_CASE(OP_ADD_INTO, IN0DATATYPE, IN0DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_SUBTRACT_FROM, IN0DATATYPE, IN0DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_DIVIDE_INTO, IN0DATATYPE, IN0DATATYPE) |
| + |
| +#define MAKE_ASSIGNMENT_SYMMETRIC_OP(IN0DATATYPE) \ |
| + MAKE_ASSIGNMENT_OP(IN0DATATYPE); \ |
| + MAKE_EVAL_CASE(OP_MULTIPLY_INTO, IN0DATATYPE, IN0DATATYPE) |
| + |
| + switch (PACK_EVAL_CASE(op, in0.dataType, in1.dataType)) |
| + { |
| + // Matrix-scalar. |
| + MAKE_SCALAR_OPS(TYPE_FLOAT_MAT2, TYPE_FLOAT); |
| + MAKE_SCALAR_OPS(TYPE_FLOAT_MAT2X3, TYPE_FLOAT); |
| + MAKE_SCALAR_OPS(TYPE_FLOAT_MAT2X4, TYPE_FLOAT); |
| + MAKE_SCALAR_OPS(TYPE_FLOAT_MAT3X2, TYPE_FLOAT); |
| + MAKE_SCALAR_OPS(TYPE_FLOAT_MAT3, TYPE_FLOAT); |
| + MAKE_SCALAR_OPS(TYPE_FLOAT_MAT3X4, TYPE_FLOAT); |
| + MAKE_SCALAR_OPS(TYPE_FLOAT_MAT4X2, TYPE_FLOAT); |
| + MAKE_SCALAR_OPS(TYPE_FLOAT_MAT4X3, TYPE_FLOAT); |
| + MAKE_SCALAR_OPS(TYPE_FLOAT_MAT4, TYPE_FLOAT); |
| + |
| + // Matrix-vector. |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_VEC2); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_VEC2); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_VEC2); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_VEC3); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_VEC3); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_VEC3); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_VEC4); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_VEC4); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_VEC4); |
| + |
| + // Vector-matrix. |
| + MAKE_MUL_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT2); |
| + MAKE_MUL_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT2X3); |
| + MAKE_MUL_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT2X4); |
| + MAKE_MUL_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT3X2); |
| + MAKE_MUL_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT3); |
| + MAKE_MUL_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT3X4); |
| + MAKE_MUL_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT4X2); |
| + MAKE_MUL_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT4X3); |
| + MAKE_MUL_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT4); |
| + |
| + // Matrix-matrix. |
| + MAKE_CWISE_OPS(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT2); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT2); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT3X2); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT4X2); |
| + |
| + MAKE_CWISE_OPS(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT2X3); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT2); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT3X2); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT4X2); |
| + |
| + MAKE_CWISE_OPS(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT2X4); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT2); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT3X2); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT4X2); |
| + |
| + MAKE_CWISE_OPS(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT3X2); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT2X3); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT3); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT4X3); |
| + |
| + MAKE_CWISE_OPS(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT3); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT2X3); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT3); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT4X3); |
| + |
| + MAKE_CWISE_OPS(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT3X4); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT2X3); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT3); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT4X3); |
| + |
| + MAKE_CWISE_OPS(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT4X2); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT2X4); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT3X4); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT4); |
| + |
| + MAKE_CWISE_OPS(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT4X3); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT2X4); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT3X4); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT4); |
| + |
| + MAKE_CWISE_OPS(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT4); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT2X4); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT3X4); |
| + MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT4); |
| + |
| + // Vector-vector. |
| + MAKE_VECVEC_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC2); |
| + MAKE_VECVEC_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC3); |
| + MAKE_VECVEC_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC4); |
| + MAKE_VECVEC_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC2); |
| + MAKE_VECVEC_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC3); |
| + MAKE_VECVEC_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC4); |
| + MAKE_VECVEC_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC2); |
| + MAKE_VECVEC_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC3); |
| + MAKE_VECVEC_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC4); |
| + |
| + // Unary Matrix. |
| + MAKE_UNARY_SYMMETRIC_OP(TYPE_FLOAT_MAT2); |
| + MAKE_UNARY_OP(TYPE_FLOAT_MAT2X3); |
| + MAKE_UNARY_OP(TYPE_FLOAT_MAT2X4); |
| + MAKE_UNARY_OP(TYPE_FLOAT_MAT3X2); |
| + MAKE_UNARY_SYMMETRIC_OP(TYPE_FLOAT_MAT3); |
| + MAKE_UNARY_OP(TYPE_FLOAT_MAT3X4); |
| + MAKE_UNARY_OP(TYPE_FLOAT_MAT4X2); |
| + MAKE_UNARY_OP(TYPE_FLOAT_MAT4X3); |
| + MAKE_UNARY_SYMMETRIC_OP(TYPE_FLOAT_MAT4); |
| + |
| + // Assignments |
| + MAKE_ASSIGNMENT_SYMMETRIC_OP(TYPE_FLOAT_MAT2); |
| + MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT2X3); |
| + MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT2X4); |
| + MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT3X2); |
| + MAKE_ASSIGNMENT_SYMMETRIC_OP(TYPE_FLOAT_MAT3); |
| + MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT3X4); |
| + MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT4X2); |
| + MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT4X3); |
| + MAKE_ASSIGNMENT_SYMMETRIC_OP(TYPE_FLOAT_MAT4); |
| + |
| + default: |
| + DE_ASSERT(DE_FALSE); |
| + return DE_NULL; |
| + } |
| |
| #undef PACK_EVAL_CASE |
| #undef MAKE_EVAL_CASE |
| @@ -1320,35 +1320,35 @@ MatrixShaderEvalFunc getEvalFunc (const ShaderInput& in0, const ShaderInput& in1 |
| template <int Size> |
| void writeVectorConstructor (std::ostream& str, const tcu::Vector<float, Size>& v) |
| { |
| - str << "vec" << Size << "("; |
| - for (int ndx = 0; ndx < Size; ndx++) |
| - { |
| - if (ndx != 0) |
| - str << ", "; |
| - str << de::floatToString(v[ndx], 1); |
| - } |
| - str << ")"; |
| + str << "vec" << Size << "("; |
| + for (int ndx = 0; ndx < Size; ndx++) |
| + { |
| + if (ndx != 0) |
| + str << ", "; |
| + str << de::floatToString(v[ndx], 1); |
| + } |
| + str << ")"; |
| } |
| |
| template <int Cols, int Rows> |
| void writeMatrixConstructor (std::ostream& str, const tcu::Matrix<float, Rows, Cols>& m) |
| { |
| - if (Rows == Cols) |
| - str << "mat" << Cols; |
| - else |
| - str << "mat" << Cols << "x" << Rows; |
| - |
| - str << "("; |
| - for (int colNdx = 0; colNdx < Cols; colNdx++) |
| - { |
| - for (int rowNdx = 0; rowNdx < Rows; rowNdx++) |
| - { |
| - if (rowNdx > 0 || colNdx > 0) |
| - str << ", "; |
| - str << de::floatToString(m(rowNdx, colNdx), 1); |
| - } |
| - } |
| - str << ")"; |
| + if (Rows == Cols) |
| + str << "mat" << Cols; |
| + else |
| + str << "mat" << Cols << "x" << Rows; |
| + |
| + str << "("; |
| + for (int colNdx = 0; colNdx < Cols; colNdx++) |
| + { |
| + for (int rowNdx = 0; rowNdx < Rows; rowNdx++) |
| + { |
| + if (rowNdx > 0 || colNdx > 0) |
| + str << ", "; |
| + str << de::floatToString(m(rowNdx, colNdx), 1); |
| + } |
| + } |
| + str << ")"; |
| } |
| |
| } // MatrixCaseUtils |
| @@ -1358,53 +1358,53 @@ using namespace MatrixCaseUtils; |
| class MatrixShaderEvaluator : public ShaderEvaluator |
| { |
| public: |
| - MatrixShaderEvaluator (MatrixShaderEvalFunc evalFunc, InputType inType0, InputType inType1); |
| + MatrixShaderEvaluator (MatrixShaderEvalFunc evalFunc, InputType inType0, InputType inType1); |
| |
| - virtual void evaluate (ShaderEvalContext& evalCtx); |
| + virtual void evaluate (ShaderEvalContext& evalCtx); |
| |
| private: |
| - MatrixShaderEvalFunc m_matEvalFunc; |
| - InputType m_inType0; |
| - InputType m_inType1; |
| + MatrixShaderEvalFunc m_matEvalFunc; |
| + InputType m_inType0; |
| + InputType m_inType1; |
| }; |
| |
| MatrixShaderEvaluator::MatrixShaderEvaluator (MatrixShaderEvalFunc evalFunc, InputType inType0, InputType inType1) |
| - : m_matEvalFunc (evalFunc) |
| - , m_inType0 (inType0) |
| - , m_inType1 (inType1) |
| + : m_matEvalFunc (evalFunc) |
| + , m_inType0 (inType0) |
| + , m_inType1 (inType1) |
| { |
| } |
| |
| void MatrixShaderEvaluator::evaluate (ShaderEvalContext& evalCtx) |
| { |
| - m_matEvalFunc(evalCtx, m_inType0, m_inType1); |
| + m_matEvalFunc(evalCtx, m_inType0, m_inType1); |
| } |
| |
| class ShaderMatrixCase : public ShaderRenderCase |
| { |
| public: |
| - ShaderMatrixCase (Context& context, const char* name, const char* desc, const ShaderInput& in0, const ShaderInput& in1, MatrixOp op, bool isVertexCase); |
| - ~ShaderMatrixCase (void); |
| + ShaderMatrixCase (Context& context, const char* name, const char* desc, const ShaderInput& in0, const ShaderInput& in1, MatrixOp op, bool isVertexCase); |
| + ~ShaderMatrixCase (void); |
| |
| - void init (void); |
| + void init (void); |
| |
| protected: |
| - std::string genGLSLMatToVec3Reduction (const glu::DataType& matType, const char* varName); |
| - void setupUniforms (int programID, const tcu::Vec4& constCoords); |
| + std::string genGLSLMatToVec3Reduction (const glu::DataType& matType, const char* varName); |
| + void setupUniforms (int programID, const tcu::Vec4& constCoords); |
| |
| private: |
| - ShaderInput m_in0; |
| - ShaderInput m_in1; |
| - MatrixOp m_op; |
| - MatrixShaderEvaluator m_matEvaluator; |
| + ShaderInput m_in0; |
| + ShaderInput m_in1; |
| + MatrixOp m_op; |
| + MatrixShaderEvaluator m_matEvaluator; |
| }; |
| |
| ShaderMatrixCase::ShaderMatrixCase (Context& context, const char* name, const char* desc, const ShaderInput& in0, const ShaderInput& in1, MatrixOp op, bool isVertexCase) |
| - : ShaderRenderCase (context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name, desc, isVertexCase, m_matEvaluator) |
| - , m_in0 (in0) |
| - , m_in1 (in1) |
| - , m_op (op) |
| - , m_matEvaluator (getEvalFunc(in0, in1, op), in0.inputType, in1.inputType) |
| + : ShaderRenderCase (context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name, desc, isVertexCase, m_matEvaluator) |
| + , m_in0 (in0) |
| + , m_in1 (in1) |
| + , m_op (op) |
| + , m_matEvaluator (getEvalFunc(in0, in1, op), in0.inputType, in1.inputType) |
| { |
| } |
| |
| @@ -1414,374 +1414,374 @@ ShaderMatrixCase::~ShaderMatrixCase (void) |
| |
| void ShaderMatrixCase::init (void) |
| { |
| - std::ostringstream vtx; |
| - std::ostringstream frag; |
| - std::ostringstream& op = m_isVertexCase ? vtx : frag; |
| - |
| - bool isInDynMat0 = isDataTypeMatrix(m_in0.dataType) && m_in0.inputType == INPUTTYPE_DYNAMIC; |
| - bool isInDynMat1 = isDataTypeMatrix(m_in1.dataType) && m_in1.inputType == INPUTTYPE_DYNAMIC; |
| - string inValue0; |
| - string inValue1; |
| - DataType resultType = TYPE_LAST; |
| - Precision resultPrec = m_in0.precision; |
| - vector<string> passVars; |
| - int numInputs = (isOperationBinary(m_op)) ? (2) : (1); |
| - |
| - std::string operationValue0; |
| - std::string operationValue1; |
| - |
| - DE_ASSERT(!isInDynMat0 || !isInDynMat1); // Only single dynamic matrix input is allowed. |
| - DE_UNREF(isInDynMat0 && isInDynMat1); |
| - |
| - // Compute result type. |
| - if (m_op == OP_MUL && isDataTypeMatrix(m_in0.dataType) && isDataTypeMatrix(m_in1.dataType)) |
| - { |
| - resultType = getDataTypeMatrix(getDataTypeMatrixNumColumns(m_in1.dataType), getDataTypeMatrixNumRows(m_in0.dataType)); |
| - } |
| - else if (m_op == OP_OUTER_PRODUCT) |
| - { |
| - resultType = getDataTypeMatrix(getDataTypeScalarSize(m_in1.dataType), getDataTypeScalarSize(m_in0.dataType)); |
| - } |
| - else if (m_op == OP_TRANSPOSE) |
| - { |
| - resultType = getDataTypeMatrix(getDataTypeMatrixNumRows(m_in0.dataType), getDataTypeMatrixNumColumns(m_in0.dataType)); |
| - } |
| - else if (m_op == OP_INVERSE) |
| - { |
| - resultType = m_in0.dataType; |
| - } |
| - else if (m_op == OP_DETERMINANT) |
| - { |
| - resultType = TYPE_FLOAT; |
| - } |
| - else if (getOperationType(m_op) == OPERATIONTYPE_UNARY_PREFIX_OPERATOR || |
| - getOperationType(m_op) == OPERATIONTYPE_UNARY_POSTFIX_OPERATOR) |
| - { |
| - resultType = m_in0.dataType; |
| - } |
| - else if (isDataTypeMatrix(m_in0.dataType) && isDataTypeMatrix(m_in1.dataType)) |
| - { |
| - DE_ASSERT(m_in0.dataType == m_in1.dataType); |
| - resultType = m_in0.dataType; |
| - } |
| - else if (isDataTypeMatrix(m_in0.dataType) || isDataTypeMatrix(m_in1.dataType)) |
| - { |
| - int matNdx = isDataTypeMatrix(m_in0.dataType) ? 0 : 1; |
| - DataType matrixType = matNdx == 0 ? m_in0.dataType : m_in1.dataType; |
| - DataType otherType = matNdx == 0 ? m_in1.dataType : m_in0.dataType; |
| - |
| - if (otherType == TYPE_FLOAT) |
| - resultType = matrixType; |
| - else |
| - { |
| - DE_ASSERT(isDataTypeVector(otherType)); |
| - resultType = getDataTypeFloatVec(matNdx == 0 ? getDataTypeMatrixNumRows(matrixType) : getDataTypeMatrixNumColumns(matrixType)); |
| - } |
| - } |
| - else |
| - { |
| - DE_ASSERT(DE_FALSE); |
| - } |
| - |
| - vtx << "#version 300 es\n"; |
| - frag << "#version 300 es\n"; |
| - |
| - vtx << "in highp vec4 a_position;\n"; |
| - frag << "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"; |
| - if (m_isVertexCase) |
| - { |
| - vtx << "out mediump vec4 v_color;\n"; |
| - frag << "in mediump vec4 v_color;\n"; |
| - } |
| - |
| - // Input declarations. |
| - for (int inNdx = 0; inNdx < numInputs; inNdx++) |
| - { |
| - const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; |
| - const char* precName = getPrecisionName(in.precision); |
| - const char* typeName = getDataTypeName(in.dataType); |
| - string& inValue = inNdx > 0 ? inValue1 : inValue0; |
| - |
| - if (in.inputType == INPUTTYPE_DYNAMIC) |
| - { |
| - vtx << "in " << precName << " " << typeName << " a_"; |
| - |
| - if (isDataTypeMatrix(in.dataType)) |
| - { |
| - // a_matN, v_matN |
| - vtx << typeName << ";\n"; |
| - if (!m_isVertexCase) |
| - { |
| - vtx << "out " << precName << " " << typeName << " v_" << typeName << ";\n"; |
| - frag << "in " << precName << " " << typeName << " v_" << typeName << ";\n"; |
| - passVars.push_back(typeName); |
| - } |
| - |
| - inValue = string(m_isVertexCase ? "a_" : "v_") + getDataTypeName(in.dataType); |
| - } |
| - else |
| - { |
| - // a_coords, v_coords |
| - vtx << "coords;\n"; |
| - if (!m_isVertexCase) |
| - { |
| - vtx << "out " << precName << " " << typeName << " v_coords;\n"; |
| - frag << "in " << precName << " " << typeName << " v_coords;\n"; |
| - passVars.push_back("coords"); |
| - } |
| - |
| - inValue = m_isVertexCase ? "a_coords" : "v_coords"; |
| - } |
| - } |
| - else if (in.inputType == INPUTTYPE_UNIFORM) |
| - { |
| - op << "uniform " << precName << " " << typeName << " u_in" << inNdx << ";\n"; |
| - inValue = string("u_in") + de::toString(inNdx); |
| - } |
| - else if (in.inputType == INPUTTYPE_CONST) |
| - { |
| - op << "const " << precName << " " << typeName << " in" << inNdx << " = "; |
| - |
| - // Generate declaration. |
| - switch (in.dataType) |
| - { |
| - case TYPE_FLOAT: op << de::floatToString(s_constInFloat[inNdx], 1); break; |
| - case TYPE_FLOAT_VEC2: writeVectorConstructor<2>(op, s_constInVec2[inNdx]); break; |
| - case TYPE_FLOAT_VEC3: writeVectorConstructor<3>(op, s_constInVec3[inNdx]); break; |
| - case TYPE_FLOAT_VEC4: writeVectorConstructor<4>(op, s_constInVec4[inNdx]); break; |
| - case TYPE_FLOAT_MAT2: writeMatrixConstructor<2, 2>(op, Mat2(s_constInMat2x2[inNdx])); break; |
| - case TYPE_FLOAT_MAT2X3: writeMatrixConstructor<2, 3>(op, Mat2x3(s_constInMat2x3[inNdx])); break; |
| - case TYPE_FLOAT_MAT2X4: writeMatrixConstructor<2, 4>(op, Mat2x4(s_constInMat2x4[inNdx])); break; |
| - case TYPE_FLOAT_MAT3X2: writeMatrixConstructor<3, 2>(op, Mat3x2(s_constInMat3x2[inNdx])); break; |
| - case TYPE_FLOAT_MAT3: writeMatrixConstructor<3, 3>(op, Mat3(s_constInMat3x3[inNdx])); break; |
| - case TYPE_FLOAT_MAT3X4: writeMatrixConstructor<3, 4>(op, Mat3x4(s_constInMat3x4[inNdx])); break; |
| - case TYPE_FLOAT_MAT4X2: writeMatrixConstructor<4, 2>(op, Mat4x2(s_constInMat4x2[inNdx])); break; |
| - case TYPE_FLOAT_MAT4X3: writeMatrixConstructor<4, 3>(op, Mat4x3(s_constInMat4x3[inNdx])); break; |
| - case TYPE_FLOAT_MAT4: writeMatrixConstructor<4, 4>(op, Mat4(s_constInMat4x4[inNdx])); break; |
| - |
| - default: |
| - DE_ASSERT(DE_FALSE); |
| - } |
| - |
| - op << ";\n"; |
| - |
| - inValue = string("in") + de::toString(inNdx); |
| - } |
| - } |
| - |
| - vtx << "\n" |
| - << "void main (void)\n" |
| - << "{\n" |
| - << " gl_Position = a_position;\n"; |
| - frag << "\n" |
| - << "void main (void)\n" |
| - << "{\n"; |
| - |
| - if (m_isVertexCase) |
| - frag << " dEQP_FragColor = v_color;\n"; |
| - else |
| - { |
| - for (vector<string>::const_iterator copyIter = passVars.begin(); copyIter != passVars.end(); copyIter++) |
| - vtx << " v_" << *copyIter << " = " << "a_" << *copyIter << ";\n"; |
| - } |
| - |
| - // Operation. |
| - |
| - switch (getOperationNature(m_op)) |
| - { |
| - case OPERATIONNATURE_PURE: |
| - DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); |
| - |
| - operationValue0 = inValue0; |
| - operationValue1 = inValue1; |
| - break; |
| - |
| - case OPERATIONNATURE_MUTATING: |
| - DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); |
| - |
| - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " tmpValue = " << inValue0 << ";\n"; |
| - |
| - operationValue0 = "tmpValue"; |
| - operationValue1 = inValue1; |
| - break; |
| - |
| - case OPERATIONNATURE_ASSIGNMENT: |
| - DE_ASSERT(getOperationType(m_op) == OPERATIONTYPE_ASSIGNMENT); |
| - |
| - operationValue0 = inValue0; |
| - operationValue1 = inValue1; |
| - break; |
| - |
| - default: |
| - DE_ASSERT(DE_FALSE); |
| - } |
| - |
| - switch (getOperationType(m_op)) |
| - { |
| - case OPERATIONTYPE_BINARY_OPERATOR: |
| - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << " " << getOperationName(m_op) << " " << operationValue1 << ";\n"; |
| - break; |
| - |
| - case OPERATIONTYPE_UNARY_PREFIX_OPERATOR: |
| - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << operationValue0 << ";\n"; |
| - break; |
| - |
| - case OPERATIONTYPE_UNARY_POSTFIX_OPERATOR: |
| - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << getOperationName(m_op) << ";\n"; |
| - break; |
| - |
| - case OPERATIONTYPE_BINARY_FUNCTION: |
| - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << "(" << operationValue0 << ", " << operationValue1 << ");\n"; |
| - break; |
| - |
| - case OPERATIONTYPE_UNARY_FUNCTION: |
| - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << "(" << operationValue0 << ");\n"; |
| - break; |
| - |
| - case OPERATIONTYPE_ASSIGNMENT: |
| - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << ";\n"; |
| - op << " res " << getOperationName(m_op) << " " << operationValue1 << ";\n"; |
| - break; |
| - |
| - default: |
| - DE_ASSERT(DE_FALSE); |
| - } |
| - |
| - // Reduction to vec3 (rgb). Check the used value too if it was modified |
| - op << " " << (m_isVertexCase ? "v_color" : "dEQP_FragColor") << " = "; |
| - |
| - if (isOperationValueModifying(m_op)) |
| - op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0) + vec4(" << genGLSLMatToVec3Reduction(resultType, "tmpValue") << ", 0.0);\n"; |
| - else |
| - op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0);\n"; |
| - |
| - vtx << "}\n"; |
| - frag << "}\n"; |
| - |
| - m_vertShaderSource = vtx.str(); |
| - m_fragShaderSource = frag.str(); |
| - |
| - // \todo [2012-02-14 pyry] Compute better values for matrix tests. |
| - m_userAttribTransforms.resize(4); |
| - for (int attribNdx = 0; attribNdx < 4; attribNdx++) |
| - { |
| - m_userAttribTransforms[attribNdx] = Mat4(0.0f); |
| - m_userAttribTransforms[attribNdx]( 0, 3) = 0.2f; // !< prevent matrix*vec from going into zero (assuming vec.w != 0) |
| - m_userAttribTransforms[attribNdx]( 1, 3) = 0.1f; // !< |
| - m_userAttribTransforms[attribNdx]( 2, 3) = 0.4f + 0.15f * float(attribNdx); // !< |
| - m_userAttribTransforms[attribNdx]( 3, 3) = 0.7f; // !< |
| - m_userAttribTransforms[attribNdx]((0 + attribNdx) % 4, 0) = 1.0f; |
| - m_userAttribTransforms[attribNdx]((1 + attribNdx) % 4, 1) = 1.0f; |
| - m_userAttribTransforms[attribNdx]((2 + attribNdx) % 4, 2) = 1.0f; |
| - m_userAttribTransforms[attribNdx]((3 + attribNdx) % 4, 3) = 1.0f; |
| - } |
| - |
| - // prevent bad reference cases such as black result images by fine-tuning used matrices |
| - if (getOperationTestMatrixType(m_op) != TESTMATRIXTYPE_DEFAULT) |
| - { |
| - for (int attribNdx = 0; attribNdx < 4; attribNdx++) |
| - { |
| - for (int row = 0; row < 4; row++) |
| - for (int col = 0; col < 4; col++) |
| - { |
| - switch (getOperationTestMatrixType(m_op)) |
| - { |
| - case TESTMATRIXTYPE_NEGATED: |
| - m_userAttribTransforms[attribNdx](row, col) = -m_userAttribTransforms[attribNdx](row, col); |
| - break; |
| - case TESTMATRIXTYPE_INCREMENTED: |
| - m_userAttribTransforms[attribNdx](row, col) += 0.3f; |
| - break; |
| - case TESTMATRIXTYPE_DECREMENTED: |
| - m_userAttribTransforms[attribNdx](row, col) -= 0.3f; |
| - break; |
| - case TESTMATRIXTYPE_NEGATED_INCREMENTED: |
| - m_userAttribTransforms[attribNdx](row, col) = -m_userAttribTransforms[attribNdx](row, col) + 0.3f; |
| - break; |
| - case TESTMATRIXTYPE_INCREMENTED_LESS: |
| - m_userAttribTransforms[attribNdx](row, col) -= 0.1f; |
| - break; |
| - |
| - default: |
| - DE_ASSERT(DE_FALSE); |
| - break; |
| - } |
| - } |
| - } |
| - } |
| - |
| - ShaderRenderCase::init(); |
| + std::ostringstream vtx; |
| + std::ostringstream frag; |
| + std::ostringstream& op = m_isVertexCase ? vtx : frag; |
| + |
| + bool isInDynMat0 = isDataTypeMatrix(m_in0.dataType) && m_in0.inputType == INPUTTYPE_DYNAMIC; |
| + bool isInDynMat1 = isDataTypeMatrix(m_in1.dataType) && m_in1.inputType == INPUTTYPE_DYNAMIC; |
| + string inValue0; |
| + string inValue1; |
| + DataType resultType = TYPE_LAST; |
| + Precision resultPrec = m_in0.precision; |
| + vector<string> passVars; |
| + int numInputs = (isOperationBinary(m_op)) ? (2) : (1); |
| + |
| + std::string operationValue0; |
| + std::string operationValue1; |
| + |
| + DE_ASSERT(!isInDynMat0 || !isInDynMat1); // Only single dynamic matrix input is allowed. |
| + DE_UNREF(isInDynMat0 && isInDynMat1); |
| + |
| + // Compute result type. |
| + if (m_op == OP_MUL && isDataTypeMatrix(m_in0.dataType) && isDataTypeMatrix(m_in1.dataType)) |
| + { |
| + resultType = getDataTypeMatrix(getDataTypeMatrixNumColumns(m_in1.dataType), getDataTypeMatrixNumRows(m_in0.dataType)); |
| + } |
| + else if (m_op == OP_OUTER_PRODUCT) |
| + { |
| + resultType = getDataTypeMatrix(getDataTypeScalarSize(m_in1.dataType), getDataTypeScalarSize(m_in0.dataType)); |
| + } |
| + else if (m_op == OP_TRANSPOSE) |
| + { |
| + resultType = getDataTypeMatrix(getDataTypeMatrixNumRows(m_in0.dataType), getDataTypeMatrixNumColumns(m_in0.dataType)); |
| + } |
| + else if (m_op == OP_INVERSE) |
| + { |
| + resultType = m_in0.dataType; |
| + } |
| + else if (m_op == OP_DETERMINANT) |
| + { |
| + resultType = TYPE_FLOAT; |
| + } |
| + else if (getOperationType(m_op) == OPERATIONTYPE_UNARY_PREFIX_OPERATOR || |
| + getOperationType(m_op) == OPERATIONTYPE_UNARY_POSTFIX_OPERATOR) |
| + { |
| + resultType = m_in0.dataType; |
| + } |
| + else if (isDataTypeMatrix(m_in0.dataType) && isDataTypeMatrix(m_in1.dataType)) |
| + { |
| + DE_ASSERT(m_in0.dataType == m_in1.dataType); |
| + resultType = m_in0.dataType; |
| + } |
| + else if (isDataTypeMatrix(m_in0.dataType) || isDataTypeMatrix(m_in1.dataType)) |
| + { |
| + int matNdx = isDataTypeMatrix(m_in0.dataType) ? 0 : 1; |
| + DataType matrixType = matNdx == 0 ? m_in0.dataType : m_in1.dataType; |
| + DataType otherType = matNdx == 0 ? m_in1.dataType : m_in0.dataType; |
| + |
| + if (otherType == TYPE_FLOAT) |
| + resultType = matrixType; |
| + else |
| + { |
| + DE_ASSERT(isDataTypeVector(otherType)); |
| + resultType = getDataTypeFloatVec(matNdx == 0 ? getDataTypeMatrixNumRows(matrixType) : getDataTypeMatrixNumColumns(matrixType)); |
| + } |
| + } |
| + else |
| + { |
| + DE_ASSERT(DE_FALSE); |
| + } |
| + |
| + vtx << "#version 300 es\n"; |
| + frag << "#version 300 es\n"; |
| + |
| + vtx << "in highp vec4 a_position;\n"; |
| + frag << "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"; |
| + if (m_isVertexCase) |
| + { |
| + vtx << "out mediump vec4 v_color;\n"; |
| + frag << "in mediump vec4 v_color;\n"; |
| + } |
| + |
| + // Input declarations. |
| + for (int inNdx = 0; inNdx < numInputs; inNdx++) |
| + { |
| + const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; |
| + const char* precName = getPrecisionName(in.precision); |
| + const char* typeName = getDataTypeName(in.dataType); |
| + string& inValue = inNdx > 0 ? inValue1 : inValue0; |
| + |
| + if (in.inputType == INPUTTYPE_DYNAMIC) |
| + { |
| + vtx << "in " << precName << " " << typeName << " a_"; |
| + |
| + if (isDataTypeMatrix(in.dataType)) |
| + { |
| + // a_matN, v_matN |
| + vtx << typeName << ";\n"; |
| + if (!m_isVertexCase) |
| + { |
| + vtx << "out " << precName << " " << typeName << " v_" << typeName << ";\n"; |
| + frag << "in " << precName << " " << typeName << " v_" << typeName << ";\n"; |
| + passVars.push_back(typeName); |
| + } |
| + |
| + inValue = string(m_isVertexCase ? "a_" : "v_") + getDataTypeName(in.dataType); |
| + } |
| + else |
| + { |
| + // a_coords, v_coords |
| + vtx << "coords;\n"; |
| + if (!m_isVertexCase) |
| + { |
| + vtx << "out " << precName << " " << typeName << " v_coords;\n"; |
| + frag << "in " << precName << " " << typeName << " v_coords;\n"; |
| + passVars.push_back("coords"); |
| + } |
| + |
| + inValue = m_isVertexCase ? "a_coords" : "v_coords"; |
| + } |
| + } |
| + else if (in.inputType == INPUTTYPE_UNIFORM) |
| + { |
| + op << "uniform " << precName << " " << typeName << " u_in" << inNdx << ";\n"; |
| + inValue = string("u_in") + de::toString(inNdx); |
| + } |
| + else if (in.inputType == INPUTTYPE_CONST) |
| + { |
| + op << "const " << precName << " " << typeName << " in" << inNdx << " = "; |
| + |
| + // Generate declaration. |
| + switch (in.dataType) |
| + { |
| + case TYPE_FLOAT: op << de::floatToString(s_constInFloat[inNdx], 1); break; |
| + case TYPE_FLOAT_VEC2: writeVectorConstructor<2>(op, s_constInVec2[inNdx]); break; |
| + case TYPE_FLOAT_VEC3: writeVectorConstructor<3>(op, s_constInVec3[inNdx]); break; |
| + case TYPE_FLOAT_VEC4: writeVectorConstructor<4>(op, s_constInVec4[inNdx]); break; |
| + case TYPE_FLOAT_MAT2: writeMatrixConstructor<2, 2>(op, Mat2(s_constInMat2x2[inNdx])); break; |
| + case TYPE_FLOAT_MAT2X3: writeMatrixConstructor<2, 3>(op, Mat2x3(s_constInMat2x3[inNdx])); break; |
| + case TYPE_FLOAT_MAT2X4: writeMatrixConstructor<2, 4>(op, Mat2x4(s_constInMat2x4[inNdx])); break; |
| + case TYPE_FLOAT_MAT3X2: writeMatrixConstructor<3, 2>(op, Mat3x2(s_constInMat3x2[inNdx])); break; |
| + case TYPE_FLOAT_MAT3: writeMatrixConstructor<3, 3>(op, Mat3(s_constInMat3x3[inNdx])); break; |
| + case TYPE_FLOAT_MAT3X4: writeMatrixConstructor<3, 4>(op, Mat3x4(s_constInMat3x4[inNdx])); break; |
| + case TYPE_FLOAT_MAT4X2: writeMatrixConstructor<4, 2>(op, Mat4x2(s_constInMat4x2[inNdx])); break; |
| + case TYPE_FLOAT_MAT4X3: writeMatrixConstructor<4, 3>(op, Mat4x3(s_constInMat4x3[inNdx])); break; |
| + case TYPE_FLOAT_MAT4: writeMatrixConstructor<4, 4>(op, Mat4(s_constInMat4x4[inNdx])); break; |
| + |
| + default: |
| + DE_ASSERT(DE_FALSE); |
| + } |
| + |
| + op << ";\n"; |
| + |
| + inValue = string("in") + de::toString(inNdx); |
| + } |
| + } |
| + |
| + vtx << "\n" |
| + << "void main (void)\n" |
| + << "{\n" |
| + << " gl_Position = a_position;\n"; |
| + frag << "\n" |
| + << "void main (void)\n" |
| + << "{\n"; |
| + |
| + if (m_isVertexCase) |
| + frag << " dEQP_FragColor = v_color;\n"; |
| + else |
| + { |
| + for (vector<string>::const_iterator copyIter = passVars.begin(); copyIter != passVars.end(); copyIter++) |
| + vtx << " v_" << *copyIter << " = " << "a_" << *copyIter << ";\n"; |
| + } |
| + |
| + // Operation. |
| + |
| + switch (getOperationNature(m_op)) |
| + { |
| + case OPERATIONNATURE_PURE: |
| + DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); |
| + |
| + operationValue0 = inValue0; |
| + operationValue1 = inValue1; |
| + break; |
| + |
| + case OPERATIONNATURE_MUTATING: |
| + DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); |
| + |
| + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " tmpValue = " << inValue0 << ";\n"; |
| + |
| + operationValue0 = "tmpValue"; |
| + operationValue1 = inValue1; |
| + break; |
| + |
| + case OPERATIONNATURE_ASSIGNMENT: |
| + DE_ASSERT(getOperationType(m_op) == OPERATIONTYPE_ASSIGNMENT); |
| + |
| + operationValue0 = inValue0; |
| + operationValue1 = inValue1; |
| + break; |
| + |
| + default: |
| + DE_ASSERT(DE_FALSE); |
| + } |
| + |
| + switch (getOperationType(m_op)) |
| + { |
| + case OPERATIONTYPE_BINARY_OPERATOR: |
| + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << " " << getOperationName(m_op) << " " << operationValue1 << ";\n"; |
| + break; |
| + |
| + case OPERATIONTYPE_UNARY_PREFIX_OPERATOR: |
| + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << operationValue0 << ";\n"; |
| + break; |
| + |
| + case OPERATIONTYPE_UNARY_POSTFIX_OPERATOR: |
| + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << getOperationName(m_op) << ";\n"; |
| + break; |
| + |
| + case OPERATIONTYPE_BINARY_FUNCTION: |
| + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << "(" << operationValue0 << ", " << operationValue1 << ");\n"; |
| + break; |
| + |
| + case OPERATIONTYPE_UNARY_FUNCTION: |
| + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << "(" << operationValue0 << ");\n"; |
| + break; |
| + |
| + case OPERATIONTYPE_ASSIGNMENT: |
| + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << ";\n"; |
| + op << " res " << getOperationName(m_op) << " " << operationValue1 << ";\n"; |
| + break; |
| + |
| + default: |
| + DE_ASSERT(DE_FALSE); |
| + } |
| + |
| + // Reduction to vec3 (rgb). Check the used value too if it was modified |
| + op << " " << (m_isVertexCase ? "v_color" : "dEQP_FragColor") << " = "; |
| + |
| + if (isOperationValueModifying(m_op)) |
| + op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0) + vec4(" << genGLSLMatToVec3Reduction(resultType, "tmpValue") << ", 0.0);\n"; |
| + else |
| + op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0);\n"; |
| + |
| + vtx << "}\n"; |
| + frag << "}\n"; |
| + |
| + m_vertShaderSource = vtx.str(); |
| + m_fragShaderSource = frag.str(); |
| + |
| + // \todo [2012-02-14 pyry] Compute better values for matrix tests. |
| + m_userAttribTransforms.resize(4); |
| + for (int attribNdx = 0; attribNdx < 4; attribNdx++) |
| + { |
| + m_userAttribTransforms[attribNdx] = Mat4(0.0f); |
| + m_userAttribTransforms[attribNdx]( 0, 3) = 0.2f; // !< prevent matrix*vec from going into zero (assuming vec.w != 0) |
| + m_userAttribTransforms[attribNdx]( 1, 3) = 0.1f; // !< |
| + m_userAttribTransforms[attribNdx]( 2, 3) = 0.4f + 0.15f * float(attribNdx); // !< |
| + m_userAttribTransforms[attribNdx]( 3, 3) = 0.7f; // !< |
| + m_userAttribTransforms[attribNdx]((0 + attribNdx) % 4, 0) = 1.0f; |
| + m_userAttribTransforms[attribNdx]((1 + attribNdx) % 4, 1) = 1.0f; |
| + m_userAttribTransforms[attribNdx]((2 + attribNdx) % 4, 2) = 1.0f; |
| + m_userAttribTransforms[attribNdx]((3 + attribNdx) % 4, 3) = 1.0f; |
| + } |
| + |
| + // prevent bad reference cases such as black result images by fine-tuning used matrices |
| + if (getOperationTestMatrixType(m_op) != TESTMATRIXTYPE_DEFAULT) |
| + { |
| + for (int attribNdx = 0; attribNdx < 4; attribNdx++) |
| + { |
| + for (int row = 0; row < 4; row++) |
| + for (int col = 0; col < 4; col++) |
| + { |
| + switch (getOperationTestMatrixType(m_op)) |
| + { |
| + case TESTMATRIXTYPE_NEGATED: |
| + m_userAttribTransforms[attribNdx](row, col) = -m_userAttribTransforms[attribNdx](row, col); |
| + break; |
| + case TESTMATRIXTYPE_INCREMENTED: |
| + m_userAttribTransforms[attribNdx](row, col) += 0.3f; |
| + break; |
| + case TESTMATRIXTYPE_DECREMENTED: |
| + m_userAttribTransforms[attribNdx](row, col) -= 0.3f; |
| + break; |
| + case TESTMATRIXTYPE_NEGATED_INCREMENTED: |
| + m_userAttribTransforms[attribNdx](row, col) = -m_userAttribTransforms[attribNdx](row, col) + 0.3f; |
| + break; |
| + case TESTMATRIXTYPE_INCREMENTED_LESS: |
| + m_userAttribTransforms[attribNdx](row, col) -= 0.1f; |
| + break; |
| + |
| + default: |
| + DE_ASSERT(DE_FALSE); |
| + break; |
| + } |
| + } |
| + } |
| + } |
| + |
| + ShaderRenderCase::init(); |
| } |
| |
| std::string ShaderMatrixCase::genGLSLMatToVec3Reduction (const glu::DataType& matType, const char* varName) |
| { |
| - std::ostringstream op; |
| - |
| - switch (matType) |
| - { |
| - case TYPE_FLOAT: op << varName << ", " << varName << ", " << varName << ""; break; |
| - case TYPE_FLOAT_VEC2: op << varName << ".x, " << varName << ".y, " << varName << ".x"; break; |
| - case TYPE_FLOAT_VEC3: op << varName << ""; break; |
| - case TYPE_FLOAT_VEC4: op << varName << ".x, " << varName << ".y, " << varName << ".z+" << varName << ".w"; break; |
| - case TYPE_FLOAT_MAT2: op << varName << "[0][0], " << varName << "[1][0], " << varName << "[0][1]+" << varName << "[1][1]"; break; |
| - case TYPE_FLOAT_MAT2X3: op << varName << "[0] + " << varName << "[1]"; break; |
| - case TYPE_FLOAT_MAT2X4: op << varName << "[0].xyz + " << varName << "[1].yzw"; break; |
| - case TYPE_FLOAT_MAT3X2: op << varName << "[0][0]+" << varName << "[0][1], " << varName << "[1][0]+" << varName << "[1][1], " << varName << "[2][0]+" << varName << "[2][1]"; break; |
| - case TYPE_FLOAT_MAT3: op << varName << "[0] + " << varName << "[1] + " << varName << "[2]"; break; |
| - case TYPE_FLOAT_MAT3X4: op << varName << "[0].xyz + " << varName << "[1].yzw + " << varName << "[2].zwx"; break; |
| - case TYPE_FLOAT_MAT4X2: op << varName << "[0][0]+" << varName << "[0][1]+" << varName << "[3][0], " << varName << "[1][0]+" << varName << "[1][1]+" << varName << "[3][1], " << varName << "[2][0]+" << varName << "[2][1]"; break; |
| - case TYPE_FLOAT_MAT4X3: op << varName << "[0] + " << varName << "[1] + " << varName << "[2] + " << varName << "[3]"; break; |
| - case TYPE_FLOAT_MAT4: op << varName << "[0].xyz+" << varName << "[1].yzw+" << varName << "[2].zwx+" << varName << "[3].wxy"; break; |
| - |
| - default: |
| - DE_ASSERT(DE_FALSE); |
| - } |
| - |
| - return op.str(); |
| + std::ostringstream op; |
| + |
| + switch (matType) |
| + { |
| + case TYPE_FLOAT: op << varName << ", " << varName << ", " << varName << ""; break; |
| + case TYPE_FLOAT_VEC2: op << varName << ".x, " << varName << ".y, " << varName << ".x"; break; |
| + case TYPE_FLOAT_VEC3: op << varName << ""; break; |
| + case TYPE_FLOAT_VEC4: op << varName << ".x, " << varName << ".y, " << varName << ".z+" << varName << ".w"; break; |
| + case TYPE_FLOAT_MAT2: op << varName << "[0][0], " << varName << "[1][0], " << varName << "[0][1]+" << varName << "[1][1]"; break; |
| + case TYPE_FLOAT_MAT2X3: op << varName << "[0] + " << varName << "[1]"; break; |
| + case TYPE_FLOAT_MAT2X4: op << varName << "[0].xyz + " << varName << "[1].yzw"; break; |
| + case TYPE_FLOAT_MAT3X2: op << varName << "[0][0]+" << varName << "[0][1], " << varName << "[1][0]+" << varName << "[1][1], " << varName << "[2][0]+" << varName << "[2][1]"; break; |
| + case TYPE_FLOAT_MAT3: op << varName << "[0] + " << varName << "[1] + " << varName << "[2]"; break; |
| + case TYPE_FLOAT_MAT3X4: op << varName << "[0].xyz + " << varName << "[1].yzw + " << varName << "[2].zwx"; break; |
| + case TYPE_FLOAT_MAT4X2: op << varName << "[0][0]+" << varName << "[0][1]+" << varName << "[3][0], " << varName << "[1][0]+" << varName << "[1][1]+" << varName << "[3][1], " << varName << "[2][0]+" << varName << "[2][1]"; break; |
| + case TYPE_FLOAT_MAT4X3: op << varName << "[0] + " << varName << "[1] + " << varName << "[2] + " << varName << "[3]"; break; |
| + case TYPE_FLOAT_MAT4: op << varName << "[0].xyz+" << varName << "[1].yzw+" << varName << "[2].zwx+" << varName << "[3].wxy"; break; |
| + |
| + default: |
| + DE_ASSERT(DE_FALSE); |
| + } |
| + |
| + return op.str(); |
| } |
| |
| void ShaderMatrixCase::setupUniforms (int programID, const tcu::Vec4& constCoords) |
| { |
| - const glw::Functions& gl = m_renderCtx.getFunctions(); |
| - |
| - DE_UNREF(constCoords); |
| - |
| - for (int inNdx = 0; inNdx < 2; inNdx++) |
| - { |
| - const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; |
| - |
| - if (in.inputType == INPUTTYPE_UNIFORM) |
| - { |
| - int loc = gl.getUniformLocation(programID, (string("u_in") + de::toString(inNdx)).c_str()); |
| - |
| - if (loc < 0) |
| - continue; |
| - |
| - switch (in.dataType) |
| - { |
| - case TYPE_FLOAT: gl.uniform1f(loc, s_constInFloat[inNdx]); break; |
| - case TYPE_FLOAT_VEC2: gl.uniform2fv(loc, 1, s_constInVec2[inNdx].getPtr()); break; |
| - case TYPE_FLOAT_VEC3: gl.uniform3fv(loc, 1, s_constInVec3[inNdx].getPtr()); break; |
| - case TYPE_FLOAT_VEC4: gl.uniform4fv(loc, 1, s_constInVec4[inNdx].getPtr()); break; |
| - // \note GLES3 supports transpose in matrix upload. |
| - case TYPE_FLOAT_MAT2: gl.uniformMatrix2fv (loc, 1, GL_TRUE, s_constInMat2x2[inNdx]); break; |
| - case TYPE_FLOAT_MAT2X3: gl.uniformMatrix2x3fv(loc, 1, GL_TRUE, s_constInMat2x3[inNdx]); break; |
| - case TYPE_FLOAT_MAT2X4: gl.uniformMatrix2x4fv(loc, 1, GL_TRUE, s_constInMat2x4[inNdx]); break; |
| - case TYPE_FLOAT_MAT3X2: gl.uniformMatrix3x2fv(loc, 1, GL_TRUE, s_constInMat3x2[inNdx]); break; |
| - case TYPE_FLOAT_MAT3: gl.uniformMatrix3fv (loc, 1, GL_TRUE, s_constInMat3x3[inNdx]); break; |
| - case TYPE_FLOAT_MAT3X4: gl.uniformMatrix3x4fv(loc, 1, GL_TRUE, s_constInMat3x4[inNdx]); break; |
| - case TYPE_FLOAT_MAT4X2: gl.uniformMatrix4x2fv(loc, 1, GL_TRUE, s_constInMat4x2[inNdx]); break; |
| - case TYPE_FLOAT_MAT4X3: gl.uniformMatrix4x3fv(loc, 1, GL_TRUE, s_constInMat4x3[inNdx]); break; |
| - case TYPE_FLOAT_MAT4: gl.uniformMatrix4fv (loc, 1, GL_TRUE, s_constInMat4x4[inNdx]); break; |
| - default: |
| - DE_ASSERT(false); |
| - } |
| - } |
| - } |
| + const glw::Functions& gl = m_renderCtx.getFunctions(); |
| + |
| + DE_UNREF(constCoords); |
| + |
| + for (int inNdx = 0; inNdx < 2; inNdx++) |
| + { |
| + const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; |
| + |
| + if (in.inputType == INPUTTYPE_UNIFORM) |
| + { |
| + int loc = gl.getUniformLocation(programID, (string("u_in") + de::toString(inNdx)).c_str()); |
| + |
| + if (loc < 0) |
| + continue; |
| + |
| + switch (in.dataType) |
| + { |
| + case TYPE_FLOAT: gl.uniform1f(loc, s_constInFloat[inNdx]); break; |
| + case TYPE_FLOAT_VEC2: gl.uniform2fv(loc, 1, s_constInVec2[inNdx].getPtr()); break; |
| + case TYPE_FLOAT_VEC3: gl.uniform3fv(loc, 1, s_constInVec3[inNdx].getPtr()); break; |
| + case TYPE_FLOAT_VEC4: gl.uniform4fv(loc, 1, s_constInVec4[inNdx].getPtr()); break; |
| + // \note GLES3 supports transpose in matrix upload. |
| + case TYPE_FLOAT_MAT2: gl.uniformMatrix2fv (loc, 1, GL_TRUE, s_constInMat2x2[inNdx]); break; |
| + case TYPE_FLOAT_MAT2X3: gl.uniformMatrix2x3fv(loc, 1, GL_TRUE, s_constInMat2x3[inNdx]); break; |
| + case TYPE_FLOAT_MAT2X4: gl.uniformMatrix2x4fv(loc, 1, GL_TRUE, s_constInMat2x4[inNdx]); break; |
| + case TYPE_FLOAT_MAT3X2: gl.uniformMatrix3x2fv(loc, 1, GL_TRUE, s_constInMat3x2[inNdx]); break; |
| + case TYPE_FLOAT_MAT3: gl.uniformMatrix3fv (loc, 1, GL_TRUE, s_constInMat3x3[inNdx]); break; |
| + case TYPE_FLOAT_MAT3X4: gl.uniformMatrix3x4fv(loc, 1, GL_TRUE, s_constInMat3x4[inNdx]); break; |
| + case TYPE_FLOAT_MAT4X2: gl.uniformMatrix4x2fv(loc, 1, GL_TRUE, s_constInMat4x2[inNdx]); break; |
| + case TYPE_FLOAT_MAT4X3: gl.uniformMatrix4x3fv(loc, 1, GL_TRUE, s_constInMat4x3[inNdx]); break; |
| + case TYPE_FLOAT_MAT4: gl.uniformMatrix4fv (loc, 1, GL_TRUE, s_constInMat4x4[inNdx]); break; |
| + default: |
| + DE_ASSERT(false); |
| + } |
| + } |
| + } |
| } |
| |
| ShaderMatrixTests::ShaderMatrixTests (Context& context) |
| - : TestCaseGroup(context, "matrix", "Matrix Tests") |
| + : TestCaseGroup(context, "matrix", "Matrix Tests") |
| { |
| } |
| |
| @@ -1791,181 +1791,181 @@ ShaderMatrixTests::~ShaderMatrixTests (void) |
| |
| void ShaderMatrixTests::init (void) |
| { |
| - static const struct |
| - { |
| - const char* name; |
| - const char* desc; |
| - MatrixOp op; |
| - bool extendedInputTypeCases; // !< test with const and uniform types too |
| - bool createInputTypeGroup; // !< create group for input types |
| - } ops[] = |
| - { |
| - { "add", "Matrix addition tests", OP_ADD, true, true }, |
| - { "sub", "Matrix subtraction tests", OP_SUB, true, true }, |
| - { "mul", "Matrix multiplication tests", OP_MUL, true, true }, |
| - { "div", "Matrix division tests", OP_DIV, true, true }, |
| - { "matrixcompmult", "Matrix component-wise multiplication tests", OP_COMP_MUL, false, true }, |
| - { "outerproduct", "Matrix outerProduct() tests", OP_OUTER_PRODUCT, false, true }, |
| - { "transpose", "Matrix transpose() tests", OP_TRANSPOSE, false, true }, |
| - { "determinant", "Matrix determinant() tests", OP_DETERMINANT, false, true }, |
| - { "inverse", "Matrix inverse() tests", OP_INVERSE, false, true }, |
| - { "unary_addition", "Matrix unary addition tests", OP_UNARY_PLUS, false, false }, |
| - { "negation", "Matrix negation tests", OP_NEGATION, false, false }, |
| - { "pre_increment", "Matrix prefix increment tests", OP_PRE_INCREMENT, false, false }, |
| - { "pre_decrement", "Matrix prefix decrement tests", OP_PRE_DECREMENT, false, false }, |
| - { "post_increment", "Matrix postfix increment tests", OP_POST_INCREMENT, false, false }, |
| - { "post_decrement", "Matrix postfix decrement tests", OP_POST_DECREMENT, false, false }, |
| - { "add_assign", "Matrix add into tests", OP_ADD_INTO, false, false }, |
| - { "sub_assign", "Matrix subtract from tests", OP_SUBTRACT_FROM, false, false }, |
| - { "mul_assign", "Matrix multiply into tests", OP_MULTIPLY_INTO, false, false }, |
| - { "div_assign", "Matrix divide into tests", OP_DIVIDE_INTO, false, false }, |
| - }; |
| - |
| - struct InputTypeSpec |
| - { |
| - const char* name; |
| - const char* desc; |
| - InputType type; |
| - }; |
| - static const InputTypeSpec extendedInputTypes[] = |
| - { |
| - { "const", "Constant matrix input", INPUTTYPE_CONST }, |
| - { "uniform", "Uniform matrix input", INPUTTYPE_UNIFORM }, |
| - { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } |
| - }; |
| - static const InputTypeSpec reducedInputTypes[] = |
| - { |
| - { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } |
| - }; |
| - |
| - static const DataType matrixTypes[] = |
| - { |
| - TYPE_FLOAT_MAT2, |
| - TYPE_FLOAT_MAT2X3, |
| - TYPE_FLOAT_MAT2X4, |
| - TYPE_FLOAT_MAT3X2, |
| - TYPE_FLOAT_MAT3, |
| - TYPE_FLOAT_MAT3X4, |
| - TYPE_FLOAT_MAT4X2, |
| - TYPE_FLOAT_MAT4X3, |
| - TYPE_FLOAT_MAT4 |
| - }; |
| - |
| - static const Precision precisions[] = |
| - { |
| - PRECISION_LOWP, |
| - PRECISION_MEDIUMP, |
| - PRECISION_HIGHP |
| - }; |
| - |
| - for (int opNdx = 0; opNdx < DE_LENGTH_OF_ARRAY(ops); opNdx++) |
| - { |
| - const InputTypeSpec* inTypeList = (ops[opNdx].extendedInputTypeCases) ? (extendedInputTypes) : (reducedInputTypes); |
| - const int inTypeListSize = (ops[opNdx].extendedInputTypeCases) ? (DE_LENGTH_OF_ARRAY(extendedInputTypes)) : (DE_LENGTH_OF_ARRAY(reducedInputTypes)); |
| - const MatrixOp op = ops[opNdx].op; |
| - tcu::TestCaseGroup* opGroup = new tcu::TestCaseGroup(m_testCtx, ops[opNdx].name, ops[opNdx].desc); |
| - |
| - addChild(opGroup); |
| - |
| - for (int inTypeNdx = 0; inTypeNdx < inTypeListSize; inTypeNdx++) |
| - { |
| - const InputType inputType = inTypeList[inTypeNdx].type; |
| - tcu::TestCaseGroup* inGroup; |
| - |
| - if (ops[opNdx].createInputTypeGroup) |
| - { |
| - inGroup = new tcu::TestCaseGroup(m_testCtx, inTypeList[inTypeNdx].name, inTypeList[inTypeNdx].desc); |
| - opGroup->addChild(inGroup); |
| - } |
| - else |
| - inGroup = opGroup; |
| - |
| - for (int matTypeNdx = 0; matTypeNdx < DE_LENGTH_OF_ARRAY(matrixTypes); matTypeNdx++) |
| - { |
| - DataType matType = matrixTypes[matTypeNdx]; |
| - int numCols = getDataTypeMatrixNumColumns(matType); |
| - int numRows = getDataTypeMatrixNumRows(matType); |
| - const char* matTypeName = getDataTypeName(matType); |
| - |
| - for (int precNdx = 0; precNdx < DE_LENGTH_OF_ARRAY(precisions); precNdx++) |
| - { |
| - Precision precision = precisions[precNdx]; |
| - const char* precName = getPrecisionName(precision); |
| - string baseName = string(precName) + "_" + matTypeName + "_"; |
| - ShaderInput matIn (inputType, matType, precision); |
| - |
| - if (isOperationMatrixScalar(op)) |
| - { |
| - // Matrix-scalar \note For div cases we use uniform input. |
| - ShaderInput scalarIn(op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, TYPE_FLOAT, precision); |
| - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix-scalar case", matIn, scalarIn, op, true)); |
| - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix-scalar case", matIn, scalarIn, op, false)); |
| - } |
| - |
| - if (isOperationMatrixVector(op)) |
| - { |
| - // Matrix-vector. |
| - DataType colVecType = getDataTypeFloatVec(numCols); |
| - ShaderInput colVecIn (op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, colVecType, precision); |
| - |
| - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(colVecType) + "_vertex").c_str(), "Matrix-vector case", matIn, colVecIn, op, true)); |
| - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(colVecType) + "_fragment").c_str(), "Matrix-vector case", matIn, colVecIn, op, false)); |
| - |
| - // Vector-matrix. |
| - DataType rowVecType = getDataTypeFloatVec(numRows); |
| - ShaderInput rowVecIn (op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, rowVecType, precision); |
| - string vecMatName = string(precName) + "_" + getDataTypeName(rowVecType) + "_" + matTypeName; |
| - |
| - inGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_vertex").c_str(), "Vector-matrix case", rowVecIn, matIn, op, true)); |
| - inGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_fragment").c_str(), "Vector-matrix case", rowVecIn, matIn, op, false)); |
| - } |
| - |
| - if (isOperationArithmeticMatrixMatrix(op)) |
| - { |
| - // Arithmetic matrix-matrix multiplication. |
| - for (int otherCols = 2; otherCols <= 4; otherCols++) |
| - { |
| - ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, getDataTypeMatrix(otherCols, numCols /* rows */), precision); |
| - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(otherMatIn.dataType) + "_vertex").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, true)); |
| - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(otherMatIn.dataType) + "_fragment").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, false)); |
| - } |
| - } |
| - else if (isOperationComponentwiseMatrixMatrix(op)) |
| - { |
| - // Component-wise. |
| - ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); |
| - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_vertex").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, true)); |
| - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_fragment").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, false)); |
| - } |
| - |
| - if (isOperationVectorVector(op)) |
| - { |
| - ShaderInput vec1In(inputType, getDataTypeFloatVec(numRows), precision); |
| - ShaderInput vec2In((inputType == INPUTTYPE_DYNAMIC) ? (INPUTTYPE_UNIFORM) : (inputType), getDataTypeFloatVec(numCols), precision); |
| - |
| - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Vector-vector case", vec1In, vec2In, op, true)); |
| - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Vector-vector case", vec1In, vec2In, op, false)); |
| - } |
| - |
| - if ((isOperationUnaryAnyMatrix(op)) || |
| - (isOperationUnarySymmetricMatrix(op) && numCols == numRows)) |
| - { |
| - ShaderInput voidInput(INPUTTYPE_LAST, TYPE_LAST, PRECISION_LAST); |
| - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix case", matIn, voidInput, op, true)); |
| - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix case", matIn, voidInput, op, false)); |
| - } |
| - |
| - if ((isOperationAssignmentAnyMatrix(op)) || |
| - (isOperationAssignmentSymmetricMatrix(op) && numCols == numRows)) |
| - { |
| - ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); |
| - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix assignment case", matIn, otherMatIn, op, true)); |
| - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix assignment case", matIn, otherMatIn, op, false)); |
| - } |
| - } |
| - } |
| - } |
| - } |
| + static const struct |
| + { |
| + const char* name; |
| + const char* desc; |
| + MatrixOp op; |
| + bool extendedInputTypeCases; // !< test with const and uniform types too |
| + bool createInputTypeGroup; // !< create group for input types |
| + } ops[] = |
| + { |
| + { "add", "Matrix addition tests", OP_ADD, true, true }, |
| + { "sub", "Matrix subtraction tests", OP_SUB, true, true }, |
| + { "mul", "Matrix multiplication tests", OP_MUL, true, true }, |
| + { "div", "Matrix division tests", OP_DIV, true, true }, |
| + { "matrixcompmult", "Matrix component-wise multiplication tests", OP_COMP_MUL, false, true }, |
| + { "outerproduct", "Matrix outerProduct() tests", OP_OUTER_PRODUCT, false, true }, |
| + { "transpose", "Matrix transpose() tests", OP_TRANSPOSE, false, true }, |
| + { "determinant", "Matrix determinant() tests", OP_DETERMINANT, false, true }, |
| + { "inverse", "Matrix inverse() tests", OP_INVERSE, false, true }, |
| + { "unary_addition", "Matrix unary addition tests", OP_UNARY_PLUS, false, false }, |
| + { "negation", "Matrix negation tests", OP_NEGATION, false, false }, |
| + { "pre_increment", "Matrix prefix increment tests", OP_PRE_INCREMENT, false, false }, |
| + { "pre_decrement", "Matrix prefix decrement tests", OP_PRE_DECREMENT, false, false }, |
| + { "post_increment", "Matrix postfix increment tests", OP_POST_INCREMENT, false, false }, |
| + { "post_decrement", "Matrix postfix decrement tests", OP_POST_DECREMENT, false, false }, |
| + { "add_assign", "Matrix add into tests", OP_ADD_INTO, false, false }, |
| + { "sub_assign", "Matrix subtract from tests", OP_SUBTRACT_FROM, false, false }, |
| + { "mul_assign", "Matrix multiply into tests", OP_MULTIPLY_INTO, false, false }, |
| + { "div_assign", "Matrix divide into tests", OP_DIVIDE_INTO, false, false }, |
| + }; |
| + |
| + struct InputTypeSpec |
| + { |
| + const char* name; |
| + const char* desc; |
| + InputType type; |
| + }; |
| + static const InputTypeSpec extendedInputTypes[] = |
| + { |
| + { "const", "Constant matrix input", INPUTTYPE_CONST }, |
| + { "uniform", "Uniform matrix input", INPUTTYPE_UNIFORM }, |
| + { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } |
| + }; |
| + static const InputTypeSpec reducedInputTypes[] = |
| + { |
| + { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } |
| + }; |
| + |
| + static const DataType matrixTypes[] = |
| + { |
| + TYPE_FLOAT_MAT2, |
| + TYPE_FLOAT_MAT2X3, |
| + TYPE_FLOAT_MAT2X4, |
| + TYPE_FLOAT_MAT3X2, |
| + TYPE_FLOAT_MAT3, |
| + TYPE_FLOAT_MAT3X4, |
| + TYPE_FLOAT_MAT4X2, |
| + TYPE_FLOAT_MAT4X3, |
| + TYPE_FLOAT_MAT4 |
| + }; |
| + |
| + static const Precision precisions[] = |
| + { |
| + PRECISION_LOWP, |
| + PRECISION_MEDIUMP, |
| + PRECISION_HIGHP |
| + }; |
| + |
| + for (int opNdx = 0; opNdx < DE_LENGTH_OF_ARRAY(ops); opNdx++) |
| + { |
| + const InputTypeSpec* inTypeList = (ops[opNdx].extendedInputTypeCases) ? (extendedInputTypes) : (reducedInputTypes); |
| + const int inTypeListSize = (ops[opNdx].extendedInputTypeCases) ? (DE_LENGTH_OF_ARRAY(extendedInputTypes)) : (DE_LENGTH_OF_ARRAY(reducedInputTypes)); |
| + const MatrixOp op = ops[opNdx].op; |
| + tcu::TestCaseGroup* opGroup = new tcu::TestCaseGroup(m_testCtx, ops[opNdx].name, ops[opNdx].desc); |
| + |
| + addChild(opGroup); |
| + |
| + for (int inTypeNdx = 0; inTypeNdx < inTypeListSize; inTypeNdx++) |
| + { |
| + const InputType inputType = inTypeList[inTypeNdx].type; |
| + tcu::TestCaseGroup* inGroup; |
| + |
| + if (ops[opNdx].createInputTypeGroup) |
| + { |
| + inGroup = new tcu::TestCaseGroup(m_testCtx, inTypeList[inTypeNdx].name, inTypeList[inTypeNdx].desc); |
| + opGroup->addChild(inGroup); |
| + } |
| + else |
| + inGroup = opGroup; |
| + |
| + for (int matTypeNdx = 0; matTypeNdx < DE_LENGTH_OF_ARRAY(matrixTypes); matTypeNdx++) |
| + { |
| + DataType matType = matrixTypes[matTypeNdx]; |
| + int numCols = getDataTypeMatrixNumColumns(matType); |
| + int numRows = getDataTypeMatrixNumRows(matType); |
| + const char* matTypeName = getDataTypeName(matType); |
| + |
| + for (int precNdx = 0; precNdx < DE_LENGTH_OF_ARRAY(precisions); precNdx++) |
| + { |
| + Precision precision = precisions[precNdx]; |
| + const char* precName = getPrecisionName(precision); |
| + string baseName = string(precName) + "_" + matTypeName + "_"; |
| + ShaderInput matIn (inputType, matType, precision); |
| + |
| + if (isOperationMatrixScalar(op)) |
| + { |
| + // Matrix-scalar \note For div cases we use uniform input. |
| + ShaderInput scalarIn(op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, TYPE_FLOAT, precision); |
| + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix-scalar case", matIn, scalarIn, op, true)); |
| + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix-scalar case", matIn, scalarIn, op, false)); |
| + } |
| + |
| + if (isOperationMatrixVector(op)) |
| + { |
| + // Matrix-vector. |
| + DataType colVecType = getDataTypeFloatVec(numCols); |
| + ShaderInput colVecIn (op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, colVecType, precision); |
| + |
| + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(colVecType) + "_vertex").c_str(), "Matrix-vector case", matIn, colVecIn, op, true)); |
| + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(colVecType) + "_fragment").c_str(), "Matrix-vector case", matIn, colVecIn, op, false)); |
| + |
| + // Vector-matrix. |
| + DataType rowVecType = getDataTypeFloatVec(numRows); |
| + ShaderInput rowVecIn (op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, rowVecType, precision); |
| + string vecMatName = string(precName) + "_" + getDataTypeName(rowVecType) + "_" + matTypeName; |
| + |
| + inGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_vertex").c_str(), "Vector-matrix case", rowVecIn, matIn, op, true)); |
| + inGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_fragment").c_str(), "Vector-matrix case", rowVecIn, matIn, op, false)); |
| + } |
| + |
| + if (isOperationArithmeticMatrixMatrix(op)) |
| + { |
| + // Arithmetic matrix-matrix multiplication. |
| + for (int otherCols = 2; otherCols <= 4; otherCols++) |
| + { |
| + ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, getDataTypeMatrix(otherCols, numCols /* rows */), precision); |
| + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(otherMatIn.dataType) + "_vertex").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, true)); |
| + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(otherMatIn.dataType) + "_fragment").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, false)); |
| + } |
| + } |
| + else if (isOperationComponentwiseMatrixMatrix(op)) |
| + { |
| + // Component-wise. |
| + ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); |
| + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_vertex").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, true)); |
| + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_fragment").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, false)); |
| + } |
| + |
| + if (isOperationVectorVector(op)) |
| + { |
| + ShaderInput vec1In(inputType, getDataTypeFloatVec(numRows), precision); |
| + ShaderInput vec2In((inputType == INPUTTYPE_DYNAMIC) ? (INPUTTYPE_UNIFORM) : (inputType), getDataTypeFloatVec(numCols), precision); |
| + |
| + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Vector-vector case", vec1In, vec2In, op, true)); |
| + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Vector-vector case", vec1In, vec2In, op, false)); |
| + } |
| + |
| + if ((isOperationUnaryAnyMatrix(op)) || |
| + (isOperationUnarySymmetricMatrix(op) && numCols == numRows)) |
| + { |
| + ShaderInput voidInput(INPUTTYPE_LAST, TYPE_LAST, PRECISION_LAST); |
| + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix case", matIn, voidInput, op, true)); |
| + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix case", matIn, voidInput, op, false)); |
| + } |
| + |
| + if ((isOperationAssignmentAnyMatrix(op)) || |
| + (isOperationAssignmentSymmetricMatrix(op) && numCols == numRows)) |
| + { |
| + ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); |
| + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix assignment case", matIn, otherMatIn, op, true)); |
| + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix assignment case", matIn, otherMatIn, op, false)); |
| + } |
| + } |
| + } |
| + } |
| + } |
| } |
| |
| } // Functional |
| diff --git a/src/tests/deqp_support/qpTestLog.c b/src/tests/deqp_support/qpTestLog.c |
| index 7252ae049..e3eaa9b14 100644 |
| --- a/src/tests/deqp_support/qpTestLog.c |
| +++ b/src/tests/deqp_support/qpTestLog.c |
| @@ -33,7 +33,7 @@ |
| #include "deMutex.h" |
| |
| #if defined(QP_SUPPORT_PNG) |
| -# include <png.h> |
| +# include <png.h> |
| #endif |
| |
| #include <stdio.h> |
| @@ -41,8 +41,8 @@ |
| #include <stdarg.h> |
| |
| #if (DE_OS == DE_OS_WIN32) |
| -# include <windows.h> |
| -# include <io.h> |
| +# include <windows.h> |
| +# include <io.h> |
| #endif |
| |
| #if defined(DE_DEBUG) |
| @@ -51,70 +51,70 @@ |
| |
| typedef enum ContainerType_e |
| { |
| - CONTAINERTYPE_SECTION = 0, |
| - CONTAINERTYPE_IMAGESET, |
| - CONTAINERTYPE_EGLCONFIGSET, |
| - CONTAINERTYPE_SHADERPROGRAM, |
| - CONTAINERTYPE_SAMPLELIST, |
| - CONTAINERTYPE_SAMPLEINFO, |
| - CONTAINERTYPE_SAMPLE, |
| + CONTAINERTYPE_SECTION = 0, |
| + CONTAINERTYPE_IMAGESET, |
| + CONTAINERTYPE_EGLCONFIGSET, |
| + CONTAINERTYPE_SHADERPROGRAM, |
| + CONTAINERTYPE_SAMPLELIST, |
| + CONTAINERTYPE_SAMPLEINFO, |
| + CONTAINERTYPE_SAMPLE, |
| |
| - CONTAINERTYPE_LAST |
| + CONTAINERTYPE_LAST |
| } ContainerType; |
| |
| DE_INLINE deBool childContainersOk (ContainerType type) |
| { |
| - return type == CONTAINERTYPE_SECTION || type == CONTAINERTYPE_SAMPLELIST; |
| + return type == CONTAINERTYPE_SECTION || type == CONTAINERTYPE_SAMPLELIST; |
| } |
| |
| enum |
| { |
| - MAX_CONTAINER_STACK_DEPTH = 32 |
| + MAX_CONTAINER_STACK_DEPTH = 32 |
| }; |
| |
| typedef struct ContainerStack_s |
| { |
| - int numElements; |
| - ContainerType elements[MAX_CONTAINER_STACK_DEPTH]; |
| + int numElements; |
| + ContainerType elements[MAX_CONTAINER_STACK_DEPTH]; |
| } ContainerStack; |
| |
| DE_INLINE void ContainerStack_reset (ContainerStack* stack) |
| { |
| - deMemset(stack, 0, sizeof(ContainerStack)); |
| + deMemset(stack, 0, sizeof(ContainerStack)); |
| } |
| |
| DE_INLINE deBool ContainerStack_isEmpty (const ContainerStack* stack) |
| { |
| - return stack->numElements == 0; |
| + return stack->numElements == 0; |
| } |
| |
| DE_INLINE deBool ContainerStack_push (ContainerStack* stack, ContainerType type) |
| { |
| - if (stack->numElements == MAX_CONTAINER_STACK_DEPTH) |
| - return DE_FALSE; |
| + if (stack->numElements == MAX_CONTAINER_STACK_DEPTH) |
| + return DE_FALSE; |
| |
| - if (stack->numElements > 0 && !childContainersOk(stack->elements[stack->numElements-1])) |
| - return DE_FALSE; |
| + if (stack->numElements > 0 && !childContainersOk(stack->elements[stack->numElements-1])) |
| + return DE_FALSE; |
| |
| - stack->elements[stack->numElements] = type; |
| - stack->numElements += 1; |
| + stack->elements[stack->numElements] = type; |
| + stack->numElements += 1; |
| |
| - return DE_TRUE; |
| + return DE_TRUE; |
| } |
| |
| DE_INLINE ContainerType ContainerStack_pop (ContainerStack* stack) |
| { |
| - DE_ASSERT(stack->numElements > 0); |
| - stack->numElements -= 1; |
| - return stack->elements[stack->numElements]; |
| + DE_ASSERT(stack->numElements > 0); |
| + stack->numElements -= 1; |
| + return stack->elements[stack->numElements]; |
| } |
| |
| DE_INLINE ContainerType ContainerStack_getTop (const ContainerStack* stack) |
| { |
| - if (stack->numElements > 0) |
| - return stack->elements[stack->numElements-1]; |
| - else |
| - return CONTAINERTYPE_LAST; |
| + if (stack->numElements > 0) |
| + return stack->elements[stack->numElements-1]; |
| + else |
| + return CONTAINERTYPE_LAST; |
| } |
| |
| #endif |
| @@ -122,26 +122,26 @@ DE_INLINE ContainerType ContainerStack_getTop (const ContainerStack* stack) |
| /* qpTestLog instance */ |
| struct qpTestLog_s |
| { |
| - deUint32 flags; /*!< Logging flags. */ |
| + deUint32 flags; /*!< Logging flags. */ |
| |
| - deMutex lock; /*!< Lock for mutable state below. */ |
| + deMutex lock; /*!< Lock for mutable state below. */ |
| |
| - /* State protected by lock. */ |
| - FILE* outputFile; |
| - qpXmlWriter* writer; |
| - deBool isSessionOpen; |
| - deBool isCaseOpen; |
| + /* State protected by lock. */ |
| + FILE* outputFile; |
| + qpXmlWriter* writer; |
| + deBool isSessionOpen; |
| + deBool isCaseOpen; |
| |
| #if defined(DE_DEBUG) |
| - ContainerStack containerStack; /*!< For container usage verification. */ |
| + ContainerStack containerStack; /*!< For container usage verification. */ |
| #endif |
| }; |
| |
| /* Maps integer to string. */ |
| typedef struct qpKeyStringMap_s |
| { |
| - int key; |
| - char* string; |
| + int key; |
| + char* string; |
| } qpKeyStringMap; |
| |
| static const char* LOG_FORMAT_VERSION = "0.3.4"; |
| @@ -149,32 +149,32 @@ static const char* LOG_FORMAT_VERSION = "0.3.4"; |
| /* Mapping enum to above strings... */ |
| static const qpKeyStringMap s_qpTestTypeMap[] = |
| { |
| - { QP_TEST_CASE_TYPE_SELF_VALIDATE, "SelfValidate" }, |
| - { QP_TEST_CASE_TYPE_PERFORMANCE, "Performance" }, |
| - { QP_TEST_CASE_TYPE_CAPABILITY, "Capability" }, |
| - { QP_TEST_CASE_TYPE_ACCURACY, "Accuracy" }, |
| + { QP_TEST_CASE_TYPE_SELF_VALIDATE, "SelfValidate" }, |
| + { QP_TEST_CASE_TYPE_PERFORMANCE, "Performance" }, |
| + { QP_TEST_CASE_TYPE_CAPABILITY, "Capability" }, |
| + { QP_TEST_CASE_TYPE_ACCURACY, "Accuracy" }, |
| |
| - { QP_TEST_CASE_TYPE_LAST, DE_NULL } |
| + { QP_TEST_CASE_TYPE_LAST, DE_NULL } |
| }; |
| |
| DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpTestTypeMap) == QP_TEST_CASE_TYPE_LAST + 1); |
| |
| static const qpKeyStringMap s_qpTestResultMap[] = |
| { |
| - { QP_TEST_RESULT_PASS, "Pass" }, |
| - { QP_TEST_RESULT_FAIL, "Fail" }, |
| - { QP_TEST_RESULT_QUALITY_WARNING, "QualityWarning" }, |
| - { QP_TEST_RESULT_COMPATIBILITY_WARNING, "CompatibilityWarning" }, |
| - { QP_TEST_RESULT_PENDING, "Pending" }, /* should not be needed here */ |
| - { QP_TEST_RESULT_NOT_SUPPORTED, "NotSupported" }, |
| - { QP_TEST_RESULT_RESOURCE_ERROR, "ResourceError" }, |
| - { QP_TEST_RESULT_INTERNAL_ERROR, "InternalError" }, |
| - { QP_TEST_RESULT_CRASH, "Crash" }, |
| - { QP_TEST_RESULT_TIMEOUT, "Timeout" }, |
| + { QP_TEST_RESULT_PASS, "Pass" }, |
| + { QP_TEST_RESULT_FAIL, "Fail" }, |
| + { QP_TEST_RESULT_QUALITY_WARNING, "QualityWarning" }, |
| + { QP_TEST_RESULT_COMPATIBILITY_WARNING, "CompatibilityWarning" }, |
| + { QP_TEST_RESULT_PENDING, "Pending" }, /* should not be needed here */ |
| + { QP_TEST_RESULT_NOT_SUPPORTED, "NotSupported" }, |
| + { QP_TEST_RESULT_RESOURCE_ERROR, "ResourceError" }, |
| + { QP_TEST_RESULT_INTERNAL_ERROR, "InternalError" }, |
| + { QP_TEST_RESULT_CRASH, "Crash" }, |
| + { QP_TEST_RESULT_TIMEOUT, "Timeout" }, |
| |
| - /* Add new values here if needed, remember to update qpTestResult enumeration. */ |
| + /* Add new values here if needed, remember to update qpTestResult enumeration. */ |
| |
| - { QP_TEST_RESULT_LAST, DE_NULL } |
| + { QP_TEST_RESULT_LAST, DE_NULL } |
| }; |
| |
| DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpTestResultMap) == QP_TEST_RESULT_LAST + 1); |
| @@ -183,13 +183,13 @@ DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpTestResultMap) == QP_TEST_RESULT_LAST + |
| |
| static const qpKeyStringMap s_qpTagMap[] = |
| { |
| - { QP_KEY_TAG_NONE, DE_NULL }, |
| - { QP_KEY_TAG_PERFORMANCE, "Performance" }, |
| - { QP_KEY_TAG_QUALITY, "Quality" }, |
| - { QP_KEY_TAG_PRECISION, "Precision" }, |
| - { QP_KEY_TAG_TIME, "Time" }, |
| + { QP_KEY_TAG_NONE, DE_NULL }, |
| + { QP_KEY_TAG_PERFORMANCE, "Performance" }, |
| + { QP_KEY_TAG_QUALITY, "Quality" }, |
| + { QP_KEY_TAG_PRECISION, "Precision" }, |
| + { QP_KEY_TAG_TIME, "Time" }, |
| |
| - { QP_KEY_TAG_LAST, DE_NULL } |
| + { QP_KEY_TAG_LAST, DE_NULL } |
| }; |
| |
| DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpTagMap) == QP_KEY_TAG_LAST + 1); |
| @@ -198,10 +198,10 @@ DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpTagMap) == QP_KEY_TAG_LAST + 1); |
| |
| static const qpKeyStringMap s_qpSampleValueTagMap[] = |
| { |
| - { QP_SAMPLE_VALUE_TAG_PREDICTOR, "Predictor" }, |
| - { QP_SAMPLE_VALUE_TAG_RESPONSE, "Response" }, |
| + { QP_SAMPLE_VALUE_TAG_PREDICTOR, "Predictor" }, |
| + { QP_SAMPLE_VALUE_TAG_RESPONSE, "Response" }, |
| |
| - { QP_SAMPLE_VALUE_TAG_LAST, DE_NULL } |
| + { QP_SAMPLE_VALUE_TAG_LAST, DE_NULL } |
| }; |
| |
| DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpSampleValueTagMap) == QP_SAMPLE_VALUE_TAG_LAST + 1); |
| @@ -210,12 +210,12 @@ DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpSampleValueTagMap) == QP_SAMPLE_VALUE_TA |
| |
| static const qpKeyStringMap s_qpImageCompressionModeMap[] = |
| { |
| - { QP_IMAGE_COMPRESSION_MODE_NONE, "None" }, |
| - { QP_IMAGE_COMPRESSION_MODE_PNG, "PNG" }, |
| + { QP_IMAGE_COMPRESSION_MODE_NONE, "None" }, |
| + { QP_IMAGE_COMPRESSION_MODE_PNG, "PNG" }, |
| |
| - { QP_IMAGE_COMPRESSION_MODE_BEST, DE_NULL }, /* not allowed to be written! */ |
| + { QP_IMAGE_COMPRESSION_MODE_BEST, DE_NULL }, /* not allowed to be written! */ |
| |
| - { QP_IMAGE_COMPRESSION_MODE_LAST, DE_NULL } |
| + { QP_IMAGE_COMPRESSION_MODE_LAST, DE_NULL } |
| }; |
| |
| DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpImageCompressionModeMap) == QP_IMAGE_COMPRESSION_MODE_LAST + 1); |
| @@ -224,10 +224,10 @@ DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpImageCompressionModeMap) == QP_IMAGE_COM |
| |
| static const qpKeyStringMap s_qpImageFormatMap[] = |
| { |
| - { QP_IMAGE_FORMAT_RGB888, "RGB888" }, |
| - { QP_IMAGE_FORMAT_RGBA8888, "RGBA8888" }, |
| + { QP_IMAGE_FORMAT_RGB888, "RGB888" }, |
| + { QP_IMAGE_FORMAT_RGBA8888, "RGBA8888" }, |
| |
| - { QP_IMAGE_FORMAT_LAST, DE_NULL } |
| + { QP_IMAGE_FORMAT_LAST, DE_NULL } |
| }; |
| |
| DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpImageFormatMap) == QP_IMAGE_FORMAT_LAST + 1); |
| @@ -236,91 +236,91 @@ DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpImageFormatMap) == QP_IMAGE_FORMAT_LAST |
| |
| static const qpKeyStringMap s_qpShaderTypeMap[] = |
| { |
| - { QP_SHADER_TYPE_VERTEX, "VertexShader" }, |
| - { QP_SHADER_TYPE_FRAGMENT, "FragmentShader" }, |
| - { QP_SHADER_TYPE_GEOMETRY, "GeometryShader" }, |
| - { QP_SHADER_TYPE_TESS_CONTROL, "TessControlShader" }, |
| - { QP_SHADER_TYPE_TESS_EVALUATION, "TessEvaluationShader" }, |
| - { QP_SHADER_TYPE_COMPUTE, "ComputeShader" }, |
| + { QP_SHADER_TYPE_VERTEX, "VertexShader" }, |
| + { QP_SHADER_TYPE_FRAGMENT, "FragmentShader" }, |
| + { QP_SHADER_TYPE_GEOMETRY, "GeometryShader" }, |
| + { QP_SHADER_TYPE_TESS_CONTROL, "TessControlShader" }, |
| + { QP_SHADER_TYPE_TESS_EVALUATION, "TessEvaluationShader" }, |
| + { QP_SHADER_TYPE_COMPUTE, "ComputeShader" }, |
| |
| - { QP_SHADER_TYPE_LAST, DE_NULL } |
| + { QP_SHADER_TYPE_LAST, DE_NULL } |
| }; |
| |
| DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpShaderTypeMap) == QP_SHADER_TYPE_LAST + 1); |
| |
| static void qpTestLog_flushFile (qpTestLog* log) |
| { |
| - DE_ASSERT(log && log->outputFile); |
| - fflush(log->outputFile); |
| + DE_ASSERT(log && log->outputFile); |
| + fflush(log->outputFile); |
| #if (DE_OS == DE_OS_WIN32) && (DE_COMPILER == DE_COMPILER_MSC) |
| - /* \todo [petri] Is this really necessary? */ |
| - FlushFileBuffers((HANDLE)_get_osfhandle(_fileno(log->outputFile))); |
| + /* \todo [petri] Is this really necessary? */ |
| + FlushFileBuffers((HANDLE)_get_osfhandle(_fileno(log->outputFile))); |
| #endif |
| } |
| |
| -#define QP_LOOKUP_STRING(KEYMAP, KEY) qpLookupString(KEYMAP, DE_LENGTH_OF_ARRAY(KEYMAP), (int)(KEY)) |
| +#define QP_LOOKUP_STRING(KEYMAP, KEY) qpLookupString(KEYMAP, DE_LENGTH_OF_ARRAY(KEYMAP), (int)(KEY)) |
| |
| static const char* qpLookupString (const qpKeyStringMap* keyMap, int keyMapSize, int key) |
| { |
| - DE_ASSERT(keyMap); |
| - DE_ASSERT(deInBounds32(key, 0, keyMapSize)); |
| - DE_ASSERT(keyMap[key].key == key); |
| - DE_UNREF(keyMapSize); /* for asserting only */ |
| - return keyMap[key].string; |
| + DE_ASSERT(keyMap); |
| + DE_ASSERT(deInBounds32(key, 0, keyMapSize)); |
| + DE_ASSERT(keyMap[key].key == key); |
| + DE_UNREF(keyMapSize); /* for asserting only */ |
| + return keyMap[key].string; |
| } |
| |
| DE_INLINE void int32ToString (int val, char buf[32]) |
| { |
| - deSprintf(&buf[0], 32, "%d", val); |
| + deSprintf(&buf[0], 32, "%d", val); |
| } |
| |
| DE_INLINE void int64ToString (deInt64 val, char buf[32]) |
| { |
| - deSprintf(&buf[0], 32, "%lld", (long long int)val); |
| + deSprintf(&buf[0], 32, "%lld", (long long int)val); |
| } |
| |
| DE_INLINE void floatToString (float value, char* buf, size_t bufSize) |
| { |
| - deSprintf(buf, bufSize, "%f", value); |
| + deSprintf(buf, bufSize, "%f", value); |
| } |
| |
| DE_INLINE void doubleToString (double value, char* buf, size_t bufSize) |
| { |
| - deSprintf(buf, bufSize, "%f", value); |
| + deSprintf(buf, bufSize, "%f", value); |
| } |
| |
| static deBool beginSession (qpTestLog* log) |
| { |
| - DE_ASSERT(log && !log->isSessionOpen); |
| + DE_ASSERT(log && !log->isSessionOpen); |
| |
| - /* Write session info. */ |
| - fprintf(log->outputFile, "#sessionInfo releaseName %s\n", qpGetReleaseName()); |
| - fprintf(log->outputFile, "#sessionInfo releaseId 0x%08x\n", qpGetReleaseId()); |
| - fprintf(log->outputFile, "#sessionInfo targetName \"%s\"\n", qpGetTargetName()); |
| + /* Write session info. */ |
| + fprintf(log->outputFile, "#sessionInfo releaseName %s\n", qpGetReleaseName()); |
| + fprintf(log->outputFile, "#sessionInfo releaseId 0x%08x\n", qpGetReleaseId()); |
| + fprintf(log->outputFile, "#sessionInfo targetName \"%s\"\n", qpGetTargetName()); |
| |
| /* Write out #beginSession. */ |
| - fprintf(log->outputFile, "#beginSession\n"); |
| - qpTestLog_flushFile(log); |
| + fprintf(log->outputFile, "#beginSession\n"); |
| + qpTestLog_flushFile(log); |
| |
| - log->isSessionOpen = DE_TRUE; |
| + log->isSessionOpen = DE_TRUE; |
| |
| - return DE_TRUE; |
| + return DE_TRUE; |
| } |
| |
| static deBool endSession (qpTestLog* log) |
| { |
| - DE_ASSERT(log && log->isSessionOpen); |
| + DE_ASSERT(log && log->isSessionOpen); |
| |
| /* Make sure xml is flushed. */ |
| qpXmlWriter_flush(log->writer); |
| |
| /* Write out #endSession. */ |
| - fprintf(log->outputFile, "\n#endSession\n"); |
| - qpTestLog_flushFile(log); |
| + fprintf(log->outputFile, "\n#endSession\n"); |
| + qpTestLog_flushFile(log); |
| |
| - log->isSessionOpen = DE_FALSE; |
| + log->isSessionOpen = DE_FALSE; |
| |
| - return DE_TRUE; |
| + return DE_TRUE; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| @@ -330,117 +330,117 @@ static deBool endSession (qpTestLog* log) |
| *//*--------------------------------------------------------------------*/ |
| qpTestLog* qpTestLog_createFileLog (const char* fileName, deUint32 flags) |
| { |
| - qpTestLog* log = (qpTestLog*)deCalloc(sizeof(qpTestLog)); |
| - if (!log) |
| - return DE_NULL; |
| + qpTestLog* log = (qpTestLog*)deCalloc(sizeof(qpTestLog)); |
| + if (!log) |
| + return DE_NULL; |
| |
| - DE_ASSERT(fileName && fileName[0]); /* must have filename. */ |
| + DE_ASSERT(fileName && fileName[0]); /* must have filename. */ |
| |
| #if defined(DE_DEBUG) |
| - ContainerStack_reset(&log->containerStack); |
| + ContainerStack_reset(&log->containerStack); |
| #endif |
| |
| - qpPrintf("Writing test log into %s\n", fileName); |
| - |
| - /* Create output file. */ |
| - log->outputFile = fopen(fileName, "wb"); |
| - if (!log->outputFile) |
| - { |
| - qpPrintf("ERROR: Unable to open test log output file '%s'.\n", fileName); |
| - qpTestLog_destroy(log); |
| - return DE_NULL; |
| - } |
| - |
| - log->flags = flags; |
| - log->writer = qpXmlWriter_createFileWriter(log->outputFile, 0, !(flags & QP_TEST_LOG_NO_FLUSH)); |
| - log->lock = deMutex_create(DE_NULL); |
| - log->isSessionOpen = DE_FALSE; |
| - log->isCaseOpen = DE_FALSE; |
| - |
| - if (!log->writer) |
| - { |
| - qpPrintf("ERROR: Unable to create output XML writer to file '%s'.\n", fileName); |
| - qpTestLog_destroy(log); |
| - return DE_NULL; |
| - } |
| - |
| - if (!log->lock) |
| - { |
| - qpPrintf("ERROR: Unable to create mutex.\n"); |
| - qpTestLog_destroy(log); |
| - return DE_NULL; |
| - } |
| - |
| - beginSession(log); |
| - |
| - return log; |
| + qpPrintf("Writing test log into %s\n", fileName); |
| + |
| + /* Create output file. */ |
| + log->outputFile = fopen(fileName, "wb"); |
| + if (!log->outputFile) |
| + { |
| + qpPrintf("ERROR: Unable to open test log output file '%s'.\n", fileName); |
| + qpTestLog_destroy(log); |
| + return DE_NULL; |
| + } |
| + |
| + log->flags = flags; |
| + log->writer = qpXmlWriter_createFileWriter(log->outputFile, 0, !(flags & QP_TEST_LOG_NO_FLUSH)); |
| + log->lock = deMutex_create(DE_NULL); |
| + log->isSessionOpen = DE_FALSE; |
| + log->isCaseOpen = DE_FALSE; |
| + |
| + if (!log->writer) |
| + { |
| + qpPrintf("ERROR: Unable to create output XML writer to file '%s'.\n", fileName); |
| + qpTestLog_destroy(log); |
| + return DE_NULL; |
| + } |
| + |
| + if (!log->lock) |
| + { |
| + qpPrintf("ERROR: Unable to create mutex.\n"); |
| + qpTestLog_destroy(log); |
| + return DE_NULL; |
| + } |
| + |
| + beginSession(log); |
| + |
| + return log; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Destroy a logger instance |
| - * \param a qpTestLog instance |
| + * \param a qpTestLog instance |
| *//*--------------------------------------------------------------------*/ |
| void qpTestLog_destroy (qpTestLog* log) |
| { |
| - DE_ASSERT(log); |
| + DE_ASSERT(log); |
| |
| - if (log->isSessionOpen) |
| - endSession(log); |
| + if (log->isSessionOpen) |
| + endSession(log); |
| |
| - if (log->writer) |
| - qpXmlWriter_destroy(log->writer); |
| + if (log->writer) |
| + qpXmlWriter_destroy(log->writer); |
| |
| - if (log->outputFile) |
| - fclose(log->outputFile); |
| + if (log->outputFile) |
| + fclose(log->outputFile); |
| |
| - if (log->lock) |
| - deMutex_destroy(log->lock); |
| + if (log->lock) |
| + deMutex_destroy(log->lock); |
| |
| - deFree(log); |
| + deFree(log); |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Log start of test case |
| * \param log qpTestLog instance |
| - * \param testCasePath Full test case path (as seen in Candy). |
| - * \param testCaseType Test case type |
| + * \param testCasePath Full test case path (as seen in Candy). |
| + * \param testCaseType Test case type |
| * \return true if ok, false otherwise |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_startCase (qpTestLog* log, const char* testCasePath, qpTestCaseType testCaseType) |
| { |
| - const char* typeStr = QP_LOOKUP_STRING(s_qpTestTypeMap, testCaseType); |
| - int numResultAttribs = 0; |
| - qpXmlAttribute resultAttribs[8]; |
| + const char* typeStr = QP_LOOKUP_STRING(s_qpTestTypeMap, testCaseType); |
| + int numResultAttribs = 0; |
| + qpXmlAttribute resultAttribs[8]; |
| |
| - DE_ASSERT(log && testCasePath && (testCasePath[0] != 0)); |
| - deMutex_lock(log->lock); |
| + DE_ASSERT(log && testCasePath && (testCasePath[0] != 0)); |
| + deMutex_lock(log->lock); |
| |
| - DE_ASSERT(!log->isCaseOpen); |
| - DE_ASSERT(ContainerStack_isEmpty(&log->containerStack)); |
| + DE_ASSERT(!log->isCaseOpen); |
| + DE_ASSERT(ContainerStack_isEmpty(&log->containerStack)); |
| |
| - /* Flush XML and write out #beginTestCaseResult. */ |
| - qpXmlWriter_flush(log->writer); |
| - fprintf(log->outputFile, "\n#beginTestCaseResult %s\n", testCasePath); |
| - if (!(log->flags & QP_TEST_LOG_NO_FLUSH)) |
| - qpTestLog_flushFile(log); |
| - |
| - log->isCaseOpen = DE_TRUE; |
| - |
| - /* Fill in attributes. */ |
| - resultAttribs[numResultAttribs++] = qpSetStringAttrib("Version", LOG_FORMAT_VERSION); |
| - resultAttribs[numResultAttribs++] = qpSetStringAttrib("CasePath", testCasePath); |
| - resultAttribs[numResultAttribs++] = qpSetStringAttrib("CaseType", typeStr); |
| - |
| - if (!qpXmlWriter_startDocument(log->writer) || |
| - !qpXmlWriter_startElement(log->writer, "TestCaseResult", numResultAttribs, resultAttribs)) |
| - { |
| - qpPrintf("qpTestLog_startCase(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| - |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + /* Flush XML and write out #beginTestCaseResult. */ |
| + qpXmlWriter_flush(log->writer); |
| + fprintf(log->outputFile, "\n#beginTestCaseResult %s\n", testCasePath); |
| + if (!(log->flags & QP_TEST_LOG_NO_FLUSH)) |
| + qpTestLog_flushFile(log); |
| + |
| + log->isCaseOpen = DE_TRUE; |
| + |
| + /* Fill in attributes. */ |
| + resultAttribs[numResultAttribs++] = qpSetStringAttrib("Version", LOG_FORMAT_VERSION); |
| + resultAttribs[numResultAttribs++] = qpSetStringAttrib("CasePath", testCasePath); |
| + resultAttribs[numResultAttribs++] = qpSetStringAttrib("CaseType", typeStr); |
| + |
| + if (!qpXmlWriter_startDocument(log->writer) || |
| + !qpXmlWriter_startElement(log->writer, "TestCaseResult", numResultAttribs, resultAttribs)) |
| + { |
| + qpPrintf("qpTestLog_startCase(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| + |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| @@ -452,600 +452,600 @@ deBool qpTestLog_startCase (qpTestLog* log, const char* testCasePath, qpTestCase |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_endCase (qpTestLog* log, qpTestResult result, const char* resultDetails) |
| { |
| - const char* statusStr = QP_LOOKUP_STRING(s_qpTestResultMap, result); |
| - qpXmlAttribute statusAttrib = qpSetStringAttrib("StatusCode", statusStr); |
| - |
| - deMutex_lock(log->lock); |
| - |
| - DE_ASSERT(log->isCaseOpen); |
| - DE_ASSERT(ContainerStack_isEmpty(&log->containerStack)); |
| - |
| - /* <Result StatusCode="Pass">Result details</Result> |
| - * </TestCaseResult> |
| - */ |
| - if (!qpXmlWriter_startElement(log->writer, "Result", 1, &statusAttrib) || |
| - (resultDetails && !qpXmlWriter_writeString(log->writer, resultDetails)) || |
| - !qpXmlWriter_endElement(log->writer, "Result") || |
| - !qpXmlWriter_endElement(log->writer, "TestCaseResult") || |
| - !qpXmlWriter_endDocument(log->writer)) /* Close any XML elements still open */ |
| - { |
| - qpPrintf("qpTestLog_endCase(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| - |
| - /* Flush XML and write #endTestCaseResult. */ |
| - qpXmlWriter_flush(log->writer); |
| - fprintf(log->outputFile, "\n#endTestCaseResult\n"); |
| - if (!(log->flags & QP_TEST_LOG_NO_FLUSH)) |
| - qpTestLog_flushFile(log); |
| - |
| - log->isCaseOpen = DE_FALSE; |
| - |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + const char* statusStr = QP_LOOKUP_STRING(s_qpTestResultMap, result); |
| + qpXmlAttribute statusAttrib = qpSetStringAttrib("StatusCode", statusStr); |
| + |
| + deMutex_lock(log->lock); |
| + |
| + DE_ASSERT(log->isCaseOpen); |
| + DE_ASSERT(ContainerStack_isEmpty(&log->containerStack)); |
| + |
| + /* <Result StatusCode="Pass">Result details</Result> |
| + * </TestCaseResult> |
| + */ |
| + if (!qpXmlWriter_startElement(log->writer, "Result", 1, &statusAttrib) || |
| + (resultDetails && !qpXmlWriter_writeString(log->writer, resultDetails)) || |
| + !qpXmlWriter_endElement(log->writer, "Result") || |
| + !qpXmlWriter_endElement(log->writer, "TestCaseResult") || |
| + !qpXmlWriter_endDocument(log->writer)) /* Close any XML elements still open */ |
| + { |
| + qpPrintf("qpTestLog_endCase(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| + |
| + /* Flush XML and write #endTestCaseResult. */ |
| + qpXmlWriter_flush(log->writer); |
| + fprintf(log->outputFile, "\n#endTestCaseResult\n"); |
| + if (!(log->flags & QP_TEST_LOG_NO_FLUSH)) |
| + qpTestLog_flushFile(log); |
| + |
| + log->isCaseOpen = DE_FALSE; |
| + |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Abrupt termination of logging. |
| - * \param log qpTestLog instance |
| - * \param result Result code, only Crash and Timeout are allowed. |
| + * \param log qpTestLog instance |
| + * \param result Result code, only Crash and Timeout are allowed. |
| * \return true if ok, false otherwise |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_terminateCase (qpTestLog* log, qpTestResult result) |
| { |
| - const char* resultStr = QP_LOOKUP_STRING(s_qpTestResultMap, result); |
| + const char* resultStr = QP_LOOKUP_STRING(s_qpTestResultMap, result); |
| |
| - DE_ASSERT(log); |
| - DE_ASSERT(result == QP_TEST_RESULT_CRASH || result == QP_TEST_RESULT_TIMEOUT); |
| + DE_ASSERT(log); |
| + DE_ASSERT(result == QP_TEST_RESULT_CRASH || result == QP_TEST_RESULT_TIMEOUT); |
| |
| - deMutex_lock(log->lock); |
| + deMutex_lock(log->lock); |
| |
| - if (!log->isCaseOpen) |
| - { |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; /* Soft error. This is called from error handler. */ |
| - } |
| + if (!log->isCaseOpen) |
| + { |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; /* Soft error. This is called from error handler. */ |
| + } |
| |
| - /* Flush XML and write #terminateTestCaseResult. */ |
| - qpXmlWriter_flush(log->writer); |
| - fprintf(log->outputFile, "\n#terminateTestCaseResult %s\n", resultStr); |
| - qpTestLog_flushFile(log); |
| + /* Flush XML and write #terminateTestCaseResult. */ |
| + qpXmlWriter_flush(log->writer); |
| + fprintf(log->outputFile, "\n#terminateTestCaseResult %s\n", resultStr); |
| + qpTestLog_flushFile(log); |
| |
| - log->isCaseOpen = DE_FALSE; |
| + log->isCaseOpen = DE_FALSE; |
| |
| #if defined(DE_DEBUG) |
| - ContainerStack_reset(&log->containerStack); |
| + ContainerStack_reset(&log->containerStack); |
| #endif |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| static deBool qpTestLog_writeKeyValuePair (qpTestLog* log, const char* elementName, const char* name, const char* description, const char* unit, qpKeyValueTag tag, const char* text) |
| { |
| - const char* tagString = QP_LOOKUP_STRING(s_qpTagMap, tag); |
| - qpXmlAttribute attribs[8]; |
| - int numAttribs = 0; |
| - |
| - DE_ASSERT(log && elementName && text); |
| - deMutex_lock(log->lock); |
| - |
| - /* Fill in attributes. */ |
| - if (name) attribs[numAttribs++] = qpSetStringAttrib("Name", name); |
| - if (description) attribs[numAttribs++] = qpSetStringAttrib("Description", description); |
| - if (tagString) attribs[numAttribs++] = qpSetStringAttrib("Tag", tagString); |
| - if (unit) attribs[numAttribs++] = qpSetStringAttrib("Unit", unit); |
| - |
| - if (!qpXmlWriter_startElement(log->writer, elementName, numAttribs, attribs) || |
| - !qpXmlWriter_writeString(log->writer, text) || |
| - !qpXmlWriter_endElement(log->writer, elementName)) |
| - { |
| - qpPrintf("qpTestLog_writeKeyValuePair(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| - |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + const char* tagString = QP_LOOKUP_STRING(s_qpTagMap, tag); |
| + qpXmlAttribute attribs[8]; |
| + int numAttribs = 0; |
| + |
| + DE_ASSERT(log && elementName && text); |
| + deMutex_lock(log->lock); |
| + |
| + /* Fill in attributes. */ |
| + if (name) attribs[numAttribs++] = qpSetStringAttrib("Name", name); |
| + if (description) attribs[numAttribs++] = qpSetStringAttrib("Description", description); |
| + if (tagString) attribs[numAttribs++] = qpSetStringAttrib("Tag", tagString); |
| + if (unit) attribs[numAttribs++] = qpSetStringAttrib("Unit", unit); |
| + |
| + if (!qpXmlWriter_startElement(log->writer, elementName, numAttribs, attribs) || |
| + !qpXmlWriter_writeString(log->writer, text) || |
| + !qpXmlWriter_endElement(log->writer, elementName)) |
| + { |
| + qpPrintf("qpTestLog_writeKeyValuePair(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| + |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Write a message to output log |
| - * \param log qpTestLog instance |
| - * \param format Format string of message |
| - * \param ... Parameters for message |
| + * \param log qpTestLog instance |
| + * \param format Format string of message |
| + * \param ... Parameters for message |
| * \return true if ok, false otherwise |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_writeMessage (qpTestLog* log, const char* format, ...) |
| { |
| - char buffer[1024]; |
| - va_list args; |
| + char buffer[1024]; |
| + va_list args; |
| |
| - /* \todo [petri] Handle buffer overflows! */ |
| + /* \todo [petri] Handle buffer overflows! */ |
| |
| - va_start(args, format); |
| - buffer[DE_LENGTH_OF_ARRAY(buffer) - 1] = 0; |
| - vsnprintf(buffer, sizeof(buffer), format, args); |
| - va_end(args); |
| + va_start(args, format); |
| + buffer[DE_LENGTH_OF_ARRAY(buffer) - 1] = 0; |
| + vsnprintf(buffer, sizeof(buffer), format, args); |
| + va_end(args); |
| |
| - /* <Text>text</Text> */ |
| - return qpTestLog_writeKeyValuePair(log, "Text", DE_NULL, DE_NULL, DE_NULL, QP_KEY_TAG_LAST, buffer); |
| + /* <Text>text</Text> */ |
| + return qpTestLog_writeKeyValuePair(log, "Text", DE_NULL, DE_NULL, DE_NULL, QP_KEY_TAG_LAST, buffer); |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Write key-value-pair into log |
| - * \param log qpTestLog instance |
| - * \param name Unique identifier for entry |
| - * \param description Human readable description |
| - * \param tag Optional tag |
| - * \param value Value of the key-value-pair |
| + * \param log qpTestLog instance |
| + * \param name Unique identifier for entry |
| + * \param description Human readable description |
| + * \param tag Optional tag |
| + * \param value Value of the key-value-pair |
| * \return true if ok, false otherwise |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_writeText (qpTestLog* log, const char* name, const char* description, qpKeyValueTag tag, const char* text) |
| { |
| - /* <Text Name="name" Description="description" Tag="tag">text</Text> */ |
| - return qpTestLog_writeKeyValuePair(log, "Text", name, description, DE_NULL, tag, text); |
| + /* <Text Name="name" Description="description" Tag="tag">text</Text> */ |
| + return qpTestLog_writeKeyValuePair(log, "Text", name, description, DE_NULL, tag, text); |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Write key-value-pair into log |
| - * \param log qpTestLog instance |
| - * \param name Unique identifier for entry |
| - * \param description Human readable description |
| - * \param tag Optional tag |
| - * \param value Value of the key-value-pair |
| + * \param log qpTestLog instance |
| + * \param name Unique identifier for entry |
| + * \param description Human readable description |
| + * \param tag Optional tag |
| + * \param value Value of the key-value-pair |
| * \return true if ok, false otherwise |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_writeInteger (qpTestLog* log, const char* name, const char* description, const char* unit, qpKeyValueTag tag, deInt64 value) |
| { |
| - char tmpString[64]; |
| - int64ToString(value, tmpString); |
| + char tmpString[64]; |
| + int64ToString(value, tmpString); |
| |
| - /* <Number Name="name" Description="description" Tag="Performance">15</Number> */ |
| - return qpTestLog_writeKeyValuePair(log, "Number", name, description, unit, tag, tmpString); |
| + /* <Number Name="name" Description="description" Tag="Performance">15</Number> */ |
| + return qpTestLog_writeKeyValuePair(log, "Number", name, description, unit, tag, tmpString); |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Write key-value-pair into log |
| - * \param log qpTestLog instance |
| - * \param name Unique identifier for entry |
| - * \param description Human readable description |
| - * \param tag Optional tag |
| - * \param value Value of the key-value-pair |
| + * \param log qpTestLog instance |
| + * \param name Unique identifier for entry |
| + * \param description Human readable description |
| + * \param tag Optional tag |
| + * \param value Value of the key-value-pair |
| * \return true if ok, false otherwise |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_writeFloat (qpTestLog* log, const char* name, const char* description, const char* unit, qpKeyValueTag tag, float value) |
| { |
| - char tmpString[64]; |
| - floatToString(value, tmpString, sizeof(tmpString)); |
| + char tmpString[64]; |
| + floatToString(value, tmpString, sizeof(tmpString)); |
| |
| - /* <Number Name="name" Description="description" Tag="Performance">15</Number> */ |
| - return qpTestLog_writeKeyValuePair(log, "Number", name, description, unit, tag, tmpString); |
| + /* <Number Name="name" Description="description" Tag="Performance">15</Number> */ |
| + return qpTestLog_writeKeyValuePair(log, "Number", name, description, unit, tag, tmpString); |
| } |
| |
| typedef struct Buffer_s |
| { |
| - size_t capacity; |
| - size_t size; |
| - deUint8* data; |
| + size_t capacity; |
| + size_t size; |
| + deUint8* data; |
| } Buffer; |
| |
| void Buffer_init (Buffer* buffer) |
| { |
| - buffer->capacity = 0; |
| - buffer->size = 0; |
| - buffer->data = DE_NULL; |
| + buffer->capacity = 0; |
| + buffer->size = 0; |
| + buffer->data = DE_NULL; |
| } |
| |
| void Buffer_deinit (Buffer* buffer) |
| { |
| - deFree(buffer->data); |
| - Buffer_init(buffer); |
| + deFree(buffer->data); |
| + Buffer_init(buffer); |
| } |
| |
| deBool Buffer_resize (Buffer* buffer, size_t newSize) |
| { |
| - /* Grow buffer if necessary. */ |
| - if (newSize > buffer->capacity) |
| - { |
| - size_t newCapacity = (size_t)deAlign32(deMax32(2*(int)buffer->capacity, (int)newSize), 512); |
| - deUint8* newData = (deUint8*)deMalloc(newCapacity); |
| - if (!newData) |
| - return DE_FALSE; |
| - |
| - memcpy(newData, buffer->data, buffer->size); |
| - deFree(buffer->data); |
| - buffer->data = newData; |
| - buffer->capacity = newCapacity; |
| - } |
| - |
| - buffer->size = newSize; |
| - return DE_TRUE; |
| + /* Grow buffer if necessary. */ |
| + if (newSize > buffer->capacity) |
| + { |
| + size_t newCapacity = (size_t)deAlign32(deMax32(2*(int)buffer->capacity, (int)newSize), 512); |
| + deUint8* newData = (deUint8*)deMalloc(newCapacity); |
| + if (!newData) |
| + return DE_FALSE; |
| + |
| + memcpy(newData, buffer->data, buffer->size); |
| + deFree(buffer->data); |
| + buffer->data = newData; |
| + buffer->capacity = newCapacity; |
| + } |
| + |
| + buffer->size = newSize; |
| + return DE_TRUE; |
| } |
| |
| deBool Buffer_append (Buffer* buffer, const deUint8* data, size_t numBytes) |
| { |
| - size_t offset = buffer->size; |
| + size_t offset = buffer->size; |
| |
| - if (!Buffer_resize(buffer, buffer->size + numBytes)) |
| - return DE_FALSE; |
| + if (!Buffer_resize(buffer, buffer->size + numBytes)) |
| + return DE_FALSE; |
| |
| - /* Append bytes. */ |
| - memcpy(&buffer->data[offset], data, numBytes); |
| - return DE_TRUE; |
| + /* Append bytes. */ |
| + memcpy(&buffer->data[offset], data, numBytes); |
| + return DE_TRUE; |
| } |
| |
| #if defined(QP_SUPPORT_PNG) |
| void pngWriteData (png_structp png, png_bytep dataPtr, png_size_t numBytes) |
| { |
| - Buffer* buffer = (Buffer*)png_get_io_ptr(png); |
| - if (!Buffer_append(buffer, (const deUint8*)dataPtr, numBytes)) |
| - png_error(png, "unable to resize PNG write buffer!"); |
| + Buffer* buffer = (Buffer*)png_get_io_ptr(png); |
| + if (!Buffer_append(buffer, (const deUint8*)dataPtr, numBytes)) |
| + png_error(png, "unable to resize PNG write buffer!"); |
| } |
| |
| void pngFlushData (png_structp png) |
| { |
| - DE_UNREF(png); |
| - /* nada */ |
| + DE_UNREF(png); |
| + /* nada */ |
| } |
| |
| static deBool writeCompressedPNG (png_structp png, png_infop info, png_byte** rowPointers, int width, int height, int colorFormat) |
| { |
| - if (setjmp(png_jmpbuf(png)) == 0) |
| - { |
| - /* Write data. */ |
| - png_set_IHDR(png, info, (png_uint_32)width, (png_uint_32)height, |
| - 8, |
| - colorFormat, |
| - PNG_INTERLACE_NONE, |
| - PNG_COMPRESSION_TYPE_BASE, |
| - PNG_FILTER_TYPE_BASE); |
| - png_write_info(png, info); |
| - png_write_image(png, rowPointers); |
| - png_write_end(png, NULL); |
| - |
| - return DE_TRUE; |
| - } |
| - else |
| - return DE_FALSE; |
| + if (setjmp(png_jmpbuf(png)) == 0) |
| + { |
| + /* Write data. */ |
| + png_set_IHDR(png, info, (png_uint_32)width, (png_uint_32)height, |
| + 8, |
| + colorFormat, |
| + PNG_INTERLACE_NONE, |
| + PNG_COMPRESSION_TYPE_BASE, |
| + PNG_FILTER_TYPE_BASE); |
| + png_write_info(png, info); |
| + png_write_image(png, rowPointers); |
| + png_write_end(png, NULL); |
| + |
| + return DE_TRUE; |
| + } |
| + else |
| + return DE_FALSE; |
| } |
| |
| static deBool compressImagePNG (Buffer* buffer, qpImageFormat imageFormat, int width, int height, int rowStride, const void* data) |
| { |
| - deBool compressOk = DE_FALSE; |
| - png_structp png = DE_NULL; |
| - png_infop info = DE_NULL; |
| - png_byte** rowPointers = DE_NULL; |
| - deBool hasAlpha = imageFormat == QP_IMAGE_FORMAT_RGBA8888; |
| - int ndx; |
| - |
| - /* Handle format. */ |
| - DE_ASSERT(imageFormat == QP_IMAGE_FORMAT_RGB888 || imageFormat == QP_IMAGE_FORMAT_RGBA8888); |
| - |
| - /* Allocate & set row pointers. */ |
| - rowPointers = (png_byte**)deMalloc((size_t)height * sizeof(png_byte*)); |
| - if (!rowPointers) |
| - return DE_FALSE; |
| - |
| - for (ndx = 0; ndx < height; ndx++) |
| - rowPointers[ndx] = (png_byte*)((const deUint8*)data + ndx*rowStride); |
| - |
| - /* Initialize PNG compressor. */ |
| - png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); |
| - info = png ? png_create_info_struct(png) : DE_NULL; |
| - if (png && info) |
| - { |
| - /* Set our own write function. */ |
| - png_set_write_fn(png, buffer, pngWriteData, pngFlushData); |
| - |
| - compressOk = writeCompressedPNG(png, info, rowPointers, width, height, |
| - hasAlpha ? PNG_COLOR_TYPE_RGBA : PNG_COLOR_TYPE_RGB); |
| - } |
| - |
| - /* Cleanup & return. */ |
| - if (png && info) |
| - { |
| - png_destroy_info_struct(png, &info); |
| - png_destroy_write_struct(&png, DE_NULL); |
| - } |
| - else if (png) |
| - png_destroy_write_struct(&png, &info); |
| - |
| - deFree(rowPointers); |
| - return compressOk; |
| + deBool compressOk = DE_FALSE; |
| + png_structp png = DE_NULL; |
| + png_infop info = DE_NULL; |
| + png_byte** rowPointers = DE_NULL; |
| + deBool hasAlpha = imageFormat == QP_IMAGE_FORMAT_RGBA8888; |
| + int ndx; |
| + |
| + /* Handle format. */ |
| + DE_ASSERT(imageFormat == QP_IMAGE_FORMAT_RGB888 || imageFormat == QP_IMAGE_FORMAT_RGBA8888); |
| + |
| + /* Allocate & set row pointers. */ |
| + rowPointers = (png_byte**)deMalloc((size_t)height * sizeof(png_byte*)); |
| + if (!rowPointers) |
| + return DE_FALSE; |
| + |
| + for (ndx = 0; ndx < height; ndx++) |
| + rowPointers[ndx] = (png_byte*)((const deUint8*)data + ndx*rowStride); |
| + |
| + /* Initialize PNG compressor. */ |
| + png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); |
| + info = png ? png_create_info_struct(png) : DE_NULL; |
| + if (png && info) |
| + { |
| + /* Set our own write function. */ |
| + png_set_write_fn(png, buffer, pngWriteData, pngFlushData); |
| + |
| + compressOk = writeCompressedPNG(png, info, rowPointers, width, height, |
| + hasAlpha ? PNG_COLOR_TYPE_RGBA : PNG_COLOR_TYPE_RGB); |
| + } |
| + |
| + /* Cleanup & return. */ |
| + if (png && info) |
| + { |
| + png_destroy_info_struct(png, &info); |
| + png_destroy_write_struct(&png, DE_NULL); |
| + } |
| + else if (png) |
| + png_destroy_write_struct(&png, &info); |
| + |
| + deFree(rowPointers); |
| + return compressOk; |
| } |
| #endif /* QP_SUPPORT_PNG */ |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Start image set |
| - * \param log qpTestLog instance |
| - * \param name Unique identifier for the set |
| - * \param description Human readable description |
| + * \param log qpTestLog instance |
| + * \param name Unique identifier for the set |
| + * \param description Human readable description |
| * \return true if ok, false otherwise |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_startImageSet (qpTestLog* log, const char* name, const char* description) |
| { |
| - qpXmlAttribute attribs[4]; |
| - int numAttribs = 0; |
| + qpXmlAttribute attribs[4]; |
| + int numAttribs = 0; |
| |
| - DE_ASSERT(log && name); |
| - deMutex_lock(log->lock); |
| + DE_ASSERT(log && name); |
| + deMutex_lock(log->lock); |
| |
| - attribs[numAttribs++] = qpSetStringAttrib("Name", name); |
| - if (description) |
| - attribs[numAttribs++] = qpSetStringAttrib("Description", description); |
| + attribs[numAttribs++] = qpSetStringAttrib("Name", name); |
| + if (description) |
| + attribs[numAttribs++] = qpSetStringAttrib("Description", description); |
| |
| - /* <ImageSet Name="<name>"> */ |
| - if (!qpXmlWriter_startElement(log->writer, "ImageSet", numAttribs, attribs)) |
| - { |
| - qpPrintf("qpTestLog_startImageSet(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + /* <ImageSet Name="<name>"> */ |
| + if (!qpXmlWriter_startElement(log->writer, "ImageSet", numAttribs, attribs)) |
| + { |
| + qpPrintf("qpTestLog_startImageSet(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_IMAGESET)); |
| + DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_IMAGESET)); |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief End image set |
| - * \param log qpTestLog instance |
| + * \param log qpTestLog instance |
| * \return true if ok, false otherwise |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_endImageSet (qpTestLog* log) |
| { |
| - DE_ASSERT(log); |
| - deMutex_lock(log->lock); |
| + DE_ASSERT(log); |
| + deMutex_lock(log->lock); |
| |
| - /* <ImageSet Name="<name>"> */ |
| - if (!qpXmlWriter_endElement(log->writer, "ImageSet")) |
| - { |
| - qpPrintf("qpTestLog_endImageSet(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + /* <ImageSet Name="<name>"> */ |
| + if (!qpXmlWriter_endElement(log->writer, "ImageSet")) |
| + { |
| + qpPrintf("qpTestLog_endImageSet(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_IMAGESET); |
| + DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_IMAGESET); |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Write base64 encoded raw image data into log |
| - * \param log qpTestLog instance |
| - * \param name Unique name (matching names can be compared across BatchResults). |
| - * \param description Textual description (shown in Candy). |
| - * \param compressionMode Compression mode |
| - * \param imageFormat Color format |
| - * \param width Width in pixels |
| - * \param height Height in pixels |
| - * \param stride Data stride (offset between rows) |
| - * \param data Pointer to pixel data |
| + * \param log qpTestLog instance |
| + * \param name Unique name (matching names can be compared across BatchResults). |
| + * \param description Textual description (shown in Candy). |
| + * \param compressionMode Compression mode |
| + * \param imageFormat Color format |
| + * \param width Width in pixels |
| + * \param height Height in pixels |
| + * \param stride Data stride (offset between rows) |
| + * \param data Pointer to pixel data |
| * \return 0 if OK, otherwise <0 |
| *//*--------------------------------------------------------------------*/ |
| -deBool qpTestLog_writeImage ( |
| - qpTestLog* log, |
| - const char* name, |
| - const char* description, |
| - qpImageCompressionMode compressionMode, |
| - qpImageFormat imageFormat, |
| - int width, |
| - int height, |
| - int stride, |
| - const void* data) |
| -{ |
| - char widthStr[32]; |
| - char heightStr[32]; |
| - qpXmlAttribute attribs[8]; |
| - int numAttribs = 0; |
| - Buffer compressedBuffer; |
| - const void* writeDataPtr = DE_NULL; |
| - size_t writeDataBytes = ~(size_t)0; |
| - |
| - DE_ASSERT(log && name); |
| - DE_ASSERT(deInRange32(width, 1, 16384)); |
| - DE_ASSERT(deInRange32(height, 1, 16384)); |
| - DE_ASSERT(data); |
| - |
| - if (log->flags & QP_TEST_LOG_EXCLUDE_IMAGES) |
| - return DE_TRUE; /* Image not logged. */ |
| - |
| - Buffer_init(&compressedBuffer); |
| - |
| - /* BEST compression mode defaults to PNG. */ |
| - if (compressionMode == QP_IMAGE_COMPRESSION_MODE_BEST) |
| - { |
| +deBool qpTestLog_writeImage ( |
| + qpTestLog* log, |
| + const char* name, |
| + const char* description, |
| + qpImageCompressionMode compressionMode, |
| + qpImageFormat imageFormat, |
| + int width, |
| + int height, |
| + int stride, |
| + const void* data) |
| +{ |
| + char widthStr[32]; |
| + char heightStr[32]; |
| + qpXmlAttribute attribs[8]; |
| + int numAttribs = 0; |
| + Buffer compressedBuffer; |
| + const void* writeDataPtr = DE_NULL; |
| + size_t writeDataBytes = ~(size_t)0; |
| + |
| + DE_ASSERT(log && name); |
| + DE_ASSERT(deInRange32(width, 1, 16384)); |
| + DE_ASSERT(deInRange32(height, 1, 16384)); |
| + DE_ASSERT(data); |
| + |
| + if (log->flags & QP_TEST_LOG_EXCLUDE_IMAGES) |
| + return DE_TRUE; /* Image not logged. */ |
| + |
| + Buffer_init(&compressedBuffer); |
| + |
| + /* BEST compression mode defaults to PNG. */ |
| + if (compressionMode == QP_IMAGE_COMPRESSION_MODE_BEST) |
| + { |
| #if defined(QP_SUPPORT_PNG) |
| - compressionMode = QP_IMAGE_COMPRESSION_MODE_PNG; |
| + compressionMode = QP_IMAGE_COMPRESSION_MODE_PNG; |
| #else |
| - compressionMode = QP_IMAGE_COMPRESSION_MODE_NONE; |
| + compressionMode = QP_IMAGE_COMPRESSION_MODE_NONE; |
| #endif |
| - } |
| + } |
| |
| #if defined(QP_SUPPORT_PNG) |
| - /* Try storing with PNG compression. */ |
| - if (compressionMode == QP_IMAGE_COMPRESSION_MODE_PNG) |
| - { |
| - deBool compressOk = compressImagePNG(&compressedBuffer, imageFormat, width, height, stride, data); |
| - if (compressOk) |
| - { |
| - writeDataPtr = compressedBuffer.data; |
| - writeDataBytes = compressedBuffer.size; |
| - } |
| - else |
| - { |
| - /* Fall-back to default compression. */ |
| - qpPrintf("WARNING: PNG compression failed -- storing image uncompressed.\n"); |
| - compressionMode = QP_IMAGE_COMPRESSION_MODE_NONE; |
| - } |
| - } |
| + /* Try storing with PNG compression. */ |
| + if (compressionMode == QP_IMAGE_COMPRESSION_MODE_PNG) |
| + { |
| + deBool compressOk = compressImagePNG(&compressedBuffer, imageFormat, width, height, stride, data); |
| + if (compressOk) |
| + { |
| + writeDataPtr = compressedBuffer.data; |
| + writeDataBytes = compressedBuffer.size; |
| + } |
| + else |
| + { |
| + /* Fall-back to default compression. */ |
| + qpPrintf("WARNING: PNG compression failed -- storing image uncompressed.\n"); |
| + compressionMode = QP_IMAGE_COMPRESSION_MODE_NONE; |
| + } |
| + } |
| #endif |
| |
| - /* Handle image compression. */ |
| - switch (compressionMode) |
| - { |
| - case QP_IMAGE_COMPRESSION_MODE_NONE: |
| - { |
| - int pixelSize = imageFormat == QP_IMAGE_FORMAT_RGB888 ? 3 : 4; |
| - int packedStride = pixelSize*width; |
| - |
| - if (packedStride == stride) |
| - writeDataPtr = data; |
| - else |
| - { |
| - /* Need to re-pack pixels. */ |
| - if (Buffer_resize(&compressedBuffer, (size_t)(packedStride*height))) |
| - { |
| - int row; |
| - for (row = 0; row < height; row++) |
| - memcpy(&compressedBuffer.data[packedStride*row], &((const deUint8*)data)[row*stride], (size_t)(pixelSize*width)); |
| - } |
| - else |
| - { |
| - qpPrintf("ERROR: Failed to pack pixels for writing.\n"); |
| - Buffer_deinit(&compressedBuffer); |
| - return DE_FALSE; |
| - } |
| - } |
| - |
| - writeDataBytes = (size_t)(packedStride*height); |
| - break; |
| - } |
| + /* Handle image compression. */ |
| + switch (compressionMode) |
| + { |
| + case QP_IMAGE_COMPRESSION_MODE_NONE: |
| + { |
| + int pixelSize = imageFormat == QP_IMAGE_FORMAT_RGB888 ? 3 : 4; |
| + int packedStride = pixelSize*width; |
| + |
| + if (packedStride == stride) |
| + writeDataPtr = data; |
| + else |
| + { |
| + /* Need to re-pack pixels. */ |
| + if (Buffer_resize(&compressedBuffer, (size_t)(packedStride*height))) |
| + { |
| + int row; |
| + for (row = 0; row < height; row++) |
| + memcpy(&compressedBuffer.data[packedStride*row], &((const deUint8*)data)[row*stride], (size_t)(pixelSize*width)); |
| + } |
| + else |
| + { |
| + qpPrintf("ERROR: Failed to pack pixels for writing.\n"); |
| + Buffer_deinit(&compressedBuffer); |
| + return DE_FALSE; |
| + } |
| + } |
| + |
| + writeDataBytes = (size_t)(packedStride*height); |
| + break; |
| + } |
| |
| #if defined(QP_SUPPORT_PNG) |
| - case QP_IMAGE_COMPRESSION_MODE_PNG: |
| - DE_ASSERT(writeDataPtr); /* Already handled. */ |
| - break; |
| + case QP_IMAGE_COMPRESSION_MODE_PNG: |
| + DE_ASSERT(writeDataPtr); /* Already handled. */ |
| + break; |
| #endif |
| |
| - default: |
| - qpPrintf("qpTestLog_writeImage(): Unknown compression mode: %s\n", QP_LOOKUP_STRING(s_qpImageCompressionModeMap, compressionMode)); |
| - Buffer_deinit(&compressedBuffer); |
| - return DE_FALSE; |
| - } |
| - |
| - /* Fill in attributes. */ |
| - int32ToString(width, widthStr); |
| - int32ToString(height, heightStr); |
| - attribs[numAttribs++] = qpSetStringAttrib("Name", name); |
| - attribs[numAttribs++] = qpSetStringAttrib("Width", widthStr); |
| - attribs[numAttribs++] = qpSetStringAttrib("Height", heightStr); |
| - attribs[numAttribs++] = qpSetStringAttrib("Format", QP_LOOKUP_STRING(s_qpImageFormatMap, imageFormat)); |
| - attribs[numAttribs++] = qpSetStringAttrib("CompressionMode", QP_LOOKUP_STRING(s_qpImageCompressionModeMap, compressionMode)); |
| - if (description) attribs[numAttribs++] = qpSetStringAttrib("Description", description); |
| - |
| - /* \note Log lock is acquired after compression! */ |
| - deMutex_lock(log->lock); |
| - |
| - /* <Image ID="result" Name="Foobar" Width="640" Height="480" Format="RGB888" CompressionMode="None">base64 data</Image> */ |
| - if (!qpXmlWriter_startElement(log->writer, "Image", numAttribs, attribs) || |
| - !qpXmlWriter_writeBase64(log->writer, (const deUint8*)writeDataPtr, writeDataBytes) || |
| - !qpXmlWriter_endElement(log->writer, "Image")) |
| - { |
| - qpPrintf("qpTestLog_writeImage(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - Buffer_deinit(&compressedBuffer); |
| - return DE_FALSE; |
| - } |
| - |
| - deMutex_unlock(log->lock); |
| - |
| - /* Free compressed data if allocated. */ |
| - Buffer_deinit(&compressedBuffer); |
| - |
| - return DE_TRUE; |
| + default: |
| + qpPrintf("qpTestLog_writeImage(): Unknown compression mode: %s\n", QP_LOOKUP_STRING(s_qpImageCompressionModeMap, compressionMode)); |
| + Buffer_deinit(&compressedBuffer); |
| + return DE_FALSE; |
| + } |
| + |
| + /* Fill in attributes. */ |
| + int32ToString(width, widthStr); |
| + int32ToString(height, heightStr); |
| + attribs[numAttribs++] = qpSetStringAttrib("Name", name); |
| + attribs[numAttribs++] = qpSetStringAttrib("Width", widthStr); |
| + attribs[numAttribs++] = qpSetStringAttrib("Height", heightStr); |
| + attribs[numAttribs++] = qpSetStringAttrib("Format", QP_LOOKUP_STRING(s_qpImageFormatMap, imageFormat)); |
| + attribs[numAttribs++] = qpSetStringAttrib("CompressionMode", QP_LOOKUP_STRING(s_qpImageCompressionModeMap, compressionMode)); |
| + if (description) attribs[numAttribs++] = qpSetStringAttrib("Description", description); |
| + |
| + /* \note Log lock is acquired after compression! */ |
| + deMutex_lock(log->lock); |
| + |
| + /* <Image ID="result" Name="Foobar" Width="640" Height="480" Format="RGB888" CompressionMode="None">base64 data</Image> */ |
| + if (!qpXmlWriter_startElement(log->writer, "Image", numAttribs, attribs) || |
| + !qpXmlWriter_writeBase64(log->writer, (const deUint8*)writeDataPtr, writeDataBytes) || |
| + !qpXmlWriter_endElement(log->writer, "Image")) |
| + { |
| + qpPrintf("qpTestLog_writeImage(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + Buffer_deinit(&compressedBuffer); |
| + return DE_FALSE; |
| + } |
| + |
| + deMutex_unlock(log->lock); |
| + |
| + /* Free compressed data if allocated. */ |
| + Buffer_deinit(&compressedBuffer); |
| + |
| + return DE_TRUE; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Write a OpenGL ES shader program into the log. |
| - * \param linkOk Shader program link result, false on failure |
| - * \param linkInfoLog Implementation provided linkage log |
| + * \param linkOk Shader program link result, false on failure |
| + * \param linkInfoLog Implementation provided linkage log |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_startShaderProgram (qpTestLog* log, deBool linkOk, const char* linkInfoLog) |
| { |
| - qpXmlAttribute programAttribs[4]; |
| - int numProgramAttribs = 0; |
| + qpXmlAttribute programAttribs[4]; |
| + int numProgramAttribs = 0; |
| |
| - DE_ASSERT(log); |
| - deMutex_lock(log->lock); |
| + DE_ASSERT(log); |
| + deMutex_lock(log->lock); |
| |
| - programAttribs[numProgramAttribs++] = qpSetStringAttrib("LinkStatus", linkOk ? "OK" : "Fail"); |
| + programAttribs[numProgramAttribs++] = qpSetStringAttrib("LinkStatus", linkOk ? "OK" : "Fail"); |
| |
| - if (!qpXmlWriter_startElement(log->writer, "ShaderProgram", numProgramAttribs, programAttribs) || |
| - !qpXmlWriter_writeStringElement(log->writer, "InfoLog", linkInfoLog)) |
| - { |
| - qpPrintf("qpTestLog_startShaderProgram(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + if (!qpXmlWriter_startElement(log->writer, "ShaderProgram", numProgramAttribs, programAttribs) || |
| + !qpXmlWriter_writeStringElement(log->writer, "InfoLog", linkInfoLog)) |
| + { |
| + qpPrintf("qpTestLog_startShaderProgram(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SHADERPROGRAM)); |
| + DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SHADERPROGRAM)); |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief End shader program |
| - * \param log qpTestLog instance |
| + * \param log qpTestLog instance |
| * \return true if ok, false otherwise |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_endShaderProgram (qpTestLog* log) |
| { |
| - DE_ASSERT(log); |
| - deMutex_lock(log->lock); |
| + DE_ASSERT(log); |
| + deMutex_lock(log->lock); |
| |
| - /* </ShaderProgram> */ |
| - if (!qpXmlWriter_endElement(log->writer, "ShaderProgram")) |
| - { |
| - qpPrintf("qpTestLog_endShaderProgram(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + /* </ShaderProgram> */ |
| + if (!qpXmlWriter_endElement(log->writer, "ShaderProgram")) |
| + { |
| + qpPrintf("qpTestLog_endShaderProgram(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SHADERPROGRAM); |
| + DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SHADERPROGRAM); |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Write a OpenGL ES shader into the log. |
| - * \param type Shader type |
| - * \param source Shader source |
| - * \param compileOk Shader compilation result, false on failure |
| - * \param infoLog Implementation provided shader compilation log |
| + * \param type Shader type |
| + * \param source Shader source |
| + * \param compileOk Shader compilation result, false on failure |
| + * \param infoLog Implementation provided shader compilation log |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_writeShader (qpTestLog* log, qpShaderType type, const char* source, deBool compileOk, const char* infoLog) |
| { |
| - const char* tagName = QP_LOOKUP_STRING(s_qpShaderTypeMap, type); |
| - const char* sourceStr = ((log->flags & QP_TEST_LOG_EXCLUDE_SHADER_SOURCES) == 0 || !compileOk) ? source : ""; |
| - int numShaderAttribs = 0; |
| - qpXmlAttribute shaderAttribs[4]; |
| + const char* tagName = QP_LOOKUP_STRING(s_qpShaderTypeMap, type); |
| + const char* sourceStr = ((log->flags & QP_TEST_LOG_EXCLUDE_SHADER_SOURCES) == 0 || !compileOk) ? source : ""; |
| + int numShaderAttribs = 0; |
| + qpXmlAttribute shaderAttribs[4]; |
| |
| - deMutex_lock(log->lock); |
| + deMutex_lock(log->lock); |
| |
| - DE_ASSERT(source); |
| - DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SHADERPROGRAM); |
| + DE_ASSERT(source); |
| + DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SHADERPROGRAM); |
| |
| - shaderAttribs[numShaderAttribs++] = qpSetStringAttrib("CompileStatus", compileOk ? "OK" : "Fail"); |
| + shaderAttribs[numShaderAttribs++] = qpSetStringAttrib("CompileStatus", compileOk ? "OK" : "Fail"); |
| |
| - if (!qpXmlWriter_startElement(log->writer, tagName, numShaderAttribs, shaderAttribs) || |
| - !qpXmlWriter_writeStringElement(log->writer, "ShaderSource", sourceStr) || |
| - !qpXmlWriter_writeStringElement(log->writer, "InfoLog", infoLog) || |
| - !qpXmlWriter_endElement(log->writer, tagName)) |
| - { |
| - qpPrintf("qpTestLog_writeShader(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + if (!qpXmlWriter_startElement(log->writer, tagName, numShaderAttribs, shaderAttribs) || |
| + !qpXmlWriter_writeStringElement(log->writer, "ShaderSource", sourceStr) || |
| + !qpXmlWriter_writeStringElement(log->writer, "InfoLog", infoLog) || |
| + !qpXmlWriter_endElement(log->writer, tagName)) |
| + { |
| + qpPrintf("qpTestLog_writeShader(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| @@ -1053,28 +1053,28 @@ deBool qpTestLog_writeShader (qpTestLog* log, qpShaderType type, const char* sou |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_startEglConfigSet (qpTestLog* log, const char* name, const char* description) |
| { |
| - qpXmlAttribute attribs[4]; |
| - int numAttribs = 0; |
| + qpXmlAttribute attribs[4]; |
| + int numAttribs = 0; |
| |
| - DE_ASSERT(log && name); |
| - deMutex_lock(log->lock); |
| + DE_ASSERT(log && name); |
| + deMutex_lock(log->lock); |
| |
| - attribs[numAttribs++] = qpSetStringAttrib("Name", name); |
| - if (description) |
| - attribs[numAttribs++] = qpSetStringAttrib("Description", description); |
| + attribs[numAttribs++] = qpSetStringAttrib("Name", name); |
| + if (description) |
| + attribs[numAttribs++] = qpSetStringAttrib("Description", description); |
| |
| - /* <EglConfigSet Name="<name>"> */ |
| - if (!qpXmlWriter_startElement(log->writer, "EglConfigSet", numAttribs, attribs)) |
| - { |
| - qpPrintf("qpTestLog_startEglImageSet(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + /* <EglConfigSet Name="<name>"> */ |
| + if (!qpXmlWriter_startElement(log->writer, "EglConfigSet", numAttribs, attribs)) |
| + { |
| + qpPrintf("qpTestLog_startEglImageSet(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_EGLCONFIGSET)); |
| + DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_EGLCONFIGSET)); |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| @@ -1082,21 +1082,21 @@ deBool qpTestLog_startEglConfigSet (qpTestLog* log, const char* name, const char |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_endEglConfigSet (qpTestLog* log) |
| { |
| - DE_ASSERT(log); |
| - deMutex_lock(log->lock); |
| + DE_ASSERT(log); |
| + deMutex_lock(log->lock); |
| |
| - /* <EglConfigSet Name="<name>"> */ |
| - if (!qpXmlWriter_endElement(log->writer, "EglConfigSet")) |
| - { |
| - qpPrintf("qpTestLog_endEglImageSet(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + /* <EglConfigSet Name="<name>"> */ |
| + if (!qpXmlWriter_endElement(log->writer, "EglConfigSet")) |
| + { |
| + qpPrintf("qpTestLog_endEglImageSet(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_EGLCONFIGSET); |
| + DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_EGLCONFIGSET); |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| @@ -1105,111 +1105,111 @@ deBool qpTestLog_endEglConfigSet (qpTestLog* log) |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_writeEglConfig (qpTestLog* log, const qpEglConfigInfo* config) |
| { |
| - qpXmlAttribute attribs[64]; |
| - int numAttribs = 0; |
| - |
| - DE_ASSERT(log && config); |
| - deMutex_lock(log->lock); |
| - |
| - attribs[numAttribs++] = qpSetIntAttrib ("BufferSize", config->bufferSize); |
| - attribs[numAttribs++] = qpSetIntAttrib ("RedSize", config->redSize); |
| - attribs[numAttribs++] = qpSetIntAttrib ("GreenSize", config->greenSize); |
| - attribs[numAttribs++] = qpSetIntAttrib ("BlueSize", config->blueSize); |
| - attribs[numAttribs++] = qpSetIntAttrib ("LuminanceSize", config->luminanceSize); |
| - attribs[numAttribs++] = qpSetIntAttrib ("AlphaSize", config->alphaSize); |
| - attribs[numAttribs++] = qpSetIntAttrib ("AlphaMaskSize", config->alphaMaskSize); |
| - attribs[numAttribs++] = qpSetBoolAttrib ("BindToTextureRGB", config->bindToTextureRGB); |
| - attribs[numAttribs++] = qpSetBoolAttrib ("BindToTextureRGBA", config->bindToTextureRGBA); |
| - attribs[numAttribs++] = qpSetStringAttrib ("ColorBufferType", config->colorBufferType); |
| - attribs[numAttribs++] = qpSetStringAttrib ("ConfigCaveat", config->configCaveat); |
| - attribs[numAttribs++] = qpSetIntAttrib ("ConfigID", config->configID); |
| - attribs[numAttribs++] = qpSetStringAttrib ("Conformant", config->conformant); |
| - attribs[numAttribs++] = qpSetIntAttrib ("DepthSize", config->depthSize); |
| - attribs[numAttribs++] = qpSetIntAttrib ("Level", config->level); |
| - attribs[numAttribs++] = qpSetIntAttrib ("MaxPBufferWidth", config->maxPBufferWidth); |
| - attribs[numAttribs++] = qpSetIntAttrib ("MaxPBufferHeight", config->maxPBufferHeight); |
| - attribs[numAttribs++] = qpSetIntAttrib ("MaxPBufferPixels", config->maxPBufferPixels); |
| - attribs[numAttribs++] = qpSetIntAttrib ("MaxSwapInterval", config->maxSwapInterval); |
| - attribs[numAttribs++] = qpSetIntAttrib ("MinSwapInterval", config->minSwapInterval); |
| - attribs[numAttribs++] = qpSetBoolAttrib ("NativeRenderable", config->nativeRenderable); |
| - attribs[numAttribs++] = qpSetStringAttrib ("RenderableType", config->renderableType); |
| - attribs[numAttribs++] = qpSetIntAttrib ("SampleBuffers", config->sampleBuffers); |
| - attribs[numAttribs++] = qpSetIntAttrib ("Samples", config->samples); |
| - attribs[numAttribs++] = qpSetIntAttrib ("StencilSize", config->stencilSize); |
| - attribs[numAttribs++] = qpSetStringAttrib ("SurfaceTypes", config->surfaceTypes); |
| - attribs[numAttribs++] = qpSetStringAttrib ("TransparentType", config->transparentType); |
| - attribs[numAttribs++] = qpSetIntAttrib ("TransparentRedValue", config->transparentRedValue); |
| - attribs[numAttribs++] = qpSetIntAttrib ("TransparentGreenValue", config->transparentGreenValue); |
| - attribs[numAttribs++] = qpSetIntAttrib ("TransparentBlueValue", config->transparentBlueValue); |
| - DE_ASSERT(numAttribs <= DE_LENGTH_OF_ARRAY(attribs)); |
| - |
| - if (!qpXmlWriter_startElement(log->writer, "EglConfig", numAttribs, attribs) || |
| - !qpXmlWriter_endElement(log->writer, "EglConfig")) |
| - { |
| - qpPrintf("qpTestLog_writeEglConfig(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| - |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + qpXmlAttribute attribs[64]; |
| + int numAttribs = 0; |
| + |
| + DE_ASSERT(log && config); |
| + deMutex_lock(log->lock); |
| + |
| + attribs[numAttribs++] = qpSetIntAttrib ("BufferSize", config->bufferSize); |
| + attribs[numAttribs++] = qpSetIntAttrib ("RedSize", config->redSize); |
| + attribs[numAttribs++] = qpSetIntAttrib ("GreenSize", config->greenSize); |
| + attribs[numAttribs++] = qpSetIntAttrib ("BlueSize", config->blueSize); |
| + attribs[numAttribs++] = qpSetIntAttrib ("LuminanceSize", config->luminanceSize); |
| + attribs[numAttribs++] = qpSetIntAttrib ("AlphaSize", config->alphaSize); |
| + attribs[numAttribs++] = qpSetIntAttrib ("AlphaMaskSize", config->alphaMaskSize); |
| + attribs[numAttribs++] = qpSetBoolAttrib ("BindToTextureRGB", config->bindToTextureRGB); |
| + attribs[numAttribs++] = qpSetBoolAttrib ("BindToTextureRGBA", config->bindToTextureRGBA); |
| + attribs[numAttribs++] = qpSetStringAttrib ("ColorBufferType", config->colorBufferType); |
| + attribs[numAttribs++] = qpSetStringAttrib ("ConfigCaveat", config->configCaveat); |
| + attribs[numAttribs++] = qpSetIntAttrib ("ConfigID", config->configID); |
| + attribs[numAttribs++] = qpSetStringAttrib ("Conformant", config->conformant); |
| + attribs[numAttribs++] = qpSetIntAttrib ("DepthSize", config->depthSize); |
| + attribs[numAttribs++] = qpSetIntAttrib ("Level", config->level); |
| + attribs[numAttribs++] = qpSetIntAttrib ("MaxPBufferWidth", config->maxPBufferWidth); |
| + attribs[numAttribs++] = qpSetIntAttrib ("MaxPBufferHeight", config->maxPBufferHeight); |
| + attribs[numAttribs++] = qpSetIntAttrib ("MaxPBufferPixels", config->maxPBufferPixels); |
| + attribs[numAttribs++] = qpSetIntAttrib ("MaxSwapInterval", config->maxSwapInterval); |
| + attribs[numAttribs++] = qpSetIntAttrib ("MinSwapInterval", config->minSwapInterval); |
| + attribs[numAttribs++] = qpSetBoolAttrib ("NativeRenderable", config->nativeRenderable); |
| + attribs[numAttribs++] = qpSetStringAttrib ("RenderableType", config->renderableType); |
| + attribs[numAttribs++] = qpSetIntAttrib ("SampleBuffers", config->sampleBuffers); |
| + attribs[numAttribs++] = qpSetIntAttrib ("Samples", config->samples); |
| + attribs[numAttribs++] = qpSetIntAttrib ("StencilSize", config->stencilSize); |
| + attribs[numAttribs++] = qpSetStringAttrib ("SurfaceTypes", config->surfaceTypes); |
| + attribs[numAttribs++] = qpSetStringAttrib ("TransparentType", config->transparentType); |
| + attribs[numAttribs++] = qpSetIntAttrib ("TransparentRedValue", config->transparentRedValue); |
| + attribs[numAttribs++] = qpSetIntAttrib ("TransparentGreenValue", config->transparentGreenValue); |
| + attribs[numAttribs++] = qpSetIntAttrib ("TransparentBlueValue", config->transparentBlueValue); |
| + DE_ASSERT(numAttribs <= DE_LENGTH_OF_ARRAY(attribs)); |
| + |
| + if (!qpXmlWriter_startElement(log->writer, "EglConfig", numAttribs, attribs) || |
| + !qpXmlWriter_endElement(log->writer, "EglConfig")) |
| + { |
| + qpPrintf("qpTestLog_writeEglConfig(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| + |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Start section in log. |
| - * \param log qpTestLog instance |
| - * \param name Section name |
| - * \param description Human readable description |
| + * \param log qpTestLog instance |
| + * \param name Section name |
| + * \param description Human readable description |
| * \return true if ok, false otherwise |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_startSection (qpTestLog* log, const char* name, const char* description) |
| { |
| - qpXmlAttribute attribs[2]; |
| - int numAttribs = 0; |
| + qpXmlAttribute attribs[2]; |
| + int numAttribs = 0; |
| |
| - DE_ASSERT(log && name); |
| - deMutex_lock(log->lock); |
| + DE_ASSERT(log && name); |
| + deMutex_lock(log->lock); |
| |
| - attribs[numAttribs++] = qpSetStringAttrib("Name", name); |
| - if (description) |
| - attribs[numAttribs++] = qpSetStringAttrib("Description", description); |
| + attribs[numAttribs++] = qpSetStringAttrib("Name", name); |
| + if (description) |
| + attribs[numAttribs++] = qpSetStringAttrib("Description", description); |
| |
| - /* <Section Name="<name>" Description="<description>"> */ |
| - if (!qpXmlWriter_startElement(log->writer, "Section", numAttribs, attribs)) |
| - { |
| - qpPrintf("qpTestLog_startSection(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + /* <Section Name="<name>" Description="<description>"> */ |
| + if (!qpXmlWriter_startElement(log->writer, "Section", numAttribs, attribs)) |
| + { |
| + qpPrintf("qpTestLog_startSection(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SECTION)); |
| + DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SECTION)); |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief End section in log. |
| - * \param log qpTestLog instance |
| + * \param log qpTestLog instance |
| * \return true if ok, false otherwise |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_endSection (qpTestLog* log) |
| { |
| - DE_ASSERT(log); |
| - deMutex_lock(log->lock); |
| + DE_ASSERT(log); |
| + deMutex_lock(log->lock); |
| |
| - /* </Section> */ |
| - if (!qpXmlWriter_endElement(log->writer, "Section")) |
| - { |
| - qpPrintf("qpTestLog_endSection(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + /* </Section> */ |
| + if (!qpXmlWriter_endElement(log->writer, "Section")) |
| + { |
| + qpPrintf("qpTestLog_endSection(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SECTION); |
| + DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SECTION); |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| @@ -1217,20 +1217,20 @@ deBool qpTestLog_endSection (qpTestLog* log) |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_writeKernelSource (qpTestLog* log, const char* source) |
| { |
| - const char* sourceStr = (log->flags & QP_TEST_LOG_EXCLUDE_SHADER_SOURCES) != 0 ? "" : source; |
| + const char* sourceStr = (log->flags & QP_TEST_LOG_EXCLUDE_SHADER_SOURCES) != 0 ? "" : source; |
| |
| - DE_ASSERT(log); |
| - deMutex_lock(log->lock); |
| + DE_ASSERT(log); |
| + deMutex_lock(log->lock); |
| |
| - if (!qpXmlWriter_writeStringElement(log->writer, "KernelSource", sourceStr)) |
| - { |
| - qpPrintf("qpTestLog_writeKernelSource(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + if (!qpXmlWriter_writeStringElement(log->writer, "KernelSource", sourceStr)) |
| + { |
| + qpPrintf("qpTestLog_writeKernelSource(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| @@ -1238,21 +1238,21 @@ deBool qpTestLog_writeKernelSource (qpTestLog* log, const char* source) |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_writeSpirVAssemblySource (qpTestLog* log, const char* source) |
| { |
| - const char* const sourceStr = (log->flags & QP_TEST_LOG_EXCLUDE_SHADER_SOURCES) != 0 ? "" : source; |
| + const char* const sourceStr = (log->flags & QP_TEST_LOG_EXCLUDE_SHADER_SOURCES) != 0 ? "" : source; |
| |
| - deMutex_lock(log->lock); |
| + deMutex_lock(log->lock); |
| |
| - DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SHADERPROGRAM); |
| + DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SHADERPROGRAM); |
| |
| - if (!qpXmlWriter_writeStringElement(log->writer, "SpirVAssemblySource", sourceStr)) |
| - { |
| - qpPrintf("qpTestLog_writeSpirVAssemblySource(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + if (!qpXmlWriter_writeStringElement(log->writer, "SpirVAssemblySource", sourceStr)) |
| + { |
| + qpPrintf("qpTestLog_writeSpirVAssemblySource(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| @@ -1260,222 +1260,222 @@ deBool qpTestLog_writeSpirVAssemblySource (qpTestLog* log, const char* source) |
| *//*--------------------------------------------------------------------*/ |
| deBool qpTestLog_writeCompileInfo (qpTestLog* log, const char* name, const char* description, deBool compileOk, const char* infoLog) |
| { |
| - int numAttribs = 0; |
| - qpXmlAttribute attribs[3]; |
| + int numAttribs = 0; |
| + qpXmlAttribute attribs[3]; |
| |
| - DE_ASSERT(log && name && description && infoLog); |
| - deMutex_lock(log->lock); |
| + DE_ASSERT(log && name && description && infoLog); |
| + deMutex_lock(log->lock); |
| |
| - attribs[numAttribs++] = qpSetStringAttrib("Name", name); |
| - attribs[numAttribs++] = qpSetStringAttrib("Description", description); |
| - attribs[numAttribs++] = qpSetStringAttrib("CompileStatus", compileOk ? "OK" : "Fail"); |
| + attribs[numAttribs++] = qpSetStringAttrib("Name", name); |
| + attribs[numAttribs++] = qpSetStringAttrib("Description", description); |
| + attribs[numAttribs++] = qpSetStringAttrib("CompileStatus", compileOk ? "OK" : "Fail"); |
| |
| - if (!qpXmlWriter_startElement(log->writer, "CompileInfo", numAttribs, attribs) || |
| - !qpXmlWriter_writeStringElement(log->writer, "InfoLog", infoLog) || |
| - !qpXmlWriter_endElement(log->writer, "CompileInfo")) |
| - { |
| - qpPrintf("qpTestLog_writeCompileInfo(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + if (!qpXmlWriter_startElement(log->writer, "CompileInfo", numAttribs, attribs) || |
| + !qpXmlWriter_writeStringElement(log->writer, "InfoLog", infoLog) || |
| + !qpXmlWriter_endElement(log->writer, "CompileInfo")) |
| + { |
| + qpPrintf("qpTestLog_writeCompileInfo(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| deBool qpTestLog_startSampleList (qpTestLog* log, const char* name, const char* description) |
| { |
| - int numAttribs = 0; |
| - qpXmlAttribute attribs[2]; |
| + int numAttribs = 0; |
| + qpXmlAttribute attribs[2]; |
| |
| - DE_ASSERT(log && name && description); |
| - deMutex_lock(log->lock); |
| + DE_ASSERT(log && name && description); |
| + deMutex_lock(log->lock); |
| |
| - attribs[numAttribs++] = qpSetStringAttrib("Name", name); |
| - attribs[numAttribs++] = qpSetStringAttrib("Description", description); |
| + attribs[numAttribs++] = qpSetStringAttrib("Name", name); |
| + attribs[numAttribs++] = qpSetStringAttrib("Description", description); |
| |
| - if (!qpXmlWriter_startElement(log->writer, "SampleList", numAttribs, attribs)) |
| - { |
| - qpPrintf("qpTestLog_startSampleList(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + if (!qpXmlWriter_startElement(log->writer, "SampleList", numAttribs, attribs)) |
| + { |
| + qpPrintf("qpTestLog_startSampleList(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SAMPLELIST)); |
| + DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SAMPLELIST)); |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| deBool qpTestLog_startSampleInfo (qpTestLog* log) |
| { |
| - DE_ASSERT(log); |
| - deMutex_lock(log->lock); |
| + DE_ASSERT(log); |
| + deMutex_lock(log->lock); |
| |
| - if (!qpXmlWriter_startElement(log->writer, "SampleInfo", 0, DE_NULL)) |
| - { |
| - qpPrintf("qpTestLog_startSampleInfo(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + if (!qpXmlWriter_startElement(log->writer, "SampleInfo", 0, DE_NULL)) |
| + { |
| + qpPrintf("qpTestLog_startSampleInfo(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SAMPLEINFO)); |
| + DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SAMPLEINFO)); |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| deBool qpTestLog_writeValueInfo (qpTestLog* log, const char* name, const char* description, const char* unit, qpSampleValueTag tag) |
| { |
| - const char* tagName = QP_LOOKUP_STRING(s_qpSampleValueTagMap, tag); |
| - int numAttribs = 0; |
| - qpXmlAttribute attribs[4]; |
| + const char* tagName = QP_LOOKUP_STRING(s_qpSampleValueTagMap, tag); |
| + int numAttribs = 0; |
| + qpXmlAttribute attribs[4]; |
| |
| - DE_ASSERT(log && name && description && tagName); |
| - deMutex_lock(log->lock); |
| + DE_ASSERT(log && name && description && tagName); |
| + deMutex_lock(log->lock); |
| |
| - DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLEINFO); |
| + DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLEINFO); |
| |
| - attribs[numAttribs++] = qpSetStringAttrib("Name", name); |
| - attribs[numAttribs++] = qpSetStringAttrib("Description", description); |
| - attribs[numAttribs++] = qpSetStringAttrib("Tag", tagName); |
| + attribs[numAttribs++] = qpSetStringAttrib("Name", name); |
| + attribs[numAttribs++] = qpSetStringAttrib("Description", description); |
| + attribs[numAttribs++] = qpSetStringAttrib("Tag", tagName); |
| |
| - if (unit) |
| - attribs[numAttribs++] = qpSetStringAttrib("Unit", unit); |
| + if (unit) |
| + attribs[numAttribs++] = qpSetStringAttrib("Unit", unit); |
| |
| - if (!qpXmlWriter_startElement(log->writer, "ValueInfo", numAttribs, attribs) || |
| - !qpXmlWriter_endElement(log->writer, "ValueInfo")) |
| - { |
| - qpPrintf("qpTestLog_writeValueInfo(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + if (!qpXmlWriter_startElement(log->writer, "ValueInfo", numAttribs, attribs) || |
| + !qpXmlWriter_endElement(log->writer, "ValueInfo")) |
| + { |
| + qpPrintf("qpTestLog_writeValueInfo(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| deBool qpTestLog_endSampleInfo (qpTestLog* log) |
| { |
| - DE_ASSERT(log); |
| - deMutex_lock(log->lock); |
| + DE_ASSERT(log); |
| + deMutex_lock(log->lock); |
| |
| - if (!qpXmlWriter_endElement(log->writer, "SampleInfo")) |
| - { |
| - qpPrintf("qpTestLog_endSampleInfo(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + if (!qpXmlWriter_endElement(log->writer, "SampleInfo")) |
| + { |
| + qpPrintf("qpTestLog_endSampleInfo(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SAMPLEINFO); |
| + DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SAMPLEINFO); |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| deBool qpTestLog_startSample (qpTestLog* log) |
| { |
| - DE_ASSERT(log); |
| - deMutex_lock(log->lock); |
| + DE_ASSERT(log); |
| + deMutex_lock(log->lock); |
| |
| - DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLELIST); |
| + DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLELIST); |
| |
| - if (!qpXmlWriter_startElement(log->writer, "Sample", 0, DE_NULL)) |
| - { |
| - qpPrintf("qpTestLog_startSample(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + if (!qpXmlWriter_startElement(log->writer, "Sample", 0, DE_NULL)) |
| + { |
| + qpPrintf("qpTestLog_startSample(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SAMPLE)); |
| + DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SAMPLE)); |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| deBool qpTestLog_writeValueFloat (qpTestLog* log, double value) |
| { |
| - char tmpString[512]; |
| - doubleToString(value, tmpString, (int)sizeof(tmpString)); |
| + char tmpString[512]; |
| + doubleToString(value, tmpString, (int)sizeof(tmpString)); |
| |
| - deMutex_lock(log->lock); |
| + deMutex_lock(log->lock); |
| |
| - DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLE); |
| + DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLE); |
| |
| - if (!qpXmlWriter_writeStringElement(log->writer, "Value", &tmpString[0])) |
| - { |
| - qpPrintf("qpTestLog_writeSampleValue(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + if (!qpXmlWriter_writeStringElement(log->writer, "Value", &tmpString[0])) |
| + { |
| + qpPrintf("qpTestLog_writeSampleValue(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| deBool qpTestLog_writeValueInteger (qpTestLog* log, deInt64 value) |
| { |
| - char tmpString[64]; |
| - int64ToString(value, tmpString); |
| + char tmpString[64]; |
| + int64ToString(value, tmpString); |
| |
| - deMutex_lock(log->lock); |
| + deMutex_lock(log->lock); |
| |
| - DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLE); |
| + DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLE); |
| |
| - if (!qpXmlWriter_writeStringElement(log->writer, "Value", &tmpString[0])) |
| - { |
| - qpPrintf("qpTestLog_writeSampleValue(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + if (!qpXmlWriter_writeStringElement(log->writer, "Value", &tmpString[0])) |
| + { |
| + qpPrintf("qpTestLog_writeSampleValue(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| deBool qpTestLog_endSample (qpTestLog* log) |
| { |
| - DE_ASSERT(log); |
| - deMutex_lock(log->lock); |
| + DE_ASSERT(log); |
| + deMutex_lock(log->lock); |
| |
| - if (!qpXmlWriter_endElement(log->writer, "Sample")) |
| - { |
| - qpPrintf("qpTestLog_endSample(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + if (!qpXmlWriter_endElement(log->writer, "Sample")) |
| + { |
| + qpPrintf("qpTestLog_endSample(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SAMPLE); |
| + DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SAMPLE); |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| deBool qpTestLog_endSampleList (qpTestLog* log) |
| { |
| - DE_ASSERT(log); |
| - deMutex_lock(log->lock); |
| + DE_ASSERT(log); |
| + deMutex_lock(log->lock); |
| |
| - if (!qpXmlWriter_endElement(log->writer, "SampleList")) |
| - { |
| - qpPrintf("qpTestLog_endSampleList(): Writing XML failed\n"); |
| - deMutex_unlock(log->lock); |
| - return DE_FALSE; |
| - } |
| + if (!qpXmlWriter_endElement(log->writer, "SampleList")) |
| + { |
| + qpPrintf("qpTestLog_endSampleList(): Writing XML failed\n"); |
| + deMutex_unlock(log->lock); |
| + return DE_FALSE; |
| + } |
| |
| - DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SAMPLELIST); |
| + DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SAMPLELIST); |
| |
| - deMutex_unlock(log->lock); |
| - return DE_TRUE; |
| + deMutex_unlock(log->lock); |
| + return DE_TRUE; |
| } |
| |
| deUint32 qpTestLog_getLogFlags (const qpTestLog* log) |
| { |
| - DE_ASSERT(log); |
| - return log->flags; |
| + DE_ASSERT(log); |
| + return log->flags; |
| } |
| |
| const char* qpGetTestResultName (qpTestResult result) |
| { |
| - return QP_LOOKUP_STRING(s_qpTestResultMap, result); |
| + return QP_LOOKUP_STRING(s_qpTestResultMap, result); |
| } |
| diff --git a/src/tests/perf_tests/MultiviewPerf.cpp b/src/tests/perf_tests/MultiviewPerf.cpp |
| index 8c106b493..c3d99d23d 100644 |
| --- a/src/tests/perf_tests/MultiviewPerf.cpp |
| +++ b/src/tests/perf_tests/MultiviewPerf.cpp |
| @@ -273,7 +273,7 @@ void MultiviewCPUBoundBenchmark::initializeBenchmark() |
| "{\n" |
| " vec4 v = vPosition;\n" |
| " v.xy += uOffset;\n" |
| - " gl_Position = v;\n" |
| + " gl_Position = v;\n" |
| "}\n"; |
| |
| const std::string &fs = |
| @@ -371,7 +371,7 @@ void MultiviewGPUBoundBenchmark::initializeBenchmark() |
| " frag_Col3 = vert_Col3;\n" |
| " frag_Col4 = vert_Col4;\n" |
| " frag_Col5 = vert_Col5;\n" |
| - " gl_Position = vPosition;\n" |
| + " gl_Position = vPosition;\n" |
| "}\n"; |
| |
| const std::string &fs = |
| diff --git a/src/tests/third_party/rapidjson/include/rapidjson/prettywriter.h b/src/tests/third_party/rapidjson/include/rapidjson/prettywriter.h |
| index ce2dac5a1..1d7c70f02 100644 |
| --- a/src/tests/third_party/rapidjson/include/rapidjson/prettywriter.h |
| +++ b/src/tests/third_party/rapidjson/include/rapidjson/prettywriter.h |
| @@ -89,7 +89,7 @@ public: |
| } |
| |
| bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } |
| - |
| + |
| bool EndObject(SizeType memberCount = 0) { |
| (void)memberCount; |
| RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); |
| diff --git a/src/tests/third_party/rapidjson/include/rapidjson/reader.h b/src/tests/third_party/rapidjson/include/rapidjson/reader.h |
| index 08425eb9e..bc5cdcf2d 100644 |
| --- a/src/tests/third_party/rapidjson/include/rapidjson/reader.h |
| +++ b/src/tests/third_party/rapidjson/include/rapidjson/reader.h |
| @@ -261,23 +261,23 @@ void SkipWhitespace(InputStream& is) { |
| #ifdef RAPIDJSON_SSE42 |
| //! Skip whitespace with SSE 4.2 pcmpistrm instruction, testing 16 8-byte characters at once. |
| inline const char *SkipWhitespace_SIMD(const char* p) { |
| - // Fast return for single non-whitespace |
| - if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') |
| - ++p; |
| - else |
| - return p; |
| - |
| - // 16-byte align to the next boundary |
| - const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & ~15); |
| - while (p != nextAligned) |
| - if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') |
| - ++p; |
| - else |
| - return p; |
| + // Fast return for single non-whitespace |
| + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') |
| + ++p; |
| + else |
| + return p; |
| + |
| + // 16-byte align to the next boundary |
| + const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & ~15); |
| + while (p != nextAligned) |
| + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') |
| + ++p; |
| + else |
| + return p; |
| |
| // The rest of string using SIMD |
| - static const char whitespace[16] = " \n\r\t"; |
| - const __m128i w = _mm_loadu_si128((const __m128i *)&whitespace[0]); |
| + static const char whitespace[16] = " \n\r\t"; |
| + const __m128i w = _mm_loadu_si128((const __m128i *)&whitespace[0]); |
| |
| for (;; p += 16) { |
| const __m128i s = _mm_load_si128((const __m128i *)p); |
| @@ -298,31 +298,31 @@ inline const char *SkipWhitespace_SIMD(const char* p) { |
| |
| //! Skip whitespace with SSE2 instructions, testing 16 8-byte characters at once. |
| inline const char *SkipWhitespace_SIMD(const char* p) { |
| - // Fast return for single non-whitespace |
| - if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') |
| - ++p; |
| - else |
| - return p; |
| + // Fast return for single non-whitespace |
| + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') |
| + ++p; |
| + else |
| + return p; |
| |
| // 16-byte align to the next boundary |
| - const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & ~15); |
| - while (p != nextAligned) |
| - if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') |
| - ++p; |
| - else |
| - return p; |
| + const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & ~15); |
| + while (p != nextAligned) |
| + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') |
| + ++p; |
| + else |
| + return p; |
| |
| // The rest of string |
| - static const char whitespaces[4][17] = { |
| - " ", |
| - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", |
| - "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r", |
| - "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"}; |
| - |
| - const __m128i w0 = _mm_loadu_si128((const __m128i *)&whitespaces[0][0]); |
| - const __m128i w1 = _mm_loadu_si128((const __m128i *)&whitespaces[1][0]); |
| - const __m128i w2 = _mm_loadu_si128((const __m128i *)&whitespaces[2][0]); |
| - const __m128i w3 = _mm_loadu_si128((const __m128i *)&whitespaces[3][0]); |
| + static const char whitespaces[4][17] = { |
| + " ", |
| + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", |
| + "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r", |
| + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"}; |
| + |
| + const __m128i w0 = _mm_loadu_si128((const __m128i *)&whitespaces[0][0]); |
| + const __m128i w1 = _mm_loadu_si128((const __m128i *)&whitespaces[1][0]); |
| + const __m128i w2 = _mm_loadu_si128((const __m128i *)&whitespaces[2][0]); |
| + const __m128i w3 = _mm_loadu_si128((const __m128i *)&whitespaces[3][0]); |
| |
| for (;; p += 16) { |
| const __m128i s = _mm_load_si128((const __m128i *)p); |
| diff --git a/src/tests/third_party/rapidjson/include/rapidjson/writer.h b/src/tests/third_party/rapidjson/include/rapidjson/writer.h |
| index 6daa78330..98931fe31 100644 |
| --- a/src/tests/third_party/rapidjson/include/rapidjson/writer.h |
| +++ b/src/tests/third_party/rapidjson/include/rapidjson/writer.h |
| @@ -134,7 +134,7 @@ public: |
| } |
| |
| bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } |
| - |
| + |
| bool EndObject(SizeType memberCount = 0) { |
| (void)memberCount; |
| RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level)); |
| diff --git a/include/EGL/eglplatform.h b/include/EGL/eglplatform.h |
| index 333448be348..47d18093c96 100644 |
| --- a/include/EGL/eglplatform.h |
| +++ b/include/EGL/eglplatform.h |
| @@ -100,7 +100,7 @@ typedef struct ANativeWindow* EGLNativeWindowType; |
| typedef struct egl_native_pixmap_t* EGLNativePixmapType; |
| typedef void* EGLNativeDisplayType; |
| |
| -#elif defined(USE_OZONE) |
| +#elif defined(USE_OZONE) || defined(USE_WPE) |
| |
| typedef intptr_t EGLNativeDisplayType; |
| typedef intptr_t EGLNativeWindowType; |