Changeset 225585 in webkit
- Timestamp:
- Dec 6, 2017 11:45:55 AM (6 years ago)
- Location:
- trunk/Source/ThirdParty/ANGLE
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/ThirdParty/ANGLE/ChangeLog
r225584 r225585 1 2017-12-06 Dean Jackson <dino@apple.com> 2 3 Update ANGLE's changes.diff 4 https://bugs.webkit.org/show_bug.cgi?id=180491 5 6 Reviewed by Antoine Quint. 7 8 Here is the list of things we've changed from the 9 ANGLE commit that we merged in. 10 11 * changes.diff: 12 1 13 2017-12-06 Dean Jackson <dino@apple.com> 2 14 -
trunk/Source/ThirdParty/ANGLE/changes.diff
r219446 r225585 1 diff --git a/include/EGL/egl.h b/include/EGL/egl.h2 index 9f9e021..8ada051 1006443 --- a/include/EGL/egl.h4 +++ b/include/EGL/egl.h5 @@ -38,6 +38,12 @@ extern "C" {6 7 #include <EGL/eglplatform.h>8 9 +#if defined(_MSC_VER) && !defined(ANGLE_WEBKIT_WIN)10 +#define EGL_SOFT_LINKING 111 +#else12 +#define EGL_SOFT_LINKING 013 +#endif14 +15 /* Generated on date 20150623 */16 17 /* Generated C header for:18 @@ -118,6 +124,7 @@ typedef void (*__eglMustCastToProperFunctionPointerType)(void);19 #define EGL_VERSION 0x305420 #define EGL_WIDTH 0x305721 #define EGL_WINDOW_BIT 0x000422 +#if !EGL_SOFT_LINKING23 EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);24 EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);25 EGLAPI EGLContext EGLAPIENTRY eglCreateContext (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);26 @@ -142,6 +149,7 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers (EGLDisplay dpy, EGLSurface surface27 EGLAPI EGLBoolean EGLAPIENTRY eglTerminate (EGLDisplay dpy);28 EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL (void);29 EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative (EGLint engine);30 +#endif31 #endif /* EGL_VERSION_1_0 */32 33 #ifndef EGL_VERSION_1_134 @@ -160,10 +168,12 @@ EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative (EGLint engine);35 #define EGL_TEXTURE_RGB 0x305D36 #define EGL_TEXTURE_RGBA 0x305E37 #define EGL_TEXTURE_TARGET 0x308138 +#if !EGL_SOFT_LINKING39 EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage (EGLDisplay dpy, EGLSurface surface, EGLint buffer);40 EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage (EGLDisplay dpy, EGLSurface surface, EGLint buffer);41 EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);42 EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval (EGLDisplay dpy, EGLint interval);43 +#endif44 #endif /* EGL_VERSION_1_1 */45 46 #ifndef EGL_VERSION_1_247 @@ -199,11 +209,13 @@ typedef void *EGLClientBuffer;48 #define EGL_SWAP_BEHAVIOR 0x309349 #define EGL_UNKNOWN ((EGLint)-1)50 #define EGL_VERTICAL_RESOLUTION 0x309151 +#if !EGL_SOFT_LINKING52 EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI (EGLenum api);53 EGLAPI EGLenum EGLAPIENTRY eglQueryAPI (void);54 EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer (EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list);55 EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread (void);56 EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient (void);57 +#endif58 #endif /* EGL_VERSION_1_2 */59 60 #ifndef EGL_VERSION_1_361 @@ -232,7 +244,9 @@ EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient (void);62 #define EGL_OPENGL_API 0x30A263 #define EGL_OPENGL_BIT 0x000864 #define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x040065 +#if !EGL_SOFT_LINKING66 EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext (void);67 +#endif68 #endif /* EGL_VERSION_1_4 */69 70 #ifndef EGL_VERSION_1_571 @@ -284,6 +298,7 @@ typedef void *EGLImage;72 #define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B873 #define EGL_IMAGE_PRESERVED 0x30D274 #define EGL_NO_IMAGE ((EGLImage)0)75 +#if !EGL_SOFT_LINKING76 EGLAPI EGLSync EGLAPIENTRY eglCreateSync (EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list);77 EGLAPI EGLBoolean EGLAPIENTRY eglDestroySync (EGLDisplay dpy, EGLSync sync);78 EGLAPI EGLint EGLAPIENTRY eglClientWaitSync (EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout);79 @@ -294,8 +309,13 @@ EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplay (EGLenum platform, void *nat80 EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurface (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list);81 EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurface (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list);82 EGLAPI EGLBoolean EGLAPIENTRY eglWaitSync (EGLDisplay dpy, EGLSync sync, EGLint flags);83 +#endif84 #endif /* EGL_VERSION_1_5 */85 86 +#if EGL_SOFT_LINKING87 +#include <EGL/eglsoftlinking.h>88 +#endif89 +90 #ifdef __cplusplus91 }92 #endif93 diff --git a/include/GLES2/gl2.h b/include/GLES2/gl2.h94 index 027e1f7..4d710c2 10064495 --- a/include/GLES2/gl2.h96 +++ b/include/GLES2/gl2.h97 @@ -520,6 +520,11 @@ typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GL98 typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v);99 typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);100 typedef void (GL_APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);101 +102 +#if defined(_MSC_VER) && !defined(ANGLE_WEBKIT_WIN)103 +#include <GLES2/gl2softlinking.h>104 +#else105 +106 #ifdef GL_GLEXT_PROTOTYPES107 GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture);108 GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader);109 @@ -664,6 +669,7 @@ GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v);110 GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);111 GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);112 #endif113 +#endif114 #endif /* GL_ES_VERSION_2_0 */115 116 #ifdef __cplusplus117 1 diff --git a/include/GLSLANG/ShaderLang.h b/include/GLSLANG/ShaderLang.h 118 index 965f7ab..f7b0ef71006442 index 1468bb146..2875c02ab 100644 119 3 --- a/include/GLSLANG/ShaderLang.h 120 4 +++ b/include/GLSLANG/ShaderLang.h 121 @@ - 25,7 +25,7 @@5 @@ -8,7 +8,7 @@ 122 6 123 7 #include <stddef.h> … … 128 12 #include <array> 129 13 #include <map> 130 diff --git a/src/common/angleutils.cpp b/src/common/angleutils.cpp 131 index 7099c21..4641928 100644 132 --- a/src/common/angleutils.cpp 133 +++ b/src/common/angleutils.cpp 134 @@ -36,7 +36,10 @@ size_t FormatStringIntoVector(const char *fmt, va_list vararg, std::vector<char> 135 136 std::string FormatString(const char *fmt, va_list vararg) 137 { 14 diff --git a/include/GLSLANG/ShaderVars.h b/include/GLSLANG/ShaderVars.h 15 index 709428aeb..acd9c358f 100644 16 --- a/include/GLSLANG/ShaderVars.h 17 +++ b/include/GLSLANG/ShaderVars.h 18 @@ -281,10 +281,17 @@ struct WorkGroupSize 19 { 20 // Must have a trivial default constructor since it is used in YYSTYPE. 21 WorkGroupSize() = default; 22 +#if defined(__clang__) 138 23 +#pragma clang diagnostic push 139 +#pragma clang diagnostic ignored "-Wexit-time-destructors" 140 static std::vector<char> buffer(512); 24 +#pragma clang diagnostic ignored "-Wmissing-braces" 25 +#endif 26 explicit constexpr WorkGroupSize(int initialSize) 27 : localSizeQualifiers{initialSize, initialSize, initialSize} 28 { 29 } 30 +#if defined(__clang__) 141 31 +#pragma clang diagnostic pop 142 143 size_t len = FormatStringIntoVector(fmt, vararg, buffer); 144 return std::string(&buffer[0], len); 145 diff --git a/src/common/angleutils.h b/src/common/angleutils.h 146 index f5ef7bd..4cb556c 100644 147 --- a/src/common/angleutils.h 148 +++ b/src/common/angleutils.h 149 @@ -116,7 +116,10 @@ inline bool IsMaskFlagSet(T mask, T flag) 150 151 inline const char* MakeStaticString(const std::string &str) 152 { 32 +#endif 33 34 void fill(int fillValue); 35 void setLocalSize(int localSizeX, int localSizeY, int localSizeZ); 36 diff --git a/include/KHR/khrplatform.h b/include/KHR/khrplatform.h 37 old mode 100755 38 new mode 100644 39 index 68fca4827..07b61b9bd 40 --- a/include/KHR/khrplatform.h 41 +++ b/include/KHR/khrplatform.h 42 @@ -282,4 +282,4 @@ typedef enum { 43 KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM 44 } khronos_boolean_enum_t; 45 46 -#endif /* __khrplatform_h_ */ 47 \ No newline at end of file 48 +#endif /* __khrplatform_h_ */ 49 diff --git a/src/common/third_party/smhasher/src/PMurHash.cpp b/src/common/third_party/smhasher/src/PMurHash.cpp 50 index 071bc3153..2d608e97d 100644 51 --- a/src/common/third_party/smhasher/src/PMurHash.cpp 52 +++ b/src/common/third_party/smhasher/src/PMurHash.cpp 53 @@ -74,6 +74,12 @@ on big endian machines, or a byte-by-byte read if the endianess is unknown. 54 * ROTL32(x,r) Rotate x left by r bits 55 */ 56 57 +#if !defined(__BYTE_ORDER) && defined(__GNUC__) 58 + #define __BIG_ENDIAN __ORDER_BIG_ENDIAN__ 59 + #define __LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__ 60 + #define __BYTE_ORDER __BYTE_ORDER__ 61 +#endif 62 + 63 /* Convention is to define __BYTE_ORDER == to one of these values */ 64 #if !defined(__BIG_ENDIAN) 65 #define __BIG_ENDIAN 4321 66 @@ -84,7 +90,9 @@ on big endian machines, or a byte-by-byte read if the endianess is unknown. 67 68 /* I386 */ 69 #if defined(_M_IX86) || defined(__i386__) || defined(__i386) || defined(i386) 70 - #define __BYTE_ORDER __LITTLE_ENDIAN 71 + #if !defined(__BYTE_ORDER) 72 + #define __BYTE_ORDER __LITTLE_ENDIAN 73 + #endif 74 #define UNALIGNED_SAFE 75 #endif 76 77 @@ -111,7 +119,14 @@ on big endian machines, or a byte-by-byte read if the endianess is unknown. 78 /* Now find best way we can to READ_UINT32 */ 79 #if __BYTE_ORDER==__LITTLE_ENDIAN 80 /* CPU endian matches murmurhash algorithm, so read 32-bit word directly */ 81 +#if defined(__clang__) 153 82 +#pragma clang diagnostic push 154 +#pragma clang diagnostic ignored "-Wexit-time-destructors" 155 static std::set<std::string> strings; 83 +#pragma clang diagnostic ignored "-Wcast-align" 84 +#endif 85 #define READ_UINT32(ptr) (*((uint32_t*)(ptr))) 86 +#if defined(__clang__) 156 87 +#pragma clang diagnostic pop 157 std::set<std::string>::iterator it = strings.find(str); 158 if (it != strings.end()) 159 { 160 diff --git a/src/common/debug.cpp b/src/common/debug.cpp 161 index 746da5e..47e1565 100644 162 --- a/src/common/debug.cpp 163 +++ b/src/common/debug.cpp 164 @@ -69,7 +69,10 @@ void output(bool traceInDebugOnly, MessageType messageType, DebugTraceOutputType 165 { 166 if (DebugAnnotationsActive()) 167 { 88 +#endif 89 #elif __BYTE_ORDER==__BIG_ENDIAN 90 /* TODO: Add additional cases below where a compiler provided bswap32 is available */ 91 #if defined(__GNUC__) && (__GNUC__>4 || (__GNUC__==4 && __GNUC_MINOR__>=3)) 92 @@ -218,14 +233,28 @@ void PMurHash32_Process(uint32_t *ph1, uint32_t *pcarry, const void *key, int le 93 switch(n) { /* how many bytes in c */ 94 case 0: /* c=[----] w=[3210] b=[3210]=w c'=[----] */ 95 for( ; ptr < end ; ptr+=4) { 96 +#if defined(__clang__) 168 97 +#pragma clang diagnostic push 169 +#pragma clang diagnostic ignored "-Wexit-time-destructors" 170 static std::vector<char> buffer(512); 98 +#pragma clang diagnostic ignored "-Wcast-align" 99 +#endif 100 uint32_t k1 = READ_UINT32(ptr); 101 +#if defined(__clang__) 171 102 +#pragma clang diagnostic pop 172 size_t len = FormatStringIntoVector(format, vararg, buffer); 173 std::wstring formattedWideMessage(buffer.begin(), buffer.begin() + len); 174 175 diff --git a/src/common/mathutil.cpp b/src/common/mathutil.cpp 176 index acbcbdf..ba6da52 100644 177 --- a/src/common/mathutil.cpp 178 +++ b/src/common/mathutil.cpp 179 @@ -31,9 +31,12 @@ static const int g_sharedexp_mantissabits = 9; 180 // Emax is the maximum allowed biased exponent value (31) 181 static const int g_sharedexp_maxexponent = 31; 182 103 +#endif 104 DOBLOCK(h1, k1); 105 } 106 break; 107 case 1: /* c=[0---] w=[4321] b=[3210]=c>>24|w<<8 c'=[4---] */ 108 for( ; ptr < end ; ptr+=4) { 109 uint32_t k1 = c>>24; 110 +#if defined(__clang__) 183 111 +#pragma clang diagnostic push 184 +#pragma clang diagnostic ignored "-W global-constructors"185 static const float g_sharedexp_max = ((pow(2.0f, g_sharedexp_mantissabits) - 1) / 186 pow(2.0f, g_sharedexp_mantissabits)) *187 pow(2.0f, g_sharedexp_maxexponent - g_sharedexp_bias); 112 +#pragma clang diagnostic ignored "-Wcast-align" 113 +#endif 114 c = READ_UINT32(ptr); 115 +#if defined(__clang__) 188 116 +#pragma clang diagnostic pop 189 190 unsigned int convertRGBFloatsTo999E5(float red, float green, float blue) 191 { 192 diff --git a/src/common/version.h b/src/common/version.h 193 index e7ffa7c..b653ae3 100644 194 --- a/src/common/version.h 195 +++ b/src/common/version.h 196 @@ -7,7 +7,7 @@ 197 #ifndef COMMON_VERSION_H_ 198 #define COMMON_VERSION_H_ 199 200 -#include "id/commit.h" 201 +#include "commit.h" 202 203 #define ANGLE_MAJOR_VERSION 2 204 #define ANGLE_MINOR_VERSION 1 117 +#endif 118 k1 |= c<<8; 119 DOBLOCK(h1, k1); 120 } 121 @@ -233,7 +262,14 @@ void PMurHash32_Process(uint32_t *ph1, uint32_t *pcarry, const void *key, int le 122 case 2: /* c=[10--] w=[5432] b=[3210]=c>>16|w<<16 c'=[54--] */ 123 for( ; ptr < end ; ptr+=4) { 124 uint32_t k1 = c>>16; 125 +#if defined(__clang__) 126 +#pragma clang diagnostic push 127 +#pragma clang diagnostic ignored "-Wcast-align" 128 +#endif 129 c = READ_UINT32(ptr); 130 +#if defined(__clang__) 131 +#pragma clang diagnostic pop 132 +#endif 133 k1 |= c<<16; 134 DOBLOCK(h1, k1); 135 } 136 @@ -241,7 +277,14 @@ void PMurHash32_Process(uint32_t *ph1, uint32_t *pcarry, const void *key, int le 137 case 3: /* c=[210-] w=[6543] b=[3210]=c>>8|w<<24 c'=[654-] */ 138 for( ; ptr < end ; ptr+=4) { 139 uint32_t k1 = c>>8; 140 +#if defined(__clang__) 141 +#pragma clang diagnostic push 142 +#pragma clang diagnostic ignored "-Wcast-align" 143 +#endif 144 c = READ_UINT32(ptr); 145 +#if defined(__clang__) 146 +#pragma clang diagnostic pop 147 +#endif 148 k1 |= c<<24; 149 DOBLOCK(h1, k1); 150 } 205 151 diff --git a/src/compiler/preprocessor/ExpressionParser.cpp b/src/compiler/preprocessor/ExpressionParser.cpp 206 index f737a2e..a8df235100644152 index ede334619..c0f8b9c97 100644 207 153 --- a/src/compiler/preprocessor/ExpressionParser.cpp 208 154 +++ b/src/compiler/preprocessor/ExpressionParser.cpp … … 216 162 Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. 217 163 diff --git a/src/compiler/preprocessor/Tokenizer.cpp b/src/compiler/preprocessor/Tokenizer.cpp 218 index 40e910e..fee20c6100644164 index d8a9b9a12..d7fad68f1 100644 219 165 --- a/src/compiler/preprocessor/Tokenizer.cpp 220 166 +++ b/src/compiler/preprocessor/Tokenizer.cpp 221 @@ - 969,7 +969,7 @@ static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner);222 static int yy_flex_strlen ( yyconst char * ,yyscan_t yyscanner);167 @@ -1148,7 +1148,7 @@ static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner); 168 static int yy_flex_strlen ( const char * , yyscan_t yyscanner); 223 169 #endif 224 170 225 171 -#ifndef YY_NO_INPUT 226 +#if 0 227 172 +#if 0 // #ifndef YY_NO_INPUT 228 173 #ifdef __cplusplus 229 static int yyinput (yyscan_t yyscanner ); 230 @@ -1858,7 +1858,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) 174 static int yyinput ( yyscan_t yyscanner ); 175 #else 176 @@ -2049,7 +2049,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) 231 177 232 178 #endif 233 179 234 180 -#ifndef YY_NO_INPUT 235 +#if 0 181 +#if 0 // #ifndef YY_NO_INPUT 236 182 #ifdef __cplusplus 237 183 static int yyinput (yyscan_t yyscanner) 238 184 #else 239 @@ -1883,7 +1883,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) 240 241 else 242 { /* need more input */ 243 - int offset = yyg->yy_c_buf_p - yyg->yytext_ptr; 244 + auto offset = yyg->yy_c_buf_p - yyg->yytext_ptr; 245 ++yyg->yy_c_buf_p; 246 247 switch ( yy_get_next_buffer( yyscanner ) ) 248 @@ -2014,7 +2014,7 @@ static void pp_load_buffer_state (yyscan_t yyscanner) 249 if ( ! b ) 250 YY_FATAL_ERROR( "out of dynamic memory in pp_create_buffer()" ); 251 252 - b->yy_buf_size = (yy_size_t)size; 253 + b->yy_buf_size = size; 254 255 /* yy_ch_buf has to be 2 characters longer than the size given because 256 * we need to put in 2 end-of-buffer characters. 257 diff --git a/src/compiler/translator/Operator.cpp b/src/compiler/translator/Operator.cpp 258 index 57878b9..0b693e2 100644 259 --- a/src/compiler/translator/Operator.cpp 260 +++ b/src/compiler/translator/Operator.cpp 261 @@ -224,4 +224,4 @@ bool IsAssignment(TOperator op) 262 default: 263 return false; 185 diff --git a/src/compiler/translator/ParseContext.cpp b/src/compiler/translator/ParseContext.cpp 186 index c97f91d78..d0a4f6aeb 100644 187 --- a/src/compiler/translator/ParseContext.cpp 188 +++ b/src/compiler/translator/ParseContext.cpp 189 @@ -3240,8 +3240,11 @@ TIntermFunctionPrototype *TParseContext::addFunctionPrototypeDeclaration( 264 190 } 265 -} 266 \ No newline at end of file 267 +} 268 diff --git a/src/compiler/translator/OutputHLSL.h b/src/compiler/translator/OutputHLSL.h 269 index db78859..f296dd9 100644 270 --- a/src/compiler/translator/OutputHLSL.h 271 +++ b/src/compiler/translator/OutputHLSL.h 272 @@ -56,21 +56,21 @@ class OutputHLSL : public TIntermTraverser 273 void header(TInfoSinkBase &out, const BuiltInFunctionEmulator *builtInFunctionEmulator); 274 275 // Visit AST nodes and output their code to the body stream 276 - void visitSymbol(TIntermSymbol*); 277 - void visitRaw(TIntermRaw*); 278 - void visitConstantUnion(TIntermConstantUnion*); 279 + void visitSymbol(TIntermSymbol*) override; 280 + void visitRaw(TIntermRaw*) override; 281 + void visitConstantUnion(TIntermConstantUnion*) override; 282 bool visitSwizzle(Visit visit, TIntermSwizzle *node) override; 283 - bool visitBinary(Visit visit, TIntermBinary*); 284 - bool visitUnary(Visit visit, TIntermUnary*); 285 - bool visitTernary(Visit visit, TIntermTernary *); 286 - bool visitIfElse(Visit visit, TIntermIfElse *); 287 - bool visitSwitch(Visit visit, TIntermSwitch *); 288 - bool visitCase(Visit visit, TIntermCase *); 289 + bool visitBinary(Visit visit, TIntermBinary*) override; 290 + bool visitUnary(Visit visit, TIntermUnary*) override; 291 + bool visitTernary(Visit visit, TIntermTernary *) override; 292 + bool visitIfElse(Visit visit, TIntermIfElse *) override; 293 + bool visitSwitch(Visit visit, TIntermSwitch *) override; 294 + bool visitCase(Visit visit, TIntermCase *) override; 295 bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override; 296 - bool visitAggregate(Visit visit, TIntermAggregate*); 297 - bool visitBlock(Visit visit, TIntermBlock *node); 298 - bool visitLoop(Visit visit, TIntermLoop*); 299 - bool visitBranch(Visit visit, TIntermBranch*); 300 + bool visitAggregate(Visit visit, TIntermAggregate*) override; 301 + bool visitBlock(Visit visit, TIntermBlock *node) override; 302 + bool visitLoop(Visit visit, TIntermLoop*) override; 303 + bool visitBranch(Visit visit, TIntermBranch*) override; 304 305 bool isSingleStatement(TIntermNode *node); 306 bool handleExcessiveLoop(TInfoSinkBase &out, TIntermLoop *node); 307 diff --git a/src/compiler/translator/RewriteTexelFetchOffset.cpp b/src/compiler/translator/RewriteTexelFetchOffset.cpp 308 index 487c909..6d0c866 100644 309 --- a/src/compiler/translator/RewriteTexelFetchOffset.cpp 310 +++ b/src/compiler/translator/RewriteTexelFetchOffset.cpp 311 @@ -167,4 +167,4 @@ void RewriteTexelFetchOffset(TIntermNode *root, 312 Traverser::Apply(root, symbolTable, shaderVersion); 313 } 314 315 -} // namespace sh 316 \ No newline at end of file 317 +} // namespace sh 318 diff --git a/src/compiler/translator/RewriteTexelFetchOffset.h b/src/compiler/translator/RewriteTexelFetchOffset.h 319 index 4218f0b..c6db664 100644 320 --- a/src/compiler/translator/RewriteTexelFetchOffset.h 321 +++ b/src/compiler/translator/RewriteTexelFetchOffset.h 322 @@ -27,4 +27,4 @@ void RewriteTexelFetchOffset(TIntermNode *root, 323 324 } // namespace sh 325 326 -#endif // COMPILER_TRANSLATOR_REWRITE_TEXELFETCHOFFSET_H_ 327 \ No newline at end of file 328 +#endif // COMPILER_TRANSLATOR_REWRITE_TEXELFETCHOFFSET_H_ 329 diff --git a/src/compiler/translator/RewriteUnaryMinusOperatorInt.cpp b/src/compiler/translator/RewriteUnaryMinusOperatorInt.cpp 330 index ef708cb..d205805 100644 331 --- a/src/compiler/translator/RewriteUnaryMinusOperatorInt.cpp 332 +++ b/src/compiler/translator/RewriteUnaryMinusOperatorInt.cpp 333 @@ -109,4 +109,4 @@ void RewriteUnaryMinusOperatorInt(TIntermNode *root) 334 Traverser::Apply(root); 335 } 336 337 -} // namespace sh 338 \ No newline at end of file 339 +} // namespace sh 340 diff --git a/src/compiler/translator/RewriteUnaryMinusOperatorInt.h b/src/compiler/translator/RewriteUnaryMinusOperatorInt.h 341 index 50f0c44..802ed57 100644 342 --- a/src/compiler/translator/RewriteUnaryMinusOperatorInt.h 343 +++ b/src/compiler/translator/RewriteUnaryMinusOperatorInt.h 344 @@ -17,4 +17,4 @@ void RewriteUnaryMinusOperatorInt(TIntermNode *root); 345 346 } // namespace sh 347 348 -#endif // COMPILER_TRANSLATOR_REWRITEUNARYMINUSOPERATORINT_H_ 349 \ No newline at end of file 350 +#endif // COMPILER_TRANSLATOR_REWRITEUNARYMINUSOPERATORINT_H_ 191 function->setHasPrototypeDeclaration(); 192 193 + // WebKit note: We currently pass true instead of false for the last parameter 194 + // here because some compilers have an issue with nameless parameters in function 195 + // declarations. 196 TIntermFunctionPrototype *prototype = 197 - createPrototypeNodeFromFunction(*function, location, false); 198 + createPrototypeNodeFromFunction(*function, location, true); 199 200 symbolTable.pop(); 201 351 202 diff --git a/src/compiler/translator/TranslatorHLSL.h b/src/compiler/translator/TranslatorHLSL.h 352 index 213d860..d2add14100644203 index d7005a603..e8436e98e 100644 353 204 --- a/src/compiler/translator/TranslatorHLSL.h 354 205 +++ b/src/compiler/translator/TranslatorHLSL.h 355 @@ -1 3,7 +13,9@@ class TranslatorHLSL : public TCompiler206 @@ -16,7 +16,7 @@ class TranslatorHLSL : public TCompiler 356 207 { 357 208 public: 358 209 TranslatorHLSL(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output); 359 +#ifdef ANGLE_ENABLE_HLSL 360 TranslatorHLSL *getAsTranslatorHLSL() override { return this; } 361 +#endif // ANGLE_ENABLE_HLSL 362 363 bool hasInterfaceBlock(const std::string &interfaceBlockName) const; 364 unsigned int getInterfaceBlockRegister(const std::string &interfaceBlockName) const; 210 - TranslatorHLSL *getAsTranslatorHLSL() override { return this; } 211 + TranslatorHLSL *getAsTranslatorHLSL() { return this; } 212 213 bool hasUniformBlock(const std::string &interfaceBlockName) const; 214 unsigned int getUniformBlockRegister(const std::string &interfaceBlockName) const; 365 215 diff --git a/src/compiler/translator/glslang_tab.cpp b/src/compiler/translator/glslang_tab.cpp 366 index d9b8ada..3e50fbc 100644216 index ce4aacf40..14cd5360c 100644 367 217 --- a/src/compiler/translator/glslang_tab.cpp 368 218 +++ b/src/compiler/translator/glslang_tab.cpp … … 376 226 Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. 377 227 diff --git a/src/compiler/translator/glslang_tab.h b/src/compiler/translator/glslang_tab.h 378 index d0e691d..74a56da100644228 index 1f5308551..cb43a46df 100644 379 229 --- a/src/compiler/translator/glslang_tab.h 380 230 +++ b/src/compiler/translator/glslang_tab.h … … 387 237 388 238 Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. 389 diff --git a/src/libANGLE/ Caps.cpp b/src/libANGLE/Caps.cpp390 index 47e1cf0..0f4d69d100644391 --- a/src/libANGLE/ Caps.cpp392 +++ b/src/libANGLE/ Caps.cpp393 @@ - 77,7 +77,10 @@ void TextureCapsMap::clear()394 395 const TextureCaps &TextureCapsMap::get(GLenum internalFormat) const396 {239 diff --git a/src/libANGLE/MemoryProgramCache.cpp b/src/libANGLE/MemoryProgramCache.cpp 240 index 9eec12e3e..2a9c6836a 100644 241 --- a/src/libANGLE/MemoryProgramCache.cpp 242 +++ b/src/libANGLE/MemoryProgramCache.cpp 243 @@ -234,7 +234,10 @@ LinkResult MemoryProgramCache::Deserialize(const Context *context, 244 245 static_assert(MAX_VERTEX_ATTRIBS <= sizeof(unsigned long) * 8, 246 "Too many vertex attribs for mask"); 397 247 +#pragma clang diagnostic push 398 +#pragma clang diagnostic ignored "-W exit-time-destructors"399 stat ic TextureCaps defaultUnsupportedTexture;248 +#pragma clang diagnostic ignored "-Wconversion" 249 state->mActiveAttribLocationsMask = stream.readInt<unsigned long>(); 400 250 +#pragma clang diagnostic pop 401 InternalFormatToCapsMap::const_iterator iter = mCapsMap.find(internalFormat);402 return (iter != mCapsMap.end()) ? iter->second : defaultUnsupportedTexture;403 }404 @@ - 594,7 +597,10 @@ const ExtensionInfoMap &GetExtensionInfoMap()405 return map;406 };407 251 252 unsigned int attribCount = stream.readInt<unsigned int>(); 253 ASSERT(state->mAttributes.empty()); 254 @@ -408,7 +411,10 @@ LinkResult MemoryProgramCache::Deserialize(const Context *context, 255 state->mAtomicCounterUniformRange = RangeUI(atomicCounterRangeLow, atomicCounterRangeHigh); 256 257 static_assert(SHADER_TYPE_MAX <= sizeof(unsigned long) * 8, "Too many shader types"); 408 258 +#pragma clang diagnostic push 409 +#pragma clang diagnostic ignored "-W exit-time-destructors"410 stat ic const ExtensionInfoMap extensionInfo = buildExtensionInfoMap();259 +#pragma clang diagnostic ignored "-Wconversion" 260 state->mLinkedShaderStages = stream.readInt<unsigned long>(); 411 261 +#pragma clang diagnostic pop 412 return extensionInfo; 413 } 414 415 diff --git a/src/libANGLE/Device.cpp b/src/libANGLE/Device.cpp 416 index eb30b20..a94d500 100644 417 --- a/src/libANGLE/Device.cpp 418 +++ b/src/libANGLE/Device.cpp 419 @@ -38,7 +38,10 @@ static std::string GenerateExtensionsString(const T &extensions) 420 typedef std::set<egl::Device *> DeviceSet; 421 static DeviceSet *GetDeviceSet() 422 { 262 263 return program->getImplementation()->load(context, infoLog, &stream); 264 } 265 diff --git a/src/libANGLE/Platform.cpp b/src/libANGLE/Platform.cpp 266 index 702091624..c51289423 100644 267 --- a/src/libANGLE/Platform.cpp 268 +++ b/src/libANGLE/Platform.cpp 269 @@ -15,7 +15,14 @@ 270 namespace 271 { 272 // TODO(jmadill): Make methods owned by egl::Display. 273 -angle::PlatformMethods g_platformMethods; 274 +#if defined(__clang__) 423 275 +#pragma clang diagnostic push 424 +#pragma clang diagnostic ignored "-Wexit-time-destructors" 425 static DeviceSet devices; 276 +#pragma clang diagnostic ignored "-Wglobal-constructors" 277 +#endif 278 + angle::PlatformMethods g_platformMethods; 279 +#if defined(__clang__) 426 280 +#pragma clang diagnostic pop 427 return &devices; 428 } 429 430 diff --git a/src/libANGLE/Display.cpp b/src/libANGLE/Display.cpp 431 index 92d7dda..5711117 100644 432 --- a/src/libANGLE/Display.cpp 433 +++ b/src/libANGLE/Display.cpp 434 @@ -90,21 +90,30 @@ typedef std::map<EGLNativeWindowType, Surface*> WindowSurfaceMap; 435 // associated with it. 436 static WindowSurfaceMap *GetWindowSurfaces() 437 { 438 +#pragma clang diagnostic push 439 +#pragma clang diagnostic ignored "-Wexit-time-destructors" 440 static WindowSurfaceMap windowSurfaces; 441 +#pragma clang diagnostic pop 442 return &windowSurfaces; 443 } 444 445 typedef std::map<EGLNativeDisplayType, Display *> ANGLEPlatformDisplayMap; 446 static ANGLEPlatformDisplayMap *GetANGLEPlatformDisplayMap() 447 { 448 +#pragma clang diagnostic push 449 +#pragma clang diagnostic ignored "-Wexit-time-destructors" 450 static ANGLEPlatformDisplayMap displays; 451 +#pragma clang diagnostic pop 452 return &displays; 453 } 454 455 typedef std::map<Device *, Display *> DevicePlatformDisplayMap; 456 static DevicePlatformDisplayMap *GetDevicePlatformDisplayMap() 457 { 458 +#pragma clang diagnostic push 459 +#pragma clang diagnostic ignored "-Wexit-time-destructors" 460 static DevicePlatformDisplayMap displays; 461 +#pragma clang diagnostic pop 462 return &displays; 463 } 464 465 @@ -921,7 +930,10 @@ const ClientExtensions &Display::getClientExtensions() 466 467 const std::string &Display::getClientExtensionString() 468 { 469 +#pragma clang diagnostic push 470 +#pragma clang diagnostic ignored "-Wexit-time-destructors" 471 static const std::string clientExtensionsString = GenerateExtensionsString(getClientExtensions()); 472 +#pragma clang diagnostic pop 473 return clientExtensionsString; 474 } 475 476 diff --git a/src/libANGLE/HandleRangeAllocator.cpp b/src/libANGLE/HandleRangeAllocator.cpp 477 index f219f95..3831aca 100644 478 --- a/src/libANGLE/HandleRangeAllocator.cpp 479 +++ b/src/libANGLE/HandleRangeAllocator.cpp 480 @@ -223,4 +223,4 @@ bool HandleRangeAllocator::isUsed(GLuint handle) const 481 return current->second >= handle; 482 } 483 484 -} // namespace gl 485 \ No newline at end of file 486 +} // namespace gl 487 diff --git a/src/libANGLE/HandleRangeAllocator.h b/src/libANGLE/HandleRangeAllocator.h 488 index 20f9a11..1023a84 100644 489 --- a/src/libANGLE/HandleRangeAllocator.h 490 +++ b/src/libANGLE/HandleRangeAllocator.h 491 @@ -56,4 +56,4 @@ class HandleRangeAllocator final : angle::NonCopyable 492 493 } // namespace gl 494 495 -#endif // LIBANGLE_HANDLERANGEALLOCATOR_H_ 496 \ No newline at end of file 497 +#endif // LIBANGLE_HANDLERANGEALLOCATOR_H_ 498 diff --git a/src/libANGLE/Path.h b/src/libANGLE/Path.h 499 index b103c84..85f49c1 100644 500 --- a/src/libANGLE/Path.h 501 +++ b/src/libANGLE/Path.h 502 @@ -68,4 +68,4 @@ class Path final : angle::NonCopyable 503 504 } // namespace gl 505 506 -#endif // LIBANGLE_PATH_H_ 507 \ No newline at end of file 508 +#endif // LIBANGLE_PATH_H_ 509 diff --git a/src/libANGLE/formatutils.cpp b/src/libANGLE/formatutils.cpp 510 index ff285dd..55a5fc8 100644 511 --- a/src/libANGLE/formatutils.cpp 512 +++ b/src/libANGLE/formatutils.cpp 513 @@ -615,7 +615,10 @@ static InternalFormatInfoMap BuildInternalFormatInfoMap() 514 515 static const InternalFormatInfoMap &GetInternalFormatMap() 516 { 517 +#pragma clang diagnostic push 518 +#pragma clang diagnostic ignored "-Wexit-time-destructors" 519 static const InternalFormatInfoMap formatMap = BuildInternalFormatInfoMap(); 520 +#pragma clang diagnostic pop 521 return formatMap; 522 } 523 524 @@ -859,7 +862,10 @@ GLenum GetSizedInternalFormat(GLenum internalFormat, GLenum type) 525 526 const FormatSet &GetAllSizedInternalFormats() 527 { 528 +#pragma clang diagnostic push 529 +#pragma clang diagnostic ignored "-Wexit-time-destructors" 530 static FormatSet formatSet = BuildAllSizedInternalFormatSet(); 531 +#pragma clang diagnostic pop 532 return formatSet; 533 } 534 535 diff --git a/src/libANGLE/renderer/PathImpl.h b/src/libANGLE/renderer/PathImpl.h 536 index 3607f69..cb03ed6 100644 537 --- a/src/libANGLE/renderer/PathImpl.h 538 +++ b/src/libANGLE/renderer/PathImpl.h 539 @@ -33,4 +33,4 @@ class PathImpl : angle::NonCopyable 540 541 } // namespace rx 542 543 -#endif // LIBANGLE_RENDERER_PATHIMPL_H_ 544 \ No newline at end of file 545 +#endif // LIBANGLE_RENDERER_PATHIMPL_H_ 546 diff --git a/src/libANGLE/validationES3.cpp b/src/libANGLE/validationES3.cpp 547 index 2f93651..49aa604 100644 548 --- a/src/libANGLE/validationES3.cpp 549 +++ b/src/libANGLE/validationES3.cpp 550 @@ -524,7 +524,10 @@ static bool IsValidES3CopyTexImageCombination(const Format &textureFormat, 551 const auto &textureFormatInfo = *textureFormat.info; 552 const auto &framebufferFormatInfo = *framebufferFormat.info; 553 554 +#pragma clang diagnostic push 555 +#pragma clang diagnostic ignored "-Wexit-time-destructors" 556 static const CopyConversionSet conversionSet = BuildValidES3CopyTexImageCombinations(); 557 +#pragma clang diagnostic pop 558 if (conversionSet.find(CopyConversion(textureFormatInfo.format, 559 framebufferFormatInfo.format)) != conversionSet.end()) 560 { 561 diff --git a/include/EGL/eglplatform.h b/include/EGL/eglplatform.h 562 index 9bb75910ac0..ccaf7e6f343 100644 563 --- a/include/EGL/eglplatform.h 564 +++ b/include/EGL/eglplatform.h 565 @@ -89,6 +89,12 @@ typedef int EGLNativeDisplayType; 566 typedef void *EGLNativeWindowType; 567 typedef void *EGLNativePixmapType; 568 569 +#elif defined(WL_EGL_PLATFORM) 570 + 571 +typedef struct wl_display *EGLNativeDisplayType; 572 +typedef struct wl_egl_pixmap *EGLNativePixmapType; 573 +typedef struct wl_egl_window *EGLNativeWindowType; 574 + 575 #elif defined(__ANDROID__) || defined(ANDROID) 576 577 #include <android/native_window.h> 578 @@ -107,6 +113,8 @@ typedef intptr_t EGLNativePixmapType; 579 580 #elif defined(__unix__) 581 582 +#if defined(ANGLE_USE_X11) && !defined(MESA_EGL_NO_X11_HEADERS) 583 + 584 /* X11 (tentative) */ 585 #include <X11/Xlib.h> 586 #include <X11/Xutil.h> 587 @@ -116,6 +124,14 @@ typedef Pixmap EGLNativePixmapType; 588 typedef Window EGLNativeWindowType; 589 281 +#endif 282 } // anonymous namespace 283 284 angle::PlatformMethods::PlatformMethods() 285 diff --git a/src/tests/compiler_tests/QualificationOrder_test.cpp b/src/tests/compiler_tests/QualificationOrder_test.cpp 286 index c0249dbb9..c82acffd7 100644 287 --- a/src/tests/compiler_tests/QualificationOrder_test.cpp 288 +++ b/src/tests/compiler_tests/QualificationOrder_test.cpp 289 @@ -429,7 +429,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersInvariant) 290 "}\n" 291 "void main()\n" 292 "{\n" 293 - " gl_FragColor = vec4(foo0(value));\n" 294 + " gl_FragColor = vec4(foo0(value));\n" 295 "}\n"; 296 297 if (compile(shaderString)) 298 @@ -449,7 +449,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersAttribute) 299 "}\n" 300 "void main()\n" 301 "{\n" 302 - " gl_FragColor = vec4(foo0(value));\n" 303 + " gl_FragColor = vec4(foo0(value));\n" 304 "}\n"; 305 306 if (compile(shaderString)) 307 @@ -469,7 +469,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersVarying) 308 "}\n" 309 "void main()\n" 310 "{\n" 311 - " gl_FragColor = vec4(foo0(value));\n" 312 + " gl_FragColor = vec4(foo0(value));\n" 313 "}\n"; 314 315 if (compile(shaderString)) 316 @@ -491,7 +491,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersLayout) 317 "out vec4 colorOUT;\n" 318 "void main()\n" 319 "{\n" 320 - " colorOUT = vec4(foo0(value));\n" 321 + " colorOUT = vec4(foo0(value));\n" 322 "}\n"; 323 324 if (compile(shaderString)) 325 @@ -513,7 +513,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersCentroidIn 326 "out vec4 colorOUT;\n" 327 "void main()\n" 328 "{\n" 329 - " colorOUT = vec4(foo0(value));\n" 330 + " colorOUT = vec4(foo0(value));\n" 331 "}\n"; 332 333 if (compile(shaderString)) 334 @@ -535,7 +535,7 @@ TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersFlatIn) 335 "out vec4 colorOUT;\n" 336 "void main()\n" 337 "{\n" 338 - " colorOUT = vec4(foo0(value));\n" 339 + " colorOUT = vec4(foo0(value));\n" 340 "}\n"; 341 342 if (compile(shaderString)) 343 diff --git a/src/tests/deqp_support/es2fShaderMatrixTests.cpp b/src/tests/deqp_support/es2fShaderMatrixTests.cpp 344 index 9feb4dcfa..54d8474fd 100644 345 --- a/src/tests/deqp_support/es2fShaderMatrixTests.cpp 346 +++ b/src/tests/deqp_support/es2fShaderMatrixTests.cpp 347 @@ -69,77 +69,77 @@ using tcu::Mat4; 348 // Uniform / constant values for tests. 349 // \note Input1 should not contain 0 components as it is used as divisor in div cases. 350 // \todo [2012-02-14 pyry] Make these dynamic. 351 -static const float s_constInFloat[2] = { 0.5f, -0.2f }; 352 -static const Vec2 s_constInVec2[2] = { Vec2(1.2f, 0.5f), Vec2(0.5f, 1.0f) }; 353 -static const Vec3 s_constInVec3[2] = { Vec3(1.1f, 0.1f, 0.5f), Vec3(-0.2f, 0.5f, 0.8f) }; 354 -static const Vec4 s_constInVec4[2] = { Vec4(1.4f, 0.2f, -0.5f, 0.7f), Vec4(0.2f, -1.0f, 0.5f, 0.8f) }; 355 +static const float s_constInFloat[2] = { 0.5f, -0.2f }; 356 +static const Vec2 s_constInVec2[2] = { Vec2(1.2f, 0.5f), Vec2(0.5f, 1.0f) }; 357 +static const Vec3 s_constInVec3[2] = { Vec3(1.1f, 0.1f, 0.5f), Vec3(-0.2f, 0.5f, 0.8f) }; 358 +static const Vec4 s_constInVec4[2] = { Vec4(1.4f, 0.2f, -0.5f, 0.7f), Vec4(0.2f, -1.0f, 0.5f, 0.8f) }; 359 360 static const float s_constInMat20[] = { 0.6f, -1.0f, 0.7f, 0.4f }; 361 static const float s_constInMat21[] = { -0.5f, -0.4f, 0.7f, -0.8f }; 362 363 static const float s_constInMat31[] = 364 { 365 - 1.2f, 0.1f, -0.1f, 366 - 0.1f, 0.9f, 0.2f, 367 - 0.2f, -0.1f, 0.7f 368 + 1.2f, 0.1f, -0.1f, 369 + 0.1f, 0.9f, 0.2f, 370 + 0.2f, -0.1f, 0.7f 371 }; 372 static const float s_constInMat41[] = 373 { 374 - 1.2f, -0.2f, 0.4f, 0.1f, 375 - 0.1f, 0.8f, -0.1f, -0.2f, 376 - -0.2f, 0.1f, -1.1f, 0.3f, 377 - 0.1f, 0.2f, 0.3f, 0.9f 378 + 1.2f, -0.2f, 0.4f, 0.1f, 379 + 0.1f, 0.8f, -0.1f, -0.2f, 380 + -0.2f, 0.1f, -1.1f, 0.3f, 381 + 0.1f, 0.2f, 0.3f, 0.9f 382 }; 383 384 -static const Mat2 s_constInMat2[2] = { tcu::Mat2(s_constInMat20), tcu::Mat2(s_constInMat21) }; 385 -static const Mat3 s_constInMat3[2] = { tcu::translationMatrix(tcu::Vec2(0.2f, -0.3f)), tcu::Mat3(s_constInMat31) }; 386 -static const Mat4 s_constInMat4[2] = { tcu::translationMatrix(tcu::Vec3(0.2f, -0.3f, 0.15f)), tcu::Mat4(s_constInMat41) }; 387 +static const Mat2 s_constInMat2[2] = { tcu::Mat2(s_constInMat20), tcu::Mat2(s_constInMat21) }; 388 +static const Mat3 s_constInMat3[2] = { tcu::translationMatrix(tcu::Vec2(0.2f, -0.3f)), tcu::Mat3(s_constInMat31) }; 389 +static const Mat4 s_constInMat4[2] = { tcu::translationMatrix(tcu::Vec3(0.2f, -0.3f, 0.15f)), tcu::Mat4(s_constInMat41) }; 390 391 namespace MatrixCaseUtils 392 { 393 394 enum InputType 395 { 396 - INPUTTYPE_CONST = 0, 397 - INPUTTYPE_UNIFORM, 398 - INPUTTYPE_DYNAMIC, 399 + INPUTTYPE_CONST = 0, 400 + INPUTTYPE_UNIFORM, 401 + INPUTTYPE_DYNAMIC, 402 403 - INPUTTYPE_LAST 404 + INPUTTYPE_LAST 405 }; 406 407 struct ShaderInput 408 { 409 - ShaderInput (InputType inputType_, DataType dataType_, Precision precision_) 410 - : inputType (inputType_) 411 - , dataType (dataType_) 412 - , precision (precision_) 413 - { 414 - } 415 - 416 - InputType inputType; 417 - DataType dataType; 418 - Precision precision; 419 + ShaderInput (InputType inputType_, DataType dataType_, Precision precision_) 420 + : inputType (inputType_) 421 + , dataType (dataType_) 422 + , precision (precision_) 423 + { 424 + } 425 + 426 + InputType inputType; 427 + DataType dataType; 428 + Precision precision; 429 }; 430 431 enum MatrixOp 432 { 433 - OP_ADD = 0, 434 - OP_SUB, 435 - OP_MUL, 436 - OP_DIV, 437 - OP_COMP_MUL, 438 - OP_UNARY_PLUS, 439 - OP_NEGATION, 440 - OP_PRE_INCREMENT, 441 - OP_PRE_DECREMENT, 442 - OP_POST_INCREMENT, 443 - OP_POST_DECREMENT, 444 - OP_ADD_INTO, 445 - OP_SUBTRACT_FROM, 446 - OP_MULTIPLY_INTO, 447 - OP_DIVIDE_INTO, 448 - 449 - OP_LAST 450 + OP_ADD = 0, 451 + OP_SUB, 452 + OP_MUL, 453 + OP_DIV, 454 + OP_COMP_MUL, 455 + OP_UNARY_PLUS, 456 + OP_NEGATION, 457 + OP_PRE_INCREMENT, 458 + OP_PRE_DECREMENT, 459 + OP_POST_INCREMENT, 460 + OP_POST_DECREMENT, 461 + OP_ADD_INTO, 462 + OP_SUBTRACT_FROM, 463 + OP_MULTIPLY_INTO, 464 + OP_DIVIDE_INTO, 465 + 466 + OP_LAST 467 }; 468 469 // Type traits. 470 @@ -147,16 +147,16 @@ enum MatrixOp 471 template <int DataT> 472 struct TypeTraits; 473 474 -#define DECLARE_TYPE_TRAIT(DATATYPE, TYPE) \ 475 -template<> \ 476 -struct TypeTraits<DATATYPE> { \ 477 - typedef TYPE Type; \ 478 +#define DECLARE_TYPE_TRAIT(DATATYPE, TYPE) \ 479 +template<> \ 480 +struct TypeTraits<DATATYPE> { \ 481 + typedef TYPE Type; \ 482 } 483 484 -DECLARE_TYPE_TRAIT(TYPE_FLOAT, float); 485 -DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC2, tcu::Vec2); 486 -DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC3, tcu::Vec3); 487 -DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC4, tcu::Vec4); 488 +DECLARE_TYPE_TRAIT(TYPE_FLOAT, float); 489 +DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC2, tcu::Vec2); 490 +DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC3, tcu::Vec3); 491 +DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC4, tcu::Vec4); 492 DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2, tcu::Mat2); 493 DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3, tcu::Mat3); 494 DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4, tcu::Mat4); 495 @@ -165,169 +165,169 @@ DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4, tcu::Mat4); 496 497 enum OperationType 498 { 499 - OPERATIONTYPE_BINARY_OPERATOR = 0, 500 - OPERATIONTYPE_BINARY_FUNCTION, 501 - OPERATIONTYPE_UNARY_PREFIX_OPERATOR, 502 - OPERATIONTYPE_UNARY_POSTFIX_OPERATOR, 503 - OPERATIONTYPE_ASSIGNMENT, 504 + OPERATIONTYPE_BINARY_OPERATOR = 0, 505 + OPERATIONTYPE_BINARY_FUNCTION, 506 + OPERATIONTYPE_UNARY_PREFIX_OPERATOR, 507 + OPERATIONTYPE_UNARY_POSTFIX_OPERATOR, 508 + OPERATIONTYPE_ASSIGNMENT, 509 510 - OPERATIONTYPE_LAST 511 + OPERATIONTYPE_LAST 512 }; 513 514 static const char* getOperationName (MatrixOp op) 515 { 516 - switch (op) 517 - { 518 - case OP_ADD: return "+"; 519 - case OP_SUB: return "-"; 520 - case OP_MUL: return "*"; 521 - case OP_DIV: return "/"; 522 - case OP_COMP_MUL: return "matrixCompMult"; 523 - case OP_UNARY_PLUS: return "+"; 524 - case OP_NEGATION: return "-"; 525 - case OP_PRE_INCREMENT: return "++"; 526 - case OP_PRE_DECREMENT: return "--"; 527 - case OP_POST_INCREMENT: return "++"; 528 - case OP_POST_DECREMENT: return "--"; 529 - case OP_ADD_INTO: return "+="; 530 - case OP_SUBTRACT_FROM: return "-="; 531 - case OP_MULTIPLY_INTO: return "*="; 532 - case OP_DIVIDE_INTO: return "/="; 533 - default: 534 - DE_ASSERT(DE_FALSE); 535 - return ""; 536 - } 537 + switch (op) 538 + { 539 + case OP_ADD: return "+"; 540 + case OP_SUB: return "-"; 541 + case OP_MUL: return "*"; 542 + case OP_DIV: return "/"; 543 + case OP_COMP_MUL: return "matrixCompMult"; 544 + case OP_UNARY_PLUS: return "+"; 545 + case OP_NEGATION: return "-"; 546 + case OP_PRE_INCREMENT: return "++"; 547 + case OP_PRE_DECREMENT: return "--"; 548 + case OP_POST_INCREMENT: return "++"; 549 + case OP_POST_DECREMENT: return "--"; 550 + case OP_ADD_INTO: return "+="; 551 + case OP_SUBTRACT_FROM: return "-="; 552 + case OP_MULTIPLY_INTO: return "*="; 553 + case OP_DIVIDE_INTO: return "/="; 554 + default: 555 + DE_ASSERT(DE_FALSE); 556 + return ""; 557 + } 558 } 559 560 static OperationType getOperationType (MatrixOp op) 561 { 562 - switch (op) 563 - { 564 - case OP_ADD: return OPERATIONTYPE_BINARY_OPERATOR; 565 - case OP_SUB: return OPERATIONTYPE_BINARY_OPERATOR; 566 - case OP_MUL: return OPERATIONTYPE_BINARY_OPERATOR; 567 - case OP_DIV: return OPERATIONTYPE_BINARY_OPERATOR; 568 - case OP_COMP_MUL: return OPERATIONTYPE_BINARY_FUNCTION; 569 - case OP_UNARY_PLUS: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; 570 - case OP_NEGATION: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; 571 - case OP_PRE_INCREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; 572 - case OP_PRE_DECREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; 573 - case OP_POST_INCREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; 574 - case OP_POST_DECREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; 575 - case OP_ADD_INTO: return OPERATIONTYPE_ASSIGNMENT; 576 - case OP_SUBTRACT_FROM: return OPERATIONTYPE_ASSIGNMENT; 577 - case OP_MULTIPLY_INTO: return OPERATIONTYPE_ASSIGNMENT; 578 - case OP_DIVIDE_INTO: return OPERATIONTYPE_ASSIGNMENT; 579 - default: 580 - DE_ASSERT(DE_FALSE); 581 - return OPERATIONTYPE_LAST; 582 - } 583 + switch (op) 584 + { 585 + case OP_ADD: return OPERATIONTYPE_BINARY_OPERATOR; 586 + case OP_SUB: return OPERATIONTYPE_BINARY_OPERATOR; 587 + case OP_MUL: return OPERATIONTYPE_BINARY_OPERATOR; 588 + case OP_DIV: return OPERATIONTYPE_BINARY_OPERATOR; 589 + case OP_COMP_MUL: return OPERATIONTYPE_BINARY_FUNCTION; 590 + case OP_UNARY_PLUS: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; 591 + case OP_NEGATION: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; 592 + case OP_PRE_INCREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; 593 + case OP_PRE_DECREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; 594 + case OP_POST_INCREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; 595 + case OP_POST_DECREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; 596 + case OP_ADD_INTO: return OPERATIONTYPE_ASSIGNMENT; 597 + case OP_SUBTRACT_FROM: return OPERATIONTYPE_ASSIGNMENT; 598 + case OP_MULTIPLY_INTO: return OPERATIONTYPE_ASSIGNMENT; 599 + case OP_DIVIDE_INTO: return OPERATIONTYPE_ASSIGNMENT; 600 + default: 601 + DE_ASSERT(DE_FALSE); 602 + return OPERATIONTYPE_LAST; 603 + } 604 } 605 606 enum TestMatrixType 607 { 608 - TESTMATRIXTYPE_DEFAULT = 0, 609 - TESTMATRIXTYPE_NEGATED, 610 - TESTMATRIXTYPE_INCREMENTED, 611 - TESTMATRIXTYPE_DECREMENTED, 612 + TESTMATRIXTYPE_DEFAULT = 0, 613 + TESTMATRIXTYPE_NEGATED, 614 + TESTMATRIXTYPE_INCREMENTED, 615 + TESTMATRIXTYPE_DECREMENTED, 616 617 - TESTMATRIXTYPE_LAST 618 + TESTMATRIXTYPE_LAST 619 }; 620 621 static TestMatrixType getOperationTestMatrixType (MatrixOp op) 622 { 623 - switch(op) 624 - { 625 - case OP_ADD: return TESTMATRIXTYPE_DEFAULT; 626 - case OP_SUB: return TESTMATRIXTYPE_DEFAULT; 627 - case OP_MUL: return TESTMATRIXTYPE_DEFAULT; 628 - case OP_DIV: return TESTMATRIXTYPE_DEFAULT; 629 - case OP_COMP_MUL: return TESTMATRIXTYPE_DEFAULT; 630 - case OP_UNARY_PLUS: return TESTMATRIXTYPE_DEFAULT; 631 - case OP_NEGATION: return TESTMATRIXTYPE_NEGATED; 632 - case OP_PRE_INCREMENT: return TESTMATRIXTYPE_NEGATED; 633 - case OP_PRE_DECREMENT: return TESTMATRIXTYPE_INCREMENTED; 634 - case OP_POST_INCREMENT: return TESTMATRIXTYPE_NEGATED; 635 - case OP_POST_DECREMENT: return TESTMATRIXTYPE_DEFAULT; 636 - case OP_ADD_INTO: return TESTMATRIXTYPE_DECREMENTED; 637 - case OP_SUBTRACT_FROM: return TESTMATRIXTYPE_DEFAULT; 638 - case OP_MULTIPLY_INTO: return TESTMATRIXTYPE_DEFAULT; 639 - case OP_DIVIDE_INTO: return TESTMATRIXTYPE_DEFAULT; 640 - 641 - default: 642 - DE_ASSERT(DE_FALSE); 643 - return TESTMATRIXTYPE_LAST; 644 - } 645 + switch(op) 646 + { 647 + case OP_ADD: return TESTMATRIXTYPE_DEFAULT; 648 + case OP_SUB: return TESTMATRIXTYPE_DEFAULT; 649 + case OP_MUL: return TESTMATRIXTYPE_DEFAULT; 650 + case OP_DIV: return TESTMATRIXTYPE_DEFAULT; 651 + case OP_COMP_MUL: return TESTMATRIXTYPE_DEFAULT; 652 + case OP_UNARY_PLUS: return TESTMATRIXTYPE_DEFAULT; 653 + case OP_NEGATION: return TESTMATRIXTYPE_NEGATED; 654 + case OP_PRE_INCREMENT: return TESTMATRIXTYPE_NEGATED; 655 + case OP_PRE_DECREMENT: return TESTMATRIXTYPE_INCREMENTED; 656 + case OP_POST_INCREMENT: return TESTMATRIXTYPE_NEGATED; 657 + case OP_POST_DECREMENT: return TESTMATRIXTYPE_DEFAULT; 658 + case OP_ADD_INTO: return TESTMATRIXTYPE_DECREMENTED; 659 + case OP_SUBTRACT_FROM: return TESTMATRIXTYPE_DEFAULT; 660 + case OP_MULTIPLY_INTO: return TESTMATRIXTYPE_DEFAULT; 661 + case OP_DIVIDE_INTO: return TESTMATRIXTYPE_DEFAULT; 662 + 663 + default: 664 + DE_ASSERT(DE_FALSE); 665 + return TESTMATRIXTYPE_LAST; 666 + } 667 } 668 669 static bool isOperationBinary (MatrixOp op) 670 { 671 - return getOperationType(op) == OPERATIONTYPE_BINARY_OPERATOR || 672 - getOperationType(op) == OPERATIONTYPE_BINARY_FUNCTION || 673 - getOperationType(op) == OPERATIONTYPE_ASSIGNMENT; 674 + return getOperationType(op) == OPERATIONTYPE_BINARY_OPERATOR || 675 + getOperationType(op) == OPERATIONTYPE_BINARY_FUNCTION || 676 + getOperationType(op) == OPERATIONTYPE_ASSIGNMENT; 677 } 678 679 static bool isOperationMatrixScalar (MatrixOp op) 680 { 681 - return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV; 682 + return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV; 683 } 684 685 static bool isOperationMatrixVector (MatrixOp op) 686 { 687 - return op == OP_MUL; 688 + return op == OP_MUL; 689 } 690 691 static bool isOperationMatrixMatrix (MatrixOp op) 692 { 693 - return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV || op == OP_COMP_MUL; 694 + return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV || op == OP_COMP_MUL; 695 } 696 697 static bool isOperationUnary (MatrixOp op) 698 { 699 - return op == OP_UNARY_PLUS || 700 - op == OP_NEGATION || 701 - op == OP_PRE_INCREMENT || 702 - op == OP_PRE_DECREMENT || 703 - op == OP_POST_INCREMENT || 704 - op == OP_POST_DECREMENT; 705 + return op == OP_UNARY_PLUS || 706 + op == OP_NEGATION || 707 + op == OP_PRE_INCREMENT || 708 + op == OP_PRE_DECREMENT || 709 + op == OP_POST_INCREMENT || 710 + op == OP_POST_DECREMENT; 711 } 712 713 static bool isOperationValueModifying (MatrixOp op) 714 { 715 - return op == OP_PRE_INCREMENT || 716 - op == OP_PRE_DECREMENT || 717 - op == OP_POST_INCREMENT || 718 - op == OP_POST_DECREMENT; 719 + return op == OP_PRE_INCREMENT || 720 + op == OP_PRE_DECREMENT || 721 + op == OP_POST_INCREMENT || 722 + op == OP_POST_DECREMENT; 723 } 724 725 static bool isOperationAssignment (MatrixOp op) 726 { 727 - return op == OP_ADD_INTO || 728 - op == OP_SUBTRACT_FROM || 729 - op == OP_MULTIPLY_INTO || 730 - op == OP_DIVIDE_INTO; 731 + return op == OP_ADD_INTO || 732 + op == OP_SUBTRACT_FROM || 733 + op == OP_MULTIPLY_INTO || 734 + op == OP_DIVIDE_INTO; 735 } 736 737 // Operation nature 738 739 enum OperationNature 740 { 741 - OPERATIONNATURE_PURE = 0, 742 - OPERATIONNATURE_MUTATING, 743 - OPERATIONNATURE_ASSIGNMENT, 744 + OPERATIONNATURE_PURE = 0, 745 + OPERATIONNATURE_MUTATING, 746 + OPERATIONNATURE_ASSIGNMENT, 747 748 - OPERATIONNATURE_LAST 749 + OPERATIONNATURE_LAST 750 }; 751 752 static OperationNature getOperationNature (MatrixOp op) 753 { 754 - if (isOperationAssignment(op)) 755 - return OPERATIONNATURE_ASSIGNMENT; 756 + if (isOperationAssignment(op)) 757 + return OPERATIONNATURE_ASSIGNMENT; 758 759 - if (isOperationValueModifying(op)) 760 - return OPERATIONNATURE_MUTATING; 761 + if (isOperationValueModifying(op)) 762 + return OPERATIONNATURE_MUTATING; 763 764 - return OPERATIONNATURE_PURE; 765 + return OPERATIONNATURE_PURE; 766 } 767 768 // Input value loader. 769 @@ -335,47 +335,47 @@ static OperationNature getOperationNature (MatrixOp op) 770 template <int InputT, int DataT> 771 typename TypeTraits<DataT>::Type getInputValue (const ShaderEvalContext& evalCtx, int inputNdx); 772 773 -template <> inline float getInputValue<INPUTTYPE_CONST, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInFloat[inputNdx]; } 774 -template <> inline tcu::Vec2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec2[inputNdx]; } 775 -template <> inline tcu::Vec3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec3[inputNdx]; } 776 -template <> inline tcu::Vec4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec4[inputNdx]; } 777 -template <> inline tcu::Mat2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInMat2[inputNdx]; } 778 -template <> inline tcu::Mat3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInMat3[inputNdx]; } 779 -template <> inline tcu::Mat4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInMat4[inputNdx]; } 780 +template <> inline float getInputValue<INPUTTYPE_CONST, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInFloat[inputNdx]; } 781 +template <> inline tcu::Vec2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec2[inputNdx]; } 782 +template <> inline tcu::Vec3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec3[inputNdx]; } 783 +template <> inline tcu::Vec4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec4[inputNdx]; } 784 +template <> inline tcu::Mat2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInMat2[inputNdx]; } 785 +template <> inline tcu::Mat3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInMat3[inputNdx]; } 786 +template <> inline tcu::Mat4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInMat4[inputNdx]; } 787 788 -template <> inline float getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.x(); } 789 -template <> inline tcu::Vec2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1); } 790 -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); } 791 -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); } 792 +template <> inline float getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.x(); } 793 +template <> inline tcu::Vec2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1); } 794 +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); } 795 +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); } 796 797 template <> inline tcu::Mat2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT2> (const ShaderEvalContext& evalCtx, int inputNdx) 798 { 799 - DE_UNREF(inputNdx); // Not used. 800 - tcu::Mat2 m; 801 - m.setColumn(0, evalCtx.in[0].swizzle(0,1)); 802 - m.setColumn(1, evalCtx.in[1].swizzle(0,1)); 803 - return m; 804 + DE_UNREF(inputNdx); // Not used. 805 + tcu::Mat2 m; 806 + m.setColumn(0, evalCtx.in[0].swizzle(0,1)); 807 + m.setColumn(1, evalCtx.in[1].swizzle(0,1)); 808 + return m; 809 } 810 811 template <> inline tcu::Mat3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT3> (const ShaderEvalContext& evalCtx, int inputNdx) 812 { 813 - DE_UNREF(inputNdx); // Not used. 814 - tcu::Mat3 m; 815 - m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); 816 - m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); 817 - m.setColumn(2, evalCtx.in[2].swizzle(0,1,2)); 818 - return m; 819 + DE_UNREF(inputNdx); // Not used. 820 + tcu::Mat3 m; 821 + m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); 822 + m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); 823 + m.setColumn(2, evalCtx.in[2].swizzle(0,1,2)); 824 + return m; 825 } 826 827 template <> inline tcu::Mat4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT4> (const ShaderEvalContext& evalCtx, int inputNdx) 828 { 829 - DE_UNREF(inputNdx); // Not used. 830 - tcu::Mat4 m; 831 - m.setColumn(0, evalCtx.in[0]); 832 - m.setColumn(1, evalCtx.in[1]); 833 - m.setColumn(2, evalCtx.in[2]); 834 - m.setColumn(3, evalCtx.in[3]); 835 - return m; 836 + DE_UNREF(inputNdx); // Not used. 837 + tcu::Mat4 m; 838 + m.setColumn(0, evalCtx.in[0]); 839 + m.setColumn(1, evalCtx.in[1]); 840 + m.setColumn(2, evalCtx.in[2]); 841 + m.setColumn(3, evalCtx.in[3]); 842 + return m; 843 } 844 845 // Reduction from expression result to vec3. 846 @@ -392,13 +392,13 @@ inline tcu::Vec3 reduceToVec3 (const tcu::Mat4& value) { return value.getColumn( 847 template <typename T, int Rows, int Cols> 848 tcu::Matrix<T, Rows, Cols> matrixCompMult (const tcu::Matrix<T, Rows, Cols>& a, const tcu::Matrix<T, Rows, Cols>& b) 849 { 850 - tcu::Matrix<T, Rows, Cols> retVal; 851 + tcu::Matrix<T, Rows, Cols> retVal; 852 853 - for (int r = 0; r < Rows; ++r) 854 - for (int c = 0; c < Cols; ++c) 855 - retVal(r,c) = a(r,c) * b(r, c); 856 + for (int r = 0; r < Rows; ++r) 857 + for (int c = 0; c < Cols; ++c) 858 + retVal(r,c) = a(r,c) * b(r, c); 859 860 - return retVal; 861 + return retVal; 862 } 863 864 // negate 865 @@ -406,13 +406,13 @@ tcu::Matrix<T, Rows, Cols> matrixCompMult (const tcu::Matrix<T, Rows, Cols>& a, 866 template <typename T, int Rows, int Cols> 867 tcu::Matrix<T, Rows, Cols> negate (const tcu::Matrix<T, Rows, Cols>& mat) 868 { 869 - tcu::Matrix<T, Rows, Cols> retVal; 870 + tcu::Matrix<T, Rows, Cols> retVal; 871 872 - for (int r = 0; r < Rows; ++r) 873 - for (int c = 0; c < Cols; ++c) 874 - retVal(r,c) = -mat(r, c); 875 + for (int r = 0; r < Rows; ++r) 876 + for (int c = 0; c < Cols; ++c) 877 + retVal(r,c) = -mat(r, c); 878 879 - return retVal; 880 + return retVal; 881 } 882 883 // increment/decrement 884 @@ -420,25 +420,25 @@ tcu::Matrix<T, Rows, Cols> negate (const tcu::Matrix<T, Rows, Cols>& mat) 885 template <typename T, int Rows, int Cols> 886 tcu::Matrix<T, Rows, Cols> increment (const tcu::Matrix<T, Rows, Cols>& mat) 887 { 888 - tcu::Matrix<T, Rows, Cols> retVal; 889 + tcu::Matrix<T, Rows, Cols> retVal; 890 891 - for (int r = 0; r < Rows; ++r) 892 - for (int c = 0; c < Cols; ++c) 893 - retVal(r,c) = mat(r, c) + 1.0f; 894 + for (int r = 0; r < Rows; ++r) 895 + for (int c = 0; c < Cols; ++c) 896 + retVal(r,c) = mat(r, c) + 1.0f; 897 898 - return retVal; 899 + return retVal; 900 } 901 902 template <typename T, int Rows, int Cols> 903 tcu::Matrix<T, Rows, Cols> decrement (const tcu::Matrix<T, Rows, Cols>& mat) 904 { 905 - tcu::Matrix<T, Rows, Cols> retVal; 906 + tcu::Matrix<T, Rows, Cols> retVal; 907 908 - for (int r = 0; r < Rows; ++r) 909 - for (int c = 0; c < Cols; ++c) 910 - retVal(r,c) = mat(r, c) - 1.0f; 911 + for (int r = 0; r < Rows; ++r) 912 + for (int c = 0; c < Cols; ++c) 913 + retVal(r,c) = mat(r, c) - 1.0f; 914 915 - return retVal; 916 + return retVal; 917 } 918 919 // Evaluator template. 920 @@ -449,244 +449,244 @@ struct Evaluator; 921 template <int In0Type, int In0DataType, int In1Type, int In1DataType> 922 struct Evaluator<OP_ADD, In0Type, In0DataType, In1Type, In1DataType> 923 { 924 - static void evaluate (ShaderEvalContext& evalCtx) 925 - { 926 - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) + getInputValue<In1Type, In1DataType>(evalCtx, 1)); 927 - } 928 + static void evaluate (ShaderEvalContext& evalCtx) 929 + { 930 + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) + getInputValue<In1Type, In1DataType>(evalCtx, 1)); 931 + } 932 }; 933 934 template <int In0Type, int In0DataType, int In1Type, int In1DataType> 935 struct Evaluator<OP_SUB, In0Type, In0DataType, In1Type, In1DataType> 936 { 937 - static void evaluate (ShaderEvalContext& evalCtx) 938 - { 939 - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) - getInputValue<In1Type, In1DataType>(evalCtx, 1)); 940 - } 941 + static void evaluate (ShaderEvalContext& evalCtx) 942 + { 943 + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) - getInputValue<In1Type, In1DataType>(evalCtx, 1)); 944 + } 945 }; 946 947 template <int In0Type, int In0DataType, int In1Type, int In1DataType> 948 struct Evaluator<OP_MUL, In0Type, In0DataType, In1Type, In1DataType> 949 { 950 - static void evaluate (ShaderEvalContext& evalCtx) 951 - { 952 - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) * getInputValue<In1Type, In1DataType>(evalCtx, 1)); 953 - } 954 + static void evaluate (ShaderEvalContext& evalCtx) 955 + { 956 + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) * getInputValue<In1Type, In1DataType>(evalCtx, 1)); 957 + } 958 }; 959 960 template <int In0Type, int In0DataType, int In1Type, int In1DataType> 961 struct Evaluator<OP_DIV, In0Type, In0DataType, In1Type, In1DataType> 962 { 963 - static void evaluate (ShaderEvalContext& evalCtx) 964 - { 965 - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) / getInputValue<In1Type, In1DataType>(evalCtx, 1)); 966 - } 967 + static void evaluate (ShaderEvalContext& evalCtx) 968 + { 969 + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) / getInputValue<In1Type, In1DataType>(evalCtx, 1)); 970 + } 971 }; 972 973 template <int In0Type, int In0DataType, int In1Type, int In1DataType> 974 struct Evaluator<OP_COMP_MUL, In0Type, In0DataType, In1Type, In1DataType> 975 { 976 - static void evaluate (ShaderEvalContext& evalCtx) 977 - { 978 - evalCtx.color.xyz() = reduceToVec3(matrixCompMult(getInputValue<In0Type, In0DataType>(evalCtx, 0), getInputValue<In1Type, In1DataType>(evalCtx, 1))); 979 - } 980 + static void evaluate (ShaderEvalContext& evalCtx) 981 + { 982 + evalCtx.color.xyz() = reduceToVec3(matrixCompMult(getInputValue<In0Type, In0DataType>(evalCtx, 0), getInputValue<In1Type, In1DataType>(evalCtx, 1))); 983 + } 984 }; 985 986 template <int In0Type, int In0DataType, int In1Type, int In1DataType> 987 struct Evaluator<OP_UNARY_PLUS, In0Type, In0DataType, In1Type, In1DataType> 988 { 989 - static void evaluate (ShaderEvalContext& evalCtx) 990 - { 991 - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0)); 992 - } 993 + static void evaluate (ShaderEvalContext& evalCtx) 994 + { 995 + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0)); 996 + } 997 }; 998 999 template <int In0Type, int In0DataType, int In1Type, int In1DataType> 1000 struct Evaluator<OP_NEGATION, In0Type, In0DataType, In1Type, In1DataType> 1001 { 1002 - static void evaluate (ShaderEvalContext& evalCtx) 1003 - { 1004 - evalCtx.color.xyz() = reduceToVec3(negate(getInputValue<In0Type, In0DataType>(evalCtx, 0))); 1005 - } 1006 + static void evaluate (ShaderEvalContext& evalCtx) 1007 + { 1008 + evalCtx.color.xyz() = reduceToVec3(negate(getInputValue<In0Type, In0DataType>(evalCtx, 0))); 1009 + } 1010 }; 1011 1012 template <int In0Type, int In0DataType, int In1Type, int In1DataType> 1013 struct Evaluator<OP_PRE_INCREMENT, In0Type, In0DataType, In1Type, In1DataType> 1014 { 1015 - static void evaluate (ShaderEvalContext& evalCtx) 1016 - { 1017 - // modifying reduction: sum modified value too 1018 - evalCtx.color.xyz() = reduceToVec3(increment(getInputValue<In0Type, In0DataType>(evalCtx, 0))) + reduceToVec3(increment(getInputValue<In0Type, In0DataType>(evalCtx, 0))); 1019 - } 1020 + static void evaluate (ShaderEvalContext& evalCtx) 1021 + { 1022 + // modifying reduction: sum modified value too 1023 + evalCtx.color.xyz() = reduceToVec3(increment(getInputValue<In0Type, In0DataType>(evalCtx, 0))) + reduceToVec3(increment(getInputValue<In0Type, In0DataType>(evalCtx, 0))); 1024 + } 1025 }; 1026 1027 template <int In0Type, int In0DataType, int In1Type, int In1DataType> 1028 struct Evaluator<OP_PRE_DECREMENT, In0Type, In0DataType, In1Type, In1DataType> 1029 { 1030 - static void evaluate (ShaderEvalContext& evalCtx) 1031 - { 1032 - // modifying reduction: sum modified value too 1033 - evalCtx.color.xyz() = reduceToVec3(decrement(getInputValue<In0Type, In0DataType>(evalCtx, 0))) + reduceToVec3(decrement(getInputValue<In0Type, In0DataType>(evalCtx, 0))); 1034 - } 1035 + static void evaluate (ShaderEvalContext& evalCtx) 1036 + { 1037 + // modifying reduction: sum modified value too 1038 + evalCtx.color.xyz() = reduceToVec3(decrement(getInputValue<In0Type, In0DataType>(evalCtx, 0))) + reduceToVec3(decrement(getInputValue<In0Type, In0DataType>(evalCtx, 0))); 1039 + } 1040 }; 1041 1042 template <int In0Type, int In0DataType, int In1Type, int In1DataType> 1043 struct Evaluator<OP_POST_INCREMENT, In0Type, In0DataType, In1Type, In1DataType> 1044 { 1045 - static void evaluate (ShaderEvalContext& evalCtx) 1046 - { 1047 - // modifying reduction: sum modified value too 1048 - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0)) + reduceToVec3(increment(getInputValue<In0Type, In0DataType>(evalCtx, 0))); 1049 - } 1050 + static void evaluate (ShaderEvalContext& evalCtx) 1051 + { 1052 + // modifying reduction: sum modified value too 1053 + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0)) + reduceToVec3(increment(getInputValue<In0Type, In0DataType>(evalCtx, 0))); 1054 + } 1055 }; 1056 1057 template <int In0Type, int In0DataType, int In1Type, int In1DataType> 1058 struct Evaluator<OP_POST_DECREMENT, In0Type, In0DataType, In1Type, In1DataType> 1059 { 1060 - static void evaluate (ShaderEvalContext& evalCtx) 1061 - { 1062 - // modifying reduction: sum modified value too 1063 - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0)) + reduceToVec3(decrement(getInputValue<In0Type, In0DataType>(evalCtx, 0))); 1064 - } 1065 + static void evaluate (ShaderEvalContext& evalCtx) 1066 + { 1067 + // modifying reduction: sum modified value too 1068 + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0)) + reduceToVec3(decrement(getInputValue<In0Type, In0DataType>(evalCtx, 0))); 1069 + } 1070 }; 1071 1072 template <int In0Type, int In0DataType, int In1Type, int In1DataType> 1073 struct Evaluator<OP_ADD_INTO, In0Type, In0DataType, In1Type, In1DataType> 1074 { 1075 - static void evaluate (ShaderEvalContext& evalCtx) 1076 - { 1077 - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) + getInputValue<In1Type, In1DataType>(evalCtx, 1)); 1078 - } 1079 + static void evaluate (ShaderEvalContext& evalCtx) 1080 + { 1081 + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) + getInputValue<In1Type, In1DataType>(evalCtx, 1)); 1082 + } 1083 }; 1084 1085 template <int In0Type, int In0DataType, int In1Type, int In1DataType> 1086 struct Evaluator<OP_SUBTRACT_FROM, In0Type, In0DataType, In1Type, In1DataType> 1087 { 1088 - static void evaluate (ShaderEvalContext& evalCtx) 1089 - { 1090 - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) - getInputValue<In1Type, In1DataType>(evalCtx, 1)); 1091 - } 1092 + static void evaluate (ShaderEvalContext& evalCtx) 1093 + { 1094 + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) - getInputValue<In1Type, In1DataType>(evalCtx, 1)); 1095 + } 1096 }; 1097 1098 template <int In0Type, int In0DataType, int In1Type, int In1DataType> 1099 struct Evaluator<OP_MULTIPLY_INTO, In0Type, In0DataType, In1Type, In1DataType> 1100 { 1101 - static void evaluate (ShaderEvalContext& evalCtx) 1102 - { 1103 - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) * getInputValue<In1Type, In1DataType>(evalCtx, 1)); 1104 - } 1105 + static void evaluate (ShaderEvalContext& evalCtx) 1106 + { 1107 + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) * getInputValue<In1Type, In1DataType>(evalCtx, 1)); 1108 + } 1109 }; 1110 1111 template <int In0Type, int In0DataType, int In1Type, int In1DataType> 1112 struct Evaluator<OP_DIVIDE_INTO, In0Type, In0DataType, In1Type, In1DataType> 1113 { 1114 - static void evaluate (ShaderEvalContext& evalCtx) 1115 - { 1116 - evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) / getInputValue<In1Type, In1DataType>(evalCtx, 1)); 1117 - } 1118 + static void evaluate (ShaderEvalContext& evalCtx) 1119 + { 1120 + evalCtx.color.xyz() = reduceToVec3(getInputValue<In0Type, In0DataType>(evalCtx, 0) / getInputValue<In1Type, In1DataType>(evalCtx, 1)); 1121 + } 1122 }; 1123 1124 ShaderEvalFunc getEvalFunc (const ShaderInput& in0, const ShaderInput& in1, MatrixOp op) 1125 { 1126 - DE_STATIC_ASSERT(TYPE_LAST <= (1<<7)); 1127 - DE_STATIC_ASSERT(OP_LAST <= (1<<4)); 1128 - DE_STATIC_ASSERT(INPUTTYPE_LAST <= (1<<2)); 1129 - 1130 -#define PACK_EVAL_CASE(OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) (((OP) << 18) | ((IN0TYPE) << 16) | ((IN0DATATYPE) << 9) | ((IN1TYPE) << 7) | (IN1DATATYPE)) 1131 - 1132 -#define MAKE_EVAL_CASE(OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ 1133 - case PACK_EVAL_CASE(OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE): \ 1134 - return Evaluator<OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE>::evaluate 1135 - 1136 -#define SCALAR_OPS(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ 1137 - MAKE_EVAL_CASE(OP_ADD, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1138 - MAKE_EVAL_CASE(OP_SUB, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1139 - MAKE_EVAL_CASE(OP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1140 - MAKE_EVAL_CASE(OP_DIV, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) 1141 - 1142 -#define ALL_OPS(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ 1143 - MAKE_EVAL_CASE(OP_ADD, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1144 - MAKE_EVAL_CASE(OP_SUB, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1145 - MAKE_EVAL_CASE(OP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1146 - MAKE_EVAL_CASE(OP_DIV, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1147 - MAKE_EVAL_CASE(OP_COMP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); 1148 - 1149 -#define MUL_OP(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ 1150 - MAKE_EVAL_CASE(OP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) 1151 - 1152 -#define MAKE_MAT_SCALAR_VEC_CASES(OP, TYPE0, TYPE1) \ 1153 - OP(INPUTTYPE_CONST, TYPE0, INPUTTYPE_CONST, TYPE1); \ 1154 - OP(INPUTTYPE_DYNAMIC, TYPE0, INPUTTYPE_CONST, TYPE1); \ 1155 - OP(INPUTTYPE_CONST, TYPE0, INPUTTYPE_DYNAMIC, TYPE1); \ 1156 - OP(INPUTTYPE_DYNAMIC, TYPE0, INPUTTYPE_DYNAMIC, TYPE1) 1157 - 1158 -#define MAKE_MAT_MAT_CASES(OP, MATTYPE) \ 1159 - OP(INPUTTYPE_CONST, MATTYPE, INPUTTYPE_CONST, MATTYPE); \ 1160 - OP(INPUTTYPE_DYNAMIC, MATTYPE, INPUTTYPE_CONST, MATTYPE) 1161 - 1162 -#define UNARY_OP(IN0TYPE, IN0DATATYPE) \ 1163 - MAKE_EVAL_CASE(OP_UNARY_PLUS, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ 1164 - MAKE_EVAL_CASE(OP_NEGATION, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ 1165 - MAKE_EVAL_CASE(OP_PRE_INCREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ 1166 - MAKE_EVAL_CASE(OP_PRE_DECREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ 1167 - MAKE_EVAL_CASE(OP_POST_INCREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ 1168 - MAKE_EVAL_CASE(OP_POST_DECREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST) 1169 - 1170 -#define MAKE_UNARY_CASES(OP, MATTYPE) \ 1171 - OP(INPUTTYPE_CONST, MATTYPE); \ 1172 - OP(INPUTTYPE_DYNAMIC, MATTYPE) 1173 - 1174 -#define ASSIGN_OP(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ 1175 - MAKE_EVAL_CASE(OP_ADD_INTO, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1176 - MAKE_EVAL_CASE(OP_SUBTRACT_FROM, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1177 - MAKE_EVAL_CASE(OP_MULTIPLY_INTO, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1178 - MAKE_EVAL_CASE(OP_DIVIDE_INTO, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) 1179 - 1180 -#define MAKE_ASSIGNMENT_CASES(OP, MATTYPE) \ 1181 - OP(INPUTTYPE_CONST, MATTYPE, INPUTTYPE_CONST, MATTYPE); \ 1182 - OP(INPUTTYPE_DYNAMIC, MATTYPE, INPUTTYPE_CONST, MATTYPE); \ 1183 - OP(INPUTTYPE_CONST, MATTYPE, INPUTTYPE_DYNAMIC, MATTYPE); \ 1184 - OP(INPUTTYPE_DYNAMIC, MATTYPE, INPUTTYPE_DYNAMIC, MATTYPE) 1185 - 1186 - // \note At the moment there is no difference between uniform and const inputs. This saves binary size. 1187 - InputType in0Type = in0.inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_DYNAMIC : INPUTTYPE_CONST; 1188 - InputType in1Type = in1.inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_DYNAMIC : INPUTTYPE_CONST; 1189 - 1190 - switch (PACK_EVAL_CASE(op, in0Type, in0.dataType, in1Type, in1.dataType)) 1191 - { 1192 - // Matrix-scalar. 1193 - MAKE_MAT_SCALAR_VEC_CASES(SCALAR_OPS, TYPE_FLOAT_MAT2, TYPE_FLOAT); 1194 - MAKE_MAT_SCALAR_VEC_CASES(SCALAR_OPS, TYPE_FLOAT_MAT3, TYPE_FLOAT); 1195 - MAKE_MAT_SCALAR_VEC_CASES(SCALAR_OPS, TYPE_FLOAT_MAT4, TYPE_FLOAT); 1196 - 1197 - // Matrix-vector. 1198 - MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_MAT2, TYPE_FLOAT_VEC2); 1199 - MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_MAT3, TYPE_FLOAT_VEC3); 1200 - MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_MAT4, TYPE_FLOAT_VEC4); 1201 - 1202 - // Vector-matrix. 1203 - MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT2); 1204 - MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT3); 1205 - MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT4); 1206 - 1207 - // Matrix-matrix. 1208 - MAKE_MAT_MAT_CASES(ALL_OPS, TYPE_FLOAT_MAT2); 1209 - MAKE_MAT_MAT_CASES(ALL_OPS, TYPE_FLOAT_MAT3); 1210 - MAKE_MAT_MAT_CASES(ALL_OPS, TYPE_FLOAT_MAT4); 1211 - 1212 - // Unary matrix 1213 - MAKE_UNARY_CASES(UNARY_OP, TYPE_FLOAT_MAT2); 1214 - MAKE_UNARY_CASES(UNARY_OP, TYPE_FLOAT_MAT3); 1215 - MAKE_UNARY_CASES(UNARY_OP, TYPE_FLOAT_MAT4); 1216 - 1217 - // Assignment matrix 1218 - MAKE_ASSIGNMENT_CASES(ASSIGN_OP, TYPE_FLOAT_MAT2); 1219 - MAKE_ASSIGNMENT_CASES(ASSIGN_OP, TYPE_FLOAT_MAT3); 1220 - MAKE_ASSIGNMENT_CASES(ASSIGN_OP, TYPE_FLOAT_MAT4); 1221 - 1222 - default: 1223 - DE_ASSERT(DE_FALSE); 1224 - return DE_NULL; 1225 - } 1226 + DE_STATIC_ASSERT(TYPE_LAST <= (1<<7)); 1227 + DE_STATIC_ASSERT(OP_LAST <= (1<<4)); 1228 + DE_STATIC_ASSERT(INPUTTYPE_LAST <= (1<<2)); 1229 + 1230 +#define PACK_EVAL_CASE(OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) (((OP) << 18) | ((IN0TYPE) << 16) | ((IN0DATATYPE) << 9) | ((IN1TYPE) << 7) | (IN1DATATYPE)) 1231 + 1232 +#define MAKE_EVAL_CASE(OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ 1233 + case PACK_EVAL_CASE(OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE): \ 1234 + return Evaluator<OP, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE>::evaluate 1235 + 1236 +#define SCALAR_OPS(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ 1237 + MAKE_EVAL_CASE(OP_ADD, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1238 + MAKE_EVAL_CASE(OP_SUB, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1239 + MAKE_EVAL_CASE(OP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1240 + MAKE_EVAL_CASE(OP_DIV, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) 1241 + 1242 +#define ALL_OPS(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ 1243 + MAKE_EVAL_CASE(OP_ADD, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1244 + MAKE_EVAL_CASE(OP_SUB, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1245 + MAKE_EVAL_CASE(OP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1246 + MAKE_EVAL_CASE(OP_DIV, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1247 + MAKE_EVAL_CASE(OP_COMP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); 1248 + 1249 +#define MUL_OP(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ 1250 + MAKE_EVAL_CASE(OP_MUL, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) 1251 + 1252 +#define MAKE_MAT_SCALAR_VEC_CASES(OP, TYPE0, TYPE1) \ 1253 + OP(INPUTTYPE_CONST, TYPE0, INPUTTYPE_CONST, TYPE1); \ 1254 + OP(INPUTTYPE_DYNAMIC, TYPE0, INPUTTYPE_CONST, TYPE1); \ 1255 + OP(INPUTTYPE_CONST, TYPE0, INPUTTYPE_DYNAMIC, TYPE1); \ 1256 + OP(INPUTTYPE_DYNAMIC, TYPE0, INPUTTYPE_DYNAMIC, TYPE1) 1257 + 1258 +#define MAKE_MAT_MAT_CASES(OP, MATTYPE) \ 1259 + OP(INPUTTYPE_CONST, MATTYPE, INPUTTYPE_CONST, MATTYPE); \ 1260 + OP(INPUTTYPE_DYNAMIC, MATTYPE, INPUTTYPE_CONST, MATTYPE) 1261 + 1262 +#define UNARY_OP(IN0TYPE, IN0DATATYPE) \ 1263 + MAKE_EVAL_CASE(OP_UNARY_PLUS, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ 1264 + MAKE_EVAL_CASE(OP_NEGATION, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ 1265 + MAKE_EVAL_CASE(OP_PRE_INCREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ 1266 + MAKE_EVAL_CASE(OP_PRE_DECREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ 1267 + MAKE_EVAL_CASE(OP_POST_INCREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST); \ 1268 + MAKE_EVAL_CASE(OP_POST_DECREMENT, IN0TYPE, IN0DATATYPE, INPUTTYPE_CONST, TYPE_LAST) 1269 + 1270 +#define MAKE_UNARY_CASES(OP, MATTYPE) \ 1271 + OP(INPUTTYPE_CONST, MATTYPE); \ 1272 + OP(INPUTTYPE_DYNAMIC, MATTYPE) 1273 + 1274 +#define ASSIGN_OP(IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) \ 1275 + MAKE_EVAL_CASE(OP_ADD_INTO, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1276 + MAKE_EVAL_CASE(OP_SUBTRACT_FROM, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1277 + MAKE_EVAL_CASE(OP_MULTIPLY_INTO, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE); \ 1278 + MAKE_EVAL_CASE(OP_DIVIDE_INTO, IN0TYPE, IN0DATATYPE, IN1TYPE, IN1DATATYPE) 1279 + 1280 +#define MAKE_ASSIGNMENT_CASES(OP, MATTYPE) \ 1281 + OP(INPUTTYPE_CONST, MATTYPE, INPUTTYPE_CONST, MATTYPE); \ 1282 + OP(INPUTTYPE_DYNAMIC, MATTYPE, INPUTTYPE_CONST, MATTYPE); \ 1283 + OP(INPUTTYPE_CONST, MATTYPE, INPUTTYPE_DYNAMIC, MATTYPE); \ 1284 + OP(INPUTTYPE_DYNAMIC, MATTYPE, INPUTTYPE_DYNAMIC, MATTYPE) 1285 + 1286 + // \note At the moment there is no difference between uniform and const inputs. This saves binary size. 1287 + InputType in0Type = in0.inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_DYNAMIC : INPUTTYPE_CONST; 1288 + InputType in1Type = in1.inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_DYNAMIC : INPUTTYPE_CONST; 1289 + 1290 + switch (PACK_EVAL_CASE(op, in0Type, in0.dataType, in1Type, in1.dataType)) 1291 + { 1292 + // Matrix-scalar. 1293 + MAKE_MAT_SCALAR_VEC_CASES(SCALAR_OPS, TYPE_FLOAT_MAT2, TYPE_FLOAT); 1294 + MAKE_MAT_SCALAR_VEC_CASES(SCALAR_OPS, TYPE_FLOAT_MAT3, TYPE_FLOAT); 1295 + MAKE_MAT_SCALAR_VEC_CASES(SCALAR_OPS, TYPE_FLOAT_MAT4, TYPE_FLOAT); 1296 + 1297 + // Matrix-vector. 1298 + MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_MAT2, TYPE_FLOAT_VEC2); 1299 + MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_MAT3, TYPE_FLOAT_VEC3); 1300 + MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_MAT4, TYPE_FLOAT_VEC4); 1301 + 1302 + // Vector-matrix. 1303 + MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT2); 1304 + MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT3); 1305 + MAKE_MAT_SCALAR_VEC_CASES(MUL_OP, TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT4); 1306 + 1307 + // Matrix-matrix. 1308 + MAKE_MAT_MAT_CASES(ALL_OPS, TYPE_FLOAT_MAT2); 1309 + MAKE_MAT_MAT_CASES(ALL_OPS, TYPE_FLOAT_MAT3); 1310 + MAKE_MAT_MAT_CASES(ALL_OPS, TYPE_FLOAT_MAT4); 1311 + 1312 + // Unary matrix 1313 + MAKE_UNARY_CASES(UNARY_OP, TYPE_FLOAT_MAT2); 1314 + MAKE_UNARY_CASES(UNARY_OP, TYPE_FLOAT_MAT3); 1315 + MAKE_UNARY_CASES(UNARY_OP, TYPE_FLOAT_MAT4); 1316 + 1317 + // Assignment matrix 1318 + MAKE_ASSIGNMENT_CASES(ASSIGN_OP, TYPE_FLOAT_MAT2); 1319 + MAKE_ASSIGNMENT_CASES(ASSIGN_OP, TYPE_FLOAT_MAT3); 1320 + MAKE_ASSIGNMENT_CASES(ASSIGN_OP, TYPE_FLOAT_MAT4); 1321 + 1322 + default: 1323 + DE_ASSERT(DE_FALSE); 1324 + return DE_NULL; 1325 + } 1326 1327 #undef PACK_EVAL_CASE 1328 #undef MAKE_EVAL_CASE 1329 @@ -701,35 +701,35 @@ ShaderEvalFunc getEvalFunc (const ShaderInput& in0, const ShaderInput& in1, Matr 1330 template <int Size> 1331 void writeVectorConstructor (std::ostream& str, const tcu::Vector<float, Size>& v) 1332 { 1333 - str << "vec" << Size << "("; 1334 - for (int ndx = 0; ndx < Size; ndx++) 1335 - { 1336 - if (ndx != 0) 1337 - str << ", "; 1338 - str << de::floatToString(v[ndx], 1); 1339 - } 1340 - str << ")"; 1341 + str << "vec" << Size << "("; 1342 + for (int ndx = 0; ndx < Size; ndx++) 1343 + { 1344 + if (ndx != 0) 1345 + str << ", "; 1346 + str << de::floatToString(v[ndx], 1); 1347 + } 1348 + str << ")"; 1349 } 1350 1351 template <int Cols, int Rows> 1352 void writeMatrixConstructor (std::ostream& str, const tcu::Matrix<float, Rows, Cols>& m) 1353 { 1354 - if (Rows == Cols) 1355 - str << "mat" << Cols; 1356 - else 1357 - str << "mat" << Cols << "x" << Rows; 1358 - 1359 - str << "("; 1360 - for (int colNdx = 0; colNdx < Cols; colNdx++) 1361 - { 1362 - for (int rowNdx = 0; rowNdx < Rows; rowNdx++) 1363 - { 1364 - if (rowNdx > 0 || colNdx > 0) 1365 - str << ", "; 1366 - str << de::floatToString(m(rowNdx, colNdx), 1); 1367 - } 1368 - } 1369 - str << ")"; 1370 + if (Rows == Cols) 1371 + str << "mat" << Cols; 1372 + else 1373 + str << "mat" << Cols << "x" << Rows; 1374 + 1375 + str << "("; 1376 + for (int colNdx = 0; colNdx < Cols; colNdx++) 1377 + { 1378 + for (int rowNdx = 0; rowNdx < Rows; rowNdx++) 1379 + { 1380 + if (rowNdx > 0 || colNdx > 0) 1381 + str << ", "; 1382 + str << de::floatToString(m(rowNdx, colNdx), 1); 1383 + } 1384 + } 1385 + str << ")"; 1386 } 1387 1388 } // MatrixCaseUtils 1389 @@ -739,26 +739,26 @@ using namespace MatrixCaseUtils; 1390 class ShaderMatrixCase : public ShaderRenderCase 1391 { 1392 public: 1393 - ShaderMatrixCase (Context& context, const char* name, const char* desc, const ShaderInput& in0, const ShaderInput& in1, MatrixOp op, bool isVertexCase); 1394 - ~ShaderMatrixCase (void); 1395 + ShaderMatrixCase (Context& context, const char* name, const char* desc, const ShaderInput& in0, const ShaderInput& in1, MatrixOp op, bool isVertexCase); 1396 + ~ShaderMatrixCase (void); 1397 1398 - void init (void); 1399 + void init (void); 1400 1401 protected: 1402 - std::string genGLSLMatToVec3Reduction (const glu::DataType& matType, const char* varName); 1403 - void setupUniforms (int programID, const tcu::Vec4& constCoords); 1404 + std::string genGLSLMatToVec3Reduction (const glu::DataType& matType, const char* varName); 1405 + void setupUniforms (int programID, const tcu::Vec4& constCoords); 1406 1407 private: 1408 - ShaderInput m_in0; 1409 - ShaderInput m_in1; 1410 - MatrixOp m_op; 1411 + ShaderInput m_in0; 1412 + ShaderInput m_in1; 1413 + MatrixOp m_op; 1414 }; 1415 1416 ShaderMatrixCase::ShaderMatrixCase (Context& context, const char* name, const char* desc, const ShaderInput& in0, const ShaderInput& in1, MatrixOp op, bool isVertexCase) 1417 - : ShaderRenderCase (context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name, desc, isVertexCase, getEvalFunc(in0, in1, op)) 1418 - , m_in0 (in0) 1419 - , m_in1 (in1) 1420 - , m_op (op) 1421 + : ShaderRenderCase (context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name, desc, isVertexCase, getEvalFunc(in0, in1, op)) 1422 + , m_in0 (in0) 1423 + , m_in1 (in1) 1424 + , m_op (op) 1425 { 1426 } 1427 1428 @@ -768,315 +768,315 @@ ShaderMatrixCase::~ShaderMatrixCase (void) 1429 1430 void ShaderMatrixCase::init (void) 1431 { 1432 - std::ostringstream vtx; 1433 - std::ostringstream frag; 1434 - std::ostringstream& op = m_isVertexCase ? vtx : frag; 1435 - 1436 - bool isInDynMat0 = isDataTypeMatrix(m_in0.dataType) && m_in0.inputType == INPUTTYPE_DYNAMIC; 1437 - bool isInDynMat1 = isDataTypeMatrix(m_in1.dataType) && m_in1.inputType == INPUTTYPE_DYNAMIC; 1438 - string inValue0; 1439 - string inValue1; 1440 - DataType resultType = TYPE_LAST; 1441 - Precision resultPrec = m_in0.precision; 1442 - vector<string> passVars; 1443 - int numInputs = (isOperationBinary(m_op)) ? (2) : (1); 1444 - 1445 - std::string operationValue0; 1446 - std::string operationValue1; 1447 - 1448 - DE_ASSERT(!isInDynMat0 || !isInDynMat1); // Only single dynamic matrix input is allowed. 1449 - DE_UNREF(isInDynMat0 && isInDynMat1); 1450 - 1451 - // Compute result type. 1452 - if (isDataTypeMatrix(m_in0.dataType) && isDataTypeMatrix(m_in1.dataType)) 1453 - { 1454 - DE_ASSERT(m_in0.dataType == m_in1.dataType); 1455 - resultType = m_in0.dataType; 1456 - } 1457 - else if (getOperationType(m_op) == OPERATIONTYPE_UNARY_PREFIX_OPERATOR || 1458 - getOperationType(m_op) == OPERATIONTYPE_UNARY_POSTFIX_OPERATOR) 1459 - { 1460 - resultType = m_in0.dataType; 1461 - } 1462 - else 1463 - { 1464 - int matNdx = isDataTypeMatrix(m_in0.dataType) ? 0 : 1; 1465 - DataType matrixType = matNdx == 0 ? m_in0.dataType : m_in1.dataType; 1466 - DataType otherType = matNdx == 0 ? m_in1.dataType : m_in0.dataType; 1467 - 1468 - if (otherType == TYPE_FLOAT) 1469 - resultType = matrixType; 1470 - else 1471 - { 1472 - DE_ASSERT(isDataTypeVector(otherType)); 1473 - resultType = otherType; 1474 - } 1475 - } 1476 - 1477 - vtx << "attribute highp vec4 a_position;\n"; 1478 - if (m_isVertexCase) 1479 - { 1480 - vtx << "varying mediump vec4 v_color;\n"; 1481 - frag << "varying mediump vec4 v_color;\n"; 1482 - } 1483 - 1484 - // Input declarations. 1485 - for (int inNdx = 0; inNdx < numInputs; inNdx++) 1486 - { 1487 - const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; 1488 - const char* precName = getPrecisionName(in.precision); 1489 - const char* typeName = getDataTypeName(in.dataType); 1490 - string& inValue = inNdx > 0 ? inValue1 : inValue0; 1491 - 1492 - if (in.inputType == INPUTTYPE_DYNAMIC) 1493 - { 1494 - vtx << "attribute " << precName << " " << typeName << " a_"; 1495 - 1496 - if (isDataTypeMatrix(in.dataType)) 1497 - { 1498 - // a_matN, v_matN 1499 - vtx << typeName << ";\n"; 1500 - if (!m_isVertexCase) 1501 - { 1502 - vtx << "varying " << precName << " " << typeName << " v_" << typeName << ";\n"; 1503 - frag << "varying " << precName << " " << typeName << " v_" << typeName << ";\n"; 1504 - passVars.push_back(typeName); 1505 - } 1506 - 1507 - inValue = string(m_isVertexCase ? "a_" : "v_") + getDataTypeName(in.dataType); 1508 - } 1509 - else 1510 - { 1511 - // a_coords, v_coords 1512 - vtx << "coords;\n"; 1513 - if (!m_isVertexCase) 1514 - { 1515 - vtx << "varying " << precName << " " << typeName << " v_coords;\n"; 1516 - frag << "varying " << precName << " " << typeName << " v_coords;\n"; 1517 - passVars.push_back("coords"); 1518 - } 1519 - 1520 - inValue = m_isVertexCase ? "a_coords" : "v_coords"; 1521 - } 1522 - } 1523 - else if (in.inputType == INPUTTYPE_UNIFORM) 1524 - { 1525 - op << "uniform " << precName << " " << typeName << " u_in" << inNdx << ";\n"; 1526 - inValue = string("u_in") + de::toString(inNdx); 1527 - } 1528 - else if (in.inputType == INPUTTYPE_CONST) 1529 - { 1530 - op << "const " << precName << " " << typeName << " in" << inNdx << " = "; 1531 - 1532 - // Generate declaration. 1533 - switch (in.dataType) 1534 - { 1535 - case TYPE_FLOAT: op << de::floatToString(s_constInFloat[inNdx], 1); break; 1536 - case TYPE_FLOAT_VEC2: writeVectorConstructor<2>(op, s_constInVec2[inNdx]); break; 1537 - case TYPE_FLOAT_VEC3: writeVectorConstructor<3>(op, s_constInVec3[inNdx]); break; 1538 - case TYPE_FLOAT_VEC4: writeVectorConstructor<4>(op, s_constInVec4[inNdx]); break; 1539 - case TYPE_FLOAT_MAT2: writeMatrixConstructor<2, 2>(op, Mat2(s_constInMat2[inNdx])); break; 1540 - case TYPE_FLOAT_MAT3: writeMatrixConstructor<3, 3>(op, Mat3(s_constInMat3[inNdx])); break; 1541 - case TYPE_FLOAT_MAT4: writeMatrixConstructor<4, 4>(op, Mat4(s_constInMat4[inNdx])); break; 1542 - 1543 - default: 1544 - DE_ASSERT(DE_FALSE); 1545 - } 1546 - 1547 - op << ";\n"; 1548 - 1549 - inValue = string("in") + de::toString(inNdx); 1550 - } 1551 - } 1552 - 1553 - vtx << "\n" 1554 - << "void main (void)\n" 1555 - << "{\n" 1556 - << " gl_Position = a_position;\n"; 1557 - frag << "\n" 1558 - << "void main (void)\n" 1559 - << "{\n"; 1560 - 1561 - if (m_isVertexCase) 1562 - { 1563 - frag << " gl_FragColor = v_color;\n"; 1564 - } 1565 - else 1566 - { 1567 - for (vector<string>::const_iterator copyIter = passVars.begin(); copyIter != passVars.end(); copyIter++) 1568 - vtx << " v_" << *copyIter << " = " << "a_" << *copyIter << ";\n"; 1569 - } 1570 - 1571 - // Operation. 1572 - 1573 - switch (getOperationNature(m_op)) 1574 - { 1575 - case OPERATIONNATURE_PURE: 1576 - DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); 1577 - 1578 - operationValue0 = inValue0; 1579 - operationValue1 = inValue1; 1580 - break; 1581 - 1582 - case OPERATIONNATURE_MUTATING: 1583 - DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); 1584 - 1585 - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " tmpValue = " << inValue0 << ";\n"; 1586 - 1587 - operationValue0 = "tmpValue"; 1588 - operationValue1 = inValue1; 1589 - break; 1590 - 1591 - case OPERATIONNATURE_ASSIGNMENT: 1592 - DE_ASSERT(getOperationType(m_op) == OPERATIONTYPE_ASSIGNMENT); 1593 - 1594 - operationValue0 = inValue0; 1595 - operationValue1 = inValue1; 1596 - break; 1597 - 1598 - default: 1599 - DE_ASSERT(DE_FALSE); 1600 - } 1601 - 1602 - switch (getOperationType(m_op)) 1603 - { 1604 - case OPERATIONTYPE_BINARY_OPERATOR: 1605 - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << " " << getOperationName(m_op) << " " << operationValue1 << ";\n"; 1606 - break; 1607 - 1608 - case OPERATIONTYPE_UNARY_PREFIX_OPERATOR: 1609 - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << operationValue0 << ";\n"; 1610 - break; 1611 - 1612 - case OPERATIONTYPE_UNARY_POSTFIX_OPERATOR: 1613 - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << getOperationName(m_op) << ";\n"; 1614 - break; 1615 - 1616 - case OPERATIONTYPE_BINARY_FUNCTION: 1617 - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << "(" << operationValue0 << ", " << operationValue1 << ");\n"; 1618 - break; 1619 - 1620 - case OPERATIONTYPE_ASSIGNMENT: 1621 - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << ";\n"; 1622 - op << " res " << getOperationName(m_op) << " " << operationValue1 << ";\n"; 1623 - break; 1624 - 1625 - default: 1626 - DE_ASSERT(DE_FALSE); 1627 - } 1628 - 1629 - // Reduction to vec3 (rgb). Check the used value too if it was modified. 1630 - op << " " << (m_isVertexCase ? "v_color" : "gl_FragColor") << " = "; 1631 - 1632 - if (isOperationValueModifying(m_op)) 1633 - op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0) + vec4(" << genGLSLMatToVec3Reduction(resultType, "tmpValue") << ", 0.0);\n"; 1634 - else 1635 - op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0);\n"; 1636 - 1637 - vtx << "}\n"; 1638 - frag << "}\n"; 1639 - 1640 - m_vertShaderSource = vtx.str(); 1641 - m_fragShaderSource = frag.str(); 1642 - 1643 - // \todo [2012-02-14 pyry] Compute better values for matrix tests. 1644 - m_userAttribTransforms.resize(4); 1645 - for (int attribNdx = 0; attribNdx < 4; attribNdx++) 1646 - { 1647 - m_userAttribTransforms[attribNdx] = Mat4(0.0f); 1648 - m_userAttribTransforms[attribNdx]((0 + attribNdx) % 4, 0) = 1.0f; 1649 - m_userAttribTransforms[attribNdx]((1 + attribNdx) % 4, 1) = 1.0f; 1650 - m_userAttribTransforms[attribNdx]((2 + attribNdx) % 4, 2) = 1.0f; 1651 - m_userAttribTransforms[attribNdx]((3 + attribNdx) % 4, 3) = 1.0f; 1652 - } 1653 - 1654 - // prevent bad reference cases such as black result images by fine-tuning used matrices 1655 - if (getOperationTestMatrixType(m_op) != TESTMATRIXTYPE_DEFAULT) 1656 - { 1657 - for (int attribNdx = 0; attribNdx < 4; attribNdx++) 1658 - { 1659 - for (int row = 0; row < 4; row++) 1660 - for (int col = 0; col < 4; col++) 1661 - { 1662 - switch (getOperationTestMatrixType(m_op)) 1663 - { 1664 - case TESTMATRIXTYPE_NEGATED: 1665 - m_userAttribTransforms[attribNdx](row, col) = -m_userAttribTransforms[attribNdx](row, col); 1666 - break; 1667 - case TESTMATRIXTYPE_INCREMENTED: 1668 - m_userAttribTransforms[attribNdx](row, col) += 0.3f; 1669 - break; 1670 - case TESTMATRIXTYPE_DECREMENTED: 1671 - m_userAttribTransforms[attribNdx](row, col) -= 0.1f; 1672 - break; 1673 - 1674 - default: 1675 - DE_ASSERT(DE_FALSE); 1676 - break; 1677 - } 1678 - } 1679 - } 1680 - } 1681 - 1682 - ShaderRenderCase::init(); 1683 + std::ostringstream vtx; 1684 + std::ostringstream frag; 1685 + std::ostringstream& op = m_isVertexCase ? vtx : frag; 1686 + 1687 + bool isInDynMat0 = isDataTypeMatrix(m_in0.dataType) && m_in0.inputType == INPUTTYPE_DYNAMIC; 1688 + bool isInDynMat1 = isDataTypeMatrix(m_in1.dataType) && m_in1.inputType == INPUTTYPE_DYNAMIC; 1689 + string inValue0; 1690 + string inValue1; 1691 + DataType resultType = TYPE_LAST; 1692 + Precision resultPrec = m_in0.precision; 1693 + vector<string> passVars; 1694 + int numInputs = (isOperationBinary(m_op)) ? (2) : (1); 1695 + 1696 + std::string operationValue0; 1697 + std::string operationValue1; 1698 + 1699 + DE_ASSERT(!isInDynMat0 || !isInDynMat1); // Only single dynamic matrix input is allowed. 1700 + DE_UNREF(isInDynMat0 && isInDynMat1); 1701 + 1702 + // Compute result type. 1703 + if (isDataTypeMatrix(m_in0.dataType) && isDataTypeMatrix(m_in1.dataType)) 1704 + { 1705 + DE_ASSERT(m_in0.dataType == m_in1.dataType); 1706 + resultType = m_in0.dataType; 1707 + } 1708 + else if (getOperationType(m_op) == OPERATIONTYPE_UNARY_PREFIX_OPERATOR || 1709 + getOperationType(m_op) == OPERATIONTYPE_UNARY_POSTFIX_OPERATOR) 1710 + { 1711 + resultType = m_in0.dataType; 1712 + } 1713 + else 1714 + { 1715 + int matNdx = isDataTypeMatrix(m_in0.dataType) ? 0 : 1; 1716 + DataType matrixType = matNdx == 0 ? m_in0.dataType : m_in1.dataType; 1717 + DataType otherType = matNdx == 0 ? m_in1.dataType : m_in0.dataType; 1718 + 1719 + if (otherType == TYPE_FLOAT) 1720 + resultType = matrixType; 1721 + else 1722 + { 1723 + DE_ASSERT(isDataTypeVector(otherType)); 1724 + resultType = otherType; 1725 + } 1726 + } 1727 + 1728 + vtx << "attribute highp vec4 a_position;\n"; 1729 + if (m_isVertexCase) 1730 + { 1731 + vtx << "varying mediump vec4 v_color;\n"; 1732 + frag << "varying mediump vec4 v_color;\n"; 1733 + } 1734 + 1735 + // Input declarations. 1736 + for (int inNdx = 0; inNdx < numInputs; inNdx++) 1737 + { 1738 + const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; 1739 + const char* precName = getPrecisionName(in.precision); 1740 + const char* typeName = getDataTypeName(in.dataType); 1741 + string& inValue = inNdx > 0 ? inValue1 : inValue0; 1742 + 1743 + if (in.inputType == INPUTTYPE_DYNAMIC) 1744 + { 1745 + vtx << "attribute " << precName << " " << typeName << " a_"; 1746 + 1747 + if (isDataTypeMatrix(in.dataType)) 1748 + { 1749 + // a_matN, v_matN 1750 + vtx << typeName << ";\n"; 1751 + if (!m_isVertexCase) 1752 + { 1753 + vtx << "varying " << precName << " " << typeName << " v_" << typeName << ";\n"; 1754 + frag << "varying " << precName << " " << typeName << " v_" << typeName << ";\n"; 1755 + passVars.push_back(typeName); 1756 + } 1757 + 1758 + inValue = string(m_isVertexCase ? "a_" : "v_") + getDataTypeName(in.dataType); 1759 + } 1760 + else 1761 + { 1762 + // a_coords, v_coords 1763 + vtx << "coords;\n"; 1764 + if (!m_isVertexCase) 1765 + { 1766 + vtx << "varying " << precName << " " << typeName << " v_coords;\n"; 1767 + frag << "varying " << precName << " " << typeName << " v_coords;\n"; 1768 + passVars.push_back("coords"); 1769 + } 1770 + 1771 + inValue = m_isVertexCase ? "a_coords" : "v_coords"; 1772 + } 1773 + } 1774 + else if (in.inputType == INPUTTYPE_UNIFORM) 1775 + { 1776 + op << "uniform " << precName << " " << typeName << " u_in" << inNdx << ";\n"; 1777 + inValue = string("u_in") + de::toString(inNdx); 1778 + } 1779 + else if (in.inputType == INPUTTYPE_CONST) 1780 + { 1781 + op << "const " << precName << " " << typeName << " in" << inNdx << " = "; 1782 + 1783 + // Generate declaration. 1784 + switch (in.dataType) 1785 + { 1786 + case TYPE_FLOAT: op << de::floatToString(s_constInFloat[inNdx], 1); break; 1787 + case TYPE_FLOAT_VEC2: writeVectorConstructor<2>(op, s_constInVec2[inNdx]); break; 1788 + case TYPE_FLOAT_VEC3: writeVectorConstructor<3>(op, s_constInVec3[inNdx]); break; 1789 + case TYPE_FLOAT_VEC4: writeVectorConstructor<4>(op, s_constInVec4[inNdx]); break; 1790 + case TYPE_FLOAT_MAT2: writeMatrixConstructor<2, 2>(op, Mat2(s_constInMat2[inNdx])); break; 1791 + case TYPE_FLOAT_MAT3: writeMatrixConstructor<3, 3>(op, Mat3(s_constInMat3[inNdx])); break; 1792 + case TYPE_FLOAT_MAT4: writeMatrixConstructor<4, 4>(op, Mat4(s_constInMat4[inNdx])); break; 1793 + 1794 + default: 1795 + DE_ASSERT(DE_FALSE); 1796 + } 1797 + 1798 + op << ";\n"; 1799 + 1800 + inValue = string("in") + de::toString(inNdx); 1801 + } 1802 + } 1803 + 1804 + vtx << "\n" 1805 + << "void main (void)\n" 1806 + << "{\n" 1807 + << " gl_Position = a_position;\n"; 1808 + frag << "\n" 1809 + << "void main (void)\n" 1810 + << "{\n"; 1811 + 1812 + if (m_isVertexCase) 1813 + { 1814 + frag << " gl_FragColor = v_color;\n"; 1815 + } 1816 + else 1817 + { 1818 + for (vector<string>::const_iterator copyIter = passVars.begin(); copyIter != passVars.end(); copyIter++) 1819 + vtx << " v_" << *copyIter << " = " << "a_" << *copyIter << ";\n"; 1820 + } 1821 + 1822 + // Operation. 1823 + 1824 + switch (getOperationNature(m_op)) 1825 + { 1826 + case OPERATIONNATURE_PURE: 1827 + DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); 1828 + 1829 + operationValue0 = inValue0; 1830 + operationValue1 = inValue1; 1831 + break; 1832 + 1833 + case OPERATIONNATURE_MUTATING: 1834 + DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); 1835 + 1836 + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " tmpValue = " << inValue0 << ";\n"; 1837 + 1838 + operationValue0 = "tmpValue"; 1839 + operationValue1 = inValue1; 1840 + break; 1841 + 1842 + case OPERATIONNATURE_ASSIGNMENT: 1843 + DE_ASSERT(getOperationType(m_op) == OPERATIONTYPE_ASSIGNMENT); 1844 + 1845 + operationValue0 = inValue0; 1846 + operationValue1 = inValue1; 1847 + break; 1848 + 1849 + default: 1850 + DE_ASSERT(DE_FALSE); 1851 + } 1852 + 1853 + switch (getOperationType(m_op)) 1854 + { 1855 + case OPERATIONTYPE_BINARY_OPERATOR: 1856 + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << " " << getOperationName(m_op) << " " << operationValue1 << ";\n"; 1857 + break; 1858 + 1859 + case OPERATIONTYPE_UNARY_PREFIX_OPERATOR: 1860 + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << operationValue0 << ";\n"; 1861 + break; 1862 + 1863 + case OPERATIONTYPE_UNARY_POSTFIX_OPERATOR: 1864 + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << getOperationName(m_op) << ";\n"; 1865 + break; 1866 + 1867 + case OPERATIONTYPE_BINARY_FUNCTION: 1868 + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << "(" << operationValue0 << ", " << operationValue1 << ");\n"; 1869 + break; 1870 + 1871 + case OPERATIONTYPE_ASSIGNMENT: 1872 + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << ";\n"; 1873 + op << " res " << getOperationName(m_op) << " " << operationValue1 << ";\n"; 1874 + break; 1875 + 1876 + default: 1877 + DE_ASSERT(DE_FALSE); 1878 + } 1879 + 1880 + // Reduction to vec3 (rgb). Check the used value too if it was modified. 1881 + op << " " << (m_isVertexCase ? "v_color" : "gl_FragColor") << " = "; 1882 + 1883 + if (isOperationValueModifying(m_op)) 1884 + op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0) + vec4(" << genGLSLMatToVec3Reduction(resultType, "tmpValue") << ", 0.0);\n"; 1885 + else 1886 + op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0);\n"; 1887 + 1888 + vtx << "}\n"; 1889 + frag << "}\n"; 1890 + 1891 + m_vertShaderSource = vtx.str(); 1892 + m_fragShaderSource = frag.str(); 1893 + 1894 + // \todo [2012-02-14 pyry] Compute better values for matrix tests. 1895 + m_userAttribTransforms.resize(4); 1896 + for (int attribNdx = 0; attribNdx < 4; attribNdx++) 1897 + { 1898 + m_userAttribTransforms[attribNdx] = Mat4(0.0f); 1899 + m_userAttribTransforms[attribNdx]((0 + attribNdx) % 4, 0) = 1.0f; 1900 + m_userAttribTransforms[attribNdx]((1 + attribNdx) % 4, 1) = 1.0f; 1901 + m_userAttribTransforms[attribNdx]((2 + attribNdx) % 4, 2) = 1.0f; 1902 + m_userAttribTransforms[attribNdx]((3 + attribNdx) % 4, 3) = 1.0f; 1903 + } 1904 + 1905 + // prevent bad reference cases such as black result images by fine-tuning used matrices 1906 + if (getOperationTestMatrixType(m_op) != TESTMATRIXTYPE_DEFAULT) 1907 + { 1908 + for (int attribNdx = 0; attribNdx < 4; attribNdx++) 1909 + { 1910 + for (int row = 0; row < 4; row++) 1911 + for (int col = 0; col < 4; col++) 1912 + { 1913 + switch (getOperationTestMatrixType(m_op)) 1914 + { 1915 + case TESTMATRIXTYPE_NEGATED: 1916 + m_userAttribTransforms[attribNdx](row, col) = -m_userAttribTransforms[attribNdx](row, col); 1917 + break; 1918 + case TESTMATRIXTYPE_INCREMENTED: 1919 + m_userAttribTransforms[attribNdx](row, col) += 0.3f; 1920 + break; 1921 + case TESTMATRIXTYPE_DECREMENTED: 1922 + m_userAttribTransforms[attribNdx](row, col) -= 0.1f; 1923 + break; 1924 + 1925 + default: 1926 + DE_ASSERT(DE_FALSE); 1927 + break; 1928 + } 1929 + } 1930 + } 1931 + } 1932 + 1933 + ShaderRenderCase::init(); 1934 } 1935 1936 std::string ShaderMatrixCase::genGLSLMatToVec3Reduction (const glu::DataType& matType, const char* varName) 1937 { 1938 - std::ostringstream op; 1939 - 1940 - switch (matType) 1941 - { 1942 - case TYPE_FLOAT: op << varName << ", " << varName << ", " << varName << ""; break; 1943 - case TYPE_FLOAT_VEC2: op << varName << ".x, " << varName << ".y, " << varName << ".x"; break; 1944 - case TYPE_FLOAT_VEC3: op << varName << ""; break; 1945 - case TYPE_FLOAT_VEC4: op << varName << ".x, " << varName << ".y, " << varName << ".z+" << varName << ".w"; break; 1946 - case TYPE_FLOAT_MAT2: op << varName << "[0][0], " << varName << "[1][0], " << varName << "[0][1]+" << varName << "[1][1]"; break; 1947 - case TYPE_FLOAT_MAT3: op << varName << "[0]+" << varName << "[1]+" << varName << "[2]"; break; 1948 - case TYPE_FLOAT_MAT4: op << varName << "[0].xyz+" << varName << "[1].yzw+" << varName << "[2].zwx+" << varName << "[3].wxy"; break; 1949 - 1950 - default: 1951 - DE_ASSERT(DE_FALSE); 1952 - } 1953 - 1954 - return op.str(); 1955 + std::ostringstream op; 1956 + 1957 + switch (matType) 1958 + { 1959 + case TYPE_FLOAT: op << varName << ", " << varName << ", " << varName << ""; break; 1960 + case TYPE_FLOAT_VEC2: op << varName << ".x, " << varName << ".y, " << varName << ".x"; break; 1961 + case TYPE_FLOAT_VEC3: op << varName << ""; break; 1962 + case TYPE_FLOAT_VEC4: op << varName << ".x, " << varName << ".y, " << varName << ".z+" << varName << ".w"; break; 1963 + case TYPE_FLOAT_MAT2: op << varName << "[0][0], " << varName << "[1][0], " << varName << "[0][1]+" << varName << "[1][1]"; break; 1964 + case TYPE_FLOAT_MAT3: op << varName << "[0]+" << varName << "[1]+" << varName << "[2]"; break; 1965 + case TYPE_FLOAT_MAT4: op << varName << "[0].xyz+" << varName << "[1].yzw+" << varName << "[2].zwx+" << varName << "[3].wxy"; break; 1966 + 1967 + default: 1968 + DE_ASSERT(DE_FALSE); 1969 + } 1970 + 1971 + return op.str(); 1972 } 1973 1974 void ShaderMatrixCase::setupUniforms (int programID, const tcu::Vec4& constCoords) 1975 { 1976 - const glw::Functions& gl = m_renderCtx.getFunctions(); 1977 - 1978 - DE_UNREF(constCoords); 1979 - 1980 - for (int inNdx = 0; inNdx < 2; inNdx++) 1981 - { 1982 - const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; 1983 - 1984 - if (in.inputType == INPUTTYPE_UNIFORM) 1985 - { 1986 - int loc = gl.getUniformLocation(programID, (string("u_in") + de::toString(inNdx)).c_str()); 1987 - 1988 - if (loc < 0) 1989 - continue; 1990 - 1991 - switch (in.dataType) 1992 - { 1993 - case TYPE_FLOAT: gl.uniform1f(loc, s_constInFloat[inNdx]); break; 1994 - case TYPE_FLOAT_VEC2: gl.uniform2fv(loc, 1, s_constInVec2[inNdx].getPtr()); break; 1995 - case TYPE_FLOAT_VEC3: gl.uniform3fv(loc, 1, s_constInVec3[inNdx].getPtr()); break; 1996 - case TYPE_FLOAT_VEC4: gl.uniform4fv(loc, 1, s_constInVec4[inNdx].getPtr()); break; 1997 - case TYPE_FLOAT_MAT2: gl.uniformMatrix2fv(loc, 1, GL_FALSE, s_constInMat2[inNdx].getColumnMajorData().getPtr()); break; 1998 - case TYPE_FLOAT_MAT3: gl.uniformMatrix3fv(loc, 1, GL_FALSE, s_constInMat3[inNdx].getColumnMajorData().getPtr()); break; 1999 - case TYPE_FLOAT_MAT4: gl.uniformMatrix4fv(loc, 1, GL_FALSE, s_constInMat4[inNdx].getColumnMajorData().getPtr()); break; 2000 - default: 2001 - DE_ASSERT(false); 2002 - } 2003 - } 2004 - } 2005 + const glw::Functions& gl = m_renderCtx.getFunctions(); 2006 + 2007 + DE_UNREF(constCoords); 2008 + 2009 + for (int inNdx = 0; inNdx < 2; inNdx++) 2010 + { 2011 + const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; 2012 + 2013 + if (in.inputType == INPUTTYPE_UNIFORM) 2014 + { 2015 + int loc = gl.getUniformLocation(programID, (string("u_in") + de::toString(inNdx)).c_str()); 2016 + 2017 + if (loc < 0) 2018 + continue; 2019 + 2020 + switch (in.dataType) 2021 + { 2022 + case TYPE_FLOAT: gl.uniform1f(loc, s_constInFloat[inNdx]); break; 2023 + case TYPE_FLOAT_VEC2: gl.uniform2fv(loc, 1, s_constInVec2[inNdx].getPtr()); break; 2024 + case TYPE_FLOAT_VEC3: gl.uniform3fv(loc, 1, s_constInVec3[inNdx].getPtr()); break; 2025 + case TYPE_FLOAT_VEC4: gl.uniform4fv(loc, 1, s_constInVec4[inNdx].getPtr()); break; 2026 + case TYPE_FLOAT_MAT2: gl.uniformMatrix2fv(loc, 1, GL_FALSE, s_constInMat2[inNdx].getColumnMajorData().getPtr()); break; 2027 + case TYPE_FLOAT_MAT3: gl.uniformMatrix3fv(loc, 1, GL_FALSE, s_constInMat3[inNdx].getColumnMajorData().getPtr()); break; 2028 + case TYPE_FLOAT_MAT4: gl.uniformMatrix4fv(loc, 1, GL_FALSE, s_constInMat4[inNdx].getColumnMajorData().getPtr()); break; 2029 + default: 2030 + DE_ASSERT(false); 2031 + } 2032 + } 2033 + } 2034 } 2035 2036 ShaderMatrixTests::ShaderMatrixTests (Context& context) 2037 - : TestCaseGroup(context, "matrix", "Matrix Tests") 2038 + : TestCaseGroup(context, "matrix", "Matrix Tests") 2039 { 2040 } 2041 2042 @@ -1086,136 +1086,136 @@ ShaderMatrixTests::~ShaderMatrixTests (void) 2043 2044 void ShaderMatrixTests::init (void) 2045 { 2046 - static const struct 2047 - { 2048 - const char* name; 2049 - const char* desc; 2050 - MatrixOp op; 2051 - bool extendedInputTypeCases; // !< test with const and uniform types too 2052 - } ops[] = 2053 - { 2054 - { "add", "Matrix addition tests", OP_ADD, true }, 2055 - { "sub", "Matrix subtraction tests", OP_SUB, true }, 2056 - { "mul", "Matrix multiplication tests", OP_MUL, true }, 2057 - { "div", "Matrix division tests", OP_DIV, true }, 2058 - { "matrixcompmult", "Matrix component-wise multiplication tests", OP_COMP_MUL, false }, 2059 - { "unary_addition", "Matrix unary addition tests", OP_UNARY_PLUS, false }, 2060 - { "negation", "Matrix negation tests", OP_NEGATION, false }, 2061 - { "pre_increment", "Matrix prefix increment tests", OP_PRE_INCREMENT, false }, 2062 - { "pre_decrement", "Matrix prefix decrement tests", OP_PRE_DECREMENT, false }, 2063 - { "post_increment", "Matrix postfix increment tests", OP_POST_INCREMENT, false }, 2064 - { "post_decrement", "Matrix postfix decrement tests", OP_POST_DECREMENT, false }, 2065 - { "add_assign", "Matrix add into tests", OP_ADD_INTO, false }, 2066 - { "sub_assign", "Matrix subtract from tests", OP_SUBTRACT_FROM, false }, 2067 - { "mul_assign", "Matrix multiply into tests", OP_MULTIPLY_INTO, false }, 2068 - { "div_assign", "Matrix divide into tests", OP_DIVIDE_INTO, false }, 2069 - }; 2070 - 2071 - struct InputTypeSpec 2072 - { 2073 - const char* name; 2074 - const char* desc; 2075 - InputType type; 2076 - }; 2077 - static const InputTypeSpec extendedInputTypes[] = 2078 - { 2079 - { "const", "Constant matrix input", INPUTTYPE_CONST }, 2080 - { "uniform", "Uniform matrix input", INPUTTYPE_UNIFORM }, 2081 - { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } 2082 - }; 2083 - static const InputTypeSpec reducedInputTypes[] = 2084 - { 2085 - { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } 2086 - }; 2087 - 2088 - static const DataType matrixTypes[] = 2089 - { 2090 - TYPE_FLOAT_MAT2, 2091 - TYPE_FLOAT_MAT3, 2092 - TYPE_FLOAT_MAT4 2093 - }; 2094 - 2095 - static const Precision precisions[] = 2096 - { 2097 - PRECISION_LOWP, 2098 - PRECISION_MEDIUMP, 2099 - PRECISION_HIGHP 2100 - }; 2101 - 2102 - for (int opNdx = 0; opNdx < DE_LENGTH_OF_ARRAY(ops); opNdx++) 2103 - { 2104 - const InputTypeSpec* inTypeList = (ops[opNdx].extendedInputTypeCases) ? (extendedInputTypes) : (reducedInputTypes); 2105 - const int inTypeListSize = (ops[opNdx].extendedInputTypeCases) ? (DE_LENGTH_OF_ARRAY(extendedInputTypes)) : (DE_LENGTH_OF_ARRAY(reducedInputTypes)); 2106 - const MatrixOp op = ops[opNdx].op; 2107 - tcu::TestCaseGroup* opGroup = new tcu::TestCaseGroup(m_testCtx, ops[opNdx].name, ops[opNdx].desc); 2108 - 2109 - addChild(opGroup); 2110 - 2111 - for (int inTypeNdx = 0; inTypeNdx < inTypeListSize; inTypeNdx++) 2112 - { 2113 - const InputType inputType = inTypeList[inTypeNdx].type; 2114 - 2115 - for (int matTypeNdx = 0; matTypeNdx < DE_LENGTH_OF_ARRAY(matrixTypes); matTypeNdx++) 2116 - { 2117 - DataType matType = matrixTypes[matTypeNdx]; 2118 - const char* matTypeName = getDataTypeName(matType); 2119 - 2120 - for (int precNdx = 0; precNdx < DE_LENGTH_OF_ARRAY(precisions); precNdx++) 2121 - { 2122 - Precision precision = precisions[precNdx]; 2123 - const char* precName = getPrecisionName(precision); 2124 - string baseName = string(inTypeList[inTypeNdx].name) + "_" + precName + "_" + matTypeName + "_"; 2125 - ShaderInput matIn (inputType, matType, precision); 2126 - 2127 - if (isOperationMatrixScalar(op)) 2128 - { 2129 - // Matrix-scalar \note For div cases we use uniform input. 2130 - ShaderInput scalarIn(op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, TYPE_FLOAT, precision); 2131 - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix-scalar case", matIn, scalarIn, op, true)); 2132 - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix-scalar case", matIn, scalarIn, op, false)); 2133 - } 2134 - 2135 - if (isOperationMatrixVector(op)) 2136 - { 2137 - // Matrix-vector. 2138 - DataType vecType = getDataTypeFloatVec(getDataTypeMatrixNumColumns(matType)); 2139 - ShaderInput vecIn (op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, vecType, precision); 2140 - 2141 - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(vecType) + "_vertex").c_str(), "Matrix-vector case", matIn, vecIn, op, true)); 2142 - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(vecType) + "_fragment").c_str(), "Matrix-vector case", matIn, vecIn, op, false)); 2143 - 2144 - // Vector-matrix. 2145 - string vecMatName = string(inTypeList[inTypeNdx].name) + "_" + precName + "_" + getDataTypeName(vecType) + "_" + matTypeName; 2146 - opGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_vertex").c_str(), "Vector-matrix case", vecIn, matIn, op, true)); 2147 - opGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_fragment").c_str(), "Vector-matrix case", vecIn, matIn, op, false)); 2148 - } 2149 - 2150 - if (isOperationMatrixMatrix(op)) 2151 - { 2152 - // Matrix-matrix. 2153 - ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); 2154 - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_vertex").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, true)); 2155 - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_fragment").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, false)); 2156 - } 2157 - 2158 - if (isOperationUnary(op)) 2159 - { 2160 - // op matrix 2161 - ShaderInput voidInput(INPUTTYPE_LAST, TYPE_LAST, PRECISION_LAST); 2162 - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "vertex").c_str(), "Matrix case", matIn, voidInput, op, true)); 2163 - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "fragment").c_str(), "Matrix case", matIn, voidInput, op, false)); 2164 - } 2165 - 2166 - if (isOperationAssignment(op)) 2167 - { 2168 - ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); 2169 - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "vertex").c_str(), "Matrix assignment case", matIn, otherMatIn, op, true)); 2170 - opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "fragment").c_str(), "Matrix assignment case", matIn, otherMatIn, op, false)); 2171 - } 2172 - } 2173 - } 2174 - } 2175 - } 2176 + static const struct 2177 + { 2178 + const char* name; 2179 + const char* desc; 2180 + MatrixOp op; 2181 + bool extendedInputTypeCases; // !< test with const and uniform types too 2182 + } ops[] = 2183 + { 2184 + { "add", "Matrix addition tests", OP_ADD, true }, 2185 + { "sub", "Matrix subtraction tests", OP_SUB, true }, 2186 + { "mul", "Matrix multiplication tests", OP_MUL, true }, 2187 + { "div", "Matrix division tests", OP_DIV, true }, 2188 + { "matrixcompmult", "Matrix component-wise multiplication tests", OP_COMP_MUL, false }, 2189 + { "unary_addition", "Matrix unary addition tests", OP_UNARY_PLUS, false }, 2190 + { "negation", "Matrix negation tests", OP_NEGATION, false }, 2191 + { "pre_increment", "Matrix prefix increment tests", OP_PRE_INCREMENT, false }, 2192 + { "pre_decrement", "Matrix prefix decrement tests", OP_PRE_DECREMENT, false }, 2193 + { "post_increment", "Matrix postfix increment tests", OP_POST_INCREMENT, false }, 2194 + { "post_decrement", "Matrix postfix decrement tests", OP_POST_DECREMENT, false }, 2195 + { "add_assign", "Matrix add into tests", OP_ADD_INTO, false }, 2196 + { "sub_assign", "Matrix subtract from tests", OP_SUBTRACT_FROM, false }, 2197 + { "mul_assign", "Matrix multiply into tests", OP_MULTIPLY_INTO, false }, 2198 + { "div_assign", "Matrix divide into tests", OP_DIVIDE_INTO, false }, 2199 + }; 2200 + 2201 + struct InputTypeSpec 2202 + { 2203 + const char* name; 2204 + const char* desc; 2205 + InputType type; 2206 + }; 2207 + static const InputTypeSpec extendedInputTypes[] = 2208 + { 2209 + { "const", "Constant matrix input", INPUTTYPE_CONST }, 2210 + { "uniform", "Uniform matrix input", INPUTTYPE_UNIFORM }, 2211 + { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } 2212 + }; 2213 + static const InputTypeSpec reducedInputTypes[] = 2214 + { 2215 + { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } 2216 + }; 2217 + 2218 + static const DataType matrixTypes[] = 2219 + { 2220 + TYPE_FLOAT_MAT2, 2221 + TYPE_FLOAT_MAT3, 2222 + TYPE_FLOAT_MAT4 2223 + }; 2224 + 2225 + static const Precision precisions[] = 2226 + { 2227 + PRECISION_LOWP, 2228 + PRECISION_MEDIUMP, 2229 + PRECISION_HIGHP 2230 + }; 2231 + 2232 + for (int opNdx = 0; opNdx < DE_LENGTH_OF_ARRAY(ops); opNdx++) 2233 + { 2234 + const InputTypeSpec* inTypeList = (ops[opNdx].extendedInputTypeCases) ? (extendedInputTypes) : (reducedInputTypes); 2235 + const int inTypeListSize = (ops[opNdx].extendedInputTypeCases) ? (DE_LENGTH_OF_ARRAY(extendedInputTypes)) : (DE_LENGTH_OF_ARRAY(reducedInputTypes)); 2236 + const MatrixOp op = ops[opNdx].op; 2237 + tcu::TestCaseGroup* opGroup = new tcu::TestCaseGroup(m_testCtx, ops[opNdx].name, ops[opNdx].desc); 2238 + 2239 + addChild(opGroup); 2240 + 2241 + for (int inTypeNdx = 0; inTypeNdx < inTypeListSize; inTypeNdx++) 2242 + { 2243 + const InputType inputType = inTypeList[inTypeNdx].type; 2244 + 2245 + for (int matTypeNdx = 0; matTypeNdx < DE_LENGTH_OF_ARRAY(matrixTypes); matTypeNdx++) 2246 + { 2247 + DataType matType = matrixTypes[matTypeNdx]; 2248 + const char* matTypeName = getDataTypeName(matType); 2249 + 2250 + for (int precNdx = 0; precNdx < DE_LENGTH_OF_ARRAY(precisions); precNdx++) 2251 + { 2252 + Precision precision = precisions[precNdx]; 2253 + const char* precName = getPrecisionName(precision); 2254 + string baseName = string(inTypeList[inTypeNdx].name) + "_" + precName + "_" + matTypeName + "_"; 2255 + ShaderInput matIn (inputType, matType, precision); 2256 + 2257 + if (isOperationMatrixScalar(op)) 2258 + { 2259 + // Matrix-scalar \note For div cases we use uniform input. 2260 + ShaderInput scalarIn(op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, TYPE_FLOAT, precision); 2261 + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix-scalar case", matIn, scalarIn, op, true)); 2262 + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix-scalar case", matIn, scalarIn, op, false)); 2263 + } 2264 + 2265 + if (isOperationMatrixVector(op)) 2266 + { 2267 + // Matrix-vector. 2268 + DataType vecType = getDataTypeFloatVec(getDataTypeMatrixNumColumns(matType)); 2269 + ShaderInput vecIn (op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, vecType, precision); 2270 + 2271 + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(vecType) + "_vertex").c_str(), "Matrix-vector case", matIn, vecIn, op, true)); 2272 + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(vecType) + "_fragment").c_str(), "Matrix-vector case", matIn, vecIn, op, false)); 2273 + 2274 + // Vector-matrix. 2275 + string vecMatName = string(inTypeList[inTypeNdx].name) + "_" + precName + "_" + getDataTypeName(vecType) + "_" + matTypeName; 2276 + opGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_vertex").c_str(), "Vector-matrix case", vecIn, matIn, op, true)); 2277 + opGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_fragment").c_str(), "Vector-matrix case", vecIn, matIn, op, false)); 2278 + } 2279 + 2280 + if (isOperationMatrixMatrix(op)) 2281 + { 2282 + // Matrix-matrix. 2283 + ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); 2284 + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_vertex").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, true)); 2285 + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_fragment").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, false)); 2286 + } 2287 + 2288 + if (isOperationUnary(op)) 2289 + { 2290 + // op matrix 2291 + ShaderInput voidInput(INPUTTYPE_LAST, TYPE_LAST, PRECISION_LAST); 2292 + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "vertex").c_str(), "Matrix case", matIn, voidInput, op, true)); 2293 + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "fragment").c_str(), "Matrix case", matIn, voidInput, op, false)); 2294 + } 2295 + 2296 + if (isOperationAssignment(op)) 2297 + { 2298 + ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); 2299 + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "vertex").c_str(), "Matrix assignment case", matIn, otherMatIn, op, true)); 2300 + opGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "fragment").c_str(), "Matrix assignment case", matIn, otherMatIn, op, false)); 2301 + } 2302 + } 2303 + } 2304 + } 2305 + } 2306 } 2307 2308 } // Functional 2309 diff --git a/src/tests/deqp_support/es3fShaderMatrixTests.cpp b/src/tests/deqp_support/es3fShaderMatrixTests.cpp 2310 index b18f8ba14..25784982c 100644 2311 --- a/src/tests/deqp_support/es3fShaderMatrixTests.cpp 2312 +++ b/src/tests/deqp_support/es3fShaderMatrixTests.cpp 2313 @@ -77,127 +77,127 @@ using tcu::Mat4; 2314 // Uniform / constant values for tests. 2315 // \note Input1 should not contain 0 components as it is used as divisor in div cases. 2316 // \todo [2012-02-14 pyry] Make these dynamic. 2317 -static const float s_constInFloat[2] = { 0.5f, -0.2f }; 2318 -static const Vec2 s_constInVec2[2] = { Vec2(1.2f, 0.5f), Vec2(0.5f, 1.0f) }; 2319 -static const Vec3 s_constInVec3[2] = { Vec3(1.1f, 0.1f, 0.5f), Vec3(-0.2f, 0.5f, 0.8f) }; 2320 -static const Vec4 s_constInVec4[2] = { Vec4(1.4f, 0.2f, -0.5f, 0.7f), Vec4(0.2f, -1.0f, 0.5f, 0.8f) }; 2321 +static const float s_constInFloat[2] = { 0.5f, -0.2f }; 2322 +static const Vec2 s_constInVec2[2] = { Vec2(1.2f, 0.5f), Vec2(0.5f, 1.0f) }; 2323 +static const Vec3 s_constInVec3[2] = { Vec3(1.1f, 0.1f, 0.5f), Vec3(-0.2f, 0.5f, 0.8f) }; 2324 +static const Vec4 s_constInVec4[2] = { Vec4(1.4f, 0.2f, -0.5f, 0.7f), Vec4(0.2f, -1.0f, 0.5f, 0.8f) }; 2325 2326 static const float s_constInMat2x2[2][4] = 2327 { 2328 - { 2329 - -0.1f, 1.0f, 2330 - -0.2f, 0.0f, 2331 - }, 2332 - { 2333 - 0.8f, 0.1f, 2334 - 0.5f, -0.9f, 2335 - }, 2336 + { 2337 + -0.1f, 1.0f, 2338 + -0.2f, 0.0f, 2339 + }, 2340 + { 2341 + 0.8f, 0.1f, 2342 + 0.5f, -0.9f, 2343 + }, 2344 }; 2345 static const float s_constInMat3x2[2][6] = 2346 { 2347 - { 2348 - 0.8f, -0.3f, 0.3f, 2349 - 1.0f, 1.2f, -1.2f, 2350 - }, 2351 - { 2352 - 1.2f, -1.0f, 0.5f, 2353 - -0.8f, 1.1f, 0.3f, 2354 - }, 2355 + { 2356 + 0.8f, -0.3f, 0.3f, 2357 + 1.0f, 1.2f, -1.2f, 2358 + }, 2359 + { 2360 + 1.2f, -1.0f, 0.5f, 2361 + -0.8f, 1.1f, 0.3f, 2362 + }, 2363 }; 2364 static const float s_constInMat4x2[2][8] = 2365 { 2366 - { 2367 - -0.2f, 0.5f, 0.0f, -1.0f, 2368 - 1.2f, -0.5f, 0.3f, -0.9f, 2369 - }, 2370 - { 2371 - 1.0f, 0.1f, -1.1f, 0.6f, 2372 - 0.8f, -1.2f, -1.1f, 0.7f, 2373 - }, 2374 + { 2375 + -0.2f, 0.5f, 0.0f, -1.0f, 2376 + 1.2f, -0.5f, 0.3f, -0.9f, 2377 + }, 2378 + { 2379 + 1.0f, 0.1f, -1.1f, 0.6f, 2380 + 0.8f, -1.2f, -1.1f, 0.7f, 2381 + }, 2382 }; 2383 static const float s_constInMat2x3[2][6] = 2384 { 2385 - { 2386 - -0.6f, -0.1f, 2387 - -0.7f, -1.2f, 2388 - -0.2f, 0.0f, 2389 - }, 2390 - { 2391 - 1.1f, 0.6f, 2392 - 0.8f, 1.0f, 2393 - 0.7f, 0.1f, 2394 - }, 2395 + { 2396 + -0.6f, -0.1f, 2397 + -0.7f, -1.2f, 2398 + -0.2f, 0.0f, 2399 + }, 2400 + { 2401 + 1.1f, 0.6f, 2402 + 0.8f, 1.0f, 2403 + 0.7f, 0.1f, 2404 + }, 2405 }; 2406 static const float s_constInMat3x3[2][9] = 2407 { 2408 - { 2409 - -0.2f, 1.1f, 1.2f, 2410 - -1.0f, 1.2f, 0.5f, 2411 - 0.7f, -0.2f, 1.0f, 2412 - }, 2413 - { 2414 - -0.1f, -0.1f, 0.1f, 2415 - -0.1f, -0.2f, 1.0f, 2416 - -0.5f, 0.1f, -0.4f, 2417 - }, 2418 + { 2419 + -0.2f, 1.1f, 1.2f, 2420 + -1.0f, 1.2f, 0.5f, 2421 + 0.7f, -0.2f, 1.0f, 2422 + }, 2423 + { 2424 + -0.1f, -0.1f, 0.1f, 2425 + -0.1f, -0.2f, 1.0f, 2426 + -0.5f, 0.1f, -0.4f, 2427 + }, 2428 }; 2429 static const float s_constInMat4x3[2][12] = 2430 { 2431 - { 2432 - -0.9f, 0.0f, 0.6f, 0.2f, 2433 - 0.9f, -0.1f, -0.3f, -0.7f, 2434 - -0.1f, 0.1f, 1.0f, 0.0f, 2435 - }, 2436 - { 2437 - 0.5f, 0.7f, 0.7f, 1.2f, 2438 - 1.1f, 0.1f, 1.0f, -1.0f, 2439 - -0.2f, -0.2f, -0.3f, -0.5f, 2440 - }, 2441 + { 2442 + -0.9f, 0.0f, 0.6f, 0.2f, 2443 + 0.9f, -0.1f, -0.3f, -0.7f, 2444 + -0.1f, 0.1f, 1.0f, 0.0f, 2445 + }, 2446 + { 2447 + 0.5f, 0.7f, 0.7f, 1.2f, 2448 + 1.1f, 0.1f, 1.0f, -1.0f, 2449 + -0.2f, -0.2f, -0.3f, -0.5f, 2450 + }, 2451 }; 2452 static const float s_constInMat2x4[2][8] = 2453 { 2454 - { 2455 - -0.6f, -1.1f, 2456 - -0.6f, -0.6f, 2457 - -0.2f, -0.6f, 2458 - -0.1f, -0.1f, 2459 - }, 2460 - { 2461 - -1.2f, -1.0f, 2462 - 0.7f, -1.0f, 2463 - 0.7f, 0.7f, 2464 - -0.4f, -0.3f, 2465 - }, 2466 + { 2467 + -0.6f, -1.1f, 2468 + -0.6f, -0.6f, 2469 + -0.2f, -0.6f, 2470 + -0.1f, -0.1f, 2471 + }, 2472 + { 2473 + -1.2f, -1.0f, 2474 + 0.7f, -1.0f, 2475 + 0.7f, 0.7f, 2476 + -0.4f, -0.3f, 2477 + }, 2478 }; 2479 static const float s_constInMat3x4[2][12] = 2480 { 2481 - { 2482 - 0.6f, -0.4f, 1.2f, 2483 - 0.9f, 0.8f, 0.4f, 2484 - 1.1f, 0.3f, 0.5f, 2485 - -0.2f, 0.0f, 1.1f, 2486 - }, 2487 - { 2488 - -0.8f, 1.2f, -0.2f, 2489 - -1.1f, -0.9f, -0.5f, 2490 - -1.2f, 1.0f, 1.2f, 2491 - 0.1f, -0.7f, -0.5f, 2492 - }, 2493 + { 2494 + 0.6f, -0.4f, 1.2f, 2495 + 0.9f, 0.8f, 0.4f, 2496 + 1.1f, 0.3f, 0.5f, 2497 + -0.2f, 0.0f, 1.1f, 2498 + }, 2499 + { 2500 + -0.8f, 1.2f, -0.2f, 2501 + -1.1f, -0.9f, -0.5f, 2502 + -1.2f, 1.0f, 1.2f, 2503 + 0.1f, -0.7f, -0.5f, 2504 + }, 2505 }; 2506 static const float s_constInMat4x4[2][16] = 2507 { 2508 - { 2509 - 0.3f, 0.9f, -0.2f, 1.0f, 2510 - -0.4f, -0.6f, 0.6f, -1.0f, 2511 - -0.9f, -0.1f, 0.3f, -0.2f, 2512 - -0.3f, -0.9f, 1.0f, 0.1f, 2513 - }, 2514 - { 2515 - 0.4f, -0.7f, -0.8f, 0.7f, 2516 - -0.4f, -0.8f, 0.6f, -0.3f, 2517 - 0.7f, -1.0f, 0.1f, -0.3f, 2518 - 0.2f, 0.6f, 0.4f, -1.0f, 2519 - }, 2520 + { 2521 + 0.3f, 0.9f, -0.2f, 1.0f, 2522 + -0.4f, -0.6f, 0.6f, -1.0f, 2523 + -0.9f, -0.1f, 0.3f, -0.2f, 2524 + -0.3f, -0.9f, 1.0f, 0.1f, 2525 + }, 2526 + { 2527 + 0.4f, -0.7f, -0.8f, 0.7f, 2528 + -0.4f, -0.8f, 0.6f, -0.3f, 2529 + 0.7f, -1.0f, 0.1f, -0.3f, 2530 + 0.2f, 0.6f, 0.4f, -1.0f, 2531 + }, 2532 }; 2533 2534 namespace MatrixCaseUtils 2535 @@ -205,49 +205,49 @@ namespace MatrixCaseUtils 2536 2537 enum InputType 2538 { 2539 - INPUTTYPE_CONST = 0, 2540 - INPUTTYPE_UNIFORM, 2541 - INPUTTYPE_DYNAMIC, 2542 + INPUTTYPE_CONST = 0, 2543 + INPUTTYPE_UNIFORM, 2544 + INPUTTYPE_DYNAMIC, 2545 2546 - INPUTTYPE_LAST 2547 + INPUTTYPE_LAST 2548 }; 2549 2550 struct ShaderInput 2551 { 2552 - ShaderInput (InputType inputType_, DataType dataType_, Precision precision_) 2553 - : inputType (inputType_) 2554 - , dataType (dataType_) 2555 - , precision (precision_) 2556 - { 2557 - } 2558 + ShaderInput (InputType inputType_, DataType dataType_, Precision precision_) 2559 + : inputType (inputType_) 2560 + , dataType (dataType_) 2561 + , precision (precision_) 2562 + { 2563 + } 2564 2565 - InputType inputType; 2566 - DataType dataType; 2567 - Precision precision; 2568 + InputType inputType; 2569 + DataType dataType; 2570 + Precision precision; 2571 }; 2572 2573 enum MatrixOp 2574 { 2575 - OP_ADD = 0, 2576 - OP_SUB, 2577 - OP_MUL, 2578 - OP_DIV, 2579 - OP_COMP_MUL, 2580 - OP_OUTER_PRODUCT, 2581 - OP_TRANSPOSE, 2582 - OP_INVERSE, 2583 - OP_DETERMINANT, 2584 - OP_UNARY_PLUS, 2585 - OP_NEGATION, 2586 - OP_PRE_INCREMENT, 2587 - OP_PRE_DECREMENT, 2588 - OP_POST_INCREMENT, 2589 - OP_POST_DECREMENT, 2590 - OP_ADD_INTO, 2591 - OP_SUBTRACT_FROM, 2592 - OP_MULTIPLY_INTO, 2593 - OP_DIVIDE_INTO, 2594 - OP_LAST 2595 + OP_ADD = 0, 2596 + OP_SUB, 2597 + OP_MUL, 2598 + OP_DIV, 2599 + OP_COMP_MUL, 2600 + OP_OUTER_PRODUCT, 2601 + OP_TRANSPOSE, 2602 + OP_INVERSE, 2603 + OP_DETERMINANT, 2604 + OP_UNARY_PLUS, 2605 + OP_NEGATION, 2606 + OP_PRE_INCREMENT, 2607 + OP_PRE_DECREMENT, 2608 + OP_POST_INCREMENT, 2609 + OP_POST_DECREMENT, 2610 + OP_ADD_INTO, 2611 + OP_SUBTRACT_FROM, 2612 + OP_MULTIPLY_INTO, 2613 + OP_DIVIDE_INTO, 2614 + OP_LAST 2615 }; 2616 2617 // Type traits. 2618 @@ -255,237 +255,237 @@ enum MatrixOp 2619 template <int DataT> 2620 struct TypeTraits; 2621 2622 -#define DECLARE_TYPE_TRAIT(DATATYPE, TYPE) \ 2623 -template<> \ 2624 -struct TypeTraits<DATATYPE> { \ 2625 - typedef TYPE Type; \ 2626 +#define DECLARE_TYPE_TRAIT(DATATYPE, TYPE) \ 2627 +template<> \ 2628 +struct TypeTraits<DATATYPE> { \ 2629 + typedef TYPE Type; \ 2630 } 2631 2632 -DECLARE_TYPE_TRAIT(TYPE_FLOAT, float); 2633 -DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC2, tcu::Vec2); 2634 -DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC3, tcu::Vec3); 2635 -DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC4, tcu::Vec4); 2636 -DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2, tcu::Mat2); 2637 -DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2X3, tcu::Mat2x3); 2638 -DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2X4, tcu::Mat2x4); 2639 -DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3X2, tcu::Mat3x2); 2640 -DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3, tcu::Mat3); 2641 -DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3X4, tcu::Mat3x4); 2642 -DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4X2, tcu::Mat4x2); 2643 -DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4X3, tcu::Mat4x3); 2644 -DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4, tcu::Mat4); 2645 +DECLARE_TYPE_TRAIT(TYPE_FLOAT, float); 2646 +DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC2, tcu::Vec2); 2647 +DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC3, tcu::Vec3); 2648 +DECLARE_TYPE_TRAIT(TYPE_FLOAT_VEC4, tcu::Vec4); 2649 +DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2, tcu::Mat2); 2650 +DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2X3, tcu::Mat2x3); 2651 +DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT2X4, tcu::Mat2x4); 2652 +DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3X2, tcu::Mat3x2); 2653 +DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3, tcu::Mat3); 2654 +DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT3X4, tcu::Mat3x4); 2655 +DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4X2, tcu::Mat4x2); 2656 +DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4X3, tcu::Mat4x3); 2657 +DECLARE_TYPE_TRAIT(TYPE_FLOAT_MAT4, tcu::Mat4); 2658 2659 // Operation info 2660 2661 enum OperationType 2662 { 2663 - OPERATIONTYPE_BINARY_OPERATOR = 0, 2664 - OPERATIONTYPE_BINARY_FUNCTION, 2665 - OPERATIONTYPE_UNARY_PREFIX_OPERATOR, 2666 - OPERATIONTYPE_UNARY_POSTFIX_OPERATOR, 2667 - OPERATIONTYPE_UNARY_FUNCTION, 2668 - OPERATIONTYPE_ASSIGNMENT, 2669 + OPERATIONTYPE_BINARY_OPERATOR = 0, 2670 + OPERATIONTYPE_BINARY_FUNCTION, 2671 + OPERATIONTYPE_UNARY_PREFIX_OPERATOR, 2672 + OPERATIONTYPE_UNARY_POSTFIX_OPERATOR, 2673 + OPERATIONTYPE_UNARY_FUNCTION, 2674 + OPERATIONTYPE_ASSIGNMENT, 2675 2676 - OPERATIONTYPE_LAST 2677 + OPERATIONTYPE_LAST 2678 }; 2679 2680 static const char* getOperationName (MatrixOp op) 2681 { 2682 - switch (op) 2683 - { 2684 - case OP_ADD: return "+"; 2685 - case OP_SUB: return "-"; 2686 - case OP_MUL: return "*"; 2687 - case OP_DIV: return "/"; 2688 - case OP_COMP_MUL: return "matrixCompMult"; 2689 - case OP_OUTER_PRODUCT: return "outerProduct"; 2690 - case OP_TRANSPOSE: return "transpose"; 2691 - case OP_INVERSE: return "inverse"; 2692 - case OP_DETERMINANT: return "determinant"; 2693 - case OP_UNARY_PLUS: return "+"; 2694 - case OP_NEGATION: return "-"; 2695 - case OP_PRE_INCREMENT: return "++"; 2696 - case OP_PRE_DECREMENT: return "--"; 2697 - case OP_POST_INCREMENT: return "++"; 2698 - case OP_POST_DECREMENT: return "--"; 2699 - case OP_ADD_INTO: return "+="; 2700 - case OP_SUBTRACT_FROM: return "-="; 2701 - case OP_MULTIPLY_INTO: return "*="; 2702 - case OP_DIVIDE_INTO: return "/="; 2703 - 2704 - default: 2705 - DE_ASSERT(DE_FALSE); 2706 - return ""; 2707 - } 2708 + switch (op) 2709 + { 2710 + case OP_ADD: return "+"; 2711 + case OP_SUB: return "-"; 2712 + case OP_MUL: return "*"; 2713 + case OP_DIV: return "/"; 2714 + case OP_COMP_MUL: return "matrixCompMult"; 2715 + case OP_OUTER_PRODUCT: return "outerProduct"; 2716 + case OP_TRANSPOSE: return "transpose"; 2717 + case OP_INVERSE: return "inverse"; 2718 + case OP_DETERMINANT: return "determinant"; 2719 + case OP_UNARY_PLUS: return "+"; 2720 + case OP_NEGATION: return "-"; 2721 + case OP_PRE_INCREMENT: return "++"; 2722 + case OP_PRE_DECREMENT: return "--"; 2723 + case OP_POST_INCREMENT: return "++"; 2724 + case OP_POST_DECREMENT: return "--"; 2725 + case OP_ADD_INTO: return "+="; 2726 + case OP_SUBTRACT_FROM: return "-="; 2727 + case OP_MULTIPLY_INTO: return "*="; 2728 + case OP_DIVIDE_INTO: return "/="; 2729 + 2730 + default: 2731 + DE_ASSERT(DE_FALSE); 2732 + return ""; 2733 + } 2734 } 2735 2736 static OperationType getOperationType (MatrixOp op) 2737 { 2738 - switch (op) 2739 - { 2740 - case OP_ADD: return OPERATIONTYPE_BINARY_OPERATOR; 2741 - case OP_SUB: return OPERATIONTYPE_BINARY_OPERATOR; 2742 - case OP_MUL: return OPERATIONTYPE_BINARY_OPERATOR; 2743 - case OP_DIV: return OPERATIONTYPE_BINARY_OPERATOR; 2744 - case OP_COMP_MUL: return OPERATIONTYPE_BINARY_FUNCTION; 2745 - case OP_OUTER_PRODUCT: return OPERATIONTYPE_BINARY_FUNCTION; 2746 - case OP_TRANSPOSE: return OPERATIONTYPE_UNARY_FUNCTION; 2747 - case OP_INVERSE: return OPERATIONTYPE_UNARY_FUNCTION; 2748 - case OP_DETERMINANT: return OPERATIONTYPE_UNARY_FUNCTION; 2749 - case OP_UNARY_PLUS: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; 2750 - case OP_NEGATION: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; 2751 - case OP_PRE_INCREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; 2752 - case OP_PRE_DECREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; 2753 - case OP_POST_INCREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; 2754 - case OP_POST_DECREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; 2755 - case OP_ADD_INTO: return OPERATIONTYPE_ASSIGNMENT; 2756 - case OP_SUBTRACT_FROM: return OPERATIONTYPE_ASSIGNMENT; 2757 - case OP_MULTIPLY_INTO: return OPERATIONTYPE_ASSIGNMENT; 2758 - case OP_DIVIDE_INTO: return OPERATIONTYPE_ASSIGNMENT; 2759 - default: 2760 - DE_ASSERT(DE_FALSE); 2761 - return OPERATIONTYPE_LAST; 2762 - } 2763 + switch (op) 2764 + { 2765 + case OP_ADD: return OPERATIONTYPE_BINARY_OPERATOR; 2766 + case OP_SUB: return OPERATIONTYPE_BINARY_OPERATOR; 2767 + case OP_MUL: return OPERATIONTYPE_BINARY_OPERATOR; 2768 + case OP_DIV: return OPERATIONTYPE_BINARY_OPERATOR; 2769 + case OP_COMP_MUL: return OPERATIONTYPE_BINARY_FUNCTION; 2770 + case OP_OUTER_PRODUCT: return OPERATIONTYPE_BINARY_FUNCTION; 2771 + case OP_TRANSPOSE: return OPERATIONTYPE_UNARY_FUNCTION; 2772 + case OP_INVERSE: return OPERATIONTYPE_UNARY_FUNCTION; 2773 + case OP_DETERMINANT: return OPERATIONTYPE_UNARY_FUNCTION; 2774 + case OP_UNARY_PLUS: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; 2775 + case OP_NEGATION: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; 2776 + case OP_PRE_INCREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; 2777 + case OP_PRE_DECREMENT: return OPERATIONTYPE_UNARY_PREFIX_OPERATOR; 2778 + case OP_POST_INCREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; 2779 + case OP_POST_DECREMENT: return OPERATIONTYPE_UNARY_POSTFIX_OPERATOR; 2780 + case OP_ADD_INTO: return OPERATIONTYPE_ASSIGNMENT; 2781 + case OP_SUBTRACT_FROM: return OPERATIONTYPE_ASSIGNMENT; 2782 + case OP_MULTIPLY_INTO: return OPERATIONTYPE_ASSIGNMENT; 2783 + case OP_DIVIDE_INTO: return OPERATIONTYPE_ASSIGNMENT; 2784 + default: 2785 + DE_ASSERT(DE_FALSE); 2786 + return OPERATIONTYPE_LAST; 2787 + } 2788 } 2789 2790 enum TestMatrixType 2791 { 2792 - TESTMATRIXTYPE_DEFAULT = 0, 2793 - TESTMATRIXTYPE_NEGATED, 2794 - TESTMATRIXTYPE_INCREMENTED, 2795 - TESTMATRIXTYPE_DECREMENTED, 2796 - TESTMATRIXTYPE_NEGATED_INCREMENTED, 2797 - TESTMATRIXTYPE_INCREMENTED_LESS, 2798 + TESTMATRIXTYPE_DEFAULT = 0, 2799 + TESTMATRIXTYPE_NEGATED, 2800 + TESTMATRIXTYPE_INCREMENTED, 2801 + TESTMATRIXTYPE_DECREMENTED, 2802 + TESTMATRIXTYPE_NEGATED_INCREMENTED, 2803 + TESTMATRIXTYPE_INCREMENTED_LESS, 2804 2805 - TESTMATRIXTYPE_LAST 2806 + TESTMATRIXTYPE_LAST 2807 }; 2808 2809 static TestMatrixType getOperationTestMatrixType (MatrixOp op) 2810 { 2811 - switch(op) 2812 - { 2813 - case OP_ADD: return TESTMATRIXTYPE_DEFAULT; 2814 - case OP_SUB: return TESTMATRIXTYPE_DEFAULT; 2815 - case OP_MUL: return TESTMATRIXTYPE_DEFAULT; 2816 - case OP_DIV: return TESTMATRIXTYPE_DEFAULT; 2817 - case OP_COMP_MUL: return TESTMATRIXTYPE_DEFAULT; 2818 - case OP_OUTER_PRODUCT: return TESTMATRIXTYPE_DEFAULT; 2819 - case OP_TRANSPOSE: return TESTMATRIXTYPE_DEFAULT; 2820 - case OP_INVERSE: return TESTMATRIXTYPE_DEFAULT; 2821 - case OP_DETERMINANT: return TESTMATRIXTYPE_DEFAULT; 2822 - case OP_UNARY_PLUS: return TESTMATRIXTYPE_DECREMENTED; 2823 - case OP_NEGATION: return TESTMATRIXTYPE_NEGATED_INCREMENTED; 2824 - case OP_PRE_INCREMENT: return TESTMATRIXTYPE_NEGATED; 2825 - case OP_PRE_DECREMENT: return TESTMATRIXTYPE_INCREMENTED; 2826 - case OP_POST_INCREMENT: return TESTMATRIXTYPE_NEGATED; 2827 - case OP_POST_DECREMENT: return TESTMATRIXTYPE_DEFAULT; 2828 - case OP_ADD_INTO: return TESTMATRIXTYPE_DEFAULT; 2829 - case OP_SUBTRACT_FROM: return TESTMATRIXTYPE_INCREMENTED_LESS; 2830 - case OP_MULTIPLY_INTO: return TESTMATRIXTYPE_NEGATED; 2831 - case OP_DIVIDE_INTO: return TESTMATRIXTYPE_DECREMENTED; 2832 - 2833 - default: 2834 - DE_ASSERT(DE_FALSE); 2835 - return TESTMATRIXTYPE_LAST; 2836 - } 2837 + switch(op) 2838 + { 2839 + case OP_ADD: return TESTMATRIXTYPE_DEFAULT; 2840 + case OP_SUB: return TESTMATRIXTYPE_DEFAULT; 2841 + case OP_MUL: return TESTMATRIXTYPE_DEFAULT; 2842 + case OP_DIV: return TESTMATRIXTYPE_DEFAULT; 2843 + case OP_COMP_MUL: return TESTMATRIXTYPE_DEFAULT; 2844 + case OP_OUTER_PRODUCT: return TESTMATRIXTYPE_DEFAULT; 2845 + case OP_TRANSPOSE: return TESTMATRIXTYPE_DEFAULT; 2846 + case OP_INVERSE: return TESTMATRIXTYPE_DEFAULT; 2847 + case OP_DETERMINANT: return TESTMATRIXTYPE_DEFAULT; 2848 + case OP_UNARY_PLUS: return TESTMATRIXTYPE_DECREMENTED; 2849 + case OP_NEGATION: return TESTMATRIXTYPE_NEGATED_INCREMENTED; 2850 + case OP_PRE_INCREMENT: return TESTMATRIXTYPE_NEGATED; 2851 + case OP_PRE_DECREMENT: return TESTMATRIXTYPE_INCREMENTED; 2852 + case OP_POST_INCREMENT: return TESTMATRIXTYPE_NEGATED; 2853 + case OP_POST_DECREMENT: return TESTMATRIXTYPE_DEFAULT; 2854 + case OP_ADD_INTO: return TESTMATRIXTYPE_DEFAULT; 2855 + case OP_SUBTRACT_FROM: return TESTMATRIXTYPE_INCREMENTED_LESS; 2856 + case OP_MULTIPLY_INTO: return TESTMATRIXTYPE_NEGATED; 2857 + case OP_DIVIDE_INTO: return TESTMATRIXTYPE_DECREMENTED; 2858 + 2859 + default: 2860 + DE_ASSERT(DE_FALSE); 2861 + return TESTMATRIXTYPE_LAST; 2862 + } 2863 } 2864 2865 static bool isOperationBinary (MatrixOp op) 2866 { 2867 - return getOperationType(op) == OPERATIONTYPE_BINARY_OPERATOR || 2868 - getOperationType(op) == OPERATIONTYPE_BINARY_FUNCTION || 2869 - getOperationType(op) == OPERATIONTYPE_ASSIGNMENT; 2870 + return getOperationType(op) == OPERATIONTYPE_BINARY_OPERATOR || 2871 + getOperationType(op) == OPERATIONTYPE_BINARY_FUNCTION || 2872 + getOperationType(op) == OPERATIONTYPE_ASSIGNMENT; 2873 } 2874 2875 static bool isOperationMatrixScalar (MatrixOp op) 2876 { 2877 - return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV; 2878 + return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV; 2879 } 2880 2881 static bool isOperationMatrixVector (MatrixOp op) 2882 { 2883 - return op == OP_MUL; 2884 + return op == OP_MUL; 2885 } 2886 2887 static bool isOperationArithmeticMatrixMatrix (MatrixOp op) 2888 { 2889 - return op == OP_MUL; 2890 + return op == OP_MUL; 2891 } 2892 2893 static bool isOperationComponentwiseMatrixMatrix (MatrixOp op) 2894 { 2895 - return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV || op == OP_COMP_MUL; 2896 + return op == OP_ADD || op == OP_SUB || op == OP_MUL || op == OP_DIV || op == OP_COMP_MUL; 2897 } 2898 2899 static bool isOperationVectorVector (MatrixOp op) 2900 { 2901 - return op == OP_OUTER_PRODUCT; 2902 + return op == OP_OUTER_PRODUCT; 2903 } 2904 2905 static bool isOperationUnaryAnyMatrix (MatrixOp op) 2906 { 2907 - return op == OP_TRANSPOSE || 2908 - op == OP_UNARY_PLUS || 2909 - op == OP_NEGATION || 2910 - op == OP_PRE_INCREMENT || 2911 - op == OP_PRE_DECREMENT || 2912 - op == OP_POST_INCREMENT || 2913 - op == OP_POST_DECREMENT; 2914 + return op == OP_TRANSPOSE || 2915 + op == OP_UNARY_PLUS || 2916 + op == OP_NEGATION || 2917 + op == OP_PRE_INCREMENT || 2918 + op == OP_PRE_DECREMENT || 2919 + op == OP_POST_INCREMENT || 2920 + op == OP_POST_DECREMENT; 2921 } 2922 2923 static bool isOperationUnarySymmetricMatrix (MatrixOp op) 2924 { 2925 - return op == OP_INVERSE || op == OP_DETERMINANT; 2926 + return op == OP_INVERSE || op == OP_DETERMINANT; 2927 } 2928 2929 static bool isOperationValueModifying (MatrixOp op) 2930 { 2931 - return op == OP_PRE_INCREMENT || 2932 - op == OP_PRE_DECREMENT || 2933 - op == OP_POST_INCREMENT || 2934 - op == OP_POST_DECREMENT; 2935 + return op == OP_PRE_INCREMENT || 2936 + op == OP_PRE_DECREMENT || 2937 + op == OP_POST_INCREMENT || 2938 + op == OP_POST_DECREMENT; 2939 } 2940 2941 static bool isOperationAssignment (MatrixOp op) 2942 { 2943 - return op == OP_ADD_INTO || 2944 - op == OP_SUBTRACT_FROM || 2945 - op == OP_MULTIPLY_INTO || 2946 - op == OP_DIVIDE_INTO; 2947 + return op == OP_ADD_INTO || 2948 + op == OP_SUBTRACT_FROM || 2949 + op == OP_MULTIPLY_INTO || 2950 + op == OP_DIVIDE_INTO; 2951 } 2952 2953 static bool isOperationAssignmentAnyMatrix (MatrixOp op) 2954 { 2955 - return op == OP_ADD_INTO || 2956 - op == OP_SUBTRACT_FROM || 2957 - op == OP_DIVIDE_INTO; 2958 + return op == OP_ADD_INTO || 2959 + op == OP_SUBTRACT_FROM || 2960 + op == OP_DIVIDE_INTO; 2961 } 2962 2963 static bool isOperationAssignmentSymmetricMatrix (MatrixOp op) 2964 { 2965 - return op == OP_MULTIPLY_INTO; 2966 + return op == OP_MULTIPLY_INTO; 2967 } 2968 2969 // Operation nature 2970 2971 enum OperationNature 2972 { 2973 - OPERATIONNATURE_PURE = 0, 2974 - OPERATIONNATURE_MUTATING, 2975 - OPERATIONNATURE_ASSIGNMENT, 2976 + OPERATIONNATURE_PURE = 0, 2977 + OPERATIONNATURE_MUTATING, 2978 + OPERATIONNATURE_ASSIGNMENT, 2979 2980 - OPERATIONNATURE_LAST 2981 + OPERATIONNATURE_LAST 2982 }; 2983 2984 static OperationNature getOperationNature (MatrixOp op) 2985 { 2986 - if (isOperationAssignment(op)) 2987 - return OPERATIONNATURE_ASSIGNMENT; 2988 + if (isOperationAssignment(op)) 2989 + return OPERATIONNATURE_ASSIGNMENT; 2990 2991 - if (isOperationValueModifying(op)) 2992 - return OPERATIONNATURE_MUTATING; 2993 + if (isOperationValueModifying(op)) 2994 + return OPERATIONNATURE_MUTATING; 2995 2996 - return OPERATIONNATURE_PURE; 2997 + return OPERATIONNATURE_PURE; 2998 } 2999 3000 // Input value loader. 3001 @@ -493,143 +493,143 @@ static OperationNature getOperationNature (MatrixOp op) 3002 template <int InputT, int DataT> 3003 typename TypeTraits<DataT>::Type getInputValue (const ShaderEvalContext& evalCtx, int inputNdx); 3004 3005 -template <> inline float getInputValue<INPUTTYPE_CONST, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInFloat[inputNdx]; } 3006 -template <> inline tcu::Vec2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec2[inputNdx]; } 3007 -template <> inline tcu::Vec3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec3[inputNdx]; } 3008 -template <> inline tcu::Vec4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec4[inputNdx]; } 3009 - 3010 -template <> inline tcu::Mat2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat2(s_constInMat2x2[inputNdx]); } 3011 -template <> inline tcu::Mat2x3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2X3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat2x3(s_constInMat2x3[inputNdx]); } 3012 -template <> inline tcu::Mat2x4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2X4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat2x4(s_constInMat2x4[inputNdx]); } 3013 -template <> inline tcu::Mat3x2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3X2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat3x2(s_constInMat3x2[inputNdx]); } 3014 -template <> inline tcu::Mat3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat3(s_constInMat3x3[inputNdx]); } 3015 -template <> inline tcu::Mat3x4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3X4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat3x4(s_constInMat3x4[inputNdx]); } 3016 -template <> inline tcu::Mat4x2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4X2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat4x2(s_constInMat4x2[inputNdx]); } 3017 -template <> inline tcu::Mat4x3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4X3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat4x3(s_constInMat4x3[inputNdx]); } 3018 -template <> inline tcu::Mat4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat4(s_constInMat4x4[inputNdx]); } 3019 - 3020 -template <> inline float getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.x(); } 3021 -template <> inline tcu::Vec2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1); } 3022 -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); } 3023 -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); } 3024 +template <> inline float getInputValue<INPUTTYPE_CONST, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInFloat[inputNdx]; } 3025 +template <> inline tcu::Vec2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec2[inputNdx]; } 3026 +template <> inline tcu::Vec3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec3[inputNdx]; } 3027 +template <> inline tcu::Vec4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_VEC4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return s_constInVec4[inputNdx]; } 3028 + 3029 +template <> inline tcu::Mat2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat2(s_constInMat2x2[inputNdx]); } 3030 +template <> inline tcu::Mat2x3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2X3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat2x3(s_constInMat2x3[inputNdx]); } 3031 +template <> inline tcu::Mat2x4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT2X4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat2x4(s_constInMat2x4[inputNdx]); } 3032 +template <> inline tcu::Mat3x2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3X2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat3x2(s_constInMat3x2[inputNdx]); } 3033 +template <> inline tcu::Mat3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat3(s_constInMat3x3[inputNdx]); } 3034 +template <> inline tcu::Mat3x4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT3X4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat3x4(s_constInMat3x4[inputNdx]); } 3035 +template <> inline tcu::Mat4x2 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4X2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat4x2(s_constInMat4x2[inputNdx]); } 3036 +template <> inline tcu::Mat4x3 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4X3> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat4x3(s_constInMat4x3[inputNdx]); } 3037 +template <> inline tcu::Mat4 getInputValue<INPUTTYPE_CONST, TYPE_FLOAT_MAT4> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(evalCtx); return tcu::Mat4(s_constInMat4x4[inputNdx]); } 3038 + 3039 +template <> inline float getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.x(); } 3040 +template <> inline tcu::Vec2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_VEC2> (const ShaderEvalContext& evalCtx, int inputNdx) { DE_UNREF(inputNdx); return evalCtx.coords.swizzle(0, 1); } 3041 +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); } 3042 +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); } 3043 3044 template <> inline tcu::Mat2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT2> (const ShaderEvalContext& evalCtx, int inputNdx) 3045 { 3046 - DE_UNREF(inputNdx); // Not used. 3047 - tcu::Mat2 m; 3048 - m.setColumn(0, evalCtx.in[0].swizzle(0,1)); 3049 - m.setColumn(1, evalCtx.in[1].swizzle(0,1)); 3050 - return m; 3051 + DE_UNREF(inputNdx); // Not used. 3052 + tcu::Mat2 m; 3053 + m.setColumn(0, evalCtx.in[0].swizzle(0,1)); 3054 + m.setColumn(1, evalCtx.in[1].swizzle(0,1)); 3055 + return m; 3056 } 3057 3058 template <> inline tcu::Mat2x3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT2X3> (const ShaderEvalContext& evalCtx, int inputNdx) 3059 { 3060 - DE_UNREF(inputNdx); // Not used. 3061 - tcu::Mat2x3 m; 3062 - m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); 3063 - m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); 3064 - return m; 3065 + DE_UNREF(inputNdx); // Not used. 3066 + tcu::Mat2x3 m; 3067 + m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); 3068 + m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); 3069 + return m; 3070 } 3071 3072 template <> inline tcu::Mat2x4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT2X4> (const ShaderEvalContext& evalCtx, int inputNdx) 3073 { 3074 - DE_UNREF(inputNdx); // Not used. 3075 - tcu::Mat2x4 m; 3076 - m.setColumn(0, evalCtx.in[0]); 3077 - m.setColumn(1, evalCtx.in[1]); 3078 - return m; 3079 + DE_UNREF(inputNdx); // Not used. 3080 + tcu::Mat2x4 m; 3081 + m.setColumn(0, evalCtx.in[0]); 3082 + m.setColumn(1, evalCtx.in[1]); 3083 + return m; 3084 } 3085 3086 template <> inline tcu::Mat3x2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT3X2> (const ShaderEvalContext& evalCtx, int inputNdx) 3087 { 3088 - DE_UNREF(inputNdx); // Not used. 3089 - tcu::Mat3x2 m; 3090 - m.setColumn(0, evalCtx.in[0].swizzle(0,1)); 3091 - m.setColumn(1, evalCtx.in[1].swizzle(0,1)); 3092 - m.setColumn(2, evalCtx.in[2].swizzle(0,1)); 3093 - return m; 3094 + DE_UNREF(inputNdx); // Not used. 3095 + tcu::Mat3x2 m; 3096 + m.setColumn(0, evalCtx.in[0].swizzle(0,1)); 3097 + m.setColumn(1, evalCtx.in[1].swizzle(0,1)); 3098 + m.setColumn(2, evalCtx.in[2].swizzle(0,1)); 3099 + return m; 3100 } 3101 3102 template <> inline tcu::Mat3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT3> (const ShaderEvalContext& evalCtx, int inputNdx) 3103 { 3104 - DE_UNREF(inputNdx); // Not used. 3105 - tcu::Mat3 m; 3106 - m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); 3107 - m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); 3108 - m.setColumn(2, evalCtx.in[2].swizzle(0,1,2)); 3109 - return m; 3110 + DE_UNREF(inputNdx); // Not used. 3111 + tcu::Mat3 m; 3112 + m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); 3113 + m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); 3114 + m.setColumn(2, evalCtx.in[2].swizzle(0,1,2)); 3115 + return m; 3116 } 3117 3118 template <> inline tcu::Mat3x4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT3X4> (const ShaderEvalContext& evalCtx, int inputNdx) 3119 { 3120 - DE_UNREF(inputNdx); // Not used. 3121 - tcu::Mat3x4 m; 3122 - m.setColumn(0, evalCtx.in[0]); 3123 - m.setColumn(1, evalCtx.in[1]); 3124 - m.setColumn(2, evalCtx.in[2]); 3125 - return m; 3126 + DE_UNREF(inputNdx); // Not used. 3127 + tcu::Mat3x4 m; 3128 + m.setColumn(0, evalCtx.in[0]); 3129 + m.setColumn(1, evalCtx.in[1]); 3130 + m.setColumn(2, evalCtx.in[2]); 3131 + return m; 3132 } 3133 3134 template <> inline tcu::Mat4x2 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT4X2> (const ShaderEvalContext& evalCtx, int inputNdx) 3135 { 3136 - DE_UNREF(inputNdx); // Not used. 3137 - tcu::Mat4x2 m; 3138 - m.setColumn(0, evalCtx.in[0].swizzle(0,1)); 3139 - m.setColumn(1, evalCtx.in[1].swizzle(0,1)); 3140 - m.setColumn(2, evalCtx.in[2].swizzle(0,1)); 3141 - m.setColumn(3, evalCtx.in[3].swizzle(0,1)); 3142 - return m; 3143 + DE_UNREF(inputNdx); // Not used. 3144 + tcu::Mat4x2 m; 3145 + m.setColumn(0, evalCtx.in[0].swizzle(0,1)); 3146 + m.setColumn(1, evalCtx.in[1].swizzle(0,1)); 3147 + m.setColumn(2, evalCtx.in[2].swizzle(0,1)); 3148 + m.setColumn(3, evalCtx.in[3].swizzle(0,1)); 3149 + return m; 3150 } 3151 3152 template <> inline tcu::Mat4x3 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT4X3> (const ShaderEvalContext& evalCtx, int inputNdx) 3153 { 3154 - DE_UNREF(inputNdx); // Not used. 3155 - tcu::Mat4x3 m; 3156 - m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); 3157 - m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); 3158 - m.setColumn(2, evalCtx.in[2].swizzle(0,1,2)); 3159 - m.setColumn(3, evalCtx.in[3].swizzle(0,1,2)); 3160 - return m; 3161 + DE_UNREF(inputNdx); // Not used. 3162 + tcu::Mat4x3 m; 3163 + m.setColumn(0, evalCtx.in[0].swizzle(0,1,2)); 3164 + m.setColumn(1, evalCtx.in[1].swizzle(0,1,2)); 3165 + m.setColumn(2, evalCtx.in[2].swizzle(0,1,2)); 3166 + m.setColumn(3, evalCtx.in[3].swizzle(0,1,2)); 3167 + return m; 3168 } 3169 3170 template <> inline tcu::Mat4 getInputValue<INPUTTYPE_DYNAMIC, TYPE_FLOAT_MAT4> (const ShaderEvalContext& evalCtx, int inputNdx) 3171 { 3172 - DE_UNREF(inputNdx); // Not used. 3173 - tcu::Mat4 m; 3174 - m.setColumn(0, evalCtx.in[0]); 3175 - m.setColumn(1, evalCtx.in[1]); 3176 - m.setColumn(2, evalCtx.in[2]); 3177 - m.setColumn(3, evalCtx.in[3]); 3178 - return m; 3179 + DE_UNREF(inputNdx); // Not used. 3180 + tcu::Mat4 m; 3181 + m.setColumn(0, evalCtx.in[0]); 3182 + m.setColumn(1, evalCtx.in[1]); 3183 + m.setColumn(2, evalCtx.in[2]); 3184 + m.setColumn(3, evalCtx.in[3]); 3185 + return m; 3186 } 3187 3188 // Reduction from expression result to vec3. 3189 3190 -inline tcu::Vec3 reduceToVec3 (const tcu::Vec2& value) { return value.swizzle(0,1,0); } 3191 -inline tcu::Vec3 reduceToVec3 (const tcu::Vec3& value) { return value; } 3192 -inline tcu::Vec3 reduceToVec3 (const tcu::Vec4& value) { return tcu::Vec3(value.x(), value.y(), value.z()+value.w()); } 3193 -inline tcu::Vec3 reduceToVec3 (const tcu::Mat2& value) { return tcu::Vec3(value(0, 0), value(0, 1), value(1, 0)+value(1, 1)); } 3194 -inline tcu::Vec3 reduceToVec3 (const tcu::Mat2x3& value) { return value.getColumn(0) + value.getColumn(1); } 3195 -inline tcu::Vec3 reduceToVec3 (const tcu::Mat2x4& value) { return value.getColumn(0).swizzle(0,1,2) + value.getColumn(1).swizzle(1,2,3); } 3196 -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)); } 3197 -inline tcu::Vec3 reduceToVec3 (const tcu::Mat3& value) { return value.getColumn(0) + value.getColumn(1) + value.getColumn(2); } 3198 -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); } 3199 -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)); } 3200 -inline tcu::Vec3 reduceToVec3 (const tcu::Mat4x3& value) { return value.getColumn(0) + value.getColumn(1) + value.getColumn(2) + value.getColumn(3); } 3201 -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); } 3202 +inline tcu::Vec3 reduceToVec3 (const tcu::Vec2& value) { return value.swizzle(0,1,0); } 3203 +inline tcu::Vec3 reduceToVec3 (const tcu::Vec3& value) { return value; } 3204 +inline tcu::Vec3 reduceToVec3 (const tcu::Vec4& value) { return tcu::Vec3(value.x(), value.y(), value.z()+value.w()); } 3205 +inline tcu::Vec3 reduceToVec3 (const tcu::Mat2& value) { return tcu::Vec3(value(0, 0), value(0, 1), value(1, 0)+value(1, 1)); } 3206 +inline tcu::Vec3 reduceToVec3 (const tcu::Mat2x3& value) { return value.getColumn(0) + value.getColumn(1); } 3207 +inline tcu::Vec3 reduceToVec3 (const tcu::Mat2x4& value) { return value.getColumn(0).swizzle(0,1,2) + value.getColumn(1).swizzle(1,2,3); } 3208 +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)); } 3209 +inline tcu::Vec3 reduceToVec3 (const tcu::Mat3& value) { return value.getColumn(0) + value.getColumn(1) + value.getColumn(2); } 3210 +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); } 3211 +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)); } 3212 +inline tcu::Vec3 reduceToVec3 (const tcu::Mat4x3& value) { return value.getColumn(0) + value.getColumn(1) + value.getColumn(2) + value.getColumn(3); } 3213 +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); } 3214 3215 // matrixCompMult 3216 3217 template <typename T, int Rows, int Cols> 3218 tcu::Matrix<T, Rows, Cols> matrixCompMult (const tcu::Matrix<T, Rows, Cols>& a, const tcu::Matrix<T, Rows, Cols>& b) 3219 { 3220 - tcu::Matrix<T, Rows, Cols> retVal; 3221 + tcu::Matrix<T, Rows, Cols> retVal; 3222 3223 - for (int r = 0; r < Rows; ++r) 3224 - for (int c = 0; c < Cols; ++c) 3225 - retVal(r,c) = a(r,c) * b(r, c); 3226 + for (int r = 0; r < Rows; ++r) 3227 + for (int c = 0; c < Cols; ++c) 3228 + retVal(r,c) = a(r,c) * b(r, c); 3229 3230 - return retVal; 3231 + return retVal; 3232 } 3233 3234 // transpose 3235 @@ -637,13 +637,13 @@ tcu::Matrix<T, Rows, Cols> matrixCompMult (const tcu::Matrix<T, Rows, Cols>& a, 3236 template <typename T, int Rows, int Cols> 3237 tcu::Matrix<T, Cols, Rows> transpose (const tcu::Matrix<T, Rows, Cols>& mat) 3238 { 3239 - tcu::Matrix<T, Cols, Rows> retVal; 3240 + tcu::Matrix<T, Cols, Rows> retVal; 3241 3242 - for (int r = 0; r < Rows; ++r) 3243 - for (int c = 0; c < Cols; ++c) 3244 - retVal(c, r) = mat(r, c); 3245 + for (int r = 0; r < Rows; ++r) 3246 + for (int c = 0; c < Cols; ++c) 3247 + retVal(c, r) = mat(r, c); 3248 3249 - return retVal; 3250 + return retVal; 3251 } 3252 3253 // outerProduct 3254 @@ -651,13 +651,13 @@ tcu::Matrix<T, Cols, Rows> transpose (const tcu::Matrix<T, Rows, Cols>& mat) 3255 template <typename T, int Rows, int Cols> 3256 tcu::Matrix<T, Cols, Rows> outerProduct (const tcu::Vector<T, Cols>& a, const tcu::Vector<T, Rows>& b) 3257 { 3258 - tcu::Matrix<T, Rows, Cols> retVal; 3259 + tcu::Matrix<T, Rows, Cols> retVal; 3260 3261 - for (int r = 0; r < Rows; ++r) 3262 - for (int c = 0; c < Cols; ++c) 3263 - retVal(r,c) = a[c] * b[r]; 3264 + for (int r = 0; r < Rows; ++r) 3265 + for (int c = 0; c < Cols; ++c) 3266 + retVal(r,c) = a[c] * b[r]; 3267 3268 - return transpose(retVal); // to gl-form (column-major) 3269 + return transpose(retVal); // to gl-form (column-major) 3270 } 3271 3272 // Determinant 3273 @@ -668,51 +668,51 @@ float determinant (const tcu::Matrix<float, Size, Size>& mat); 3274 template <> 3275 float determinant<2> (const tcu::Matrix<float, 2, 2>& mat) 3276 { 3277 - return mat(0,0) * mat(1,1) - mat(1,0) * mat(0,1); 3278 + return mat(0,0) * mat(1,1) - mat(1,0) * mat(0,1); 3279 } 3280 3281 template <> 3282 float determinant<3> (const tcu::Matrix<float, 3, 3>& mat) 3283 { 3284 - return + mat(0,0) * mat(1,1) * mat(2,2) 3285 - + mat(0,1) * mat(1,2) * mat(2,0) 3286 - + mat(0,2) * mat(1,0) * mat(2,1) 3287 - - mat(0,0) * mat(1,2) * mat(2,1) 3288 - - mat(0,1) * mat(1,0) * mat(2,2) 3289 - - mat(0,2) * mat(1,1) * mat(2,0); 3290 + return + mat(0,0) * mat(1,1) * mat(2,2) 3291 + + mat(0,1) * mat(1,2) * mat(2,0) 3292 + + mat(0,2) * mat(1,0) * mat(2,1) 3293 + - mat(0,0) * mat(1,2) * mat(2,1) 3294 + - mat(0,1) * mat(1,0) * mat(2,2) 3295 + - mat(0,2) * mat(1,1) * mat(2,0); 3296 } 3297 3298 template <> 3299 float determinant<4> (const tcu::Matrix<float, 4, 4>& mat) 3300 { 3301 - const float minorMatrices[4][3*3] = 3302 - { 3303 - { 3304 - mat(1,1), mat(2,1), mat(3,1), 3305 - mat(1,2), mat(2,2), mat(3,2), 3306 - mat(1,3), mat(2,3), mat(3,3), 3307 - }, 3308 - { 3309 - mat(1,0), mat(2,0), mat(3,0), 3310 - mat(1,2), mat(2,2), mat(3,2), 3311 - mat(1,3), mat(2,3), mat(3,3), 3312 - }, 3313 - { 3314 - mat(1,0), mat(2,0), mat(3,0), 3315 - mat(1,1), mat(2,1), mat(3,1), 3316 - mat(1,3), mat(2,3), mat(3,3), 3317 - }, 3318 - { 3319 - mat(1,0), mat(2,0), mat(3,0), 3320 - mat(1,1), mat(2,1), mat(3,1), 3321 - mat(1,2), mat(2,2), mat(3,2), 3322 - } 3323 - }; 3324 - 3325 - return + mat(0,0) * determinant(tcu::Mat3(minorMatrices[0])) 3326 - - mat(0,1) * determinant(tcu::Mat3(minorMatrices[1])) 3327 - + mat(0,2) * determinant(tcu::Mat3(minorMatrices[2])) 3328 - - mat(0,3) * determinant(tcu::Mat3(minorMatrices[3])); 3329 + const float minorMatrices[4][3*3] = 3330 + { 3331 + { 3332 + mat(1,1), mat(2,1), mat(3,1), 3333 + mat(1,2), mat(2,2), mat(3,2), 3334 + mat(1,3), mat(2,3), mat(3,3), 3335 + }, 3336 + { 3337 + mat(1,0), mat(2,0), mat(3,0), 3338 + mat(1,2), mat(2,2), mat(3,2), 3339 + mat(1,3), mat(2,3), mat(3,3), 3340 + }, 3341 + { 3342 + mat(1,0), mat(2,0), mat(3,0), 3343 + mat(1,1), mat(2,1), mat(3,1), 3344 + mat(1,3), mat(2,3), mat(3,3), 3345 + }, 3346 + { 3347 + mat(1,0), mat(2,0), mat(3,0), 3348 + mat(1,1), mat(2,1), mat(3,1), 3349 + mat(1,2), mat(2,2), mat(3,2), 3350 + } 3351 + }; 3352 + 3353 + return + mat(0,0) * determinant(tcu::Mat3(minorMatrices[0])) 3354 + - mat(0,1) * determinant(tcu::Mat3(minorMatrices[1])) 3355 + + mat(0,2) * determinant(tcu::Mat3(minorMatrices[2])) 3356 + - mat(0,3) * determinant(tcu::Mat3(minorMatrices[3])); 3357 } 3358 3359 // Inverse 3360 @@ -723,120 +723,120 @@ tcu::Matrix<float, Size, Size> inverse (const tcu::Matrix<float, Size, Size>& ma 3361 template <> 3362 tcu::Matrix<float, 2, 2> inverse<2> (const tcu::Matrix<float, 2, 2>& mat) 3363 { 3364 - const float det = determinant(mat); 3365 - tcu::Matrix<float, 2, 2> retVal; 3366 + const float det = determinant(mat); 3367 + tcu::Matrix<float, 2, 2> retVal; 3368 3369 - DE_ASSERT(det != 0.0f); 3370 + DE_ASSERT(det != 0.0f); 3371 3372 - retVal(0, 0) = mat(1, 1) / det; 3373 - retVal(0, 1) = -mat(0, 1) / det; 3374 - retVal(1, 0) = -mat(1, 0) / det; 3375 - retVal(1, 1) = mat(0, 0) / det; 3376 + retVal(0, 0) = mat(1, 1) / det; 3377 + retVal(0, 1) = -mat(0, 1) / det; 3378 + retVal(1, 0) = -mat(1, 0) / det; 3379 + retVal(1, 1) = mat(0, 0) / det; 3380 3381 - return retVal; 3382 + return retVal; 3383 } 3384 3385 template <> 3386 tcu::Matrix<float, 3, 3> inverse<3> (const tcu::Matrix<float, 3, 3>& mat) 3387 { 3388 - // Blockwise inversion 3389 - 3390 - DE_ASSERT(determinant(mat) != 0.0f); 3391 - 3392 - const float areaA[2*2] = 3393 - { 3394 - mat(0,0), mat(0,1), 3395 - mat(1,0), mat(1,1) 3396 - }; 3397 - const float areaB[2] = 3398 - { 3399 - mat(0,2), 3400 - mat(1,2), 3401 - }; 3402 - const float areaC[2] = 3403 - { 3404 - mat(2,0), mat(2,1), 3405 - }; 3406 - const float areaD[1] = 3407 - { 3408 - mat(2,2) 3409 - }; 3410 - const float nullField[4] = { 0.0f }; 3411 - 3412 - const tcu::Matrix<float, 2, 2> invA = inverse(tcu::Matrix<float, 2, 2>(areaA)); 3413 - const tcu::Matrix<float, 2, 1> matB = tcu::Matrix<float, 2, 1>(areaB); 3414 - const tcu::Matrix<float, 1, 2> matC = tcu::Matrix<float, 1, 2>(areaC); 3415 - const tcu::Matrix<float, 1, 1> matD = tcu::Matrix<float, 1, 1>(areaD); 3416 - 3417 - const float schurComplement = 1.0f / (matD - matC*invA*matB)(0,0); 3418 - const tcu::Matrix<float, 2, 2> zeroMat = Mat2(nullField); 3419 - 3420 - const tcu::Matrix<float, 2, 2> blockA = invA + invA*matB*schurComplement*matC*invA; 3421 - const tcu::Matrix<float, 2, 1> blockB = (zeroMat-invA)*matB*schurComplement; 3422 - const tcu::Matrix<float, 1, 2> blockC = matC*invA*(-schurComplement); 3423 - const float blockD = schurComplement; 3424 - 3425 - const float result[3*3] = 3426 - { 3427 - blockA(0,0), blockA(0,1), blockB(0,0), 3428 - blockA(1,0), blockA(1,1), blockB(1,0), 3429 - blockC(0,0), blockC(0,1), blockD, 3430 - }; 3431 - 3432 - return Mat3(result); 3433 + // Blockwise inversion 3434 + 3435 + DE_ASSERT(determinant(mat) != 0.0f); 3436 + 3437 + const float areaA[2*2] = 3438 + { 3439 + mat(0,0), mat(0,1), 3440 + mat(1,0), mat(1,1) 3441 + }; 3442 + const float areaB[2] = 3443 + { 3444 + mat(0,2), 3445 + mat(1,2), 3446 + }; 3447 + const float areaC[2] = 3448 + { 3449 + mat(2,0), mat(2,1), 3450 + }; 3451 + const float areaD[1] = 3452 + { 3453 + mat(2,2) 3454 + }; 3455 + const float nullField[4] = { 0.0f }; 3456 + 3457 + const tcu::Matrix<float, 2, 2> invA = inverse(tcu::Matrix<float, 2, 2>(areaA)); 3458 + const tcu::Matrix<float, 2, 1> matB = tcu::Matrix<float, 2, 1>(areaB); 3459 + const tcu::Matrix<float, 1, 2> matC = tcu::Matrix<float, 1, 2>(areaC); 3460 + const tcu::Matrix<float, 1, 1> matD = tcu::Matrix<float, 1, 1>(areaD); 3461 + 3462 + const float schurComplement = 1.0f / (matD - matC*invA*matB)(0,0); 3463 + const tcu::Matrix<float, 2, 2> zeroMat = Mat2(nullField); 3464 + 3465 + const tcu::Matrix<float, 2, 2> blockA = invA + invA*matB*schurComplement*matC*invA; 3466 + const tcu::Matrix<float, 2, 1> blockB = (zeroMat-invA)*matB*schurComplement; 3467 + const tcu::Matrix<float, 1, 2> blockC = matC*invA*(-schurComplement); 3468 + const float blockD = schurComplement; 3469 + 3470 + const float result[3*3] = 3471 + { 3472 + blockA(0,0), blockA(0,1), blockB(0,0), 3473 + blockA(1,0), blockA(1,1), blockB(1,0), 3474 + blockC(0,0), blockC(0,1), blockD, 3475 + }; 3476 + 3477 + return Mat3(result); 3478 } 3479 3480 template <> 3481 tcu::Matrix<float, 4, 4> inverse<4> (const tcu::Matrix<float, 4, 4>& mat) 3482 { 3483 - // Blockwise inversion 3484 - 3485 - DE_ASSERT(determinant(mat) != 0.0f); 3486 - 3487 - const float areaA[2*2] = 3488 - { 3489 - mat(0,0), mat(0,1), 3490 - mat(1,0), mat(1,1) 3491 - }; 3492 - const float areaB[2*2] = 3493 - { 3494 - mat(0,2), mat(0,3), 3495 - mat(1,2), mat(1,3) 3496 - }; 3497 - const float areaC[2*2] = 3498 - { 3499 - mat(2,0), mat(2,1), 3500 - mat(3,0), mat(3,1) 3501 - }; 3502 - const float areaD[2*2] = 3503 - { 3504 - mat(2,2), mat(2,3), 3505 - mat(3,2), mat(3,3) 3506 - }; 3507 - const float nullField[4] = { 0.0f }; 3508 - 3509 - const tcu::Matrix<float, 2, 2> invA = inverse(Mat2(areaA)); 3510 - const tcu::Matrix<float, 2, 2> matB = Mat2(areaB); 3511 - const tcu::Matrix<float, 2, 2> matC = Mat2(areaC); 3512 - const tcu::Matrix<float, 2, 2> matD = Mat2(areaD); 3513 - 3514 - const tcu::Matrix<float, 2, 2> schurComplement = inverse(matD - matC*invA*matB); 3515 - const tcu::Matrix<float, 2, 2> zeroMat = Mat2(nullField); 3516 - 3517 - const tcu::Matrix<float, 2, 2> blockA = invA + invA*matB*schurComplement*matC*invA; 3518 - const tcu::Matrix<float, 2, 2> blockB = (zeroMat-invA)*matB*schurComplement; 3519 - const tcu::Matrix<float, 2, 2> blockC = (zeroMat-schurComplement)*matC*invA; 3520 - const tcu::Matrix<float, 2, 2> blockD = schurComplement; 3521 - 3522 - const float result[4*4] = 3523 - { 3524 - blockA(0,0), blockA(0,1), blockB(0,0), blockB(0,1), 3525 - blockA(1,0), blockA(1,1), blockB(1,0), blockB(1,1), 3526 - blockC(0,0), blockC(0,1), blockD(0,0), blockD(0,1), 3527 - blockC(1,0), blockC(1,1), blockD(1,0), blockD(1,1), 3528 - }; 3529 - 3530 - return Mat4(result); 3531 + // Blockwise inversion 3532 + 3533 + DE_ASSERT(determinant(mat) != 0.0f); 3534 + 3535 + const float areaA[2*2] = 3536 + { 3537 + mat(0,0), mat(0,1), 3538 + mat(1,0), mat(1,1) 3539 + }; 3540 + const float areaB[2*2] = 3541 + { 3542 + mat(0,2), mat(0,3), 3543 + mat(1,2), mat(1,3) 3544 + }; 3545 + const float areaC[2*2] = 3546 + { 3547 + mat(2,0), mat(2,1), 3548 + mat(3,0), mat(3,1) 3549 + }; 3550 + const float areaD[2*2] = 3551 + { 3552 + mat(2,2), mat(2,3), 3553 + mat(3,2), mat(3,3) 3554 + }; 3555 + const float nullField[4] = { 0.0f }; 3556 + 3557 + const tcu::Matrix<float, 2, 2> invA = inverse(Mat2(areaA)); 3558 + const tcu::Matrix<float, 2, 2> matB = Mat2(areaB); 3559 + const tcu::Matrix<float, 2, 2> matC = Mat2(areaC); 3560 + const tcu::Matrix<float, 2, 2> matD = Mat2(areaD); 3561 + 3562 + const tcu::Matrix<float, 2, 2> schurComplement = inverse(matD - matC*invA*matB); 3563 + const tcu::Matrix<float, 2, 2> zeroMat = Mat2(nullField); 3564 + 3565 + const tcu::Matrix<float, 2, 2> blockA = invA + invA*matB*schurComplement*matC*invA; 3566 + const tcu::Matrix<float, 2, 2> blockB = (zeroMat-invA)*matB*schurComplement; 3567 + const tcu::Matrix<float, 2, 2> blockC = (zeroMat-schurComplement)*matC*invA; 3568 + const tcu::Matrix<float, 2, 2> blockD = schurComplement; 3569 + 3570 + const float result[4*4] = 3571 + { 3572 + blockA(0,0), blockA(0,1), blockB(0,0), blockB(0,1), 3573 + blockA(1,0), blockA(1,1), blockB(1,0), blockB(1,1), 3574 + blockC(0,0), blockC(0,1), blockD(0,0), blockD(0,1), 3575 + blockC(1,0), blockC(1,1), blockD(1,0), blockD(1,1), 3576 + }; 3577 + 3578 + return Mat4(result); 3579 } 3580 3581 // negate 3582 @@ -844,13 +844,13 @@ tcu::Matrix<float, 4, 4> inverse<4> (const tcu::Matrix<float, 4, 4>& mat) 3583 template <typename T, int Rows, int Cols> 3584 tcu::Matrix<T, Rows, Cols> negate (const tcu::Matrix<T, Rows, Cols>& mat) 3585 { 3586 - tcu::Matrix<T, Rows, Cols> retVal; 3587 + tcu::Matrix<T, Rows, Cols> retVal; 3588 3589 - for (int r = 0; r < Rows; ++r) 3590 - for (int c = 0; c < Cols; ++c) 3591 - retVal(r,c) = -mat(r, c); 3592 + for (int r = 0; r < Rows; ++r) 3593 + for (int c = 0; c < Cols; ++c) 3594 + retVal(r,c) = -mat(r, c); 3595 3596 - return retVal; 3597 + return retVal; 3598 } 3599 3600 // increment/decrement 3601 @@ -858,25 +858,25 @@ tcu::Matrix<T, Rows, Cols> negate (const tcu::Matrix<T, Rows, Cols>& mat) 3602 template <typename T, int Rows, int Cols> 3603 tcu::Matrix<T, Rows, Cols> increment (const tcu::Matrix<T, Rows, Cols>& mat) 3604 { 3605 - tcu::Matrix<T, Rows, Cols> retVal; 3606 + tcu::Matrix<T, Rows, Cols> retVal; 3607 3608 - for (int r = 0; r < Rows; ++r) 3609 - for (int c = 0; c < Cols; ++c) 3610 - retVal(r,c) = mat(r, c) + 1.0f; 3611 + for (int r = 0; r < Rows; ++r) 3612 + for (int c = 0; c < Cols; ++c) 3613 + retVal(r,c) = mat(r, c) + 1.0f; 3614 3615 - return retVal; 3616 + return retVal; 3617 } 3618 3619 template <typename T, int Rows, int Cols> 3620 tcu::Matrix<T, Rows, Cols> decrement (const tcu::Matrix<T, Rows, Cols>& mat) 3621 { 3622 - tcu::Matrix<T, Rows, Cols> retVal; 3623 + tcu::Matrix<T, Rows, Cols> retVal; 3624 3625 - for (int r = 0; r < Rows; ++r) 3626 - for (int c = 0; c < Cols; ++c) 3627 - retVal(r,c) = mat(r, c) - 1.0f; 3628 + for (int r = 0; r < Rows; ++r) 3629 + for (int c = 0; c < Cols; ++c) 3630 + retVal(r,c) = mat(r, c) - 1.0f; 3631 3632 - return retVal; 3633 + return retVal; 3634 } 3635 3636 // Evaluator template. 3637 @@ -889,423 +889,423 @@ struct Evaluator; 3638 template <int In0DataType, int In1DataType> 3639 struct Evaluator<OP_ADD, In0DataType, In1DataType> 3640 { 3641 - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3642 - { 3643 - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3644 - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3645 - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 3646 - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 3647 - evalCtx.color.xyz() = reduceToVec3(in0 + in1); 3648 - } 3649 + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3650 + { 3651 + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3652 + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3653 + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 3654 + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 3655 + evalCtx.color.xyz() = reduceToVec3(in0 + in1); 3656 + } 3657 }; 3658 3659 template <int In0DataType, int In1DataType> 3660 struct Evaluator<OP_SUB, In0DataType, In1DataType> 3661 { 3662 - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3663 - { 3664 - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3665 - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3666 - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 3667 - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 3668 - evalCtx.color.xyz() = reduceToVec3(in0 - in1); 3669 - } 3670 + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3671 + { 3672 + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3673 + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3674 + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 3675 + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 3676 + evalCtx.color.xyz() = reduceToVec3(in0 - in1); 3677 + } 3678 }; 3679 3680 template <int In0DataType, int In1DataType> 3681 struct Evaluator<OP_MUL, In0DataType, In1DataType> 3682 { 3683 - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3684 - { 3685 - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3686 - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3687 - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 3688 - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 3689 - evalCtx.color.xyz() = reduceToVec3(in0 * in1); 3690 - } 3691 + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3692 + { 3693 + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3694 + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3695 + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 3696 + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 3697 + evalCtx.color.xyz() = reduceToVec3(in0 * in1); 3698 + } 3699 }; 3700 3701 template <int In0DataType, int In1DataType> 3702 struct Evaluator<OP_DIV, In0DataType, In1DataType> 3703 { 3704 - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3705 - { 3706 - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3707 - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3708 - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 3709 - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 3710 - evalCtx.color.xyz() = reduceToVec3(in0 / in1); 3711 - } 3712 + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3713 + { 3714 + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3715 + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3716 + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 3717 + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 3718 + evalCtx.color.xyz() = reduceToVec3(in0 / in1); 3719 + } 3720 }; 3721 3722 template <int In0DataType, int In1DataType> 3723 struct Evaluator<OP_COMP_MUL, In0DataType, In1DataType> 3724 { 3725 - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3726 - { 3727 - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3728 - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3729 - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 3730 - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 3731 - evalCtx.color.xyz() = reduceToVec3(matrixCompMult(in0, in1)); 3732 - } 3733 + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3734 + { 3735 + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3736 + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3737 + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 3738 + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 3739 + evalCtx.color.xyz() = reduceToVec3(matrixCompMult(in0, in1)); 3740 + } 3741 }; 3742 3743 template <int In0DataType, int In1DataType> 3744 struct Evaluator<OP_OUTER_PRODUCT, In0DataType, In1DataType> 3745 { 3746 - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3747 - { 3748 - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3749 - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3750 - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 3751 - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 3752 - evalCtx.color.xyz() = reduceToVec3(outerProduct(in0, in1)); 3753 - } 3754 + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3755 + { 3756 + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3757 + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3758 + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 3759 + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 3760 + evalCtx.color.xyz() = reduceToVec3(outerProduct(in0, in1)); 3761 + } 3762 }; 3763 3764 template <int In0DataType, int In1DataType> 3765 struct Evaluator<OP_TRANSPOSE, In0DataType, In1DataType> 3766 { 3767 - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3768 - { 3769 - DE_UNREF(in1Type); 3770 - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3771 - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3772 - evalCtx.color.xyz() = reduceToVec3(transpose(in0)); 3773 - } 3774 + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3775 + { 3776 + DE_UNREF(in1Type); 3777 + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3778 + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3779 + evalCtx.color.xyz() = reduceToVec3(transpose(in0)); 3780 + } 3781 }; 3782 3783 template <int In0DataType, int In1DataType> 3784 struct Evaluator<OP_INVERSE, In0DataType, In1DataType> 3785 { 3786 - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3787 - { 3788 - DE_UNREF(in1Type); 3789 - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3790 - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3791 - evalCtx.color.xyz() = reduceToVec3(inverse(in0)); 3792 - } 3793 + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3794 + { 3795 + DE_UNREF(in1Type); 3796 + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3797 + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3798 + evalCtx.color.xyz() = reduceToVec3(inverse(in0)); 3799 + } 3800 }; 3801 3802 template <int In0DataType, int In1DataType> 3803 struct Evaluator<OP_DETERMINANT, In0DataType, In1DataType> 3804 { 3805 - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3806 - { 3807 - DE_UNREF(in1Type); 3808 - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3809 - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3810 - evalCtx.color.xyz() = Vec3(determinant(in0)); 3811 - } 3812 + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3813 + { 3814 + DE_UNREF(in1Type); 3815 + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3816 + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3817 + evalCtx.color.xyz() = Vec3(determinant(in0)); 3818 + } 3819 }; 3820 3821 template <int In0DataType, int In1DataType> 3822 struct Evaluator<OP_UNARY_PLUS, In0DataType, In1DataType> 3823 { 3824 - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3825 - { 3826 - DE_UNREF(in1Type); 3827 - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3828 - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3829 - evalCtx.color.xyz() = reduceToVec3(in0); 3830 - } 3831 + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3832 + { 3833 + DE_UNREF(in1Type); 3834 + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3835 + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3836 + evalCtx.color.xyz() = reduceToVec3(in0); 3837 + } 3838 }; 3839 3840 template <int In0DataType, int In1DataType> 3841 struct Evaluator<OP_NEGATION, In0DataType, In1DataType> 3842 { 3843 - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3844 - { 3845 - DE_UNREF(in1Type); 3846 - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3847 - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3848 - evalCtx.color.xyz() = reduceToVec3(negate(in0)); 3849 - } 3850 + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3851 + { 3852 + DE_UNREF(in1Type); 3853 + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3854 + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3855 + evalCtx.color.xyz() = reduceToVec3(negate(in0)); 3856 + } 3857 }; 3858 3859 template <int In0DataType, int In1DataType> 3860 struct Evaluator<OP_PRE_INCREMENT, In0DataType, In1DataType> 3861 { 3862 - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3863 - { 3864 - DE_UNREF(in1Type); 3865 - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3866 - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3867 + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3868 + { 3869 + DE_UNREF(in1Type); 3870 + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3871 + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3872 3873 - // modifying reduction: sum modified value too 3874 - evalCtx.color.xyz() = reduceToVec3(increment(in0)) + reduceToVec3(increment(in0)); 3875 - } 3876 + // modifying reduction: sum modified value too 3877 + evalCtx.color.xyz() = reduceToVec3(increment(in0)) + reduceToVec3(increment(in0)); 3878 + } 3879 }; 3880 3881 template <int In0DataType, int In1DataType> 3882 struct Evaluator<OP_PRE_DECREMENT, In0DataType, In1DataType> 3883 { 3884 - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3885 - { 3886 - DE_UNREF(in1Type); 3887 - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3888 - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3889 + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3890 + { 3891 + DE_UNREF(in1Type); 3892 + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3893 + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3894 3895 - // modifying reduction: sum modified value too 3896 - evalCtx.color.xyz() = reduceToVec3(decrement(in0)) + reduceToVec3(decrement(in0)); 3897 - } 3898 + // modifying reduction: sum modified value too 3899 + evalCtx.color.xyz() = reduceToVec3(decrement(in0)) + reduceToVec3(decrement(in0)); 3900 + } 3901 }; 3902 3903 template <int In0DataType, int In1DataType> 3904 struct Evaluator<OP_POST_INCREMENT, In0DataType, In1DataType> 3905 { 3906 - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3907 - { 3908 - DE_UNREF(in1Type); 3909 - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3910 - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3911 + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3912 + { 3913 + DE_UNREF(in1Type); 3914 + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3915 + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3916 3917 - // modifying reduction: sum modified value too 3918 - evalCtx.color.xyz() = reduceToVec3(in0) + reduceToVec3(increment(in0)); 3919 - } 3920 + // modifying reduction: sum modified value too 3921 + evalCtx.color.xyz() = reduceToVec3(in0) + reduceToVec3(increment(in0)); 3922 + } 3923 }; 3924 3925 template <int In0DataType, int In1DataType> 3926 struct Evaluator<OP_POST_DECREMENT, In0DataType, In1DataType> 3927 { 3928 - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3929 - { 3930 - DE_UNREF(in1Type); 3931 - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3932 - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3933 + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3934 + { 3935 + DE_UNREF(in1Type); 3936 + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3937 + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3938 3939 - // modifying reduction: sum modified value too 3940 - evalCtx.color.xyz() = reduceToVec3(in0) + reduceToVec3(decrement(in0)); 3941 - } 3942 + // modifying reduction: sum modified value too 3943 + evalCtx.color.xyz() = reduceToVec3(in0) + reduceToVec3(decrement(in0)); 3944 + } 3945 }; 3946 3947 template <int In0DataType, int In1DataType> 3948 struct Evaluator<OP_ADD_INTO, In0DataType, In1DataType> 3949 { 3950 - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3951 - { 3952 - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3953 - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3954 - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 3955 - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 3956 - evalCtx.color.xyz() = reduceToVec3(in0 + in1); 3957 - } 3958 + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3959 + { 3960 + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3961 + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3962 + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 3963 + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 3964 + evalCtx.color.xyz() = reduceToVec3(in0 + in1); 3965 + } 3966 }; 3967 3968 template <int In0DataType, int In1DataType> 3969 struct Evaluator<OP_SUBTRACT_FROM, In0DataType, In1DataType> 3970 { 3971 - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3972 - { 3973 - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3974 - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3975 - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 3976 - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 3977 - evalCtx.color.xyz() = reduceToVec3(in0 - in1); 3978 - } 3979 + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3980 + { 3981 + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3982 + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3983 + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 3984 + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 3985 + evalCtx.color.xyz() = reduceToVec3(in0 - in1); 3986 + } 3987 }; 3988 3989 template <int In0DataType, int In1DataType> 3990 struct Evaluator<OP_MULTIPLY_INTO, In0DataType, In1DataType> 3991 { 3992 - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 3993 - { 3994 - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 3995 - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 3996 - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 3997 - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 3998 - evalCtx.color.xyz() = reduceToVec3(in0 * in1); 3999 - } 4000 + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 4001 + { 4002 + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 4003 + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 4004 + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 4005 + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 4006 + evalCtx.color.xyz() = reduceToVec3(in0 * in1); 4007 + } 4008 }; 4009 4010 template <int In0DataType, int In1DataType> 4011 struct Evaluator<OP_DIVIDE_INTO, In0DataType, In1DataType> 4012 { 4013 - static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 4014 - { 4015 - typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 4016 - : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 4017 - typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 4018 - : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 4019 - evalCtx.color.xyz() = reduceToVec3(in0 / in1); 4020 - } 4021 + static void evaluate (ShaderEvalContext& evalCtx, InputType in0Type, InputType in1Type) 4022 + { 4023 + typename TypeTraits<In0DataType>::Type in0 = (in0Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In0DataType>(evalCtx, 0) 4024 + : getInputValue<INPUTTYPE_CONST, In0DataType>(evalCtx, 0); 4025 + typename TypeTraits<In1DataType>::Type in1 = (in1Type == INPUTTYPE_DYNAMIC) ? getInputValue<INPUTTYPE_DYNAMIC, In1DataType>(evalCtx, 1) 4026 + : getInputValue<INPUTTYPE_CONST, In1DataType>(evalCtx, 1); 4027 + evalCtx.color.xyz() = reduceToVec3(in0 / in1); 4028 + } 4029 }; 4030 4031 MatrixShaderEvalFunc getEvalFunc (const ShaderInput& in0, const ShaderInput& in1, MatrixOp op) 4032 { 4033 - // Evaluator is selected based on op and input data types. 4034 - // For efficient lookup the types and op enums are packed together to form a 19-bit key: 4035 - // [18..14 OP] [13..7 TYPE0] [6..0 TYPE1] 4036 - 4037 - DE_STATIC_ASSERT(TYPE_LAST <= (1<<7)); 4038 - DE_STATIC_ASSERT(OP_LAST <= (1<<5)); 4039 - 4040 -#define PACK_EVAL_CASE(OP, IN0DATATYPE, IN1DATATYPE) (((OP) << 14) | ((IN0DATATYPE) << 7) | (IN1DATATYPE)) 4041 - 4042 -#define MAKE_EVAL_CASE(OP, IN0DATATYPE, IN1DATATYPE) \ 4043 - case PACK_EVAL_CASE(OP, IN0DATATYPE, IN1DATATYPE): \ 4044 - return Evaluator<OP, IN0DATATYPE, IN1DATATYPE>::evaluate 4045 - 4046 -#define MAKE_SCALAR_OPS(IN0DATATYPE, IN1DATATYPE) \ 4047 - MAKE_EVAL_CASE(OP_ADD, IN0DATATYPE, IN1DATATYPE); \ 4048 - MAKE_EVAL_CASE(OP_SUB, IN0DATATYPE, IN1DATATYPE); \ 4049 - MAKE_EVAL_CASE(OP_MUL, IN0DATATYPE, IN1DATATYPE); \ 4050 - MAKE_EVAL_CASE(OP_DIV, IN0DATATYPE, IN1DATATYPE) 4051 - 4052 -#define MAKE_CWISE_OPS(IN0DATATYPE, IN1DATATYPE) \ 4053 - MAKE_EVAL_CASE(OP_ADD, IN0DATATYPE, IN1DATATYPE); \ 4054 - MAKE_EVAL_CASE(OP_SUB, IN0DATATYPE, IN1DATATYPE); \ 4055 - MAKE_EVAL_CASE(OP_DIV, IN0DATATYPE, IN1DATATYPE); \ 4056 - MAKE_EVAL_CASE(OP_COMP_MUL, IN0DATATYPE, IN1DATATYPE) 4057 - 4058 -#define MAKE_MUL_OP(IN0DATATYPE, IN1DATATYPE) \ 4059 - MAKE_EVAL_CASE(OP_MUL, IN0DATATYPE, IN1DATATYPE) 4060 - 4061 -#define MAKE_VECVEC_OP(IN0DATATYPE, IN1DATATYPE) \ 4062 - MAKE_EVAL_CASE(OP_OUTER_PRODUCT, IN0DATATYPE, IN1DATATYPE) 4063 - 4064 -#define MAKE_UNARY_OP(IN0DATATYPE) \ 4065 - MAKE_EVAL_CASE(OP_TRANSPOSE, IN0DATATYPE, TYPE_LAST); \ 4066 - MAKE_EVAL_CASE(OP_UNARY_PLUS, IN0DATATYPE, TYPE_LAST); \ 4067 - MAKE_EVAL_CASE(OP_NEGATION, IN0DATATYPE, TYPE_LAST); \ 4068 - MAKE_EVAL_CASE(OP_PRE_INCREMENT, IN0DATATYPE, TYPE_LAST); \ 4069 - MAKE_EVAL_CASE(OP_PRE_DECREMENT, IN0DATATYPE, TYPE_LAST); \ 4070 - MAKE_EVAL_CASE(OP_POST_INCREMENT, IN0DATATYPE, TYPE_LAST); \ 4071 - MAKE_EVAL_CASE(OP_POST_DECREMENT, IN0DATATYPE, TYPE_LAST) 4072 - 4073 -#define MAKE_UNARY_SYMMETRIC_OP(IN0DATATYPE) \ 4074 - MAKE_UNARY_OP(IN0DATATYPE); \ 4075 - MAKE_EVAL_CASE(OP_DETERMINANT, IN0DATATYPE, TYPE_LAST); \ 4076 - MAKE_EVAL_CASE(OP_INVERSE, IN0DATATYPE, TYPE_LAST) 4077 - 4078 -#define MAKE_ASSIGNMENT_OP(IN0DATATYPE) \ 4079 - MAKE_EVAL_CASE(OP_ADD_INTO, IN0DATATYPE, IN0DATATYPE); \ 4080 - MAKE_EVAL_CASE(OP_SUBTRACT_FROM, IN0DATATYPE, IN0DATATYPE); \ 4081 - MAKE_EVAL_CASE(OP_DIVIDE_INTO, IN0DATATYPE, IN0DATATYPE) 4082 - 4083 -#define MAKE_ASSIGNMENT_SYMMETRIC_OP(IN0DATATYPE) \ 4084 - MAKE_ASSIGNMENT_OP(IN0DATATYPE); \ 4085 - MAKE_EVAL_CASE(OP_MULTIPLY_INTO, IN0DATATYPE, IN0DATATYPE) 4086 - 4087 - switch (PACK_EVAL_CASE(op, in0.dataType, in1.dataType)) 4088 - { 4089 - // Matrix-scalar. 4090 - MAKE_SCALAR_OPS(TYPE_FLOAT_MAT2, TYPE_FLOAT); 4091 - MAKE_SCALAR_OPS(TYPE_FLOAT_MAT2X3, TYPE_FLOAT); 4092 - MAKE_SCALAR_OPS(TYPE_FLOAT_MAT2X4, TYPE_FLOAT); 4093 - MAKE_SCALAR_OPS(TYPE_FLOAT_MAT3X2, TYPE_FLOAT); 4094 - MAKE_SCALAR_OPS(TYPE_FLOAT_MAT3, TYPE_FLOAT); 4095 - MAKE_SCALAR_OPS(TYPE_FLOAT_MAT3X4, TYPE_FLOAT); 4096 - MAKE_SCALAR_OPS(TYPE_FLOAT_MAT4X2, TYPE_FLOAT); 4097 - MAKE_SCALAR_OPS(TYPE_FLOAT_MAT4X3, TYPE_FLOAT); 4098 - MAKE_SCALAR_OPS(TYPE_FLOAT_MAT4, TYPE_FLOAT); 4099 - 4100 - // Matrix-vector. 4101 - MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_VEC2); 4102 - MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_VEC2); 4103 - MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_VEC2); 4104 - MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_VEC3); 4105 - MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_VEC3); 4106 - MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_VEC3); 4107 - MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_VEC4); 4108 - MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_VEC4); 4109 - MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_VEC4); 4110 - 4111 - // Vector-matrix. 4112 - MAKE_MUL_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT2); 4113 - MAKE_MUL_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT2X3); 4114 - MAKE_MUL_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT2X4); 4115 - MAKE_MUL_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT3X2); 4116 - MAKE_MUL_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT3); 4117 - MAKE_MUL_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT3X4); 4118 - MAKE_MUL_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT4X2); 4119 - MAKE_MUL_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT4X3); 4120 - MAKE_MUL_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT4); 4121 - 4122 - // Matrix-matrix. 4123 - MAKE_CWISE_OPS(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT2); 4124 - MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT2); 4125 - MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT3X2); 4126 - MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT4X2); 4127 - 4128 - MAKE_CWISE_OPS(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT2X3); 4129 - MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT2); 4130 - MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT3X2); 4131 - MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT4X2); 4132 - 4133 - MAKE_CWISE_OPS(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT2X4); 4134 - MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT2); 4135 - MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT3X2); 4136 - MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT4X2); 4137 - 4138 - MAKE_CWISE_OPS(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT3X2); 4139 - MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT2X3); 4140 - MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT3); 4141 - MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT4X3); 4142 - 4143 - MAKE_CWISE_OPS(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT3); 4144 - MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT2X3); 4145 - MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT3); 4146 - MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT4X3); 4147 - 4148 - MAKE_CWISE_OPS(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT3X4); 4149 - MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT2X3); 4150 - MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT3); 4151 - MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT4X3); 4152 - 4153 - MAKE_CWISE_OPS(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT4X2); 4154 - MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT2X4); 4155 - MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT3X4); 4156 - MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT4); 4157 - 4158 - MAKE_CWISE_OPS(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT4X3); 4159 - MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT2X4); 4160 - MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT3X4); 4161 - MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT4); 4162 - 4163 - MAKE_CWISE_OPS(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT4); 4164 - MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT2X4); 4165 - MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT3X4); 4166 - MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT4); 4167 - 4168 - // Vector-vector. 4169 - MAKE_VECVEC_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC2); 4170 - MAKE_VECVEC_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC3); 4171 - MAKE_VECVEC_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC4); 4172 - MAKE_VECVEC_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC2); 4173 - MAKE_VECVEC_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC3); 4174 - MAKE_VECVEC_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC4); 4175 - MAKE_VECVEC_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC2); 4176 - MAKE_VECVEC_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC3); 4177 - MAKE_VECVEC_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC4); 4178 - 4179 - // Unary Matrix. 4180 - MAKE_UNARY_SYMMETRIC_OP(TYPE_FLOAT_MAT2); 4181 - MAKE_UNARY_OP(TYPE_FLOAT_MAT2X3); 4182 - MAKE_UNARY_OP(TYPE_FLOAT_MAT2X4); 4183 - MAKE_UNARY_OP(TYPE_FLOAT_MAT3X2); 4184 - MAKE_UNARY_SYMMETRIC_OP(TYPE_FLOAT_MAT3); 4185 - MAKE_UNARY_OP(TYPE_FLOAT_MAT3X4); 4186 - MAKE_UNARY_OP(TYPE_FLOAT_MAT4X2); 4187 - MAKE_UNARY_OP(TYPE_FLOAT_MAT4X3); 4188 - MAKE_UNARY_SYMMETRIC_OP(TYPE_FLOAT_MAT4); 4189 - 4190 - // Assignments 4191 - MAKE_ASSIGNMENT_SYMMETRIC_OP(TYPE_FLOAT_MAT2); 4192 - MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT2X3); 4193 - MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT2X4); 4194 - MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT3X2); 4195 - MAKE_ASSIGNMENT_SYMMETRIC_OP(TYPE_FLOAT_MAT3); 4196 - MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT3X4); 4197 - MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT4X2); 4198 - MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT4X3); 4199 - MAKE_ASSIGNMENT_SYMMETRIC_OP(TYPE_FLOAT_MAT4); 4200 - 4201 - default: 4202 - DE_ASSERT(DE_FALSE); 4203 - return DE_NULL; 4204 - } 4205 + // Evaluator is selected based on op and input data types. 4206 + // For efficient lookup the types and op enums are packed together to form a 19-bit key: 4207 + // [18..14 OP] [13..7 TYPE0] [6..0 TYPE1] 4208 + 4209 + DE_STATIC_ASSERT(TYPE_LAST <= (1<<7)); 4210 + DE_STATIC_ASSERT(OP_LAST <= (1<<5)); 4211 + 4212 +#define PACK_EVAL_CASE(OP, IN0DATATYPE, IN1DATATYPE) (((OP) << 14) | ((IN0DATATYPE) << 7) | (IN1DATATYPE)) 4213 + 4214 +#define MAKE_EVAL_CASE(OP, IN0DATATYPE, IN1DATATYPE) \ 4215 + case PACK_EVAL_CASE(OP, IN0DATATYPE, IN1DATATYPE): \ 4216 + return Evaluator<OP, IN0DATATYPE, IN1DATATYPE>::evaluate 4217 + 4218 +#define MAKE_SCALAR_OPS(IN0DATATYPE, IN1DATATYPE) \ 4219 + MAKE_EVAL_CASE(OP_ADD, IN0DATATYPE, IN1DATATYPE); \ 4220 + MAKE_EVAL_CASE(OP_SUB, IN0DATATYPE, IN1DATATYPE); \ 4221 + MAKE_EVAL_CASE(OP_MUL, IN0DATATYPE, IN1DATATYPE); \ 4222 + MAKE_EVAL_CASE(OP_DIV, IN0DATATYPE, IN1DATATYPE) 4223 + 4224 +#define MAKE_CWISE_OPS(IN0DATATYPE, IN1DATATYPE) \ 4225 + MAKE_EVAL_CASE(OP_ADD, IN0DATATYPE, IN1DATATYPE); \ 4226 + MAKE_EVAL_CASE(OP_SUB, IN0DATATYPE, IN1DATATYPE); \ 4227 + MAKE_EVAL_CASE(OP_DIV, IN0DATATYPE, IN1DATATYPE); \ 4228 + MAKE_EVAL_CASE(OP_COMP_MUL, IN0DATATYPE, IN1DATATYPE) 4229 + 4230 +#define MAKE_MUL_OP(IN0DATATYPE, IN1DATATYPE) \ 4231 + MAKE_EVAL_CASE(OP_MUL, IN0DATATYPE, IN1DATATYPE) 4232 + 4233 +#define MAKE_VECVEC_OP(IN0DATATYPE, IN1DATATYPE) \ 4234 + MAKE_EVAL_CASE(OP_OUTER_PRODUCT, IN0DATATYPE, IN1DATATYPE) 4235 + 4236 +#define MAKE_UNARY_OP(IN0DATATYPE) \ 4237 + MAKE_EVAL_CASE(OP_TRANSPOSE, IN0DATATYPE, TYPE_LAST); \ 4238 + MAKE_EVAL_CASE(OP_UNARY_PLUS, IN0DATATYPE, TYPE_LAST); \ 4239 + MAKE_EVAL_CASE(OP_NEGATION, IN0DATATYPE, TYPE_LAST); \ 4240 + MAKE_EVAL_CASE(OP_PRE_INCREMENT, IN0DATATYPE, TYPE_LAST); \ 4241 + MAKE_EVAL_CASE(OP_PRE_DECREMENT, IN0DATATYPE, TYPE_LAST); \ 4242 + MAKE_EVAL_CASE(OP_POST_INCREMENT, IN0DATATYPE, TYPE_LAST); \ 4243 + MAKE_EVAL_CASE(OP_POST_DECREMENT, IN0DATATYPE, TYPE_LAST) 4244 + 4245 +#define MAKE_UNARY_SYMMETRIC_OP(IN0DATATYPE) \ 4246 + MAKE_UNARY_OP(IN0DATATYPE); \ 4247 + MAKE_EVAL_CASE(OP_DETERMINANT, IN0DATATYPE, TYPE_LAST); \ 4248 + MAKE_EVAL_CASE(OP_INVERSE, IN0DATATYPE, TYPE_LAST) 4249 + 4250 +#define MAKE_ASSIGNMENT_OP(IN0DATATYPE) \ 4251 + MAKE_EVAL_CASE(OP_ADD_INTO, IN0DATATYPE, IN0DATATYPE); \ 4252 + MAKE_EVAL_CASE(OP_SUBTRACT_FROM, IN0DATATYPE, IN0DATATYPE); \ 4253 + MAKE_EVAL_CASE(OP_DIVIDE_INTO, IN0DATATYPE, IN0DATATYPE) 4254 + 4255 +#define MAKE_ASSIGNMENT_SYMMETRIC_OP(IN0DATATYPE) \ 4256 + MAKE_ASSIGNMENT_OP(IN0DATATYPE); \ 4257 + MAKE_EVAL_CASE(OP_MULTIPLY_INTO, IN0DATATYPE, IN0DATATYPE) 4258 + 4259 + switch (PACK_EVAL_CASE(op, in0.dataType, in1.dataType)) 4260 + { 4261 + // Matrix-scalar. 4262 + MAKE_SCALAR_OPS(TYPE_FLOAT_MAT2, TYPE_FLOAT); 4263 + MAKE_SCALAR_OPS(TYPE_FLOAT_MAT2X3, TYPE_FLOAT); 4264 + MAKE_SCALAR_OPS(TYPE_FLOAT_MAT2X4, TYPE_FLOAT); 4265 + MAKE_SCALAR_OPS(TYPE_FLOAT_MAT3X2, TYPE_FLOAT); 4266 + MAKE_SCALAR_OPS(TYPE_FLOAT_MAT3, TYPE_FLOAT); 4267 + MAKE_SCALAR_OPS(TYPE_FLOAT_MAT3X4, TYPE_FLOAT); 4268 + MAKE_SCALAR_OPS(TYPE_FLOAT_MAT4X2, TYPE_FLOAT); 4269 + MAKE_SCALAR_OPS(TYPE_FLOAT_MAT4X3, TYPE_FLOAT); 4270 + MAKE_SCALAR_OPS(TYPE_FLOAT_MAT4, TYPE_FLOAT); 4271 + 4272 + // Matrix-vector. 4273 + MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_VEC2); 4274 + MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_VEC2); 4275 + MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_VEC2); 4276 + MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_VEC3); 4277 + MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_VEC3); 4278 + MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_VEC3); 4279 + MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_VEC4); 4280 + MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_VEC4); 4281 + MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_VEC4); 4282 + 4283 + // Vector-matrix. 4284 + MAKE_MUL_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT2); 4285 + MAKE_MUL_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT2X3); 4286 + MAKE_MUL_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT2X4); 4287 + MAKE_MUL_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT3X2); 4288 + MAKE_MUL_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT3); 4289 + MAKE_MUL_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT3X4); 4290 + MAKE_MUL_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_MAT4X2); 4291 + MAKE_MUL_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_MAT4X3); 4292 + MAKE_MUL_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_MAT4); 4293 + 4294 + // Matrix-matrix. 4295 + MAKE_CWISE_OPS(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT2); 4296 + MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT2); 4297 + MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT3X2); 4298 + MAKE_MUL_OP(TYPE_FLOAT_MAT2, TYPE_FLOAT_MAT4X2); 4299 + 4300 + MAKE_CWISE_OPS(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT2X3); 4301 + MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT2); 4302 + MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT3X2); 4303 + MAKE_MUL_OP(TYPE_FLOAT_MAT2X3, TYPE_FLOAT_MAT4X2); 4304 + 4305 + MAKE_CWISE_OPS(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT2X4); 4306 + MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT2); 4307 + MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT3X2); 4308 + MAKE_MUL_OP(TYPE_FLOAT_MAT2X4, TYPE_FLOAT_MAT4X2); 4309 + 4310 + MAKE_CWISE_OPS(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT3X2); 4311 + MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT2X3); 4312 + MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT3); 4313 + MAKE_MUL_OP(TYPE_FLOAT_MAT3X2, TYPE_FLOAT_MAT4X3); 4314 + 4315 + MAKE_CWISE_OPS(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT3); 4316 + MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT2X3); 4317 + MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT3); 4318 + MAKE_MUL_OP(TYPE_FLOAT_MAT3, TYPE_FLOAT_MAT4X3); 4319 + 4320 + MAKE_CWISE_OPS(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT3X4); 4321 + MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT2X3); 4322 + MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT3); 4323 + MAKE_MUL_OP(TYPE_FLOAT_MAT3X4, TYPE_FLOAT_MAT4X3); 4324 + 4325 + MAKE_CWISE_OPS(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT4X2); 4326 + MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT2X4); 4327 + MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT3X4); 4328 + MAKE_MUL_OP(TYPE_FLOAT_MAT4X2, TYPE_FLOAT_MAT4); 4329 + 4330 + MAKE_CWISE_OPS(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT4X3); 4331 + MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT2X4); 4332 + MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT3X4); 4333 + MAKE_MUL_OP(TYPE_FLOAT_MAT4X3, TYPE_FLOAT_MAT4); 4334 + 4335 + MAKE_CWISE_OPS(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT4); 4336 + MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT2X4); 4337 + MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT3X4); 4338 + MAKE_MUL_OP(TYPE_FLOAT_MAT4, TYPE_FLOAT_MAT4); 4339 + 4340 + // Vector-vector. 4341 + MAKE_VECVEC_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC2); 4342 + MAKE_VECVEC_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC3); 4343 + MAKE_VECVEC_OP(TYPE_FLOAT_VEC2, TYPE_FLOAT_VEC4); 4344 + MAKE_VECVEC_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC2); 4345 + MAKE_VECVEC_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC3); 4346 + MAKE_VECVEC_OP(TYPE_FLOAT_VEC3, TYPE_FLOAT_VEC4); 4347 + MAKE_VECVEC_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC2); 4348 + MAKE_VECVEC_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC3); 4349 + MAKE_VECVEC_OP(TYPE_FLOAT_VEC4, TYPE_FLOAT_VEC4); 4350 + 4351 + // Unary Matrix. 4352 + MAKE_UNARY_SYMMETRIC_OP(TYPE_FLOAT_MAT2); 4353 + MAKE_UNARY_OP(TYPE_FLOAT_MAT2X3); 4354 + MAKE_UNARY_OP(TYPE_FLOAT_MAT2X4); 4355 + MAKE_UNARY_OP(TYPE_FLOAT_MAT3X2); 4356 + MAKE_UNARY_SYMMETRIC_OP(TYPE_FLOAT_MAT3); 4357 + MAKE_UNARY_OP(TYPE_FLOAT_MAT3X4); 4358 + MAKE_UNARY_OP(TYPE_FLOAT_MAT4X2); 4359 + MAKE_UNARY_OP(TYPE_FLOAT_MAT4X3); 4360 + MAKE_UNARY_SYMMETRIC_OP(TYPE_FLOAT_MAT4); 4361 + 4362 + // Assignments 4363 + MAKE_ASSIGNMENT_SYMMETRIC_OP(TYPE_FLOAT_MAT2); 4364 + MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT2X3); 4365 + MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT2X4); 4366 + MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT3X2); 4367 + MAKE_ASSIGNMENT_SYMMETRIC_OP(TYPE_FLOAT_MAT3); 4368 + MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT3X4); 4369 + MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT4X2); 4370 + MAKE_ASSIGNMENT_OP(TYPE_FLOAT_MAT4X3); 4371 + MAKE_ASSIGNMENT_SYMMETRIC_OP(TYPE_FLOAT_MAT4); 4372 + 4373 + default: 4374 + DE_ASSERT(DE_FALSE); 4375 + return DE_NULL; 4376 + } 4377 4378 #undef PACK_EVAL_CASE 4379 #undef MAKE_EVAL_CASE 4380 @@ -1320,35 +1320,35 @@ MatrixShaderEvalFunc getEvalFunc (const ShaderInput& in0, const ShaderInput& in1 4381 template <int Size> 4382 void writeVectorConstructor (std::ostream& str, const tcu::Vector<float, Size>& v) 4383 { 4384 - str << "vec" << Size << "("; 4385 - for (int ndx = 0; ndx < Size; ndx++) 4386 - { 4387 - if (ndx != 0) 4388 - str << ", "; 4389 - str << de::floatToString(v[ndx], 1); 4390 - } 4391 - str << ")"; 4392 + str << "vec" << Size << "("; 4393 + for (int ndx = 0; ndx < Size; ndx++) 4394 + { 4395 + if (ndx != 0) 4396 + str << ", "; 4397 + str << de::floatToString(v[ndx], 1); 4398 + } 4399 + str << ")"; 4400 } 4401 4402 template <int Cols, int Rows> 4403 void writeMatrixConstructor (std::ostream& str, const tcu::Matrix<float, Rows, Cols>& m) 4404 { 4405 - if (Rows == Cols) 4406 - str << "mat" << Cols; 4407 - else 4408 - str << "mat" << Cols << "x" << Rows; 4409 - 4410 - str << "("; 4411 - for (int colNdx = 0; colNdx < Cols; colNdx++) 4412 - { 4413 - for (int rowNdx = 0; rowNdx < Rows; rowNdx++) 4414 - { 4415 - if (rowNdx > 0 || colNdx > 0) 4416 - str << ", "; 4417 - str << de::floatToString(m(rowNdx, colNdx), 1); 4418 - } 4419 - } 4420 - str << ")"; 4421 + if (Rows == Cols) 4422 + str << "mat" << Cols; 4423 + else 4424 + str << "mat" << Cols << "x" << Rows; 4425 + 4426 + str << "("; 4427 + for (int colNdx = 0; colNdx < Cols; colNdx++) 4428 + { 4429 + for (int rowNdx = 0; rowNdx < Rows; rowNdx++) 4430 + { 4431 + if (rowNdx > 0 || colNdx > 0) 4432 + str << ", "; 4433 + str << de::floatToString(m(rowNdx, colNdx), 1); 4434 + } 4435 + } 4436 + str << ")"; 4437 } 4438 4439 } // MatrixCaseUtils 4440 @@ -1358,53 +1358,53 @@ using namespace MatrixCaseUtils; 4441 class MatrixShaderEvaluator : public ShaderEvaluator 4442 { 4443 public: 4444 - MatrixShaderEvaluator (MatrixShaderEvalFunc evalFunc, InputType inType0, InputType inType1); 4445 + MatrixShaderEvaluator (MatrixShaderEvalFunc evalFunc, InputType inType0, InputType inType1); 4446 4447 - virtual void evaluate (ShaderEvalContext& evalCtx); 4448 + virtual void evaluate (ShaderEvalContext& evalCtx); 4449 4450 private: 4451 - MatrixShaderEvalFunc m_matEvalFunc; 4452 - InputType m_inType0; 4453 - InputType m_inType1; 4454 + MatrixShaderEvalFunc m_matEvalFunc; 4455 + InputType m_inType0; 4456 + InputType m_inType1; 4457 }; 4458 4459 MatrixShaderEvaluator::MatrixShaderEvaluator (MatrixShaderEvalFunc evalFunc, InputType inType0, InputType inType1) 4460 - : m_matEvalFunc (evalFunc) 4461 - , m_inType0 (inType0) 4462 - , m_inType1 (inType1) 4463 + : m_matEvalFunc (evalFunc) 4464 + , m_inType0 (inType0) 4465 + , m_inType1 (inType1) 4466 { 4467 } 4468 4469 void MatrixShaderEvaluator::evaluate (ShaderEvalContext& evalCtx) 4470 { 4471 - m_matEvalFunc(evalCtx, m_inType0, m_inType1); 4472 + m_matEvalFunc(evalCtx, m_inType0, m_inType1); 4473 } 4474 4475 class ShaderMatrixCase : public ShaderRenderCase 4476 { 4477 public: 4478 - ShaderMatrixCase (Context& context, const char* name, const char* desc, const ShaderInput& in0, const ShaderInput& in1, MatrixOp op, bool isVertexCase); 4479 - ~ShaderMatrixCase (void); 4480 + ShaderMatrixCase (Context& context, const char* name, const char* desc, const ShaderInput& in0, const ShaderInput& in1, MatrixOp op, bool isVertexCase); 4481 + ~ShaderMatrixCase (void); 4482 4483 - void init (void); 4484 + void init (void); 4485 4486 protected: 4487 - std::string genGLSLMatToVec3Reduction (const glu::DataType& matType, const char* varName); 4488 - void setupUniforms (int programID, const tcu::Vec4& constCoords); 4489 + std::string genGLSLMatToVec3Reduction (const glu::DataType& matType, const char* varName); 4490 + void setupUniforms (int programID, const tcu::Vec4& constCoords); 4491 4492 private: 4493 - ShaderInput m_in0; 4494 - ShaderInput m_in1; 4495 - MatrixOp m_op; 4496 - MatrixShaderEvaluator m_matEvaluator; 4497 + ShaderInput m_in0; 4498 + ShaderInput m_in1; 4499 + MatrixOp m_op; 4500 + MatrixShaderEvaluator m_matEvaluator; 4501 }; 4502 4503 ShaderMatrixCase::ShaderMatrixCase (Context& context, const char* name, const char* desc, const ShaderInput& in0, const ShaderInput& in1, MatrixOp op, bool isVertexCase) 4504 - : ShaderRenderCase (context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name, desc, isVertexCase, m_matEvaluator) 4505 - , m_in0 (in0) 4506 - , m_in1 (in1) 4507 - , m_op (op) 4508 - , m_matEvaluator (getEvalFunc(in0, in1, op), in0.inputType, in1.inputType) 4509 + : ShaderRenderCase (context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name, desc, isVertexCase, m_matEvaluator) 4510 + , m_in0 (in0) 4511 + , m_in1 (in1) 4512 + , m_op (op) 4513 + , m_matEvaluator (getEvalFunc(in0, in1, op), in0.inputType, in1.inputType) 4514 { 4515 } 4516 4517 @@ -1414,374 +1414,374 @@ ShaderMatrixCase::~ShaderMatrixCase (void) 4518 4519 void ShaderMatrixCase::init (void) 4520 { 4521 - std::ostringstream vtx; 4522 - std::ostringstream frag; 4523 - std::ostringstream& op = m_isVertexCase ? vtx : frag; 4524 - 4525 - bool isInDynMat0 = isDataTypeMatrix(m_in0.dataType) && m_in0.inputType == INPUTTYPE_DYNAMIC; 4526 - bool isInDynMat1 = isDataTypeMatrix(m_in1.dataType) && m_in1.inputType == INPUTTYPE_DYNAMIC; 4527 - string inValue0; 4528 - string inValue1; 4529 - DataType resultType = TYPE_LAST; 4530 - Precision resultPrec = m_in0.precision; 4531 - vector<string> passVars; 4532 - int numInputs = (isOperationBinary(m_op)) ? (2) : (1); 4533 - 4534 - std::string operationValue0; 4535 - std::string operationValue1; 4536 - 4537 - DE_ASSERT(!isInDynMat0 || !isInDynMat1); // Only single dynamic matrix input is allowed. 4538 - DE_UNREF(isInDynMat0 && isInDynMat1); 4539 - 4540 - // Compute result type. 4541 - if (m_op == OP_MUL && isDataTypeMatrix(m_in0.dataType) && isDataTypeMatrix(m_in1.dataType)) 4542 - { 4543 - resultType = getDataTypeMatrix(getDataTypeMatrixNumColumns(m_in1.dataType), getDataTypeMatrixNumRows(m_in0.dataType)); 4544 - } 4545 - else if (m_op == OP_OUTER_PRODUCT) 4546 - { 4547 - resultType = getDataTypeMatrix(getDataTypeScalarSize(m_in1.dataType), getDataTypeScalarSize(m_in0.dataType)); 4548 - } 4549 - else if (m_op == OP_TRANSPOSE) 4550 - { 4551 - resultType = getDataTypeMatrix(getDataTypeMatrixNumRows(m_in0.dataType), getDataTypeMatrixNumColumns(m_in0.dataType)); 4552 - } 4553 - else if (m_op == OP_INVERSE) 4554 - { 4555 - resultType = m_in0.dataType; 4556 - } 4557 - else if (m_op == OP_DETERMINANT) 4558 - { 4559 - resultType = TYPE_FLOAT; 4560 - } 4561 - else if (getOperationType(m_op) == OPERATIONTYPE_UNARY_PREFIX_OPERATOR || 4562 - getOperationType(m_op) == OPERATIONTYPE_UNARY_POSTFIX_OPERATOR) 4563 - { 4564 - resultType = m_in0.dataType; 4565 - } 4566 - else if (isDataTypeMatrix(m_in0.dataType) && isDataTypeMatrix(m_in1.dataType)) 4567 - { 4568 - DE_ASSERT(m_in0.dataType == m_in1.dataType); 4569 - resultType = m_in0.dataType; 4570 - } 4571 - else if (isDataTypeMatrix(m_in0.dataType) || isDataTypeMatrix(m_in1.dataType)) 4572 - { 4573 - int matNdx = isDataTypeMatrix(m_in0.dataType) ? 0 : 1; 4574 - DataType matrixType = matNdx == 0 ? m_in0.dataType : m_in1.dataType; 4575 - DataType otherType = matNdx == 0 ? m_in1.dataType : m_in0.dataType; 4576 - 4577 - if (otherType == TYPE_FLOAT) 4578 - resultType = matrixType; 4579 - else 4580 - { 4581 - DE_ASSERT(isDataTypeVector(otherType)); 4582 - resultType = getDataTypeFloatVec(matNdx == 0 ? getDataTypeMatrixNumRows(matrixType) : getDataTypeMatrixNumColumns(matrixType)); 4583 - } 4584 - } 4585 - else 4586 - { 4587 - DE_ASSERT(DE_FALSE); 4588 - } 4589 - 4590 - vtx << "#version 300 es\n"; 4591 - frag << "#version 300 es\n"; 4592 - 4593 - vtx << "in highp vec4 a_position;\n"; 4594 - frag << "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"; 4595 - if (m_isVertexCase) 4596 - { 4597 - vtx << "out mediump vec4 v_color;\n"; 4598 - frag << "in mediump vec4 v_color;\n"; 4599 - } 4600 - 4601 - // Input declarations. 4602 - for (int inNdx = 0; inNdx < numInputs; inNdx++) 4603 - { 4604 - const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; 4605 - const char* precName = getPrecisionName(in.precision); 4606 - const char* typeName = getDataTypeName(in.dataType); 4607 - string& inValue = inNdx > 0 ? inValue1 : inValue0; 4608 - 4609 - if (in.inputType == INPUTTYPE_DYNAMIC) 4610 - { 4611 - vtx << "in " << precName << " " << typeName << " a_"; 4612 - 4613 - if (isDataTypeMatrix(in.dataType)) 4614 - { 4615 - // a_matN, v_matN 4616 - vtx << typeName << ";\n"; 4617 - if (!m_isVertexCase) 4618 - { 4619 - vtx << "out " << precName << " " << typeName << " v_" << typeName << ";\n"; 4620 - frag << "in " << precName << " " << typeName << " v_" << typeName << ";\n"; 4621 - passVars.push_back(typeName); 4622 - } 4623 - 4624 - inValue = string(m_isVertexCase ? "a_" : "v_") + getDataTypeName(in.dataType); 4625 - } 4626 - else 4627 - { 4628 - // a_coords, v_coords 4629 - vtx << "coords;\n"; 4630 - if (!m_isVertexCase) 4631 - { 4632 - vtx << "out " << precName << " " << typeName << " v_coords;\n"; 4633 - frag << "in " << precName << " " << typeName << " v_coords;\n"; 4634 - passVars.push_back("coords"); 4635 - } 4636 - 4637 - inValue = m_isVertexCase ? "a_coords" : "v_coords"; 4638 - } 4639 - } 4640 - else if (in.inputType == INPUTTYPE_UNIFORM) 4641 - { 4642 - op << "uniform " << precName << " " << typeName << " u_in" << inNdx << ";\n"; 4643 - inValue = string("u_in") + de::toString(inNdx); 4644 - } 4645 - else if (in.inputType == INPUTTYPE_CONST) 4646 - { 4647 - op << "const " << precName << " " << typeName << " in" << inNdx << " = "; 4648 - 4649 - // Generate declaration. 4650 - switch (in.dataType) 4651 - { 4652 - case TYPE_FLOAT: op << de::floatToString(s_constInFloat[inNdx], 1); break; 4653 - case TYPE_FLOAT_VEC2: writeVectorConstructor<2>(op, s_constInVec2[inNdx]); break; 4654 - case TYPE_FLOAT_VEC3: writeVectorConstructor<3>(op, s_constInVec3[inNdx]); break; 4655 - case TYPE_FLOAT_VEC4: writeVectorConstructor<4>(op, s_constInVec4[inNdx]); break; 4656 - case TYPE_FLOAT_MAT2: writeMatrixConstructor<2, 2>(op, Mat2(s_constInMat2x2[inNdx])); break; 4657 - case TYPE_FLOAT_MAT2X3: writeMatrixConstructor<2, 3>(op, Mat2x3(s_constInMat2x3[inNdx])); break; 4658 - case TYPE_FLOAT_MAT2X4: writeMatrixConstructor<2, 4>(op, Mat2x4(s_constInMat2x4[inNdx])); break; 4659 - case TYPE_FLOAT_MAT3X2: writeMatrixConstructor<3, 2>(op, Mat3x2(s_constInMat3x2[inNdx])); break; 4660 - case TYPE_FLOAT_MAT3: writeMatrixConstructor<3, 3>(op, Mat3(s_constInMat3x3[inNdx])); break; 4661 - case TYPE_FLOAT_MAT3X4: writeMatrixConstructor<3, 4>(op, Mat3x4(s_constInMat3x4[inNdx])); break; 4662 - case TYPE_FLOAT_MAT4X2: writeMatrixConstructor<4, 2>(op, Mat4x2(s_constInMat4x2[inNdx])); break; 4663 - case TYPE_FLOAT_MAT4X3: writeMatrixConstructor<4, 3>(op, Mat4x3(s_constInMat4x3[inNdx])); break; 4664 - case TYPE_FLOAT_MAT4: writeMatrixConstructor<4, 4>(op, Mat4(s_constInMat4x4[inNdx])); break; 4665 - 4666 - default: 4667 - DE_ASSERT(DE_FALSE); 4668 - } 4669 - 4670 - op << ";\n"; 4671 - 4672 - inValue = string("in") + de::toString(inNdx); 4673 - } 4674 - } 4675 - 4676 - vtx << "\n" 4677 - << "void main (void)\n" 4678 - << "{\n" 4679 - << " gl_Position = a_position;\n"; 4680 - frag << "\n" 4681 - << "void main (void)\n" 4682 - << "{\n"; 4683 - 4684 - if (m_isVertexCase) 4685 - frag << " dEQP_FragColor = v_color;\n"; 4686 - else 4687 - { 4688 - for (vector<string>::const_iterator copyIter = passVars.begin(); copyIter != passVars.end(); copyIter++) 4689 - vtx << " v_" << *copyIter << " = " << "a_" << *copyIter << ";\n"; 4690 - } 4691 - 4692 - // Operation. 4693 - 4694 - switch (getOperationNature(m_op)) 4695 - { 4696 - case OPERATIONNATURE_PURE: 4697 - DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); 4698 - 4699 - operationValue0 = inValue0; 4700 - operationValue1 = inValue1; 4701 - break; 4702 - 4703 - case OPERATIONNATURE_MUTATING: 4704 - DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); 4705 - 4706 - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " tmpValue = " << inValue0 << ";\n"; 4707 - 4708 - operationValue0 = "tmpValue"; 4709 - operationValue1 = inValue1; 4710 - break; 4711 - 4712 - case OPERATIONNATURE_ASSIGNMENT: 4713 - DE_ASSERT(getOperationType(m_op) == OPERATIONTYPE_ASSIGNMENT); 4714 - 4715 - operationValue0 = inValue0; 4716 - operationValue1 = inValue1; 4717 - break; 4718 - 4719 - default: 4720 - DE_ASSERT(DE_FALSE); 4721 - } 4722 - 4723 - switch (getOperationType(m_op)) 4724 - { 4725 - case OPERATIONTYPE_BINARY_OPERATOR: 4726 - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << " " << getOperationName(m_op) << " " << operationValue1 << ";\n"; 4727 - break; 4728 - 4729 - case OPERATIONTYPE_UNARY_PREFIX_OPERATOR: 4730 - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << operationValue0 << ";\n"; 4731 - break; 4732 - 4733 - case OPERATIONTYPE_UNARY_POSTFIX_OPERATOR: 4734 - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << getOperationName(m_op) << ";\n"; 4735 - break; 4736 - 4737 - case OPERATIONTYPE_BINARY_FUNCTION: 4738 - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << "(" << operationValue0 << ", " << operationValue1 << ");\n"; 4739 - break; 4740 - 4741 - case OPERATIONTYPE_UNARY_FUNCTION: 4742 - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << "(" << operationValue0 << ");\n"; 4743 - break; 4744 - 4745 - case OPERATIONTYPE_ASSIGNMENT: 4746 - op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << ";\n"; 4747 - op << " res " << getOperationName(m_op) << " " << operationValue1 << ";\n"; 4748 - break; 4749 - 4750 - default: 4751 - DE_ASSERT(DE_FALSE); 4752 - } 4753 - 4754 - // Reduction to vec3 (rgb). Check the used value too if it was modified 4755 - op << " " << (m_isVertexCase ? "v_color" : "dEQP_FragColor") << " = "; 4756 - 4757 - if (isOperationValueModifying(m_op)) 4758 - op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0) + vec4(" << genGLSLMatToVec3Reduction(resultType, "tmpValue") << ", 0.0);\n"; 4759 - else 4760 - op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0);\n"; 4761 - 4762 - vtx << "}\n"; 4763 - frag << "}\n"; 4764 - 4765 - m_vertShaderSource = vtx.str(); 4766 - m_fragShaderSource = frag.str(); 4767 - 4768 - // \todo [2012-02-14 pyry] Compute better values for matrix tests. 4769 - m_userAttribTransforms.resize(4); 4770 - for (int attribNdx = 0; attribNdx < 4; attribNdx++) 4771 - { 4772 - m_userAttribTransforms[attribNdx] = Mat4(0.0f); 4773 - m_userAttribTransforms[attribNdx]( 0, 3) = 0.2f; // !< prevent matrix*vec from going into zero (assuming vec.w != 0) 4774 - m_userAttribTransforms[attribNdx]( 1, 3) = 0.1f; // !< 4775 - m_userAttribTransforms[attribNdx]( 2, 3) = 0.4f + 0.15f * float(attribNdx); // !< 4776 - m_userAttribTransforms[attribNdx]( 3, 3) = 0.7f; // !< 4777 - m_userAttribTransforms[attribNdx]((0 + attribNdx) % 4, 0) = 1.0f; 4778 - m_userAttribTransforms[attribNdx]((1 + attribNdx) % 4, 1) = 1.0f; 4779 - m_userAttribTransforms[attribNdx]((2 + attribNdx) % 4, 2) = 1.0f; 4780 - m_userAttribTransforms[attribNdx]((3 + attribNdx) % 4, 3) = 1.0f; 4781 - } 4782 - 4783 - // prevent bad reference cases such as black result images by fine-tuning used matrices 4784 - if (getOperationTestMatrixType(m_op) != TESTMATRIXTYPE_DEFAULT) 4785 - { 4786 - for (int attribNdx = 0; attribNdx < 4; attribNdx++) 4787 - { 4788 - for (int row = 0; row < 4; row++) 4789 - for (int col = 0; col < 4; col++) 4790 - { 4791 - switch (getOperationTestMatrixType(m_op)) 4792 - { 4793 - case TESTMATRIXTYPE_NEGATED: 4794 - m_userAttribTransforms[attribNdx](row, col) = -m_userAttribTransforms[attribNdx](row, col); 4795 - break; 4796 - case TESTMATRIXTYPE_INCREMENTED: 4797 - m_userAttribTransforms[attribNdx](row, col) += 0.3f; 4798 - break; 4799 - case TESTMATRIXTYPE_DECREMENTED: 4800 - m_userAttribTransforms[attribNdx](row, col) -= 0.3f; 4801 - break; 4802 - case TESTMATRIXTYPE_NEGATED_INCREMENTED: 4803 - m_userAttribTransforms[attribNdx](row, col) = -m_userAttribTransforms[attribNdx](row, col) + 0.3f; 4804 - break; 4805 - case TESTMATRIXTYPE_INCREMENTED_LESS: 4806 - m_userAttribTransforms[attribNdx](row, col) -= 0.1f; 4807 - break; 4808 - 4809 - default: 4810 - DE_ASSERT(DE_FALSE); 4811 - break; 4812 - } 4813 - } 4814 - } 4815 - } 4816 - 4817 - ShaderRenderCase::init(); 4818 + std::ostringstream vtx; 4819 + std::ostringstream frag; 4820 + std::ostringstream& op = m_isVertexCase ? vtx : frag; 4821 + 4822 + bool isInDynMat0 = isDataTypeMatrix(m_in0.dataType) && m_in0.inputType == INPUTTYPE_DYNAMIC; 4823 + bool isInDynMat1 = isDataTypeMatrix(m_in1.dataType) && m_in1.inputType == INPUTTYPE_DYNAMIC; 4824 + string inValue0; 4825 + string inValue1; 4826 + DataType resultType = TYPE_LAST; 4827 + Precision resultPrec = m_in0.precision; 4828 + vector<string> passVars; 4829 + int numInputs = (isOperationBinary(m_op)) ? (2) : (1); 4830 + 4831 + std::string operationValue0; 4832 + std::string operationValue1; 4833 + 4834 + DE_ASSERT(!isInDynMat0 || !isInDynMat1); // Only single dynamic matrix input is allowed. 4835 + DE_UNREF(isInDynMat0 && isInDynMat1); 4836 + 4837 + // Compute result type. 4838 + if (m_op == OP_MUL && isDataTypeMatrix(m_in0.dataType) && isDataTypeMatrix(m_in1.dataType)) 4839 + { 4840 + resultType = getDataTypeMatrix(getDataTypeMatrixNumColumns(m_in1.dataType), getDataTypeMatrixNumRows(m_in0.dataType)); 4841 + } 4842 + else if (m_op == OP_OUTER_PRODUCT) 4843 + { 4844 + resultType = getDataTypeMatrix(getDataTypeScalarSize(m_in1.dataType), getDataTypeScalarSize(m_in0.dataType)); 4845 + } 4846 + else if (m_op == OP_TRANSPOSE) 4847 + { 4848 + resultType = getDataTypeMatrix(getDataTypeMatrixNumRows(m_in0.dataType), getDataTypeMatrixNumColumns(m_in0.dataType)); 4849 + } 4850 + else if (m_op == OP_INVERSE) 4851 + { 4852 + resultType = m_in0.dataType; 4853 + } 4854 + else if (m_op == OP_DETERMINANT) 4855 + { 4856 + resultType = TYPE_FLOAT; 4857 + } 4858 + else if (getOperationType(m_op) == OPERATIONTYPE_UNARY_PREFIX_OPERATOR || 4859 + getOperationType(m_op) == OPERATIONTYPE_UNARY_POSTFIX_OPERATOR) 4860 + { 4861 + resultType = m_in0.dataType; 4862 + } 4863 + else if (isDataTypeMatrix(m_in0.dataType) && isDataTypeMatrix(m_in1.dataType)) 4864 + { 4865 + DE_ASSERT(m_in0.dataType == m_in1.dataType); 4866 + resultType = m_in0.dataType; 4867 + } 4868 + else if (isDataTypeMatrix(m_in0.dataType) || isDataTypeMatrix(m_in1.dataType)) 4869 + { 4870 + int matNdx = isDataTypeMatrix(m_in0.dataType) ? 0 : 1; 4871 + DataType matrixType = matNdx == 0 ? m_in0.dataType : m_in1.dataType; 4872 + DataType otherType = matNdx == 0 ? m_in1.dataType : m_in0.dataType; 4873 + 4874 + if (otherType == TYPE_FLOAT) 4875 + resultType = matrixType; 4876 + else 4877 + { 4878 + DE_ASSERT(isDataTypeVector(otherType)); 4879 + resultType = getDataTypeFloatVec(matNdx == 0 ? getDataTypeMatrixNumRows(matrixType) : getDataTypeMatrixNumColumns(matrixType)); 4880 + } 4881 + } 4882 + else 4883 + { 4884 + DE_ASSERT(DE_FALSE); 4885 + } 4886 + 4887 + vtx << "#version 300 es\n"; 4888 + frag << "#version 300 es\n"; 4889 + 4890 + vtx << "in highp vec4 a_position;\n"; 4891 + frag << "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"; 4892 + if (m_isVertexCase) 4893 + { 4894 + vtx << "out mediump vec4 v_color;\n"; 4895 + frag << "in mediump vec4 v_color;\n"; 4896 + } 4897 + 4898 + // Input declarations. 4899 + for (int inNdx = 0; inNdx < numInputs; inNdx++) 4900 + { 4901 + const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; 4902 + const char* precName = getPrecisionName(in.precision); 4903 + const char* typeName = getDataTypeName(in.dataType); 4904 + string& inValue = inNdx > 0 ? inValue1 : inValue0; 4905 + 4906 + if (in.inputType == INPUTTYPE_DYNAMIC) 4907 + { 4908 + vtx << "in " << precName << " " << typeName << " a_"; 4909 + 4910 + if (isDataTypeMatrix(in.dataType)) 4911 + { 4912 + // a_matN, v_matN 4913 + vtx << typeName << ";\n"; 4914 + if (!m_isVertexCase) 4915 + { 4916 + vtx << "out " << precName << " " << typeName << " v_" << typeName << ";\n"; 4917 + frag << "in " << precName << " " << typeName << " v_" << typeName << ";\n"; 4918 + passVars.push_back(typeName); 4919 + } 4920 + 4921 + inValue = string(m_isVertexCase ? "a_" : "v_") + getDataTypeName(in.dataType); 4922 + } 4923 + else 4924 + { 4925 + // a_coords, v_coords 4926 + vtx << "coords;\n"; 4927 + if (!m_isVertexCase) 4928 + { 4929 + vtx << "out " << precName << " " << typeName << " v_coords;\n"; 4930 + frag << "in " << precName << " " << typeName << " v_coords;\n"; 4931 + passVars.push_back("coords"); 4932 + } 4933 + 4934 + inValue = m_isVertexCase ? "a_coords" : "v_coords"; 4935 + } 4936 + } 4937 + else if (in.inputType == INPUTTYPE_UNIFORM) 4938 + { 4939 + op << "uniform " << precName << " " << typeName << " u_in" << inNdx << ";\n"; 4940 + inValue = string("u_in") + de::toString(inNdx); 4941 + } 4942 + else if (in.inputType == INPUTTYPE_CONST) 4943 + { 4944 + op << "const " << precName << " " << typeName << " in" << inNdx << " = "; 4945 + 4946 + // Generate declaration. 4947 + switch (in.dataType) 4948 + { 4949 + case TYPE_FLOAT: op << de::floatToString(s_constInFloat[inNdx], 1); break; 4950 + case TYPE_FLOAT_VEC2: writeVectorConstructor<2>(op, s_constInVec2[inNdx]); break; 4951 + case TYPE_FLOAT_VEC3: writeVectorConstructor<3>(op, s_constInVec3[inNdx]); break; 4952 + case TYPE_FLOAT_VEC4: writeVectorConstructor<4>(op, s_constInVec4[inNdx]); break; 4953 + case TYPE_FLOAT_MAT2: writeMatrixConstructor<2, 2>(op, Mat2(s_constInMat2x2[inNdx])); break; 4954 + case TYPE_FLOAT_MAT2X3: writeMatrixConstructor<2, 3>(op, Mat2x3(s_constInMat2x3[inNdx])); break; 4955 + case TYPE_FLOAT_MAT2X4: writeMatrixConstructor<2, 4>(op, Mat2x4(s_constInMat2x4[inNdx])); break; 4956 + case TYPE_FLOAT_MAT3X2: writeMatrixConstructor<3, 2>(op, Mat3x2(s_constInMat3x2[inNdx])); break; 4957 + case TYPE_FLOAT_MAT3: writeMatrixConstructor<3, 3>(op, Mat3(s_constInMat3x3[inNdx])); break; 4958 + case TYPE_FLOAT_MAT3X4: writeMatrixConstructor<3, 4>(op, Mat3x4(s_constInMat3x4[inNdx])); break; 4959 + case TYPE_FLOAT_MAT4X2: writeMatrixConstructor<4, 2>(op, Mat4x2(s_constInMat4x2[inNdx])); break; 4960 + case TYPE_FLOAT_MAT4X3: writeMatrixConstructor<4, 3>(op, Mat4x3(s_constInMat4x3[inNdx])); break; 4961 + case TYPE_FLOAT_MAT4: writeMatrixConstructor<4, 4>(op, Mat4(s_constInMat4x4[inNdx])); break; 4962 + 4963 + default: 4964 + DE_ASSERT(DE_FALSE); 4965 + } 4966 + 4967 + op << ";\n"; 4968 + 4969 + inValue = string("in") + de::toString(inNdx); 4970 + } 4971 + } 4972 + 4973 + vtx << "\n" 4974 + << "void main (void)\n" 4975 + << "{\n" 4976 + << " gl_Position = a_position;\n"; 4977 + frag << "\n" 4978 + << "void main (void)\n" 4979 + << "{\n"; 4980 + 4981 + if (m_isVertexCase) 4982 + frag << " dEQP_FragColor = v_color;\n"; 4983 + else 4984 + { 4985 + for (vector<string>::const_iterator copyIter = passVars.begin(); copyIter != passVars.end(); copyIter++) 4986 + vtx << " v_" << *copyIter << " = " << "a_" << *copyIter << ";\n"; 4987 + } 4988 + 4989 + // Operation. 4990 + 4991 + switch (getOperationNature(m_op)) 4992 + { 4993 + case OPERATIONNATURE_PURE: 4994 + DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); 4995 + 4996 + operationValue0 = inValue0; 4997 + operationValue1 = inValue1; 4998 + break; 4999 + 5000 + case OPERATIONNATURE_MUTATING: 5001 + DE_ASSERT(getOperationType(m_op) != OPERATIONTYPE_ASSIGNMENT); 5002 + 5003 + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " tmpValue = " << inValue0 << ";\n"; 5004 + 5005 + operationValue0 = "tmpValue"; 5006 + operationValue1 = inValue1; 5007 + break; 5008 + 5009 + case OPERATIONNATURE_ASSIGNMENT: 5010 + DE_ASSERT(getOperationType(m_op) == OPERATIONTYPE_ASSIGNMENT); 5011 + 5012 + operationValue0 = inValue0; 5013 + operationValue1 = inValue1; 5014 + break; 5015 + 5016 + default: 5017 + DE_ASSERT(DE_FALSE); 5018 + } 5019 + 5020 + switch (getOperationType(m_op)) 5021 + { 5022 + case OPERATIONTYPE_BINARY_OPERATOR: 5023 + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << " " << getOperationName(m_op) << " " << operationValue1 << ";\n"; 5024 + break; 5025 + 5026 + case OPERATIONTYPE_UNARY_PREFIX_OPERATOR: 5027 + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << operationValue0 << ";\n"; 5028 + break; 5029 + 5030 + case OPERATIONTYPE_UNARY_POSTFIX_OPERATOR: 5031 + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << getOperationName(m_op) << ";\n"; 5032 + break; 5033 + 5034 + case OPERATIONTYPE_BINARY_FUNCTION: 5035 + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << "(" << operationValue0 << ", " << operationValue1 << ");\n"; 5036 + break; 5037 + 5038 + case OPERATIONTYPE_UNARY_FUNCTION: 5039 + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << getOperationName(m_op) << "(" << operationValue0 << ");\n"; 5040 + break; 5041 + 5042 + case OPERATIONTYPE_ASSIGNMENT: 5043 + op << " " << getPrecisionName(resultPrec) << " " << getDataTypeName(resultType) << " res = " << operationValue0 << ";\n"; 5044 + op << " res " << getOperationName(m_op) << " " << operationValue1 << ";\n"; 5045 + break; 5046 + 5047 + default: 5048 + DE_ASSERT(DE_FALSE); 5049 + } 5050 + 5051 + // Reduction to vec3 (rgb). Check the used value too if it was modified 5052 + op << " " << (m_isVertexCase ? "v_color" : "dEQP_FragColor") << " = "; 5053 + 5054 + if (isOperationValueModifying(m_op)) 5055 + op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0) + vec4(" << genGLSLMatToVec3Reduction(resultType, "tmpValue") << ", 0.0);\n"; 5056 + else 5057 + op << "vec4(" << genGLSLMatToVec3Reduction(resultType, "res") << ", 1.0);\n"; 5058 + 5059 + vtx << "}\n"; 5060 + frag << "}\n"; 5061 + 5062 + m_vertShaderSource = vtx.str(); 5063 + m_fragShaderSource = frag.str(); 5064 + 5065 + // \todo [2012-02-14 pyry] Compute better values for matrix tests. 5066 + m_userAttribTransforms.resize(4); 5067 + for (int attribNdx = 0; attribNdx < 4; attribNdx++) 5068 + { 5069 + m_userAttribTransforms[attribNdx] = Mat4(0.0f); 5070 + m_userAttribTransforms[attribNdx]( 0, 3) = 0.2f; // !< prevent matrix*vec from going into zero (assuming vec.w != 0) 5071 + m_userAttribTransforms[attribNdx]( 1, 3) = 0.1f; // !< 5072 + m_userAttribTransforms[attribNdx]( 2, 3) = 0.4f + 0.15f * float(attribNdx); // !< 5073 + m_userAttribTransforms[attribNdx]( 3, 3) = 0.7f; // !< 5074 + m_userAttribTransforms[attribNdx]((0 + attribNdx) % 4, 0) = 1.0f; 5075 + m_userAttribTransforms[attribNdx]((1 + attribNdx) % 4, 1) = 1.0f; 5076 + m_userAttribTransforms[attribNdx]((2 + attribNdx) % 4, 2) = 1.0f; 5077 + m_userAttribTransforms[attribNdx]((3 + attribNdx) % 4, 3) = 1.0f; 5078 + } 5079 + 5080 + // prevent bad reference cases such as black result images by fine-tuning used matrices 5081 + if (getOperationTestMatrixType(m_op) != TESTMATRIXTYPE_DEFAULT) 5082 + { 5083 + for (int attribNdx = 0; attribNdx < 4; attribNdx++) 5084 + { 5085 + for (int row = 0; row < 4; row++) 5086 + for (int col = 0; col < 4; col++) 5087 + { 5088 + switch (getOperationTestMatrixType(m_op)) 5089 + { 5090 + case TESTMATRIXTYPE_NEGATED: 5091 + m_userAttribTransforms[attribNdx](row, col) = -m_userAttribTransforms[attribNdx](row, col); 5092 + break; 5093 + case TESTMATRIXTYPE_INCREMENTED: 5094 + m_userAttribTransforms[attribNdx](row, col) += 0.3f; 5095 + break; 5096 + case TESTMATRIXTYPE_DECREMENTED: 5097 + m_userAttribTransforms[attribNdx](row, col) -= 0.3f; 5098 + break; 5099 + case TESTMATRIXTYPE_NEGATED_INCREMENTED: 5100 + m_userAttribTransforms[attribNdx](row, col) = -m_userAttribTransforms[attribNdx](row, col) + 0.3f; 5101 + break; 5102 + case TESTMATRIXTYPE_INCREMENTED_LESS: 5103 + m_userAttribTransforms[attribNdx](row, col) -= 0.1f; 5104 + break; 5105 + 5106 + default: 5107 + DE_ASSERT(DE_FALSE); 5108 + break; 5109 + } 5110 + } 5111 + } 5112 + } 5113 + 5114 + ShaderRenderCase::init(); 5115 } 5116 5117 std::string ShaderMatrixCase::genGLSLMatToVec3Reduction (const glu::DataType& matType, const char* varName) 5118 { 5119 - std::ostringstream op; 5120 - 5121 - switch (matType) 5122 - { 5123 - case TYPE_FLOAT: op << varName << ", " << varName << ", " << varName << ""; break; 5124 - case TYPE_FLOAT_VEC2: op << varName << ".x, " << varName << ".y, " << varName << ".x"; break; 5125 - case TYPE_FLOAT_VEC3: op << varName << ""; break; 5126 - case TYPE_FLOAT_VEC4: op << varName << ".x, " << varName << ".y, " << varName << ".z+" << varName << ".w"; break; 5127 - case TYPE_FLOAT_MAT2: op << varName << "[0][0], " << varName << "[1][0], " << varName << "[0][1]+" << varName << "[1][1]"; break; 5128 - case TYPE_FLOAT_MAT2X3: op << varName << "[0] + " << varName << "[1]"; break; 5129 - case TYPE_FLOAT_MAT2X4: op << varName << "[0].xyz + " << varName << "[1].yzw"; break; 5130 - case TYPE_FLOAT_MAT3X2: op << varName << "[0][0]+" << varName << "[0][1], " << varName << "[1][0]+" << varName << "[1][1], " << varName << "[2][0]+" << varName << "[2][1]"; break; 5131 - case TYPE_FLOAT_MAT3: op << varName << "[0] + " << varName << "[1] + " << varName << "[2]"; break; 5132 - case TYPE_FLOAT_MAT3X4: op << varName << "[0].xyz + " << varName << "[1].yzw + " << varName << "[2].zwx"; break; 5133 - 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; 5134 - case TYPE_FLOAT_MAT4X3: op << varName << "[0] + " << varName << "[1] + " << varName << "[2] + " << varName << "[3]"; break; 5135 - case TYPE_FLOAT_MAT4: op << varName << "[0].xyz+" << varName << "[1].yzw+" << varName << "[2].zwx+" << varName << "[3].wxy"; break; 5136 - 5137 - default: 5138 - DE_ASSERT(DE_FALSE); 5139 - } 5140 - 5141 - return op.str(); 5142 + std::ostringstream op; 5143 + 5144 + switch (matType) 5145 + { 5146 + case TYPE_FLOAT: op << varName << ", " << varName << ", " << varName << ""; break; 5147 + case TYPE_FLOAT_VEC2: op << varName << ".x, " << varName << ".y, " << varName << ".x"; break; 5148 + case TYPE_FLOAT_VEC3: op << varName << ""; break; 5149 + case TYPE_FLOAT_VEC4: op << varName << ".x, " << varName << ".y, " << varName << ".z+" << varName << ".w"; break; 5150 + case TYPE_FLOAT_MAT2: op << varName << "[0][0], " << varName << "[1][0], " << varName << "[0][1]+" << varName << "[1][1]"; break; 5151 + case TYPE_FLOAT_MAT2X3: op << varName << "[0] + " << varName << "[1]"; break; 5152 + case TYPE_FLOAT_MAT2X4: op << varName << "[0].xyz + " << varName << "[1].yzw"; break; 5153 + case TYPE_FLOAT_MAT3X2: op << varName << "[0][0]+" << varName << "[0][1], " << varName << "[1][0]+" << varName << "[1][1], " << varName << "[2][0]+" << varName << "[2][1]"; break; 5154 + case TYPE_FLOAT_MAT3: op << varName << "[0] + " << varName << "[1] + " << varName << "[2]"; break; 5155 + case TYPE_FLOAT_MAT3X4: op << varName << "[0].xyz + " << varName << "[1].yzw + " << varName << "[2].zwx"; break; 5156 + 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; 5157 + case TYPE_FLOAT_MAT4X3: op << varName << "[0] + " << varName << "[1] + " << varName << "[2] + " << varName << "[3]"; break; 5158 + case TYPE_FLOAT_MAT4: op << varName << "[0].xyz+" << varName << "[1].yzw+" << varName << "[2].zwx+" << varName << "[3].wxy"; break; 5159 + 5160 + default: 5161 + DE_ASSERT(DE_FALSE); 5162 + } 5163 + 5164 + return op.str(); 5165 } 5166 5167 void ShaderMatrixCase::setupUniforms (int programID, const tcu::Vec4& constCoords) 5168 { 5169 - const glw::Functions& gl = m_renderCtx.getFunctions(); 5170 - 5171 - DE_UNREF(constCoords); 5172 - 5173 - for (int inNdx = 0; inNdx < 2; inNdx++) 5174 - { 5175 - const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; 5176 - 5177 - if (in.inputType == INPUTTYPE_UNIFORM) 5178 - { 5179 - int loc = gl.getUniformLocation(programID, (string("u_in") + de::toString(inNdx)).c_str()); 5180 - 5181 - if (loc < 0) 5182 - continue; 5183 - 5184 - switch (in.dataType) 5185 - { 5186 - case TYPE_FLOAT: gl.uniform1f(loc, s_constInFloat[inNdx]); break; 5187 - case TYPE_FLOAT_VEC2: gl.uniform2fv(loc, 1, s_constInVec2[inNdx].getPtr()); break; 5188 - case TYPE_FLOAT_VEC3: gl.uniform3fv(loc, 1, s_constInVec3[inNdx].getPtr()); break; 5189 - case TYPE_FLOAT_VEC4: gl.uniform4fv(loc, 1, s_constInVec4[inNdx].getPtr()); break; 5190 - // \note GLES3 supports transpose in matrix upload. 5191 - case TYPE_FLOAT_MAT2: gl.uniformMatrix2fv (loc, 1, GL_TRUE, s_constInMat2x2[inNdx]); break; 5192 - case TYPE_FLOAT_MAT2X3: gl.uniformMatrix2x3fv(loc, 1, GL_TRUE, s_constInMat2x3[inNdx]); break; 5193 - case TYPE_FLOAT_MAT2X4: gl.uniformMatrix2x4fv(loc, 1, GL_TRUE, s_constInMat2x4[inNdx]); break; 5194 - case TYPE_FLOAT_MAT3X2: gl.uniformMatrix3x2fv(loc, 1, GL_TRUE, s_constInMat3x2[inNdx]); break; 5195 - case TYPE_FLOAT_MAT3: gl.uniformMatrix3fv (loc, 1, GL_TRUE, s_constInMat3x3[inNdx]); break; 5196 - case TYPE_FLOAT_MAT3X4: gl.uniformMatrix3x4fv(loc, 1, GL_TRUE, s_constInMat3x4[inNdx]); break; 5197 - case TYPE_FLOAT_MAT4X2: gl.uniformMatrix4x2fv(loc, 1, GL_TRUE, s_constInMat4x2[inNdx]); break; 5198 - case TYPE_FLOAT_MAT4X3: gl.uniformMatrix4x3fv(loc, 1, GL_TRUE, s_constInMat4x3[inNdx]); break; 5199 - case TYPE_FLOAT_MAT4: gl.uniformMatrix4fv (loc, 1, GL_TRUE, s_constInMat4x4[inNdx]); break; 5200 - default: 5201 - DE_ASSERT(false); 5202 - } 5203 - } 5204 - } 5205 + const glw::Functions& gl = m_renderCtx.getFunctions(); 5206 + 5207 + DE_UNREF(constCoords); 5208 + 5209 + for (int inNdx = 0; inNdx < 2; inNdx++) 5210 + { 5211 + const ShaderInput& in = inNdx > 0 ? m_in1 : m_in0; 5212 + 5213 + if (in.inputType == INPUTTYPE_UNIFORM) 5214 + { 5215 + int loc = gl.getUniformLocation(programID, (string("u_in") + de::toString(inNdx)).c_str()); 5216 + 5217 + if (loc < 0) 5218 + continue; 5219 + 5220 + switch (in.dataType) 5221 + { 5222 + case TYPE_FLOAT: gl.uniform1f(loc, s_constInFloat[inNdx]); break; 5223 + case TYPE_FLOAT_VEC2: gl.uniform2fv(loc, 1, s_constInVec2[inNdx].getPtr()); break; 5224 + case TYPE_FLOAT_VEC3: gl.uniform3fv(loc, 1, s_constInVec3[inNdx].getPtr()); break; 5225 + case TYPE_FLOAT_VEC4: gl.uniform4fv(loc, 1, s_constInVec4[inNdx].getPtr()); break; 5226 + // \note GLES3 supports transpose in matrix upload. 5227 + case TYPE_FLOAT_MAT2: gl.uniformMatrix2fv (loc, 1, GL_TRUE, s_constInMat2x2[inNdx]); break; 5228 + case TYPE_FLOAT_MAT2X3: gl.uniformMatrix2x3fv(loc, 1, GL_TRUE, s_constInMat2x3[inNdx]); break; 5229 + case TYPE_FLOAT_MAT2X4: gl.uniformMatrix2x4fv(loc, 1, GL_TRUE, s_constInMat2x4[inNdx]); break; 5230 + case TYPE_FLOAT_MAT3X2: gl.uniformMatrix3x2fv(loc, 1, GL_TRUE, s_constInMat3x2[inNdx]); break; 5231 + case TYPE_FLOAT_MAT3: gl.uniformMatrix3fv (loc, 1, GL_TRUE, s_constInMat3x3[inNdx]); break; 5232 + case TYPE_FLOAT_MAT3X4: gl.uniformMatrix3x4fv(loc, 1, GL_TRUE, s_constInMat3x4[inNdx]); break; 5233 + case TYPE_FLOAT_MAT4X2: gl.uniformMatrix4x2fv(loc, 1, GL_TRUE, s_constInMat4x2[inNdx]); break; 5234 + case TYPE_FLOAT_MAT4X3: gl.uniformMatrix4x3fv(loc, 1, GL_TRUE, s_constInMat4x3[inNdx]); break; 5235 + case TYPE_FLOAT_MAT4: gl.uniformMatrix4fv (loc, 1, GL_TRUE, s_constInMat4x4[inNdx]); break; 5236 + default: 5237 + DE_ASSERT(false); 5238 + } 5239 + } 5240 + } 5241 } 5242 5243 ShaderMatrixTests::ShaderMatrixTests (Context& context) 5244 - : TestCaseGroup(context, "matrix", "Matrix Tests") 5245 + : TestCaseGroup(context, "matrix", "Matrix Tests") 5246 { 5247 } 5248 5249 @@ -1791,181 +1791,181 @@ ShaderMatrixTests::~ShaderMatrixTests (void) 5250 5251 void ShaderMatrixTests::init (void) 5252 { 5253 - static const struct 5254 - { 5255 - const char* name; 5256 - const char* desc; 5257 - MatrixOp op; 5258 - bool extendedInputTypeCases; // !< test with const and uniform types too 5259 - bool createInputTypeGroup; // !< create group for input types 5260 - } ops[] = 5261 - { 5262 - { "add", "Matrix addition tests", OP_ADD, true, true }, 5263 - { "sub", "Matrix subtraction tests", OP_SUB, true, true }, 5264 - { "mul", "Matrix multiplication tests", OP_MUL, true, true }, 5265 - { "div", "Matrix division tests", OP_DIV, true, true }, 5266 - { "matrixcompmult", "Matrix component-wise multiplication tests", OP_COMP_MUL, false, true }, 5267 - { "outerproduct", "Matrix outerProduct() tests", OP_OUTER_PRODUCT, false, true }, 5268 - { "transpose", "Matrix transpose() tests", OP_TRANSPOSE, false, true }, 5269 - { "determinant", "Matrix determinant() tests", OP_DETERMINANT, false, true }, 5270 - { "inverse", "Matrix inverse() tests", OP_INVERSE, false, true }, 5271 - { "unary_addition", "Matrix unary addition tests", OP_UNARY_PLUS, false, false }, 5272 - { "negation", "Matrix negation tests", OP_NEGATION, false, false }, 5273 - { "pre_increment", "Matrix prefix increment tests", OP_PRE_INCREMENT, false, false }, 5274 - { "pre_decrement", "Matrix prefix decrement tests", OP_PRE_DECREMENT, false, false }, 5275 - { "post_increment", "Matrix postfix increment tests", OP_POST_INCREMENT, false, false }, 5276 - { "post_decrement", "Matrix postfix decrement tests", OP_POST_DECREMENT, false, false }, 5277 - { "add_assign", "Matrix add into tests", OP_ADD_INTO, false, false }, 5278 - { "sub_assign", "Matrix subtract from tests", OP_SUBTRACT_FROM, false, false }, 5279 - { "mul_assign", "Matrix multiply into tests", OP_MULTIPLY_INTO, false, false }, 5280 - { "div_assign", "Matrix divide into tests", OP_DIVIDE_INTO, false, false }, 5281 - }; 5282 - 5283 - struct InputTypeSpec 5284 - { 5285 - const char* name; 5286 - const char* desc; 5287 - InputType type; 5288 - }; 5289 - static const InputTypeSpec extendedInputTypes[] = 5290 - { 5291 - { "const", "Constant matrix input", INPUTTYPE_CONST }, 5292 - { "uniform", "Uniform matrix input", INPUTTYPE_UNIFORM }, 5293 - { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } 5294 - }; 5295 - static const InputTypeSpec reducedInputTypes[] = 5296 - { 5297 - { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } 5298 - }; 5299 - 5300 - static const DataType matrixTypes[] = 5301 - { 5302 - TYPE_FLOAT_MAT2, 5303 - TYPE_FLOAT_MAT2X3, 5304 - TYPE_FLOAT_MAT2X4, 5305 - TYPE_FLOAT_MAT3X2, 5306 - TYPE_FLOAT_MAT3, 5307 - TYPE_FLOAT_MAT3X4, 5308 - TYPE_FLOAT_MAT4X2, 5309 - TYPE_FLOAT_MAT4X3, 5310 - TYPE_FLOAT_MAT4 5311 - }; 5312 - 5313 - static const Precision precisions[] = 5314 - { 5315 - PRECISION_LOWP, 5316 - PRECISION_MEDIUMP, 5317 - PRECISION_HIGHP 5318 - }; 5319 - 5320 - for (int opNdx = 0; opNdx < DE_LENGTH_OF_ARRAY(ops); opNdx++) 5321 - { 5322 - const InputTypeSpec* inTypeList = (ops[opNdx].extendedInputTypeCases) ? (extendedInputTypes) : (reducedInputTypes); 5323 - const int inTypeListSize = (ops[opNdx].extendedInputTypeCases) ? (DE_LENGTH_OF_ARRAY(extendedInputTypes)) : (DE_LENGTH_OF_ARRAY(reducedInputTypes)); 5324 - const MatrixOp op = ops[opNdx].op; 5325 - tcu::TestCaseGroup* opGroup = new tcu::TestCaseGroup(m_testCtx, ops[opNdx].name, ops[opNdx].desc); 5326 - 5327 - addChild(opGroup); 5328 - 5329 - for (int inTypeNdx = 0; inTypeNdx < inTypeListSize; inTypeNdx++) 5330 - { 5331 - const InputType inputType = inTypeList[inTypeNdx].type; 5332 - tcu::TestCaseGroup* inGroup; 5333 - 5334 - if (ops[opNdx].createInputTypeGroup) 5335 - { 5336 - inGroup = new tcu::TestCaseGroup(m_testCtx, inTypeList[inTypeNdx].name, inTypeList[inTypeNdx].desc); 5337 - opGroup->addChild(inGroup); 5338 - } 5339 - else 5340 - inGroup = opGroup; 5341 - 5342 - for (int matTypeNdx = 0; matTypeNdx < DE_LENGTH_OF_ARRAY(matrixTypes); matTypeNdx++) 5343 - { 5344 - DataType matType = matrixTypes[matTypeNdx]; 5345 - int numCols = getDataTypeMatrixNumColumns(matType); 5346 - int numRows = getDataTypeMatrixNumRows(matType); 5347 - const char* matTypeName = getDataTypeName(matType); 5348 - 5349 - for (int precNdx = 0; precNdx < DE_LENGTH_OF_ARRAY(precisions); precNdx++) 5350 - { 5351 - Precision precision = precisions[precNdx]; 5352 - const char* precName = getPrecisionName(precision); 5353 - string baseName = string(precName) + "_" + matTypeName + "_"; 5354 - ShaderInput matIn (inputType, matType, precision); 5355 - 5356 - if (isOperationMatrixScalar(op)) 5357 - { 5358 - // Matrix-scalar \note For div cases we use uniform input. 5359 - ShaderInput scalarIn(op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, TYPE_FLOAT, precision); 5360 - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix-scalar case", matIn, scalarIn, op, true)); 5361 - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix-scalar case", matIn, scalarIn, op, false)); 5362 - } 5363 - 5364 - if (isOperationMatrixVector(op)) 5365 - { 5366 - // Matrix-vector. 5367 - DataType colVecType = getDataTypeFloatVec(numCols); 5368 - ShaderInput colVecIn (op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, colVecType, precision); 5369 - 5370 - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(colVecType) + "_vertex").c_str(), "Matrix-vector case", matIn, colVecIn, op, true)); 5371 - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(colVecType) + "_fragment").c_str(), "Matrix-vector case", matIn, colVecIn, op, false)); 5372 - 5373 - // Vector-matrix. 5374 - DataType rowVecType = getDataTypeFloatVec(numRows); 5375 - ShaderInput rowVecIn (op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, rowVecType, precision); 5376 - string vecMatName = string(precName) + "_" + getDataTypeName(rowVecType) + "_" + matTypeName; 5377 - 5378 - inGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_vertex").c_str(), "Vector-matrix case", rowVecIn, matIn, op, true)); 5379 - inGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_fragment").c_str(), "Vector-matrix case", rowVecIn, matIn, op, false)); 5380 - } 5381 - 5382 - if (isOperationArithmeticMatrixMatrix(op)) 5383 - { 5384 - // Arithmetic matrix-matrix multiplication. 5385 - for (int otherCols = 2; otherCols <= 4; otherCols++) 5386 - { 5387 - ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, getDataTypeMatrix(otherCols, numCols /* rows */), precision); 5388 - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(otherMatIn.dataType) + "_vertex").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, true)); 5389 - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(otherMatIn.dataType) + "_fragment").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, false)); 5390 - } 5391 - } 5392 - else if (isOperationComponentwiseMatrixMatrix(op)) 5393 - { 5394 - // Component-wise. 5395 - ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); 5396 - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_vertex").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, true)); 5397 - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_fragment").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, false)); 5398 - } 5399 - 5400 - if (isOperationVectorVector(op)) 5401 - { 5402 - ShaderInput vec1In(inputType, getDataTypeFloatVec(numRows), precision); 5403 - ShaderInput vec2In((inputType == INPUTTYPE_DYNAMIC) ? (INPUTTYPE_UNIFORM) : (inputType), getDataTypeFloatVec(numCols), precision); 5404 - 5405 - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Vector-vector case", vec1In, vec2In, op, true)); 5406 - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Vector-vector case", vec1In, vec2In, op, false)); 5407 - } 5408 - 5409 - if ((isOperationUnaryAnyMatrix(op)) || 5410 - (isOperationUnarySymmetricMatrix(op) && numCols == numRows)) 5411 - { 5412 - ShaderInput voidInput(INPUTTYPE_LAST, TYPE_LAST, PRECISION_LAST); 5413 - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix case", matIn, voidInput, op, true)); 5414 - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix case", matIn, voidInput, op, false)); 5415 - } 5416 - 5417 - if ((isOperationAssignmentAnyMatrix(op)) || 5418 - (isOperationAssignmentSymmetricMatrix(op) && numCols == numRows)) 5419 - { 5420 - ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); 5421 - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix assignment case", matIn, otherMatIn, op, true)); 5422 - inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix assignment case", matIn, otherMatIn, op, false)); 5423 - } 5424 - } 5425 - } 5426 - } 5427 - } 5428 + static const struct 5429 + { 5430 + const char* name; 5431 + const char* desc; 5432 + MatrixOp op; 5433 + bool extendedInputTypeCases; // !< test with const and uniform types too 5434 + bool createInputTypeGroup; // !< create group for input types 5435 + } ops[] = 5436 + { 5437 + { "add", "Matrix addition tests", OP_ADD, true, true }, 5438 + { "sub", "Matrix subtraction tests", OP_SUB, true, true }, 5439 + { "mul", "Matrix multiplication tests", OP_MUL, true, true }, 5440 + { "div", "Matrix division tests", OP_DIV, true, true }, 5441 + { "matrixcompmult", "Matrix component-wise multiplication tests", OP_COMP_MUL, false, true }, 5442 + { "outerproduct", "Matrix outerProduct() tests", OP_OUTER_PRODUCT, false, true }, 5443 + { "transpose", "Matrix transpose() tests", OP_TRANSPOSE, false, true }, 5444 + { "determinant", "Matrix determinant() tests", OP_DETERMINANT, false, true }, 5445 + { "inverse", "Matrix inverse() tests", OP_INVERSE, false, true }, 5446 + { "unary_addition", "Matrix unary addition tests", OP_UNARY_PLUS, false, false }, 5447 + { "negation", "Matrix negation tests", OP_NEGATION, false, false }, 5448 + { "pre_increment", "Matrix prefix increment tests", OP_PRE_INCREMENT, false, false }, 5449 + { "pre_decrement", "Matrix prefix decrement tests", OP_PRE_DECREMENT, false, false }, 5450 + { "post_increment", "Matrix postfix increment tests", OP_POST_INCREMENT, false, false }, 5451 + { "post_decrement", "Matrix postfix decrement tests", OP_POST_DECREMENT, false, false }, 5452 + { "add_assign", "Matrix add into tests", OP_ADD_INTO, false, false }, 5453 + { "sub_assign", "Matrix subtract from tests", OP_SUBTRACT_FROM, false, false }, 5454 + { "mul_assign", "Matrix multiply into tests", OP_MULTIPLY_INTO, false, false }, 5455 + { "div_assign", "Matrix divide into tests", OP_DIVIDE_INTO, false, false }, 5456 + }; 5457 + 5458 + struct InputTypeSpec 5459 + { 5460 + const char* name; 5461 + const char* desc; 5462 + InputType type; 5463 + }; 5464 + static const InputTypeSpec extendedInputTypes[] = 5465 + { 5466 + { "const", "Constant matrix input", INPUTTYPE_CONST }, 5467 + { "uniform", "Uniform matrix input", INPUTTYPE_UNIFORM }, 5468 + { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } 5469 + }; 5470 + static const InputTypeSpec reducedInputTypes[] = 5471 + { 5472 + { "dynamic", "Dynamic matrix input", INPUTTYPE_DYNAMIC } 5473 + }; 5474 + 5475 + static const DataType matrixTypes[] = 5476 + { 5477 + TYPE_FLOAT_MAT2, 5478 + TYPE_FLOAT_MAT2X3, 5479 + TYPE_FLOAT_MAT2X4, 5480 + TYPE_FLOAT_MAT3X2, 5481 + TYPE_FLOAT_MAT3, 5482 + TYPE_FLOAT_MAT3X4, 5483 + TYPE_FLOAT_MAT4X2, 5484 + TYPE_FLOAT_MAT4X3, 5485 + TYPE_FLOAT_MAT4 5486 + }; 5487 + 5488 + static const Precision precisions[] = 5489 + { 5490 + PRECISION_LOWP, 5491 + PRECISION_MEDIUMP, 5492 + PRECISION_HIGHP 5493 + }; 5494 + 5495 + for (int opNdx = 0; opNdx < DE_LENGTH_OF_ARRAY(ops); opNdx++) 5496 + { 5497 + const InputTypeSpec* inTypeList = (ops[opNdx].extendedInputTypeCases) ? (extendedInputTypes) : (reducedInputTypes); 5498 + const int inTypeListSize = (ops[opNdx].extendedInputTypeCases) ? (DE_LENGTH_OF_ARRAY(extendedInputTypes)) : (DE_LENGTH_OF_ARRAY(reducedInputTypes)); 5499 + const MatrixOp op = ops[opNdx].op; 5500 + tcu::TestCaseGroup* opGroup = new tcu::TestCaseGroup(m_testCtx, ops[opNdx].name, ops[opNdx].desc); 5501 + 5502 + addChild(opGroup); 5503 + 5504 + for (int inTypeNdx = 0; inTypeNdx < inTypeListSize; inTypeNdx++) 5505 + { 5506 + const InputType inputType = inTypeList[inTypeNdx].type; 5507 + tcu::TestCaseGroup* inGroup; 5508 + 5509 + if (ops[opNdx].createInputTypeGroup) 5510 + { 5511 + inGroup = new tcu::TestCaseGroup(m_testCtx, inTypeList[inTypeNdx].name, inTypeList[inTypeNdx].desc); 5512 + opGroup->addChild(inGroup); 5513 + } 5514 + else 5515 + inGroup = opGroup; 5516 + 5517 + for (int matTypeNdx = 0; matTypeNdx < DE_LENGTH_OF_ARRAY(matrixTypes); matTypeNdx++) 5518 + { 5519 + DataType matType = matrixTypes[matTypeNdx]; 5520 + int numCols = getDataTypeMatrixNumColumns(matType); 5521 + int numRows = getDataTypeMatrixNumRows(matType); 5522 + const char* matTypeName = getDataTypeName(matType); 5523 + 5524 + for (int precNdx = 0; precNdx < DE_LENGTH_OF_ARRAY(precisions); precNdx++) 5525 + { 5526 + Precision precision = precisions[precNdx]; 5527 + const char* precName = getPrecisionName(precision); 5528 + string baseName = string(precName) + "_" + matTypeName + "_"; 5529 + ShaderInput matIn (inputType, matType, precision); 5530 + 5531 + if (isOperationMatrixScalar(op)) 5532 + { 5533 + // Matrix-scalar \note For div cases we use uniform input. 5534 + ShaderInput scalarIn(op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, TYPE_FLOAT, precision); 5535 + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix-scalar case", matIn, scalarIn, op, true)); 5536 + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix-scalar case", matIn, scalarIn, op, false)); 5537 + } 5538 + 5539 + if (isOperationMatrixVector(op)) 5540 + { 5541 + // Matrix-vector. 5542 + DataType colVecType = getDataTypeFloatVec(numCols); 5543 + ShaderInput colVecIn (op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, colVecType, precision); 5544 + 5545 + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(colVecType) + "_vertex").c_str(), "Matrix-vector case", matIn, colVecIn, op, true)); 5546 + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(colVecType) + "_fragment").c_str(), "Matrix-vector case", matIn, colVecIn, op, false)); 5547 + 5548 + // Vector-matrix. 5549 + DataType rowVecType = getDataTypeFloatVec(numRows); 5550 + ShaderInput rowVecIn (op == OP_DIV ? INPUTTYPE_UNIFORM : INPUTTYPE_DYNAMIC, rowVecType, precision); 5551 + string vecMatName = string(precName) + "_" + getDataTypeName(rowVecType) + "_" + matTypeName; 5552 + 5553 + inGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_vertex").c_str(), "Vector-matrix case", rowVecIn, matIn, op, true)); 5554 + inGroup->addChild(new ShaderMatrixCase(m_context, (vecMatName + "_fragment").c_str(), "Vector-matrix case", rowVecIn, matIn, op, false)); 5555 + } 5556 + 5557 + if (isOperationArithmeticMatrixMatrix(op)) 5558 + { 5559 + // Arithmetic matrix-matrix multiplication. 5560 + for (int otherCols = 2; otherCols <= 4; otherCols++) 5561 + { 5562 + ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, getDataTypeMatrix(otherCols, numCols /* rows */), precision); 5563 + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(otherMatIn.dataType) + "_vertex").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, true)); 5564 + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + getDataTypeName(otherMatIn.dataType) + "_fragment").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, false)); 5565 + } 5566 + } 5567 + else if (isOperationComponentwiseMatrixMatrix(op)) 5568 + { 5569 + // Component-wise. 5570 + ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); 5571 + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_vertex").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, true)); 5572 + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + matTypeName + "_fragment").c_str(), "Matrix-matrix case", matIn, otherMatIn, op, false)); 5573 + } 5574 + 5575 + if (isOperationVectorVector(op)) 5576 + { 5577 + ShaderInput vec1In(inputType, getDataTypeFloatVec(numRows), precision); 5578 + ShaderInput vec2In((inputType == INPUTTYPE_DYNAMIC) ? (INPUTTYPE_UNIFORM) : (inputType), getDataTypeFloatVec(numCols), precision); 5579 + 5580 + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Vector-vector case", vec1In, vec2In, op, true)); 5581 + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Vector-vector case", vec1In, vec2In, op, false)); 5582 + } 5583 + 5584 + if ((isOperationUnaryAnyMatrix(op)) || 5585 + (isOperationUnarySymmetricMatrix(op) && numCols == numRows)) 5586 + { 5587 + ShaderInput voidInput(INPUTTYPE_LAST, TYPE_LAST, PRECISION_LAST); 5588 + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix case", matIn, voidInput, op, true)); 5589 + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix case", matIn, voidInput, op, false)); 5590 + } 5591 + 5592 + if ((isOperationAssignmentAnyMatrix(op)) || 5593 + (isOperationAssignmentSymmetricMatrix(op) && numCols == numRows)) 5594 + { 5595 + ShaderInput otherMatIn(inputType == INPUTTYPE_DYNAMIC ? INPUTTYPE_UNIFORM : inputType, matType, precision); 5596 + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_vertex").c_str(), "Matrix assignment case", matIn, otherMatIn, op, true)); 5597 + inGroup->addChild(new ShaderMatrixCase(m_context, (baseName + "float_fragment").c_str(), "Matrix assignment case", matIn, otherMatIn, op, false)); 5598 + } 5599 + } 5600 + } 5601 + } 5602 + } 5603 } 5604 5605 } // Functional 5606 diff --git a/src/tests/deqp_support/qpTestLog.c b/src/tests/deqp_support/qpTestLog.c 5607 index 7252ae049..e3eaa9b14 100644 5608 --- a/src/tests/deqp_support/qpTestLog.c 5609 +++ b/src/tests/deqp_support/qpTestLog.c 5610 @@ -33,7 +33,7 @@ 5611 #include "deMutex.h" 5612 5613 #if defined(QP_SUPPORT_PNG) 5614 -# include <png.h> 5615 +# include <png.h> 5616 #endif 5617 5618 #include <stdio.h> 5619 @@ -41,8 +41,8 @@ 5620 #include <stdarg.h> 5621 5622 #if (DE_OS == DE_OS_WIN32) 5623 -# include <windows.h> 5624 -# include <io.h> 5625 +# include <windows.h> 5626 +# include <io.h> 5627 #endif 5628 5629 #if defined(DE_DEBUG) 5630 @@ -51,70 +51,70 @@ 5631 5632 typedef enum ContainerType_e 5633 { 5634 - CONTAINERTYPE_SECTION = 0, 5635 - CONTAINERTYPE_IMAGESET, 5636 - CONTAINERTYPE_EGLCONFIGSET, 5637 - CONTAINERTYPE_SHADERPROGRAM, 5638 - CONTAINERTYPE_SAMPLELIST, 5639 - CONTAINERTYPE_SAMPLEINFO, 5640 - CONTAINERTYPE_SAMPLE, 5641 + CONTAINERTYPE_SECTION = 0, 5642 + CONTAINERTYPE_IMAGESET, 5643 + CONTAINERTYPE_EGLCONFIGSET, 5644 + CONTAINERTYPE_SHADERPROGRAM, 5645 + CONTAINERTYPE_SAMPLELIST, 5646 + CONTAINERTYPE_SAMPLEINFO, 5647 + CONTAINERTYPE_SAMPLE, 5648 5649 - CONTAINERTYPE_LAST 5650 + CONTAINERTYPE_LAST 5651 } ContainerType; 5652 5653 DE_INLINE deBool childContainersOk (ContainerType type) 5654 { 5655 - return type == CONTAINERTYPE_SECTION || type == CONTAINERTYPE_SAMPLELIST; 5656 + return type == CONTAINERTYPE_SECTION || type == CONTAINERTYPE_SAMPLELIST; 5657 } 5658 5659 enum 5660 { 5661 - MAX_CONTAINER_STACK_DEPTH = 32 5662 + MAX_CONTAINER_STACK_DEPTH = 32 5663 }; 5664 5665 typedef struct ContainerStack_s 5666 { 5667 - int numElements; 5668 - ContainerType elements[MAX_CONTAINER_STACK_DEPTH]; 5669 + int numElements; 5670 + ContainerType elements[MAX_CONTAINER_STACK_DEPTH]; 5671 } ContainerStack; 5672 5673 DE_INLINE void ContainerStack_reset (ContainerStack* stack) 5674 { 5675 - deMemset(stack, 0, sizeof(ContainerStack)); 5676 + deMemset(stack, 0, sizeof(ContainerStack)); 5677 } 5678 5679 DE_INLINE deBool ContainerStack_isEmpty (const ContainerStack* stack) 5680 { 5681 - return stack->numElements == 0; 5682 + return stack->numElements == 0; 5683 } 5684 5685 DE_INLINE deBool ContainerStack_push (ContainerStack* stack, ContainerType type) 5686 { 5687 - if (stack->numElements == MAX_CONTAINER_STACK_DEPTH) 5688 - return DE_FALSE; 5689 + if (stack->numElements == MAX_CONTAINER_STACK_DEPTH) 5690 + return DE_FALSE; 5691 5692 - if (stack->numElements > 0 && !childContainersOk(stack->elements[stack->numElements-1])) 5693 - return DE_FALSE; 5694 + if (stack->numElements > 0 && !childContainersOk(stack->elements[stack->numElements-1])) 5695 + return DE_FALSE; 5696 5697 - stack->elements[stack->numElements] = type; 5698 - stack->numElements += 1; 5699 + stack->elements[stack->numElements] = type; 5700 + stack->numElements += 1; 5701 5702 - return DE_TRUE; 5703 + return DE_TRUE; 5704 } 5705 5706 DE_INLINE ContainerType ContainerStack_pop (ContainerStack* stack) 5707 { 5708 - DE_ASSERT(stack->numElements > 0); 5709 - stack->numElements -= 1; 5710 - return stack->elements[stack->numElements]; 5711 + DE_ASSERT(stack->numElements > 0); 5712 + stack->numElements -= 1; 5713 + return stack->elements[stack->numElements]; 5714 } 5715 5716 DE_INLINE ContainerType ContainerStack_getTop (const ContainerStack* stack) 5717 { 5718 - if (stack->numElements > 0) 5719 - return stack->elements[stack->numElements-1]; 5720 - else 5721 - return CONTAINERTYPE_LAST; 5722 + if (stack->numElements > 0) 5723 + return stack->elements[stack->numElements-1]; 5724 + else 5725 + return CONTAINERTYPE_LAST; 5726 } 5727 5728 #endif 5729 @@ -122,26 +122,26 @@ DE_INLINE ContainerType ContainerStack_getTop (const ContainerStack* stack) 5730 /* qpTestLog instance */ 5731 struct qpTestLog_s 5732 { 5733 - deUint32 flags; /*!< Logging flags. */ 5734 + deUint32 flags; /*!< Logging flags. */ 5735 5736 - deMutex lock; /*!< Lock for mutable state below. */ 5737 + deMutex lock; /*!< Lock for mutable state below. */ 5738 5739 - /* State protected by lock. */ 5740 - FILE* outputFile; 5741 - qpXmlWriter* writer; 5742 - deBool isSessionOpen; 5743 - deBool isCaseOpen; 5744 + /* State protected by lock. */ 5745 + FILE* outputFile; 5746 + qpXmlWriter* writer; 5747 + deBool isSessionOpen; 5748 + deBool isCaseOpen; 5749 5750 #if defined(DE_DEBUG) 5751 - ContainerStack containerStack; /*!< For container usage verification. */ 5752 + ContainerStack containerStack; /*!< For container usage verification. */ 5753 #endif 5754 }; 5755 5756 /* Maps integer to string. */ 5757 typedef struct qpKeyStringMap_s 5758 { 5759 - int key; 5760 - char* string; 5761 + int key; 5762 + char* string; 5763 } qpKeyStringMap; 5764 5765 static const char* LOG_FORMAT_VERSION = "0.3.4"; 5766 @@ -149,32 +149,32 @@ static const char* LOG_FORMAT_VERSION = "0.3.4"; 5767 /* Mapping enum to above strings... */ 5768 static const qpKeyStringMap s_qpTestTypeMap[] = 5769 { 5770 - { QP_TEST_CASE_TYPE_SELF_VALIDATE, "SelfValidate" }, 5771 - { QP_TEST_CASE_TYPE_PERFORMANCE, "Performance" }, 5772 - { QP_TEST_CASE_TYPE_CAPABILITY, "Capability" }, 5773 - { QP_TEST_CASE_TYPE_ACCURACY, "Accuracy" }, 5774 + { QP_TEST_CASE_TYPE_SELF_VALIDATE, "SelfValidate" }, 5775 + { QP_TEST_CASE_TYPE_PERFORMANCE, "Performance" }, 5776 + { QP_TEST_CASE_TYPE_CAPABILITY, "Capability" }, 5777 + { QP_TEST_CASE_TYPE_ACCURACY, "Accuracy" }, 5778 5779 - { QP_TEST_CASE_TYPE_LAST, DE_NULL } 5780 + { QP_TEST_CASE_TYPE_LAST, DE_NULL } 5781 }; 5782 5783 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpTestTypeMap) == QP_TEST_CASE_TYPE_LAST + 1); 5784 5785 static const qpKeyStringMap s_qpTestResultMap[] = 5786 { 5787 - { QP_TEST_RESULT_PASS, "Pass" }, 5788 - { QP_TEST_RESULT_FAIL, "Fail" }, 5789 - { QP_TEST_RESULT_QUALITY_WARNING, "QualityWarning" }, 5790 - { QP_TEST_RESULT_COMPATIBILITY_WARNING, "CompatibilityWarning" }, 5791 - { QP_TEST_RESULT_PENDING, "Pending" }, /* should not be needed here */ 5792 - { QP_TEST_RESULT_NOT_SUPPORTED, "NotSupported" }, 5793 - { QP_TEST_RESULT_RESOURCE_ERROR, "ResourceError" }, 5794 - { QP_TEST_RESULT_INTERNAL_ERROR, "InternalError" }, 5795 - { QP_TEST_RESULT_CRASH, "Crash" }, 5796 - { QP_TEST_RESULT_TIMEOUT, "Timeout" }, 5797 + { QP_TEST_RESULT_PASS, "Pass" }, 5798 + { QP_TEST_RESULT_FAIL, "Fail" }, 5799 + { QP_TEST_RESULT_QUALITY_WARNING, "QualityWarning" }, 5800 + { QP_TEST_RESULT_COMPATIBILITY_WARNING, "CompatibilityWarning" }, 5801 + { QP_TEST_RESULT_PENDING, "Pending" }, /* should not be needed here */ 5802 + { QP_TEST_RESULT_NOT_SUPPORTED, "NotSupported" }, 5803 + { QP_TEST_RESULT_RESOURCE_ERROR, "ResourceError" }, 5804 + { QP_TEST_RESULT_INTERNAL_ERROR, "InternalError" }, 5805 + { QP_TEST_RESULT_CRASH, "Crash" }, 5806 + { QP_TEST_RESULT_TIMEOUT, "Timeout" }, 5807 5808 - /* Add new values here if needed, remember to update qpTestResult enumeration. */ 5809 + /* Add new values here if needed, remember to update qpTestResult enumeration. */ 5810 5811 - { QP_TEST_RESULT_LAST, DE_NULL } 5812 + { QP_TEST_RESULT_LAST, DE_NULL } 5813 }; 5814 5815 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpTestResultMap) == QP_TEST_RESULT_LAST + 1); 5816 @@ -183,13 +183,13 @@ DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpTestResultMap) == QP_TEST_RESULT_LAST + 5817 5818 static const qpKeyStringMap s_qpTagMap[] = 5819 { 5820 - { QP_KEY_TAG_NONE, DE_NULL }, 5821 - { QP_KEY_TAG_PERFORMANCE, "Performance" }, 5822 - { QP_KEY_TAG_QUALITY, "Quality" }, 5823 - { QP_KEY_TAG_PRECISION, "Precision" }, 5824 - { QP_KEY_TAG_TIME, "Time" }, 5825 + { QP_KEY_TAG_NONE, DE_NULL }, 5826 + { QP_KEY_TAG_PERFORMANCE, "Performance" }, 5827 + { QP_KEY_TAG_QUALITY, "Quality" }, 5828 + { QP_KEY_TAG_PRECISION, "Precision" }, 5829 + { QP_KEY_TAG_TIME, "Time" }, 5830 5831 - { QP_KEY_TAG_LAST, DE_NULL } 5832 + { QP_KEY_TAG_LAST, DE_NULL } 5833 }; 5834 5835 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpTagMap) == QP_KEY_TAG_LAST + 1); 5836 @@ -198,10 +198,10 @@ DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpTagMap) == QP_KEY_TAG_LAST + 1); 5837 5838 static const qpKeyStringMap s_qpSampleValueTagMap[] = 5839 { 5840 - { QP_SAMPLE_VALUE_TAG_PREDICTOR, "Predictor" }, 5841 - { QP_SAMPLE_VALUE_TAG_RESPONSE, "Response" }, 5842 + { QP_SAMPLE_VALUE_TAG_PREDICTOR, "Predictor" }, 5843 + { QP_SAMPLE_VALUE_TAG_RESPONSE, "Response" }, 5844 5845 - { QP_SAMPLE_VALUE_TAG_LAST, DE_NULL } 5846 + { QP_SAMPLE_VALUE_TAG_LAST, DE_NULL } 5847 }; 5848 5849 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpSampleValueTagMap) == QP_SAMPLE_VALUE_TAG_LAST + 1); 5850 @@ -210,12 +210,12 @@ DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpSampleValueTagMap) == QP_SAMPLE_VALUE_TA 5851 5852 static const qpKeyStringMap s_qpImageCompressionModeMap[] = 5853 { 5854 - { QP_IMAGE_COMPRESSION_MODE_NONE, "None" }, 5855 - { QP_IMAGE_COMPRESSION_MODE_PNG, "PNG" }, 5856 + { QP_IMAGE_COMPRESSION_MODE_NONE, "None" }, 5857 + { QP_IMAGE_COMPRESSION_MODE_PNG, "PNG" }, 5858 5859 - { QP_IMAGE_COMPRESSION_MODE_BEST, DE_NULL }, /* not allowed to be written! */ 5860 + { QP_IMAGE_COMPRESSION_MODE_BEST, DE_NULL }, /* not allowed to be written! */ 5861 5862 - { QP_IMAGE_COMPRESSION_MODE_LAST, DE_NULL } 5863 + { QP_IMAGE_COMPRESSION_MODE_LAST, DE_NULL } 5864 }; 5865 5866 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpImageCompressionModeMap) == QP_IMAGE_COMPRESSION_MODE_LAST + 1); 5867 @@ -224,10 +224,10 @@ DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpImageCompressionModeMap) == QP_IMAGE_COM 5868 5869 static const qpKeyStringMap s_qpImageFormatMap[] = 5870 { 5871 - { QP_IMAGE_FORMAT_RGB888, "RGB888" }, 5872 - { QP_IMAGE_FORMAT_RGBA8888, "RGBA8888" }, 5873 + { QP_IMAGE_FORMAT_RGB888, "RGB888" }, 5874 + { QP_IMAGE_FORMAT_RGBA8888, "RGBA8888" }, 5875 5876 - { QP_IMAGE_FORMAT_LAST, DE_NULL } 5877 + { QP_IMAGE_FORMAT_LAST, DE_NULL } 5878 }; 5879 5880 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpImageFormatMap) == QP_IMAGE_FORMAT_LAST + 1); 5881 @@ -236,91 +236,91 @@ DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpImageFormatMap) == QP_IMAGE_FORMAT_LAST 5882 5883 static const qpKeyStringMap s_qpShaderTypeMap[] = 5884 { 5885 - { QP_SHADER_TYPE_VERTEX, "VertexShader" }, 5886 - { QP_SHADER_TYPE_FRAGMENT, "FragmentShader" }, 5887 - { QP_SHADER_TYPE_GEOMETRY, "GeometryShader" }, 5888 - { QP_SHADER_TYPE_TESS_CONTROL, "TessControlShader" }, 5889 - { QP_SHADER_TYPE_TESS_EVALUATION, "TessEvaluationShader" }, 5890 - { QP_SHADER_TYPE_COMPUTE, "ComputeShader" }, 5891 + { QP_SHADER_TYPE_VERTEX, "VertexShader" }, 5892 + { QP_SHADER_TYPE_FRAGMENT, "FragmentShader" }, 5893 + { QP_SHADER_TYPE_GEOMETRY, "GeometryShader" }, 5894 + { QP_SHADER_TYPE_TESS_CONTROL, "TessControlShader" }, 5895 + { QP_SHADER_TYPE_TESS_EVALUATION, "TessEvaluationShader" }, 5896 + { QP_SHADER_TYPE_COMPUTE, "ComputeShader" }, 5897 5898 - { QP_SHADER_TYPE_LAST, DE_NULL } 5899 + { QP_SHADER_TYPE_LAST, DE_NULL } 5900 }; 5901 5902 DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qpShaderTypeMap) == QP_SHADER_TYPE_LAST + 1); 5903 5904 static void qpTestLog_flushFile (qpTestLog* log) 5905 { 5906 - DE_ASSERT(log && log->outputFile); 5907 - fflush(log->outputFile); 5908 + DE_ASSERT(log && log->outputFile); 5909 + fflush(log->outputFile); 5910 #if (DE_OS == DE_OS_WIN32) && (DE_COMPILER == DE_COMPILER_MSC) 5911 - /* \todo [petri] Is this really necessary? */ 5912 - FlushFileBuffers((HANDLE)_get_osfhandle(_fileno(log->outputFile))); 5913 + /* \todo [petri] Is this really necessary? */ 5914 + FlushFileBuffers((HANDLE)_get_osfhandle(_fileno(log->outputFile))); 5915 #endif 5916 } 5917 5918 -#define QP_LOOKUP_STRING(KEYMAP, KEY) qpLookupString(KEYMAP, DE_LENGTH_OF_ARRAY(KEYMAP), (int)(KEY)) 5919 +#define QP_LOOKUP_STRING(KEYMAP, KEY) qpLookupString(KEYMAP, DE_LENGTH_OF_ARRAY(KEYMAP), (int)(KEY)) 5920 5921 static const char* qpLookupString (const qpKeyStringMap* keyMap, int keyMapSize, int key) 5922 { 5923 - DE_ASSERT(keyMap); 5924 - DE_ASSERT(deInBounds32(key, 0, keyMapSize)); 5925 - DE_ASSERT(keyMap[key].key == key); 5926 - DE_UNREF(keyMapSize); /* for asserting only */ 5927 - return keyMap[key].string; 5928 + DE_ASSERT(keyMap); 5929 + DE_ASSERT(deInBounds32(key, 0, keyMapSize)); 5930 + DE_ASSERT(keyMap[key].key == key); 5931 + DE_UNREF(keyMapSize); /* for asserting only */ 5932 + return keyMap[key].string; 5933 } 5934 5935 DE_INLINE void int32ToString (int val, char buf[32]) 5936 { 5937 - deSprintf(&buf[0], 32, "%d", val); 5938 + deSprintf(&buf[0], 32, "%d", val); 5939 } 5940 5941 DE_INLINE void int64ToString (deInt64 val, char buf[32]) 5942 { 5943 - deSprintf(&buf[0], 32, "%lld", (long long int)val); 5944 + deSprintf(&buf[0], 32, "%lld", (long long int)val); 5945 } 5946 5947 DE_INLINE void floatToString (float value, char* buf, size_t bufSize) 5948 { 5949 - deSprintf(buf, bufSize, "%f", value); 5950 + deSprintf(buf, bufSize, "%f", value); 5951 } 5952 5953 DE_INLINE void doubleToString (double value, char* buf, size_t bufSize) 5954 { 5955 - deSprintf(buf, bufSize, "%f", value); 5956 + deSprintf(buf, bufSize, "%f", value); 5957 } 5958 5959 static deBool beginSession (qpTestLog* log) 5960 { 5961 - DE_ASSERT(log && !log->isSessionOpen); 5962 + DE_ASSERT(log && !log->isSessionOpen); 5963 5964 - /* Write session info. */ 5965 - fprintf(log->outputFile, "#sessionInfo releaseName %s\n", qpGetReleaseName()); 5966 - fprintf(log->outputFile, "#sessionInfo releaseId 0x%08x\n", qpGetReleaseId()); 5967 - fprintf(log->outputFile, "#sessionInfo targetName \"%s\"\n", qpGetTargetName()); 5968 + /* Write session info. */ 5969 + fprintf(log->outputFile, "#sessionInfo releaseName %s\n", qpGetReleaseName()); 5970 + fprintf(log->outputFile, "#sessionInfo releaseId 0x%08x\n", qpGetReleaseId()); 5971 + fprintf(log->outputFile, "#sessionInfo targetName \"%s\"\n", qpGetTargetName()); 5972 5973 /* Write out #beginSession. */ 5974 - fprintf(log->outputFile, "#beginSession\n"); 5975 - qpTestLog_flushFile(log); 5976 + fprintf(log->outputFile, "#beginSession\n"); 5977 + qpTestLog_flushFile(log); 5978 5979 - log->isSessionOpen = DE_TRUE; 5980 + log->isSessionOpen = DE_TRUE; 5981 5982 - return DE_TRUE; 5983 + return DE_TRUE; 5984 } 5985 5986 static deBool endSession (qpTestLog* log) 5987 { 5988 - DE_ASSERT(log && log->isSessionOpen); 5989 + DE_ASSERT(log && log->isSessionOpen); 5990 5991 /* Make sure xml is flushed. */ 5992 qpXmlWriter_flush(log->writer); 5993 5994 /* Write out #endSession. */ 5995 - fprintf(log->outputFile, "\n#endSession\n"); 5996 - qpTestLog_flushFile(log); 5997 + fprintf(log->outputFile, "\n#endSession\n"); 5998 + qpTestLog_flushFile(log); 5999 6000 - log->isSessionOpen = DE_FALSE; 6001 + log->isSessionOpen = DE_FALSE; 6002 6003 - return DE_TRUE; 6004 + return DE_TRUE; 6005 } 6006 6007 /*--------------------------------------------------------------------*//*! 6008 @@ -330,117 +330,117 @@ static deBool endSession (qpTestLog* log) 6009 *//*--------------------------------------------------------------------*/ 6010 qpTestLog* qpTestLog_createFileLog (const char* fileName, deUint32 flags) 6011 { 6012 - qpTestLog* log = (qpTestLog*)deCalloc(sizeof(qpTestLog)); 6013 - if (!log) 6014 - return DE_NULL; 6015 + qpTestLog* log = (qpTestLog*)deCalloc(sizeof(qpTestLog)); 6016 + if (!log) 6017 + return DE_NULL; 6018 6019 - DE_ASSERT(fileName && fileName[0]); /* must have filename. */ 6020 + DE_ASSERT(fileName && fileName[0]); /* must have filename. */ 6021 6022 #if defined(DE_DEBUG) 6023 - ContainerStack_reset(&log->containerStack); 6024 + ContainerStack_reset(&log->containerStack); 6025 #endif 6026 6027 - qpPrintf("Writing test log into %s\n", fileName); 6028 - 6029 - /* Create output file. */ 6030 - log->outputFile = fopen(fileName, "wb"); 6031 - if (!log->outputFile) 6032 - { 6033 - qpPrintf("ERROR: Unable to open test log output file '%s'.\n", fileName); 6034 - qpTestLog_destroy(log); 6035 - return DE_NULL; 6036 - } 6037 - 6038 - log->flags = flags; 6039 - log->writer = qpXmlWriter_createFileWriter(log->outputFile, 0, !(flags & QP_TEST_LOG_NO_FLUSH)); 6040 - log->lock = deMutex_create(DE_NULL); 6041 - log->isSessionOpen = DE_FALSE; 6042 - log->isCaseOpen = DE_FALSE; 6043 - 6044 - if (!log->writer) 6045 - { 6046 - qpPrintf("ERROR: Unable to create output XML writer to file '%s'.\n", fileName); 6047 - qpTestLog_destroy(log); 6048 - return DE_NULL; 6049 - } 6050 - 6051 - if (!log->lock) 6052 - { 6053 - qpPrintf("ERROR: Unable to create mutex.\n"); 6054 - qpTestLog_destroy(log); 6055 - return DE_NULL; 6056 - } 6057 - 6058 - beginSession(log); 6059 - 6060 - return log; 6061 + qpPrintf("Writing test log into %s\n", fileName); 6062 + 6063 + /* Create output file. */ 6064 + log->outputFile = fopen(fileName, "wb"); 6065 + if (!log->outputFile) 6066 + { 6067 + qpPrintf("ERROR: Unable to open test log output file '%s'.\n", fileName); 6068 + qpTestLog_destroy(log); 6069 + return DE_NULL; 6070 + } 6071 + 6072 + log->flags = flags; 6073 + log->writer = qpXmlWriter_createFileWriter(log->outputFile, 0, !(flags & QP_TEST_LOG_NO_FLUSH)); 6074 + log->lock = deMutex_create(DE_NULL); 6075 + log->isSessionOpen = DE_FALSE; 6076 + log->isCaseOpen = DE_FALSE; 6077 + 6078 + if (!log->writer) 6079 + { 6080 + qpPrintf("ERROR: Unable to create output XML writer to file '%s'.\n", fileName); 6081 + qpTestLog_destroy(log); 6082 + return DE_NULL; 6083 + } 6084 + 6085 + if (!log->lock) 6086 + { 6087 + qpPrintf("ERROR: Unable to create mutex.\n"); 6088 + qpTestLog_destroy(log); 6089 + return DE_NULL; 6090 + } 6091 + 6092 + beginSession(log); 6093 + 6094 + return log; 6095 } 6096 6097 /*--------------------------------------------------------------------*//*! 6098 * \brief Destroy a logger instance 6099 - * \param a qpTestLog instance 6100 + * \param a qpTestLog instance 6101 *//*--------------------------------------------------------------------*/ 6102 void qpTestLog_destroy (qpTestLog* log) 6103 { 6104 - DE_ASSERT(log); 6105 + DE_ASSERT(log); 6106 6107 - if (log->isSessionOpen) 6108 - endSession(log); 6109 + if (log->isSessionOpen) 6110 + endSession(log); 6111 6112 - if (log->writer) 6113 - qpXmlWriter_destroy(log->writer); 6114 + if (log->writer) 6115 + qpXmlWriter_destroy(log->writer); 6116 6117 - if (log->outputFile) 6118 - fclose(log->outputFile); 6119 + if (log->outputFile) 6120 + fclose(log->outputFile); 6121 6122 - if (log->lock) 6123 - deMutex_destroy(log->lock); 6124 + if (log->lock) 6125 + deMutex_destroy(log->lock); 6126 6127 - deFree(log); 6128 + deFree(log); 6129 } 6130 6131 /*--------------------------------------------------------------------*//*! 6132 * \brief Log start of test case 6133 * \param log qpTestLog instance 6134 - * \param testCasePath Full test case path (as seen in Candy). 6135 - * \param testCaseType Test case type 6136 + * \param testCasePath Full test case path (as seen in Candy). 6137 + * \param testCaseType Test case type 6138 * \return true if ok, false otherwise 6139 *//*--------------------------------------------------------------------*/ 6140 deBool qpTestLog_startCase (qpTestLog* log, const char* testCasePath, qpTestCaseType testCaseType) 6141 { 6142 - const char* typeStr = QP_LOOKUP_STRING(s_qpTestTypeMap, testCaseType); 6143 - int numResultAttribs = 0; 6144 - qpXmlAttribute resultAttribs[8]; 6145 + const char* typeStr = QP_LOOKUP_STRING(s_qpTestTypeMap, testCaseType); 6146 + int numResultAttribs = 0; 6147 + qpXmlAttribute resultAttribs[8]; 6148 6149 - DE_ASSERT(log && testCasePath && (testCasePath[0] != 0)); 6150 - deMutex_lock(log->lock); 6151 + DE_ASSERT(log && testCasePath && (testCasePath[0] != 0)); 6152 + deMutex_lock(log->lock); 6153 6154 - DE_ASSERT(!log->isCaseOpen); 6155 - DE_ASSERT(ContainerStack_isEmpty(&log->containerStack)); 6156 + DE_ASSERT(!log->isCaseOpen); 6157 + DE_ASSERT(ContainerStack_isEmpty(&log->containerStack)); 6158 6159 - /* Flush XML and write out #beginTestCaseResult. */ 6160 - qpXmlWriter_flush(log->writer); 6161 - fprintf(log->outputFile, "\n#beginTestCaseResult %s\n", testCasePath); 6162 - if (!(log->flags & QP_TEST_LOG_NO_FLUSH)) 6163 - qpTestLog_flushFile(log); 6164 - 6165 - log->isCaseOpen = DE_TRUE; 6166 - 6167 - /* Fill in attributes. */ 6168 - resultAttribs[numResultAttribs++] = qpSetStringAttrib("Version", LOG_FORMAT_VERSION); 6169 - resultAttribs[numResultAttribs++] = qpSetStringAttrib("CasePath", testCasePath); 6170 - resultAttribs[numResultAttribs++] = qpSetStringAttrib("CaseType", typeStr); 6171 - 6172 - if (!qpXmlWriter_startDocument(log->writer) || 6173 - !qpXmlWriter_startElement(log->writer, "TestCaseResult", numResultAttribs, resultAttribs)) 6174 - { 6175 - qpPrintf("qpTestLog_startCase(): Writing XML failed\n"); 6176 - deMutex_unlock(log->lock); 6177 - return DE_FALSE; 6178 - } 6179 - 6180 - deMutex_unlock(log->lock); 6181 - return DE_TRUE; 6182 + /* Flush XML and write out #beginTestCaseResult. */ 6183 + qpXmlWriter_flush(log->writer); 6184 + fprintf(log->outputFile, "\n#beginTestCaseResult %s\n", testCasePath); 6185 + if (!(log->flags & QP_TEST_LOG_NO_FLUSH)) 6186 + qpTestLog_flushFile(log); 6187 + 6188 + log->isCaseOpen = DE_TRUE; 6189 + 6190 + /* Fill in attributes. */ 6191 + resultAttribs[numResultAttribs++] = qpSetStringAttrib("Version", LOG_FORMAT_VERSION); 6192 + resultAttribs[numResultAttribs++] = qpSetStringAttrib("CasePath", testCasePath); 6193 + resultAttribs[numResultAttribs++] = qpSetStringAttrib("CaseType", typeStr); 6194 + 6195 + if (!qpXmlWriter_startDocument(log->writer) || 6196 + !qpXmlWriter_startElement(log->writer, "TestCaseResult", numResultAttribs, resultAttribs)) 6197 + { 6198 + qpPrintf("qpTestLog_startCase(): Writing XML failed\n"); 6199 + deMutex_unlock(log->lock); 6200 + return DE_FALSE; 6201 + } 6202 + 6203 + deMutex_unlock(log->lock); 6204 + return DE_TRUE; 6205 } 6206 6207 /*--------------------------------------------------------------------*//*! 6208 @@ -452,600 +452,600 @@ deBool qpTestLog_startCase (qpTestLog* log, const char* testCasePath, qpTestCase 6209 *//*--------------------------------------------------------------------*/ 6210 deBool qpTestLog_endCase (qpTestLog* log, qpTestResult result, const char* resultDetails) 6211 { 6212 - const char* statusStr = QP_LOOKUP_STRING(s_qpTestResultMap, result); 6213 - qpXmlAttribute statusAttrib = qpSetStringAttrib("StatusCode", statusStr); 6214 - 6215 - deMutex_lock(log->lock); 6216 - 6217 - DE_ASSERT(log->isCaseOpen); 6218 - DE_ASSERT(ContainerStack_isEmpty(&log->containerStack)); 6219 - 6220 - /* <Result StatusCode="Pass">Result details</Result> 6221 - * </TestCaseResult> 6222 - */ 6223 - if (!qpXmlWriter_startElement(log->writer, "Result", 1, &statusAttrib) || 6224 - (resultDetails && !qpXmlWriter_writeString(log->writer, resultDetails)) || 6225 - !qpXmlWriter_endElement(log->writer, "Result") || 6226 - !qpXmlWriter_endElement(log->writer, "TestCaseResult") || 6227 - !qpXmlWriter_endDocument(log->writer)) /* Close any XML elements still open */ 6228 - { 6229 - qpPrintf("qpTestLog_endCase(): Writing XML failed\n"); 6230 - deMutex_unlock(log->lock); 6231 - return DE_FALSE; 6232 - } 6233 - 6234 - /* Flush XML and write #endTestCaseResult. */ 6235 - qpXmlWriter_flush(log->writer); 6236 - fprintf(log->outputFile, "\n#endTestCaseResult\n"); 6237 - if (!(log->flags & QP_TEST_LOG_NO_FLUSH)) 6238 - qpTestLog_flushFile(log); 6239 - 6240 - log->isCaseOpen = DE_FALSE; 6241 - 6242 - deMutex_unlock(log->lock); 6243 - return DE_TRUE; 6244 + const char* statusStr = QP_LOOKUP_STRING(s_qpTestResultMap, result); 6245 + qpXmlAttribute statusAttrib = qpSetStringAttrib("StatusCode", statusStr); 6246 + 6247 + deMutex_lock(log->lock); 6248 + 6249 + DE_ASSERT(log->isCaseOpen); 6250 + DE_ASSERT(ContainerStack_isEmpty(&log->containerStack)); 6251 + 6252 + /* <Result StatusCode="Pass">Result details</Result> 6253 + * </TestCaseResult> 6254 + */ 6255 + if (!qpXmlWriter_startElement(log->writer, "Result", 1, &statusAttrib) || 6256 + (resultDetails && !qpXmlWriter_writeString(log->writer, resultDetails)) || 6257 + !qpXmlWriter_endElement(log->writer, "Result") || 6258 + !qpXmlWriter_endElement(log->writer, "TestCaseResult") || 6259 + !qpXmlWriter_endDocument(log->writer)) /* Close any XML elements still open */ 6260 + { 6261 + qpPrintf("qpTestLog_endCase(): Writing XML failed\n"); 6262 + deMutex_unlock(log->lock); 6263 + return DE_FALSE; 6264 + } 6265 + 6266 + /* Flush XML and write #endTestCaseResult. */ 6267 + qpXmlWriter_flush(log->writer); 6268 + fprintf(log->outputFile, "\n#endTestCaseResult\n"); 6269 + if (!(log->flags & QP_TEST_LOG_NO_FLUSH)) 6270 + qpTestLog_flushFile(log); 6271 + 6272 + log->isCaseOpen = DE_FALSE; 6273 + 6274 + deMutex_unlock(log->lock); 6275 + return DE_TRUE; 6276 } 6277 6278 /*--------------------------------------------------------------------*//*! 6279 * \brief Abrupt termination of logging. 6280 - * \param log qpTestLog instance 6281 - * \param result Result code, only Crash and Timeout are allowed. 6282 + * \param log qpTestLog instance 6283 + * \param result Result code, only Crash and Timeout are allowed. 6284 * \return true if ok, false otherwise 6285 *//*--------------------------------------------------------------------*/ 6286 deBool qpTestLog_terminateCase (qpTestLog* log, qpTestResult result) 6287 { 6288 - const char* resultStr = QP_LOOKUP_STRING(s_qpTestResultMap, result); 6289 + const char* resultStr = QP_LOOKUP_STRING(s_qpTestResultMap, result); 6290 6291 - DE_ASSERT(log); 6292 - DE_ASSERT(result == QP_TEST_RESULT_CRASH || result == QP_TEST_RESULT_TIMEOUT); 6293 + DE_ASSERT(log); 6294 + DE_ASSERT(result == QP_TEST_RESULT_CRASH || result == QP_TEST_RESULT_TIMEOUT); 6295 6296 - deMutex_lock(log->lock); 6297 + deMutex_lock(log->lock); 6298 6299 - if (!log->isCaseOpen) 6300 - { 6301 - deMutex_unlock(log->lock); 6302 - return DE_FALSE; /* Soft error. This is called from error handler. */ 6303 - } 6304 + if (!log->isCaseOpen) 6305 + { 6306 + deMutex_unlock(log->lock); 6307 + return DE_FALSE; /* Soft error. This is called from error handler. */ 6308 + } 6309 6310 - /* Flush XML and write #terminateTestCaseResult. */ 6311 - qpXmlWriter_flush(log->writer); 6312 - fprintf(log->outputFile, "\n#terminateTestCaseResult %s\n", resultStr); 6313 - qpTestLog_flushFile(log); 6314 + /* Flush XML and write #terminateTestCaseResult. */ 6315 + qpXmlWriter_flush(log->writer); 6316 + fprintf(log->outputFile, "\n#terminateTestCaseResult %s\n", resultStr); 6317 + qpTestLog_flushFile(log); 6318 6319 - log->isCaseOpen = DE_FALSE; 6320 + log->isCaseOpen = DE_FALSE; 6321 6322 #if defined(DE_DEBUG) 6323 - ContainerStack_reset(&log->containerStack); 6324 + ContainerStack_reset(&log->containerStack); 6325 #endif 6326 6327 - deMutex_unlock(log->lock); 6328 - return DE_TRUE; 6329 + deMutex_unlock(log->lock); 6330 + return DE_TRUE; 6331 } 6332 6333 static deBool qpTestLog_writeKeyValuePair (qpTestLog* log, const char* elementName, const char* name, const char* description, const char* unit, qpKeyValueTag tag, const char* text) 6334 { 6335 - const char* tagString = QP_LOOKUP_STRING(s_qpTagMap, tag); 6336 - qpXmlAttribute attribs[8]; 6337 - int numAttribs = 0; 6338 - 6339 - DE_ASSERT(log && elementName && text); 6340 - deMutex_lock(log->lock); 6341 - 6342 - /* Fill in attributes. */ 6343 - if (name) attribs[numAttribs++] = qpSetStringAttrib("Name", name); 6344 - if (description) attribs[numAttribs++] = qpSetStringAttrib("Description", description); 6345 - if (tagString) attribs[numAttribs++] = qpSetStringAttrib("Tag", tagString); 6346 - if (unit) attribs[numAttribs++] = qpSetStringAttrib("Unit", unit); 6347 - 6348 - if (!qpXmlWriter_startElement(log->writer, elementName, numAttribs, attribs) || 6349 - !qpXmlWriter_writeString(log->writer, text) || 6350 - !qpXmlWriter_endElement(log->writer, elementName)) 6351 - { 6352 - qpPrintf("qpTestLog_writeKeyValuePair(): Writing XML failed\n"); 6353 - deMutex_unlock(log->lock); 6354 - return DE_FALSE; 6355 - } 6356 - 6357 - deMutex_unlock(log->lock); 6358 - return DE_TRUE; 6359 + const char* tagString = QP_LOOKUP_STRING(s_qpTagMap, tag); 6360 + qpXmlAttribute attribs[8]; 6361 + int numAttribs = 0; 6362 + 6363 + DE_ASSERT(log && elementName && text); 6364 + deMutex_lock(log->lock); 6365 + 6366 + /* Fill in attributes. */ 6367 + if (name) attribs[numAttribs++] = qpSetStringAttrib("Name", name); 6368 + if (description) attribs[numAttribs++] = qpSetStringAttrib("Description", description); 6369 + if (tagString) attribs[numAttribs++] = qpSetStringAttrib("Tag", tagString); 6370 + if (unit) attribs[numAttribs++] = qpSetStringAttrib("Unit", unit); 6371 + 6372 + if (!qpXmlWriter_startElement(log->writer, elementName, numAttribs, attribs) || 6373 + !qpXmlWriter_writeString(log->writer, text) || 6374 + !qpXmlWriter_endElement(log->writer, elementName)) 6375 + { 6376 + qpPrintf("qpTestLog_writeKeyValuePair(): Writing XML failed\n"); 6377 + deMutex_unlock(log->lock); 6378 + return DE_FALSE; 6379 + } 6380 + 6381 + deMutex_unlock(log->lock); 6382 + return DE_TRUE; 6383 } 6384 6385 /*--------------------------------------------------------------------*//*! 6386 * \brief Write a message to output log 6387 - * \param log qpTestLog instance 6388 - * \param format Format string of message 6389 - * \param ... Parameters for message 6390 + * \param log qpTestLog instance 6391 + * \param format Format string of message 6392 + * \param ... Parameters for message 6393 * \return true if ok, false otherwise 6394 *//*--------------------------------------------------------------------*/ 6395 deBool qpTestLog_writeMessage (qpTestLog* log, const char* format, ...) 6396 { 6397 - char buffer[1024]; 6398 - va_list args; 6399 + char buffer[1024]; 6400 + va_list args; 6401 6402 - /* \todo [petri] Handle buffer overflows! */ 6403 + /* \todo [petri] Handle buffer overflows! */ 6404 6405 - va_start(args, format); 6406 - buffer[DE_LENGTH_OF_ARRAY(buffer) - 1] = 0; 6407 - vsnprintf(buffer, sizeof(buffer), format, args); 6408 - va_end(args); 6409 + va_start(args, format); 6410 + buffer[DE_LENGTH_OF_ARRAY(buffer) - 1] = 0; 6411 + vsnprintf(buffer, sizeof(buffer), format, args); 6412 + va_end(args); 6413 6414 - /* <Text>text</Text> */ 6415 - return qpTestLog_writeKeyValuePair(log, "Text", DE_NULL, DE_NULL, DE_NULL, QP_KEY_TAG_LAST, buffer); 6416 + /* <Text>text</Text> */ 6417 + return qpTestLog_writeKeyValuePair(log, "Text", DE_NULL, DE_NULL, DE_NULL, QP_KEY_TAG_LAST, buffer); 6418 } 6419 6420 /*--------------------------------------------------------------------*//*! 6421 * \brief Write key-value-pair into log 6422 - * \param log qpTestLog instance 6423 - * \param name Unique identifier for entry 6424 - * \param description Human readable description 6425 - * \param tag Optional tag 6426 - * \param value Value of the key-value-pair 6427 + * \param log qpTestLog instance 6428 + * \param name Unique identifier for entry 6429 + * \param description Human readable description 6430 + * \param tag Optional tag 6431 + * \param value Value of the key-value-pair 6432 * \return true if ok, false otherwise 6433 *//*--------------------------------------------------------------------*/ 6434 deBool qpTestLog_writeText (qpTestLog* log, const char* name, const char* description, qpKeyValueTag tag, const char* text) 6435 { 6436 - /* <Text Name="name" Description="description" Tag="tag">text</Text> */ 6437 - return qpTestLog_writeKeyValuePair(log, "Text", name, description, DE_NULL, tag, text); 6438 + /* <Text Name="name" Description="description" Tag="tag">text</Text> */ 6439 + return qpTestLog_writeKeyValuePair(log, "Text", name, description, DE_NULL, tag, text); 6440 } 6441 6442 /*--------------------------------------------------------------------*//*! 6443 * \brief Write key-value-pair into log 6444 - * \param log qpTestLog instance 6445 - * \param name Unique identifier for entry 6446 - * \param description Human readable description 6447 - * \param tag Optional tag 6448 - * \param value Value of the key-value-pair 6449 + * \param log qpTestLog instance 6450 + * \param name Unique identifier for entry 6451 + * \param description Human readable description 6452 + * \param tag Optional tag 6453 + * \param value Value of the key-value-pair 6454 * \return true if ok, false otherwise 6455 *//*--------------------------------------------------------------------*/ 6456 deBool qpTestLog_writeInteger (qpTestLog* log, const char* name, const char* description, const char* unit, qpKeyValueTag tag, deInt64 value) 6457 { 6458 - char tmpString[64]; 6459 - int64ToString(value, tmpString); 6460 + char tmpString[64]; 6461 + int64ToString(value, tmpString); 6462 6463 - /* <Number Name="name" Description="description" Tag="Performance">15</Number> */ 6464 - return qpTestLog_writeKeyValuePair(log, "Number", name, description, unit, tag, tmpString); 6465 + /* <Number Name="name" Description="description" Tag="Performance">15</Number> */ 6466 + return qpTestLog_writeKeyValuePair(log, "Number", name, description, unit, tag, tmpString); 6467 } 6468 6469 /*--------------------------------------------------------------------*//*! 6470 * \brief Write key-value-pair into log 6471 - * \param log qpTestLog instance 6472 - * \param name Unique identifier for entry 6473 - * \param description Human readable description 6474 - * \param tag Optional tag 6475 - * \param value Value of the key-value-pair 6476 + * \param log qpTestLog instance 6477 + * \param name Unique identifier for entry 6478 + * \param description Human readable description 6479 + * \param tag Optional tag 6480 + * \param value Value of the key-value-pair 6481 * \return true if ok, false otherwise 6482 *//*--------------------------------------------------------------------*/ 6483 deBool qpTestLog_writeFloat (qpTestLog* log, const char* name, const char* description, const char* unit, qpKeyValueTag tag, float value) 6484 { 6485 - char tmpString[64]; 6486 - floatToString(value, tmpString, sizeof(tmpString)); 6487 + char tmpString[64]; 6488 + floatToString(value, tmpString, sizeof(tmpString)); 6489 6490 - /* <Number Name="name" Description="description" Tag="Performance">15</Number> */ 6491 - return qpTestLog_writeKeyValuePair(log, "Number", name, description, unit, tag, tmpString); 6492 + /* <Number Name="name" Description="description" Tag="Performance">15</Number> */ 6493 + return qpTestLog_writeKeyValuePair(log, "Number", name, description, unit, tag, tmpString); 6494 } 6495 6496 typedef struct Buffer_s 6497 { 6498 - size_t capacity; 6499 - size_t size; 6500 - deUint8* data; 6501 + size_t capacity; 6502 + size_t size; 6503 + deUint8* data; 6504 } Buffer; 6505 6506 void Buffer_init (Buffer* buffer) 6507 { 6508 - buffer->capacity = 0; 6509 - buffer->size = 0; 6510 - buffer->data = DE_NULL; 6511 + buffer->capacity = 0; 6512 + buffer->size = 0; 6513 + buffer->data = DE_NULL; 6514 } 6515 6516 void Buffer_deinit (Buffer* buffer) 6517 { 6518 - deFree(buffer->data); 6519 - Buffer_init(buffer); 6520 + deFree(buffer->data); 6521 + Buffer_init(buffer); 6522 } 6523 6524 deBool Buffer_resize (Buffer* buffer, size_t newSize) 6525 { 6526 - /* Grow buffer if necessary. */ 6527 - if (newSize > buffer->capacity) 6528 - { 6529 - size_t newCapacity = (size_t)deAlign32(deMax32(2*(int)buffer->capacity, (int)newSize), 512); 6530 - deUint8* newData = (deUint8*)deMalloc(newCapacity); 6531 - if (!newData) 6532 - return DE_FALSE; 6533 - 6534 - memcpy(newData, buffer->data, buffer->size); 6535 - deFree(buffer->data); 6536 - buffer->data = newData; 6537 - buffer->capacity = newCapacity; 6538 - } 6539 - 6540 - buffer->size = newSize; 6541 - return DE_TRUE; 6542 + /* Grow buffer if necessary. */ 6543 + if (newSize > buffer->capacity) 6544 + { 6545 + size_t newCapacity = (size_t)deAlign32(deMax32(2*(int)buffer->capacity, (int)newSize), 512); 6546 + deUint8* newData = (deUint8*)deMalloc(newCapacity); 6547 + if (!newData) 6548 + return DE_FALSE; 6549 + 6550 + memcpy(newData, buffer->data, buffer->size); 6551 + deFree(buffer->data); 6552 + buffer->data = newData; 6553 + buffer->capacity = newCapacity; 6554 + } 6555 + 6556 + buffer->size = newSize; 6557 + return DE_TRUE; 6558 } 6559 6560 deBool Buffer_append (Buffer* buffer, const deUint8* data, size_t numBytes) 6561 { 6562 - size_t offset = buffer->size; 6563 + size_t offset = buffer->size; 6564 6565 - if (!Buffer_resize(buffer, buffer->size + numBytes)) 6566 - return DE_FALSE; 6567 + if (!Buffer_resize(buffer, buffer->size + numBytes)) 6568 + return DE_FALSE; 6569 6570 - /* Append bytes. */ 6571 - memcpy(&buffer->data[offset], data, numBytes); 6572 - return DE_TRUE; 6573 + /* Append bytes. */ 6574 + memcpy(&buffer->data[offset], data, numBytes); 6575 + return DE_TRUE; 6576 } 6577 6578 #if defined(QP_SUPPORT_PNG) 6579 void pngWriteData (png_structp png, png_bytep dataPtr, png_size_t numBytes) 6580 { 6581 - Buffer* buffer = (Buffer*)png_get_io_ptr(png); 6582 - if (!Buffer_append(buffer, (const deUint8*)dataPtr, numBytes)) 6583 - png_error(png, "unable to resize PNG write buffer!"); 6584 + Buffer* buffer = (Buffer*)png_get_io_ptr(png); 6585 + if (!Buffer_append(buffer, (const deUint8*)dataPtr, numBytes)) 6586 + png_error(png, "unable to resize PNG write buffer!"); 6587 } 6588 6589 void pngFlushData (png_structp png) 6590 { 6591 - DE_UNREF(png); 6592 - /* nada */ 6593 + DE_UNREF(png); 6594 + /* nada */ 6595 } 6596 6597 static deBool writeCompressedPNG (png_structp png, png_infop info, png_byte** rowPointers, int width, int height, int colorFormat) 6598 { 6599 - if (setjmp(png_jmpbuf(png)) == 0) 6600 - { 6601 - /* Write data. */ 6602 - png_set_IHDR(png, info, (png_uint_32)width, (png_uint_32)height, 6603 - 8, 6604 - colorFormat, 6605 - PNG_INTERLACE_NONE, 6606 - PNG_COMPRESSION_TYPE_BASE, 6607 - PNG_FILTER_TYPE_BASE); 6608 - png_write_info(png, info); 6609 - png_write_image(png, rowPointers); 6610 - png_write_end(png, NULL); 6611 - 6612 - return DE_TRUE; 6613 - } 6614 - else 6615 - return DE_FALSE; 6616 + if (setjmp(png_jmpbuf(png)) == 0) 6617 + { 6618 + /* Write data. */ 6619 + png_set_IHDR(png, info, (png_uint_32)width, (png_uint_32)height, 6620 + 8, 6621 + colorFormat, 6622 + PNG_INTERLACE_NONE, 6623 + PNG_COMPRESSION_TYPE_BASE, 6624 + PNG_FILTER_TYPE_BASE); 6625 + png_write_info(png, info); 6626 + png_write_image(png, rowPointers); 6627 + png_write_end(png, NULL); 6628 + 6629 + return DE_TRUE; 6630 + } 6631 + else 6632 + return DE_FALSE; 6633 } 6634 6635 static deBool compressImagePNG (Buffer* buffer, qpImageFormat imageFormat, int width, int height, int rowStride, const void* data) 6636 { 6637 - deBool compressOk = DE_FALSE; 6638 - png_structp png = DE_NULL; 6639 - png_infop info = DE_NULL; 6640 - png_byte** rowPointers = DE_NULL; 6641 - deBool hasAlpha = imageFormat == QP_IMAGE_FORMAT_RGBA8888; 6642 - int ndx; 6643 - 6644 - /* Handle format. */ 6645 - DE_ASSERT(imageFormat == QP_IMAGE_FORMAT_RGB888 || imageFormat == QP_IMAGE_FORMAT_RGBA8888); 6646 - 6647 - /* Allocate & set row pointers. */ 6648 - rowPointers = (png_byte**)deMalloc((size_t)height * sizeof(png_byte*)); 6649 - if (!rowPointers) 6650 - return DE_FALSE; 6651 - 6652 - for (ndx = 0; ndx < height; ndx++) 6653 - rowPointers[ndx] = (png_byte*)((const deUint8*)data + ndx*rowStride); 6654 - 6655 - /* Initialize PNG compressor. */ 6656 - png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); 6657 - info = png ? png_create_info_struct(png) : DE_NULL; 6658 - if (png && info) 6659 - { 6660 - /* Set our own write function. */ 6661 - png_set_write_fn(png, buffer, pngWriteData, pngFlushData); 6662 - 6663 - compressOk = writeCompressedPNG(png, info, rowPointers, width, height, 6664 - hasAlpha ? PNG_COLOR_TYPE_RGBA : PNG_COLOR_TYPE_RGB); 6665 - } 6666 - 6667 - /* Cleanup & return. */ 6668 - if (png && info) 6669 - { 6670 - png_destroy_info_struct(png, &info); 6671 - png_destroy_write_struct(&png, DE_NULL); 6672 - } 6673 - else if (png) 6674 - png_destroy_write_struct(&png, &info); 6675 - 6676 - deFree(rowPointers); 6677 - return compressOk; 6678 + deBool compressOk = DE_FALSE; 6679 + png_structp png = DE_NULL; 6680 + png_infop info = DE_NULL; 6681 + png_byte** rowPointers = DE_NULL; 6682 + deBool hasAlpha = imageFormat == QP_IMAGE_FORMAT_RGBA8888; 6683 + int ndx; 6684 + 6685 + /* Handle format. */ 6686 + DE_ASSERT(imageFormat == QP_IMAGE_FORMAT_RGB888 || imageFormat == QP_IMAGE_FORMAT_RGBA8888); 6687 + 6688 + /* Allocate & set row pointers. */ 6689 + rowPointers = (png_byte**)deMalloc((size_t)height * sizeof(png_byte*)); 6690 + if (!rowPointers) 6691 + return DE_FALSE; 6692 + 6693 + for (ndx = 0; ndx < height; ndx++) 6694 + rowPointers[ndx] = (png_byte*)((const deUint8*)data + ndx*rowStride); 6695 + 6696 + /* Initialize PNG compressor. */ 6697 + png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); 6698 + info = png ? png_create_info_struct(png) : DE_NULL; 6699 + if (png && info) 6700 + { 6701 + /* Set our own write function. */ 6702 + png_set_write_fn(png, buffer, pngWriteData, pngFlushData); 6703 + 6704 + compressOk = writeCompressedPNG(png, info, rowPointers, width, height, 6705 + hasAlpha ? PNG_COLOR_TYPE_RGBA : PNG_COLOR_TYPE_RGB); 6706 + } 6707 + 6708 + /* Cleanup & return. */ 6709 + if (png && info) 6710 + { 6711 + png_destroy_info_struct(png, &info); 6712 + png_destroy_write_struct(&png, DE_NULL); 6713 + } 6714 + else if (png) 6715 + png_destroy_write_struct(&png, &info); 6716 + 6717 + deFree(rowPointers); 6718 + return compressOk; 6719 } 6720 #endif /* QP_SUPPORT_PNG */ 6721 6722 /*--------------------------------------------------------------------*//*! 6723 * \brief Start image set 6724 - * \param log qpTestLog instance 6725 - * \param name Unique identifier for the set 6726 - * \param description Human readable description 6727 + * \param log qpTestLog instance 6728 + * \param name Unique identifier for the set 6729 + * \param description Human readable description 6730 * \return true if ok, false otherwise 6731 *//*--------------------------------------------------------------------*/ 6732 deBool qpTestLog_startImageSet (qpTestLog* log, const char* name, const char* description) 6733 { 6734 - qpXmlAttribute attribs[4]; 6735 - int numAttribs = 0; 6736 + qpXmlAttribute attribs[4]; 6737 + int numAttribs = 0; 6738 6739 - DE_ASSERT(log && name); 6740 - deMutex_lock(log->lock); 6741 + DE_ASSERT(log && name); 6742 + deMutex_lock(log->lock); 6743 6744 - attribs[numAttribs++] = qpSetStringAttrib("Name", name); 6745 - if (description) 6746 - attribs[numAttribs++] = qpSetStringAttrib("Description", description); 6747 + attribs[numAttribs++] = qpSetStringAttrib("Name", name); 6748 + if (description) 6749 + attribs[numAttribs++] = qpSetStringAttrib("Description", description); 6750 6751 - /* <ImageSet Name="<name>"> */ 6752 - if (!qpXmlWriter_startElement(log->writer, "ImageSet", numAttribs, attribs)) 6753 - { 6754 - qpPrintf("qpTestLog_startImageSet(): Writing XML failed\n"); 6755 - deMutex_unlock(log->lock); 6756 - return DE_FALSE; 6757 - } 6758 + /* <ImageSet Name="<name>"> */ 6759 + if (!qpXmlWriter_startElement(log->writer, "ImageSet", numAttribs, attribs)) 6760 + { 6761 + qpPrintf("qpTestLog_startImageSet(): Writing XML failed\n"); 6762 + deMutex_unlock(log->lock); 6763 + return DE_FALSE; 6764 + } 6765 6766 - DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_IMAGESET)); 6767 + DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_IMAGESET)); 6768 6769 - deMutex_unlock(log->lock); 6770 - return DE_TRUE; 6771 + deMutex_unlock(log->lock); 6772 + return DE_TRUE; 6773 } 6774 6775 /*--------------------------------------------------------------------*//*! 6776 * \brief End image set 6777 - * \param log qpTestLog instance 6778 + * \param log qpTestLog instance 6779 * \return true if ok, false otherwise 6780 *//*--------------------------------------------------------------------*/ 6781 deBool qpTestLog_endImageSet (qpTestLog* log) 6782 { 6783 - DE_ASSERT(log); 6784 - deMutex_lock(log->lock); 6785 + DE_ASSERT(log); 6786 + deMutex_lock(log->lock); 6787 6788 - /* <ImageSet Name="<name>"> */ 6789 - if (!qpXmlWriter_endElement(log->writer, "ImageSet")) 6790 - { 6791 - qpPrintf("qpTestLog_endImageSet(): Writing XML failed\n"); 6792 - deMutex_unlock(log->lock); 6793 - return DE_FALSE; 6794 - } 6795 + /* <ImageSet Name="<name>"> */ 6796 + if (!qpXmlWriter_endElement(log->writer, "ImageSet")) 6797 + { 6798 + qpPrintf("qpTestLog_endImageSet(): Writing XML failed\n"); 6799 + deMutex_unlock(log->lock); 6800 + return DE_FALSE; 6801 + } 6802 6803 - DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_IMAGESET); 6804 + DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_IMAGESET); 6805 6806 - deMutex_unlock(log->lock); 6807 - return DE_TRUE; 6808 + deMutex_unlock(log->lock); 6809 + return DE_TRUE; 6810 } 6811 6812 /*--------------------------------------------------------------------*//*! 6813 * \brief Write base64 encoded raw image data into log 6814 - * \param log qpTestLog instance 6815 - * \param name Unique name (matching names can be compared across BatchResults). 6816 - * \param description Textual description (shown in Candy). 6817 - * \param compressionMode Compression mode 6818 - * \param imageFormat Color format 6819 - * \param width Width in pixels 6820 - * \param height Height in pixels 6821 - * \param stride Data stride (offset between rows) 6822 - * \param data Pointer to pixel data 6823 + * \param log qpTestLog instance 6824 + * \param name Unique name (matching names can be compared across BatchResults). 6825 + * \param description Textual description (shown in Candy). 6826 + * \param compressionMode Compression mode 6827 + * \param imageFormat Color format 6828 + * \param width Width in pixels 6829 + * \param height Height in pixels 6830 + * \param stride Data stride (offset between rows) 6831 + * \param data Pointer to pixel data 6832 * \return 0 if OK, otherwise <0 6833 *//*--------------------------------------------------------------------*/ 6834 -deBool qpTestLog_writeImage ( 6835 - qpTestLog* log, 6836 - const char* name, 6837 - const char* description, 6838 - qpImageCompressionMode compressionMode, 6839 - qpImageFormat imageFormat, 6840 - int width, 6841 - int height, 6842 - int stride, 6843 - const void* data) 6844 -{ 6845 - char widthStr[32]; 6846 - char heightStr[32]; 6847 - qpXmlAttribute attribs[8]; 6848 - int numAttribs = 0; 6849 - Buffer compressedBuffer; 6850 - const void* writeDataPtr = DE_NULL; 6851 - size_t writeDataBytes = ~(size_t)0; 6852 - 6853 - DE_ASSERT(log && name); 6854 - DE_ASSERT(deInRange32(width, 1, 16384)); 6855 - DE_ASSERT(deInRange32(height, 1, 16384)); 6856 - DE_ASSERT(data); 6857 - 6858 - if (log->flags & QP_TEST_LOG_EXCLUDE_IMAGES) 6859 - return DE_TRUE; /* Image not logged. */ 6860 - 6861 - Buffer_init(&compressedBuffer); 6862 - 6863 - /* BEST compression mode defaults to PNG. */ 6864 - if (compressionMode == QP_IMAGE_COMPRESSION_MODE_BEST) 6865 - { 6866 +deBool qpTestLog_writeImage ( 6867 + qpTestLog* log, 6868 + const char* name, 6869 + const char* description, 6870 + qpImageCompressionMode compressionMode, 6871 + qpImageFormat imageFormat, 6872 + int width, 6873 + int height, 6874 + int stride, 6875 + const void* data) 6876 +{ 6877 + char widthStr[32]; 6878 + char heightStr[32]; 6879 + qpXmlAttribute attribs[8]; 6880 + int numAttribs = 0; 6881 + Buffer compressedBuffer; 6882 + const void* writeDataPtr = DE_NULL; 6883 + size_t writeDataBytes = ~(size_t)0; 6884 + 6885 + DE_ASSERT(log && name); 6886 + DE_ASSERT(deInRange32(width, 1, 16384)); 6887 + DE_ASSERT(deInRange32(height, 1, 16384)); 6888 + DE_ASSERT(data); 6889 + 6890 + if (log->flags & QP_TEST_LOG_EXCLUDE_IMAGES) 6891 + return DE_TRUE; /* Image not logged. */ 6892 + 6893 + Buffer_init(&compressedBuffer); 6894 + 6895 + /* BEST compression mode defaults to PNG. */ 6896 + if (compressionMode == QP_IMAGE_COMPRESSION_MODE_BEST) 6897 + { 6898 #if defined(QP_SUPPORT_PNG) 6899 - compressionMode = QP_IMAGE_COMPRESSION_MODE_PNG; 6900 + compressionMode = QP_IMAGE_COMPRESSION_MODE_PNG; 590 6901 #else 591 + 592 +typedef void *EGLNativeDisplayType; 593 +typedef khronos_uintptr_t EGLNativePixmapType; 594 +typedef khronos_uintptr_t EGLNativeWindowType; 595 + 596 +#endif /* ANGLE_USE_X11 && !MESA_EGL_NO_X11_HEADERS */ 597 + 598 +#else 599 #error "Platform not recognized" 6902 - compressionMode = QP_IMAGE_COMPRESSION_MODE_NONE; 6903 + compressionMode = QP_IMAGE_COMPRESSION_MODE_NONE; 600 6904 #endif 601 6905 - } 6906 + } 6907 6908 #if defined(QP_SUPPORT_PNG) 6909 - /* Try storing with PNG compression. */ 6910 - if (compressionMode == QP_IMAGE_COMPRESSION_MODE_PNG) 6911 - { 6912 - deBool compressOk = compressImagePNG(&compressedBuffer, imageFormat, width, height, stride, data); 6913 - if (compressOk) 6914 - { 6915 - writeDataPtr = compressedBuffer.data; 6916 - writeDataBytes = compressedBuffer.size; 6917 - } 6918 - else 6919 - { 6920 - /* Fall-back to default compression. */ 6921 - qpPrintf("WARNING: PNG compression failed -- storing image uncompressed.\n"); 6922 - compressionMode = QP_IMAGE_COMPRESSION_MODE_NONE; 6923 - } 6924 - } 6925 + /* Try storing with PNG compression. */ 6926 + if (compressionMode == QP_IMAGE_COMPRESSION_MODE_PNG) 6927 + { 6928 + deBool compressOk = compressImagePNG(&compressedBuffer, imageFormat, width, height, stride, data); 6929 + if (compressOk) 6930 + { 6931 + writeDataPtr = compressedBuffer.data; 6932 + writeDataBytes = compressedBuffer.size; 6933 + } 6934 + else 6935 + { 6936 + /* Fall-back to default compression. */ 6937 + qpPrintf("WARNING: PNG compression failed -- storing image uncompressed.\n"); 6938 + compressionMode = QP_IMAGE_COMPRESSION_MODE_NONE; 6939 + } 6940 + } 6941 #endif 6942 6943 - /* Handle image compression. */ 6944 - switch (compressionMode) 6945 - { 6946 - case QP_IMAGE_COMPRESSION_MODE_NONE: 6947 - { 6948 - int pixelSize = imageFormat == QP_IMAGE_FORMAT_RGB888 ? 3 : 4; 6949 - int packedStride = pixelSize*width; 6950 - 6951 - if (packedStride == stride) 6952 - writeDataPtr = data; 6953 - else 6954 - { 6955 - /* Need to re-pack pixels. */ 6956 - if (Buffer_resize(&compressedBuffer, (size_t)(packedStride*height))) 6957 - { 6958 - int row; 6959 - for (row = 0; row < height; row++) 6960 - memcpy(&compressedBuffer.data[packedStride*row], &((const deUint8*)data)[row*stride], (size_t)(pixelSize*width)); 6961 - } 6962 - else 6963 - { 6964 - qpPrintf("ERROR: Failed to pack pixels for writing.\n"); 6965 - Buffer_deinit(&compressedBuffer); 6966 - return DE_FALSE; 6967 - } 6968 - } 6969 - 6970 - writeDataBytes = (size_t)(packedStride*height); 6971 - break; 6972 - } 6973 + /* Handle image compression. */ 6974 + switch (compressionMode) 6975 + { 6976 + case QP_IMAGE_COMPRESSION_MODE_NONE: 6977 + { 6978 + int pixelSize = imageFormat == QP_IMAGE_FORMAT_RGB888 ? 3 : 4; 6979 + int packedStride = pixelSize*width; 6980 + 6981 + if (packedStride == stride) 6982 + writeDataPtr = data; 6983 + else 6984 + { 6985 + /* Need to re-pack pixels. */ 6986 + if (Buffer_resize(&compressedBuffer, (size_t)(packedStride*height))) 6987 + { 6988 + int row; 6989 + for (row = 0; row < height; row++) 6990 + memcpy(&compressedBuffer.data[packedStride*row], &((const deUint8*)data)[row*stride], (size_t)(pixelSize*width)); 6991 + } 6992 + else 6993 + { 6994 + qpPrintf("ERROR: Failed to pack pixels for writing.\n"); 6995 + Buffer_deinit(&compressedBuffer); 6996 + return DE_FALSE; 6997 + } 6998 + } 6999 + 7000 + writeDataBytes = (size_t)(packedStride*height); 7001 + break; 7002 + } 7003 7004 #if defined(QP_SUPPORT_PNG) 7005 - case QP_IMAGE_COMPRESSION_MODE_PNG: 7006 - DE_ASSERT(writeDataPtr); /* Already handled. */ 7007 - break; 7008 + case QP_IMAGE_COMPRESSION_MODE_PNG: 7009 + DE_ASSERT(writeDataPtr); /* Already handled. */ 7010 + break; 7011 #endif 7012 7013 - default: 7014 - qpPrintf("qpTestLog_writeImage(): Unknown compression mode: %s\n", QP_LOOKUP_STRING(s_qpImageCompressionModeMap, compressionMode)); 7015 - Buffer_deinit(&compressedBuffer); 7016 - return DE_FALSE; 7017 - } 7018 - 7019 - /* Fill in attributes. */ 7020 - int32ToString(width, widthStr); 7021 - int32ToString(height, heightStr); 7022 - attribs[numAttribs++] = qpSetStringAttrib("Name", name); 7023 - attribs[numAttribs++] = qpSetStringAttrib("Width", widthStr); 7024 - attribs[numAttribs++] = qpSetStringAttrib("Height", heightStr); 7025 - attribs[numAttribs++] = qpSetStringAttrib("Format", QP_LOOKUP_STRING(s_qpImageFormatMap, imageFormat)); 7026 - attribs[numAttribs++] = qpSetStringAttrib("CompressionMode", QP_LOOKUP_STRING(s_qpImageCompressionModeMap, compressionMode)); 7027 - if (description) attribs[numAttribs++] = qpSetStringAttrib("Description", description); 7028 - 7029 - /* \note Log lock is acquired after compression! */ 7030 - deMutex_lock(log->lock); 7031 - 7032 - /* <Image ID="result" Name="Foobar" Width="640" Height="480" Format="RGB888" CompressionMode="None">base64 data</Image> */ 7033 - if (!qpXmlWriter_startElement(log->writer, "Image", numAttribs, attribs) || 7034 - !qpXmlWriter_writeBase64(log->writer, (const deUint8*)writeDataPtr, writeDataBytes) || 7035 - !qpXmlWriter_endElement(log->writer, "Image")) 7036 - { 7037 - qpPrintf("qpTestLog_writeImage(): Writing XML failed\n"); 7038 - deMutex_unlock(log->lock); 7039 - Buffer_deinit(&compressedBuffer); 7040 - return DE_FALSE; 7041 - } 7042 - 7043 - deMutex_unlock(log->lock); 7044 - 7045 - /* Free compressed data if allocated. */ 7046 - Buffer_deinit(&compressedBuffer); 7047 - 7048 - return DE_TRUE; 7049 + default: 7050 + qpPrintf("qpTestLog_writeImage(): Unknown compression mode: %s\n", QP_LOOKUP_STRING(s_qpImageCompressionModeMap, compressionMode)); 7051 + Buffer_deinit(&compressedBuffer); 7052 + return DE_FALSE; 7053 + } 7054 + 7055 + /* Fill in attributes. */ 7056 + int32ToString(width, widthStr); 7057 + int32ToString(height, heightStr); 7058 + attribs[numAttribs++] = qpSetStringAttrib("Name", name); 7059 + attribs[numAttribs++] = qpSetStringAttrib("Width", widthStr); 7060 + attribs[numAttribs++] = qpSetStringAttrib("Height", heightStr); 7061 + attribs[numAttribs++] = qpSetStringAttrib("Format", QP_LOOKUP_STRING(s_qpImageFormatMap, imageFormat)); 7062 + attribs[numAttribs++] = qpSetStringAttrib("CompressionMode", QP_LOOKUP_STRING(s_qpImageCompressionModeMap, compressionMode)); 7063 + if (description) attribs[numAttribs++] = qpSetStringAttrib("Description", description); 7064 + 7065 + /* \note Log lock is acquired after compression! */ 7066 + deMutex_lock(log->lock); 7067 + 7068 + /* <Image ID="result" Name="Foobar" Width="640" Height="480" Format="RGB888" CompressionMode="None">base64 data</Image> */ 7069 + if (!qpXmlWriter_startElement(log->writer, "Image", numAttribs, attribs) || 7070 + !qpXmlWriter_writeBase64(log->writer, (const deUint8*)writeDataPtr, writeDataBytes) || 7071 + !qpXmlWriter_endElement(log->writer, "Image")) 7072 + { 7073 + qpPrintf("qpTestLog_writeImage(): Writing XML failed\n"); 7074 + deMutex_unlock(log->lock); 7075 + Buffer_deinit(&compressedBuffer); 7076 + return DE_FALSE; 7077 + } 7078 + 7079 + deMutex_unlock(log->lock); 7080 + 7081 + /* Free compressed data if allocated. */ 7082 + Buffer_deinit(&compressedBuffer); 7083 + 7084 + return DE_TRUE; 7085 } 7086 7087 /*--------------------------------------------------------------------*//*! 7088 * \brief Write a OpenGL ES shader program into the log. 7089 - * \param linkOk Shader program link result, false on failure 7090 - * \param linkInfoLog Implementation provided linkage log 7091 + * \param linkOk Shader program link result, false on failure 7092 + * \param linkInfoLog Implementation provided linkage log 7093 *//*--------------------------------------------------------------------*/ 7094 deBool qpTestLog_startShaderProgram (qpTestLog* log, deBool linkOk, const char* linkInfoLog) 7095 { 7096 - qpXmlAttribute programAttribs[4]; 7097 - int numProgramAttribs = 0; 7098 + qpXmlAttribute programAttribs[4]; 7099 + int numProgramAttribs = 0; 7100 7101 - DE_ASSERT(log); 7102 - deMutex_lock(log->lock); 7103 + DE_ASSERT(log); 7104 + deMutex_lock(log->lock); 7105 7106 - programAttribs[numProgramAttribs++] = qpSetStringAttrib("LinkStatus", linkOk ? "OK" : "Fail"); 7107 + programAttribs[numProgramAttribs++] = qpSetStringAttrib("LinkStatus", linkOk ? "OK" : "Fail"); 7108 7109 - if (!qpXmlWriter_startElement(log->writer, "ShaderProgram", numProgramAttribs, programAttribs) || 7110 - !qpXmlWriter_writeStringElement(log->writer, "InfoLog", linkInfoLog)) 7111 - { 7112 - qpPrintf("qpTestLog_startShaderProgram(): Writing XML failed\n"); 7113 - deMutex_unlock(log->lock); 7114 - return DE_FALSE; 7115 - } 7116 + if (!qpXmlWriter_startElement(log->writer, "ShaderProgram", numProgramAttribs, programAttribs) || 7117 + !qpXmlWriter_writeStringElement(log->writer, "InfoLog", linkInfoLog)) 7118 + { 7119 + qpPrintf("qpTestLog_startShaderProgram(): Writing XML failed\n"); 7120 + deMutex_unlock(log->lock); 7121 + return DE_FALSE; 7122 + } 7123 7124 - DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SHADERPROGRAM)); 7125 + DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SHADERPROGRAM)); 7126 7127 - deMutex_unlock(log->lock); 7128 - return DE_TRUE; 7129 + deMutex_unlock(log->lock); 7130 + return DE_TRUE; 7131 } 7132 7133 /*--------------------------------------------------------------------*//*! 7134 * \brief End shader program 7135 - * \param log qpTestLog instance 7136 + * \param log qpTestLog instance 7137 * \return true if ok, false otherwise 7138 *//*--------------------------------------------------------------------*/ 7139 deBool qpTestLog_endShaderProgram (qpTestLog* log) 7140 { 7141 - DE_ASSERT(log); 7142 - deMutex_lock(log->lock); 7143 + DE_ASSERT(log); 7144 + deMutex_lock(log->lock); 7145 7146 - /* </ShaderProgram> */ 7147 - if (!qpXmlWriter_endElement(log->writer, "ShaderProgram")) 7148 - { 7149 - qpPrintf("qpTestLog_endShaderProgram(): Writing XML failed\n"); 7150 - deMutex_unlock(log->lock); 7151 - return DE_FALSE; 7152 - } 7153 + /* </ShaderProgram> */ 7154 + if (!qpXmlWriter_endElement(log->writer, "ShaderProgram")) 7155 + { 7156 + qpPrintf("qpTestLog_endShaderProgram(): Writing XML failed\n"); 7157 + deMutex_unlock(log->lock); 7158 + return DE_FALSE; 7159 + } 7160 7161 - DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SHADERPROGRAM); 7162 + DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SHADERPROGRAM); 7163 7164 - deMutex_unlock(log->lock); 7165 - return DE_TRUE; 7166 + deMutex_unlock(log->lock); 7167 + return DE_TRUE; 7168 } 7169 7170 /*--------------------------------------------------------------------*//*! 7171 * \brief Write a OpenGL ES shader into the log. 7172 - * \param type Shader type 7173 - * \param source Shader source 7174 - * \param compileOk Shader compilation result, false on failure 7175 - * \param infoLog Implementation provided shader compilation log 7176 + * \param type Shader type 7177 + * \param source Shader source 7178 + * \param compileOk Shader compilation result, false on failure 7179 + * \param infoLog Implementation provided shader compilation log 7180 *//*--------------------------------------------------------------------*/ 7181 deBool qpTestLog_writeShader (qpTestLog* log, qpShaderType type, const char* source, deBool compileOk, const char* infoLog) 7182 { 7183 - const char* tagName = QP_LOOKUP_STRING(s_qpShaderTypeMap, type); 7184 - const char* sourceStr = ((log->flags & QP_TEST_LOG_EXCLUDE_SHADER_SOURCES) == 0 || !compileOk) ? source : ""; 7185 - int numShaderAttribs = 0; 7186 - qpXmlAttribute shaderAttribs[4]; 7187 + const char* tagName = QP_LOOKUP_STRING(s_qpShaderTypeMap, type); 7188 + const char* sourceStr = ((log->flags & QP_TEST_LOG_EXCLUDE_SHADER_SOURCES) == 0 || !compileOk) ? source : ""; 7189 + int numShaderAttribs = 0; 7190 + qpXmlAttribute shaderAttribs[4]; 7191 7192 - deMutex_lock(log->lock); 7193 + deMutex_lock(log->lock); 7194 7195 - DE_ASSERT(source); 7196 - DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SHADERPROGRAM); 7197 + DE_ASSERT(source); 7198 + DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SHADERPROGRAM); 7199 7200 - shaderAttribs[numShaderAttribs++] = qpSetStringAttrib("CompileStatus", compileOk ? "OK" : "Fail"); 7201 + shaderAttribs[numShaderAttribs++] = qpSetStringAttrib("CompileStatus", compileOk ? "OK" : "Fail"); 7202 7203 - if (!qpXmlWriter_startElement(log->writer, tagName, numShaderAttribs, shaderAttribs) || 7204 - !qpXmlWriter_writeStringElement(log->writer, "ShaderSource", sourceStr) || 7205 - !qpXmlWriter_writeStringElement(log->writer, "InfoLog", infoLog) || 7206 - !qpXmlWriter_endElement(log->writer, tagName)) 7207 - { 7208 - qpPrintf("qpTestLog_writeShader(): Writing XML failed\n"); 7209 - deMutex_unlock(log->lock); 7210 - return DE_FALSE; 7211 - } 7212 + if (!qpXmlWriter_startElement(log->writer, tagName, numShaderAttribs, shaderAttribs) || 7213 + !qpXmlWriter_writeStringElement(log->writer, "ShaderSource", sourceStr) || 7214 + !qpXmlWriter_writeStringElement(log->writer, "InfoLog", infoLog) || 7215 + !qpXmlWriter_endElement(log->writer, tagName)) 7216 + { 7217 + qpPrintf("qpTestLog_writeShader(): Writing XML failed\n"); 7218 + deMutex_unlock(log->lock); 7219 + return DE_FALSE; 7220 + } 7221 7222 - deMutex_unlock(log->lock); 7223 - return DE_TRUE; 7224 + deMutex_unlock(log->lock); 7225 + return DE_TRUE; 7226 } 7227 7228 /*--------------------------------------------------------------------*//*! 7229 @@ -1053,28 +1053,28 @@ deBool qpTestLog_writeShader (qpTestLog* log, qpShaderType type, const char* sou 7230 *//*--------------------------------------------------------------------*/ 7231 deBool qpTestLog_startEglConfigSet (qpTestLog* log, const char* name, const char* description) 7232 { 7233 - qpXmlAttribute attribs[4]; 7234 - int numAttribs = 0; 7235 + qpXmlAttribute attribs[4]; 7236 + int numAttribs = 0; 7237 7238 - DE_ASSERT(log && name); 7239 - deMutex_lock(log->lock); 7240 + DE_ASSERT(log && name); 7241 + deMutex_lock(log->lock); 7242 7243 - attribs[numAttribs++] = qpSetStringAttrib("Name", name); 7244 - if (description) 7245 - attribs[numAttribs++] = qpSetStringAttrib("Description", description); 7246 + attribs[numAttribs++] = qpSetStringAttrib("Name", name); 7247 + if (description) 7248 + attribs[numAttribs++] = qpSetStringAttrib("Description", description); 7249 7250 - /* <EglConfigSet Name="<name>"> */ 7251 - if (!qpXmlWriter_startElement(log->writer, "EglConfigSet", numAttribs, attribs)) 7252 - { 7253 - qpPrintf("qpTestLog_startEglImageSet(): Writing XML failed\n"); 7254 - deMutex_unlock(log->lock); 7255 - return DE_FALSE; 7256 - } 7257 + /* <EglConfigSet Name="<name>"> */ 7258 + if (!qpXmlWriter_startElement(log->writer, "EglConfigSet", numAttribs, attribs)) 7259 + { 7260 + qpPrintf("qpTestLog_startEglImageSet(): Writing XML failed\n"); 7261 + deMutex_unlock(log->lock); 7262 + return DE_FALSE; 7263 + } 7264 7265 - DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_EGLCONFIGSET)); 7266 + DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_EGLCONFIGSET)); 7267 7268 - deMutex_unlock(log->lock); 7269 - return DE_TRUE; 7270 + deMutex_unlock(log->lock); 7271 + return DE_TRUE; 7272 } 7273 7274 /*--------------------------------------------------------------------*//*! 7275 @@ -1082,21 +1082,21 @@ deBool qpTestLog_startEglConfigSet (qpTestLog* log, const char* name, const char 7276 *//*--------------------------------------------------------------------*/ 7277 deBool qpTestLog_endEglConfigSet (qpTestLog* log) 7278 { 7279 - DE_ASSERT(log); 7280 - deMutex_lock(log->lock); 7281 + DE_ASSERT(log); 7282 + deMutex_lock(log->lock); 7283 7284 - /* <EglConfigSet Name="<name>"> */ 7285 - if (!qpXmlWriter_endElement(log->writer, "EglConfigSet")) 7286 - { 7287 - qpPrintf("qpTestLog_endEglImageSet(): Writing XML failed\n"); 7288 - deMutex_unlock(log->lock); 7289 - return DE_FALSE; 7290 - } 7291 + /* <EglConfigSet Name="<name>"> */ 7292 + if (!qpXmlWriter_endElement(log->writer, "EglConfigSet")) 7293 + { 7294 + qpPrintf("qpTestLog_endEglImageSet(): Writing XML failed\n"); 7295 + deMutex_unlock(log->lock); 7296 + return DE_FALSE; 7297 + } 7298 7299 - DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_EGLCONFIGSET); 7300 + DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_EGLCONFIGSET); 7301 7302 - deMutex_unlock(log->lock); 7303 - return DE_TRUE; 7304 + deMutex_unlock(log->lock); 7305 + return DE_TRUE; 7306 } 7307 7308 /*--------------------------------------------------------------------*//*! 7309 @@ -1105,111 +1105,111 @@ deBool qpTestLog_endEglConfigSet (qpTestLog* log) 7310 *//*--------------------------------------------------------------------*/ 7311 deBool qpTestLog_writeEglConfig (qpTestLog* log, const qpEglConfigInfo* config) 7312 { 7313 - qpXmlAttribute attribs[64]; 7314 - int numAttribs = 0; 7315 - 7316 - DE_ASSERT(log && config); 7317 - deMutex_lock(log->lock); 7318 - 7319 - attribs[numAttribs++] = qpSetIntAttrib ("BufferSize", config->bufferSize); 7320 - attribs[numAttribs++] = qpSetIntAttrib ("RedSize", config->redSize); 7321 - attribs[numAttribs++] = qpSetIntAttrib ("GreenSize", config->greenSize); 7322 - attribs[numAttribs++] = qpSetIntAttrib ("BlueSize", config->blueSize); 7323 - attribs[numAttribs++] = qpSetIntAttrib ("LuminanceSize", config->luminanceSize); 7324 - attribs[numAttribs++] = qpSetIntAttrib ("AlphaSize", config->alphaSize); 7325 - attribs[numAttribs++] = qpSetIntAttrib ("AlphaMaskSize", config->alphaMaskSize); 7326 - attribs[numAttribs++] = qpSetBoolAttrib ("BindToTextureRGB", config->bindToTextureRGB); 7327 - attribs[numAttribs++] = qpSetBoolAttrib ("BindToTextureRGBA", config->bindToTextureRGBA); 7328 - attribs[numAttribs++] = qpSetStringAttrib ("ColorBufferType", config->colorBufferType); 7329 - attribs[numAttribs++] = qpSetStringAttrib ("ConfigCaveat", config->configCaveat); 7330 - attribs[numAttribs++] = qpSetIntAttrib ("ConfigID", config->configID); 7331 - attribs[numAttribs++] = qpSetStringAttrib ("Conformant", config->conformant); 7332 - attribs[numAttribs++] = qpSetIntAttrib ("DepthSize", config->depthSize); 7333 - attribs[numAttribs++] = qpSetIntAttrib ("Level", config->level); 7334 - attribs[numAttribs++] = qpSetIntAttrib ("MaxPBufferWidth", config->maxPBufferWidth); 7335 - attribs[numAttribs++] = qpSetIntAttrib ("MaxPBufferHeight", config->maxPBufferHeight); 7336 - attribs[numAttribs++] = qpSetIntAttrib ("MaxPBufferPixels", config->maxPBufferPixels); 7337 - attribs[numAttribs++] = qpSetIntAttrib ("MaxSwapInterval", config->maxSwapInterval); 7338 - attribs[numAttribs++] = qpSetIntAttrib ("MinSwapInterval", config->minSwapInterval); 7339 - attribs[numAttribs++] = qpSetBoolAttrib ("NativeRenderable", config->nativeRenderable); 7340 - attribs[numAttribs++] = qpSetStringAttrib ("RenderableType", config->renderableType); 7341 - attribs[numAttribs++] = qpSetIntAttrib ("SampleBuffers", config->sampleBuffers); 7342 - attribs[numAttribs++] = qpSetIntAttrib ("Samples", config->samples); 7343 - attribs[numAttribs++] = qpSetIntAttrib ("StencilSize", config->stencilSize); 7344 - attribs[numAttribs++] = qpSetStringAttrib ("SurfaceTypes", config->surfaceTypes); 7345 - attribs[numAttribs++] = qpSetStringAttrib ("TransparentType", config->transparentType); 7346 - attribs[numAttribs++] = qpSetIntAttrib ("TransparentRedValue", config->transparentRedValue); 7347 - attribs[numAttribs++] = qpSetIntAttrib ("TransparentGreenValue", config->transparentGreenValue); 7348 - attribs[numAttribs++] = qpSetIntAttrib ("TransparentBlueValue", config->transparentBlueValue); 7349 - DE_ASSERT(numAttribs <= DE_LENGTH_OF_ARRAY(attribs)); 7350 - 7351 - if (!qpXmlWriter_startElement(log->writer, "EglConfig", numAttribs, attribs) || 7352 - !qpXmlWriter_endElement(log->writer, "EglConfig")) 7353 - { 7354 - qpPrintf("qpTestLog_writeEglConfig(): Writing XML failed\n"); 7355 - deMutex_unlock(log->lock); 7356 - return DE_FALSE; 7357 - } 7358 - 7359 - deMutex_unlock(log->lock); 7360 - return DE_TRUE; 7361 + qpXmlAttribute attribs[64]; 7362 + int numAttribs = 0; 7363 + 7364 + DE_ASSERT(log && config); 7365 + deMutex_lock(log->lock); 7366 + 7367 + attribs[numAttribs++] = qpSetIntAttrib ("BufferSize", config->bufferSize); 7368 + attribs[numAttribs++] = qpSetIntAttrib ("RedSize", config->redSize); 7369 + attribs[numAttribs++] = qpSetIntAttrib ("GreenSize", config->greenSize); 7370 + attribs[numAttribs++] = qpSetIntAttrib ("BlueSize", config->blueSize); 7371 + attribs[numAttribs++] = qpSetIntAttrib ("LuminanceSize", config->luminanceSize); 7372 + attribs[numAttribs++] = qpSetIntAttrib ("AlphaSize", config->alphaSize); 7373 + attribs[numAttribs++] = qpSetIntAttrib ("AlphaMaskSize", config->alphaMaskSize); 7374 + attribs[numAttribs++] = qpSetBoolAttrib ("BindToTextureRGB", config->bindToTextureRGB); 7375 + attribs[numAttribs++] = qpSetBoolAttrib ("BindToTextureRGBA", config->bindToTextureRGBA); 7376 + attribs[numAttribs++] = qpSetStringAttrib ("ColorBufferType", config->colorBufferType); 7377 + attribs[numAttribs++] = qpSetStringAttrib ("ConfigCaveat", config->configCaveat); 7378 + attribs[numAttribs++] = qpSetIntAttrib ("ConfigID", config->configID); 7379 + attribs[numAttribs++] = qpSetStringAttrib ("Conformant", config->conformant); 7380 + attribs[numAttribs++] = qpSetIntAttrib ("DepthSize", config->depthSize); 7381 + attribs[numAttribs++] = qpSetIntAttrib ("Level", config->level); 7382 + attribs[numAttribs++] = qpSetIntAttrib ("MaxPBufferWidth", config->maxPBufferWidth); 7383 + attribs[numAttribs++] = qpSetIntAttrib ("MaxPBufferHeight", config->maxPBufferHeight); 7384 + attribs[numAttribs++] = qpSetIntAttrib ("MaxPBufferPixels", config->maxPBufferPixels); 7385 + attribs[numAttribs++] = qpSetIntAttrib ("MaxSwapInterval", config->maxSwapInterval); 7386 + attribs[numAttribs++] = qpSetIntAttrib ("MinSwapInterval", config->minSwapInterval); 7387 + attribs[numAttribs++] = qpSetBoolAttrib ("NativeRenderable", config->nativeRenderable); 7388 + attribs[numAttribs++] = qpSetStringAttrib ("RenderableType", config->renderableType); 7389 + attribs[numAttribs++] = qpSetIntAttrib ("SampleBuffers", config->sampleBuffers); 7390 + attribs[numAttribs++] = qpSetIntAttrib ("Samples", config->samples); 7391 + attribs[numAttribs++] = qpSetIntAttrib ("StencilSize", config->stencilSize); 7392 + attribs[numAttribs++] = qpSetStringAttrib ("SurfaceTypes", config->surfaceTypes); 7393 + attribs[numAttribs++] = qpSetStringAttrib ("TransparentType", config->transparentType); 7394 + attribs[numAttribs++] = qpSetIntAttrib ("TransparentRedValue", config->transparentRedValue); 7395 + attribs[numAttribs++] = qpSetIntAttrib ("TransparentGreenValue", config->transparentGreenValue); 7396 + attribs[numAttribs++] = qpSetIntAttrib ("TransparentBlueValue", config->transparentBlueValue); 7397 + DE_ASSERT(numAttribs <= DE_LENGTH_OF_ARRAY(attribs)); 7398 + 7399 + if (!qpXmlWriter_startElement(log->writer, "EglConfig", numAttribs, attribs) || 7400 + !qpXmlWriter_endElement(log->writer, "EglConfig")) 7401 + { 7402 + qpPrintf("qpTestLog_writeEglConfig(): Writing XML failed\n"); 7403 + deMutex_unlock(log->lock); 7404 + return DE_FALSE; 7405 + } 7406 + 7407 + deMutex_unlock(log->lock); 7408 + return DE_TRUE; 7409 } 7410 7411 /*--------------------------------------------------------------------*//*! 7412 * \brief Start section in log. 7413 - * \param log qpTestLog instance 7414 - * \param name Section name 7415 - * \param description Human readable description 7416 + * \param log qpTestLog instance 7417 + * \param name Section name 7418 + * \param description Human readable description 7419 * \return true if ok, false otherwise 7420 *//*--------------------------------------------------------------------*/ 7421 deBool qpTestLog_startSection (qpTestLog* log, const char* name, const char* description) 7422 { 7423 - qpXmlAttribute attribs[2]; 7424 - int numAttribs = 0; 7425 + qpXmlAttribute attribs[2]; 7426 + int numAttribs = 0; 7427 7428 - DE_ASSERT(log && name); 7429 - deMutex_lock(log->lock); 7430 + DE_ASSERT(log && name); 7431 + deMutex_lock(log->lock); 7432 7433 - attribs[numAttribs++] = qpSetStringAttrib("Name", name); 7434 - if (description) 7435 - attribs[numAttribs++] = qpSetStringAttrib("Description", description); 7436 + attribs[numAttribs++] = qpSetStringAttrib("Name", name); 7437 + if (description) 7438 + attribs[numAttribs++] = qpSetStringAttrib("Description", description); 7439 7440 - /* <Section Name="<name>" Description="<description>"> */ 7441 - if (!qpXmlWriter_startElement(log->writer, "Section", numAttribs, attribs)) 7442 - { 7443 - qpPrintf("qpTestLog_startSection(): Writing XML failed\n"); 7444 - deMutex_unlock(log->lock); 7445 - return DE_FALSE; 7446 - } 7447 + /* <Section Name="<name>" Description="<description>"> */ 7448 + if (!qpXmlWriter_startElement(log->writer, "Section", numAttribs, attribs)) 7449 + { 7450 + qpPrintf("qpTestLog_startSection(): Writing XML failed\n"); 7451 + deMutex_unlock(log->lock); 7452 + return DE_FALSE; 7453 + } 7454 7455 - DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SECTION)); 7456 + DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SECTION)); 7457 7458 - deMutex_unlock(log->lock); 7459 - return DE_TRUE; 7460 + deMutex_unlock(log->lock); 7461 + return DE_TRUE; 7462 } 7463 7464 /*--------------------------------------------------------------------*//*! 7465 * \brief End section in log. 7466 - * \param log qpTestLog instance 7467 + * \param log qpTestLog instance 7468 * \return true if ok, false otherwise 7469 *//*--------------------------------------------------------------------*/ 7470 deBool qpTestLog_endSection (qpTestLog* log) 7471 { 7472 - DE_ASSERT(log); 7473 - deMutex_lock(log->lock); 7474 + DE_ASSERT(log); 7475 + deMutex_lock(log->lock); 7476 7477 - /* </Section> */ 7478 - if (!qpXmlWriter_endElement(log->writer, "Section")) 7479 - { 7480 - qpPrintf("qpTestLog_endSection(): Writing XML failed\n"); 7481 - deMutex_unlock(log->lock); 7482 - return DE_FALSE; 7483 - } 7484 + /* </Section> */ 7485 + if (!qpXmlWriter_endElement(log->writer, "Section")) 7486 + { 7487 + qpPrintf("qpTestLog_endSection(): Writing XML failed\n"); 7488 + deMutex_unlock(log->lock); 7489 + return DE_FALSE; 7490 + } 7491 7492 - DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SECTION); 7493 + DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SECTION); 7494 7495 - deMutex_unlock(log->lock); 7496 - return DE_TRUE; 7497 + deMutex_unlock(log->lock); 7498 + return DE_TRUE; 7499 } 7500 7501 /*--------------------------------------------------------------------*//*! 7502 @@ -1217,20 +1217,20 @@ deBool qpTestLog_endSection (qpTestLog* log) 7503 *//*--------------------------------------------------------------------*/ 7504 deBool qpTestLog_writeKernelSource (qpTestLog* log, const char* source) 7505 { 7506 - const char* sourceStr = (log->flags & QP_TEST_LOG_EXCLUDE_SHADER_SOURCES) != 0 ? "" : source; 7507 + const char* sourceStr = (log->flags & QP_TEST_LOG_EXCLUDE_SHADER_SOURCES) != 0 ? "" : source; 7508 7509 - DE_ASSERT(log); 7510 - deMutex_lock(log->lock); 7511 + DE_ASSERT(log); 7512 + deMutex_lock(log->lock); 7513 7514 - if (!qpXmlWriter_writeStringElement(log->writer, "KernelSource", sourceStr)) 7515 - { 7516 - qpPrintf("qpTestLog_writeKernelSource(): Writing XML failed\n"); 7517 - deMutex_unlock(log->lock); 7518 - return DE_FALSE; 7519 - } 7520 + if (!qpXmlWriter_writeStringElement(log->writer, "KernelSource", sourceStr)) 7521 + { 7522 + qpPrintf("qpTestLog_writeKernelSource(): Writing XML failed\n"); 7523 + deMutex_unlock(log->lock); 7524 + return DE_FALSE; 7525 + } 7526 7527 - deMutex_unlock(log->lock); 7528 - return DE_TRUE; 7529 + deMutex_unlock(log->lock); 7530 + return DE_TRUE; 7531 } 7532 7533 /*--------------------------------------------------------------------*//*! 7534 @@ -1238,21 +1238,21 @@ deBool qpTestLog_writeKernelSource (qpTestLog* log, const char* source) 7535 *//*--------------------------------------------------------------------*/ 7536 deBool qpTestLog_writeSpirVAssemblySource (qpTestLog* log, const char* source) 7537 { 7538 - const char* const sourceStr = (log->flags & QP_TEST_LOG_EXCLUDE_SHADER_SOURCES) != 0 ? "" : source; 7539 + const char* const sourceStr = (log->flags & QP_TEST_LOG_EXCLUDE_SHADER_SOURCES) != 0 ? "" : source; 7540 7541 - deMutex_lock(log->lock); 7542 + deMutex_lock(log->lock); 7543 7544 - DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SHADERPROGRAM); 7545 + DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SHADERPROGRAM); 7546 7547 - if (!qpXmlWriter_writeStringElement(log->writer, "SpirVAssemblySource", sourceStr)) 7548 - { 7549 - qpPrintf("qpTestLog_writeSpirVAssemblySource(): Writing XML failed\n"); 7550 - deMutex_unlock(log->lock); 7551 - return DE_FALSE; 7552 - } 7553 + if (!qpXmlWriter_writeStringElement(log->writer, "SpirVAssemblySource", sourceStr)) 7554 + { 7555 + qpPrintf("qpTestLog_writeSpirVAssemblySource(): Writing XML failed\n"); 7556 + deMutex_unlock(log->lock); 7557 + return DE_FALSE; 7558 + } 7559 7560 - deMutex_unlock(log->lock); 7561 - return DE_TRUE; 7562 + deMutex_unlock(log->lock); 7563 + return DE_TRUE; 7564 } 7565 7566 /*--------------------------------------------------------------------*//*! 7567 @@ -1260,222 +1260,222 @@ deBool qpTestLog_writeSpirVAssemblySource (qpTestLog* log, const char* source) 7568 *//*--------------------------------------------------------------------*/ 7569 deBool qpTestLog_writeCompileInfo (qpTestLog* log, const char* name, const char* description, deBool compileOk, const char* infoLog) 7570 { 7571 - int numAttribs = 0; 7572 - qpXmlAttribute attribs[3]; 7573 + int numAttribs = 0; 7574 + qpXmlAttribute attribs[3]; 7575 7576 - DE_ASSERT(log && name && description && infoLog); 7577 - deMutex_lock(log->lock); 7578 + DE_ASSERT(log && name && description && infoLog); 7579 + deMutex_lock(log->lock); 7580 7581 - attribs[numAttribs++] = qpSetStringAttrib("Name", name); 7582 - attribs[numAttribs++] = qpSetStringAttrib("Description", description); 7583 - attribs[numAttribs++] = qpSetStringAttrib("CompileStatus", compileOk ? "OK" : "Fail"); 7584 + attribs[numAttribs++] = qpSetStringAttrib("Name", name); 7585 + attribs[numAttribs++] = qpSetStringAttrib("Description", description); 7586 + attribs[numAttribs++] = qpSetStringAttrib("CompileStatus", compileOk ? "OK" : "Fail"); 7587 7588 - if (!qpXmlWriter_startElement(log->writer, "CompileInfo", numAttribs, attribs) || 7589 - !qpXmlWriter_writeStringElement(log->writer, "InfoLog", infoLog) || 7590 - !qpXmlWriter_endElement(log->writer, "CompileInfo")) 7591 - { 7592 - qpPrintf("qpTestLog_writeCompileInfo(): Writing XML failed\n"); 7593 - deMutex_unlock(log->lock); 7594 - return DE_FALSE; 7595 - } 7596 + if (!qpXmlWriter_startElement(log->writer, "CompileInfo", numAttribs, attribs) || 7597 + !qpXmlWriter_writeStringElement(log->writer, "InfoLog", infoLog) || 7598 + !qpXmlWriter_endElement(log->writer, "CompileInfo")) 7599 + { 7600 + qpPrintf("qpTestLog_writeCompileInfo(): Writing XML failed\n"); 7601 + deMutex_unlock(log->lock); 7602 + return DE_FALSE; 7603 + } 7604 7605 - deMutex_unlock(log->lock); 7606 - return DE_TRUE; 7607 + deMutex_unlock(log->lock); 7608 + return DE_TRUE; 7609 } 7610 7611 deBool qpTestLog_startSampleList (qpTestLog* log, const char* name, const char* description) 7612 { 7613 - int numAttribs = 0; 7614 - qpXmlAttribute attribs[2]; 7615 + int numAttribs = 0; 7616 + qpXmlAttribute attribs[2]; 7617 7618 - DE_ASSERT(log && name && description); 7619 - deMutex_lock(log->lock); 7620 + DE_ASSERT(log && name && description); 7621 + deMutex_lock(log->lock); 7622 7623 - attribs[numAttribs++] = qpSetStringAttrib("Name", name); 7624 - attribs[numAttribs++] = qpSetStringAttrib("Description", description); 7625 + attribs[numAttribs++] = qpSetStringAttrib("Name", name); 7626 + attribs[numAttribs++] = qpSetStringAttrib("Description", description); 7627 7628 - if (!qpXmlWriter_startElement(log->writer, "SampleList", numAttribs, attribs)) 7629 - { 7630 - qpPrintf("qpTestLog_startSampleList(): Writing XML failed\n"); 7631 - deMutex_unlock(log->lock); 7632 - return DE_FALSE; 7633 - } 7634 + if (!qpXmlWriter_startElement(log->writer, "SampleList", numAttribs, attribs)) 7635 + { 7636 + qpPrintf("qpTestLog_startSampleList(): Writing XML failed\n"); 7637 + deMutex_unlock(log->lock); 7638 + return DE_FALSE; 7639 + } 7640 7641 - DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SAMPLELIST)); 7642 + DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SAMPLELIST)); 7643 7644 - deMutex_unlock(log->lock); 7645 - return DE_TRUE; 7646 + deMutex_unlock(log->lock); 7647 + return DE_TRUE; 7648 } 7649 7650 deBool qpTestLog_startSampleInfo (qpTestLog* log) 7651 { 7652 - DE_ASSERT(log); 7653 - deMutex_lock(log->lock); 7654 + DE_ASSERT(log); 7655 + deMutex_lock(log->lock); 7656 7657 - if (!qpXmlWriter_startElement(log->writer, "SampleInfo", 0, DE_NULL)) 7658 - { 7659 - qpPrintf("qpTestLog_startSampleInfo(): Writing XML failed\n"); 7660 - deMutex_unlock(log->lock); 7661 - return DE_FALSE; 7662 - } 7663 + if (!qpXmlWriter_startElement(log->writer, "SampleInfo", 0, DE_NULL)) 7664 + { 7665 + qpPrintf("qpTestLog_startSampleInfo(): Writing XML failed\n"); 7666 + deMutex_unlock(log->lock); 7667 + return DE_FALSE; 7668 + } 7669 7670 - DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SAMPLEINFO)); 7671 + DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SAMPLEINFO)); 7672 7673 - deMutex_unlock(log->lock); 7674 - return DE_TRUE; 7675 + deMutex_unlock(log->lock); 7676 + return DE_TRUE; 7677 } 7678 7679 deBool qpTestLog_writeValueInfo (qpTestLog* log, const char* name, const char* description, const char* unit, qpSampleValueTag tag) 7680 { 7681 - const char* tagName = QP_LOOKUP_STRING(s_qpSampleValueTagMap, tag); 7682 - int numAttribs = 0; 7683 - qpXmlAttribute attribs[4]; 7684 + const char* tagName = QP_LOOKUP_STRING(s_qpSampleValueTagMap, tag); 7685 + int numAttribs = 0; 7686 + qpXmlAttribute attribs[4]; 7687 7688 - DE_ASSERT(log && name && description && tagName); 7689 - deMutex_lock(log->lock); 7690 + DE_ASSERT(log && name && description && tagName); 7691 + deMutex_lock(log->lock); 7692 7693 - DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLEINFO); 7694 + DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLEINFO); 7695 7696 - attribs[numAttribs++] = qpSetStringAttrib("Name", name); 7697 - attribs[numAttribs++] = qpSetStringAttrib("Description", description); 7698 - attribs[numAttribs++] = qpSetStringAttrib("Tag", tagName); 7699 + attribs[numAttribs++] = qpSetStringAttrib("Name", name); 7700 + attribs[numAttribs++] = qpSetStringAttrib("Description", description); 7701 + attribs[numAttribs++] = qpSetStringAttrib("Tag", tagName); 7702 7703 - if (unit) 7704 - attribs[numAttribs++] = qpSetStringAttrib("Unit", unit); 7705 + if (unit) 7706 + attribs[numAttribs++] = qpSetStringAttrib("Unit", unit); 7707 7708 - if (!qpXmlWriter_startElement(log->writer, "ValueInfo", numAttribs, attribs) || 7709 - !qpXmlWriter_endElement(log->writer, "ValueInfo")) 7710 - { 7711 - qpPrintf("qpTestLog_writeValueInfo(): Writing XML failed\n"); 7712 - deMutex_unlock(log->lock); 7713 - return DE_FALSE; 7714 - } 7715 + if (!qpXmlWriter_startElement(log->writer, "ValueInfo", numAttribs, attribs) || 7716 + !qpXmlWriter_endElement(log->writer, "ValueInfo")) 7717 + { 7718 + qpPrintf("qpTestLog_writeValueInfo(): Writing XML failed\n"); 7719 + deMutex_unlock(log->lock); 7720 + return DE_FALSE; 7721 + } 7722 7723 - deMutex_unlock(log->lock); 7724 - return DE_TRUE; 7725 + deMutex_unlock(log->lock); 7726 + return DE_TRUE; 7727 } 7728 7729 deBool qpTestLog_endSampleInfo (qpTestLog* log) 7730 { 7731 - DE_ASSERT(log); 7732 - deMutex_lock(log->lock); 7733 + DE_ASSERT(log); 7734 + deMutex_lock(log->lock); 7735 7736 - if (!qpXmlWriter_endElement(log->writer, "SampleInfo")) 7737 - { 7738 - qpPrintf("qpTestLog_endSampleInfo(): Writing XML failed\n"); 7739 - deMutex_unlock(log->lock); 7740 - return DE_FALSE; 7741 - } 7742 + if (!qpXmlWriter_endElement(log->writer, "SampleInfo")) 7743 + { 7744 + qpPrintf("qpTestLog_endSampleInfo(): Writing XML failed\n"); 7745 + deMutex_unlock(log->lock); 7746 + return DE_FALSE; 7747 + } 7748 7749 - DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SAMPLEINFO); 7750 + DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SAMPLEINFO); 7751 7752 - deMutex_unlock(log->lock); 7753 - return DE_TRUE; 7754 + deMutex_unlock(log->lock); 7755 + return DE_TRUE; 7756 } 7757 7758 deBool qpTestLog_startSample (qpTestLog* log) 7759 { 7760 - DE_ASSERT(log); 7761 - deMutex_lock(log->lock); 7762 + DE_ASSERT(log); 7763 + deMutex_lock(log->lock); 7764 7765 - DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLELIST); 7766 + DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLELIST); 7767 7768 - if (!qpXmlWriter_startElement(log->writer, "Sample", 0, DE_NULL)) 7769 - { 7770 - qpPrintf("qpTestLog_startSample(): Writing XML failed\n"); 7771 - deMutex_unlock(log->lock); 7772 - return DE_FALSE; 7773 - } 7774 + if (!qpXmlWriter_startElement(log->writer, "Sample", 0, DE_NULL)) 7775 + { 7776 + qpPrintf("qpTestLog_startSample(): Writing XML failed\n"); 7777 + deMutex_unlock(log->lock); 7778 + return DE_FALSE; 7779 + } 7780 7781 - DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SAMPLE)); 7782 + DE_ASSERT(ContainerStack_push(&log->containerStack, CONTAINERTYPE_SAMPLE)); 7783 7784 - deMutex_unlock(log->lock); 7785 - return DE_TRUE; 7786 + deMutex_unlock(log->lock); 7787 + return DE_TRUE; 7788 } 7789 7790 deBool qpTestLog_writeValueFloat (qpTestLog* log, double value) 7791 { 7792 - char tmpString[512]; 7793 - doubleToString(value, tmpString, (int)sizeof(tmpString)); 7794 + char tmpString[512]; 7795 + doubleToString(value, tmpString, (int)sizeof(tmpString)); 7796 7797 - deMutex_lock(log->lock); 7798 + deMutex_lock(log->lock); 7799 7800 - DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLE); 7801 + DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLE); 7802 7803 - if (!qpXmlWriter_writeStringElement(log->writer, "Value", &tmpString[0])) 7804 - { 7805 - qpPrintf("qpTestLog_writeSampleValue(): Writing XML failed\n"); 7806 - deMutex_unlock(log->lock); 7807 - return DE_FALSE; 7808 - } 7809 + if (!qpXmlWriter_writeStringElement(log->writer, "Value", &tmpString[0])) 7810 + { 7811 + qpPrintf("qpTestLog_writeSampleValue(): Writing XML failed\n"); 7812 + deMutex_unlock(log->lock); 7813 + return DE_FALSE; 7814 + } 7815 7816 - deMutex_unlock(log->lock); 7817 - return DE_TRUE; 7818 + deMutex_unlock(log->lock); 7819 + return DE_TRUE; 7820 } 7821 7822 deBool qpTestLog_writeValueInteger (qpTestLog* log, deInt64 value) 7823 { 7824 - char tmpString[64]; 7825 - int64ToString(value, tmpString); 7826 + char tmpString[64]; 7827 + int64ToString(value, tmpString); 7828 7829 - deMutex_lock(log->lock); 7830 + deMutex_lock(log->lock); 7831 7832 - DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLE); 7833 + DE_ASSERT(ContainerStack_getTop(&log->containerStack) == CONTAINERTYPE_SAMPLE); 7834 7835 - if (!qpXmlWriter_writeStringElement(log->writer, "Value", &tmpString[0])) 7836 - { 7837 - qpPrintf("qpTestLog_writeSampleValue(): Writing XML failed\n"); 7838 - deMutex_unlock(log->lock); 7839 - return DE_FALSE; 7840 - } 7841 + if (!qpXmlWriter_writeStringElement(log->writer, "Value", &tmpString[0])) 7842 + { 7843 + qpPrintf("qpTestLog_writeSampleValue(): Writing XML failed\n"); 7844 + deMutex_unlock(log->lock); 7845 + return DE_FALSE; 7846 + } 7847 7848 - deMutex_unlock(log->lock); 7849 - return DE_TRUE; 7850 + deMutex_unlock(log->lock); 7851 + return DE_TRUE; 7852 } 7853 7854 deBool qpTestLog_endSample (qpTestLog* log) 7855 { 7856 - DE_ASSERT(log); 7857 - deMutex_lock(log->lock); 7858 + DE_ASSERT(log); 7859 + deMutex_lock(log->lock); 7860 7861 - if (!qpXmlWriter_endElement(log->writer, "Sample")) 7862 - { 7863 - qpPrintf("qpTestLog_endSample(): Writing XML failed\n"); 7864 - deMutex_unlock(log->lock); 7865 - return DE_FALSE; 7866 - } 7867 + if (!qpXmlWriter_endElement(log->writer, "Sample")) 7868 + { 7869 + qpPrintf("qpTestLog_endSample(): Writing XML failed\n"); 7870 + deMutex_unlock(log->lock); 7871 + return DE_FALSE; 7872 + } 7873 7874 - DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SAMPLE); 7875 + DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SAMPLE); 7876 7877 - deMutex_unlock(log->lock); 7878 - return DE_TRUE; 7879 + deMutex_unlock(log->lock); 7880 + return DE_TRUE; 7881 } 7882 7883 deBool qpTestLog_endSampleList (qpTestLog* log) 7884 { 7885 - DE_ASSERT(log); 7886 - deMutex_lock(log->lock); 7887 + DE_ASSERT(log); 7888 + deMutex_lock(log->lock); 7889 7890 - if (!qpXmlWriter_endElement(log->writer, "SampleList")) 7891 - { 7892 - qpPrintf("qpTestLog_endSampleList(): Writing XML failed\n"); 7893 - deMutex_unlock(log->lock); 7894 - return DE_FALSE; 7895 - } 7896 + if (!qpXmlWriter_endElement(log->writer, "SampleList")) 7897 + { 7898 + qpPrintf("qpTestLog_endSampleList(): Writing XML failed\n"); 7899 + deMutex_unlock(log->lock); 7900 + return DE_FALSE; 7901 + } 7902 7903 - DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SAMPLELIST); 7904 + DE_ASSERT(ContainerStack_pop(&log->containerStack) == CONTAINERTYPE_SAMPLELIST); 7905 7906 - deMutex_unlock(log->lock); 7907 - return DE_TRUE; 7908 + deMutex_unlock(log->lock); 7909 + return DE_TRUE; 7910 } 7911 7912 deUint32 qpTestLog_getLogFlags (const qpTestLog* log) 7913 { 7914 - DE_ASSERT(log); 7915 - return log->flags; 7916 + DE_ASSERT(log); 7917 + return log->flags; 7918 } 7919 7920 const char* qpGetTestResultName (qpTestResult result) 7921 { 7922 - return QP_LOOKUP_STRING(s_qpTestResultMap, result); 7923 + return QP_LOOKUP_STRING(s_qpTestResultMap, result); 7924 } 7925 diff --git a/src/tests/perf_tests/MultiviewPerf.cpp b/src/tests/perf_tests/MultiviewPerf.cpp 7926 index 8c106b493..c3d99d23d 100644 7927 --- a/src/tests/perf_tests/MultiviewPerf.cpp 7928 +++ b/src/tests/perf_tests/MultiviewPerf.cpp 7929 @@ -273,7 +273,7 @@ void MultiviewCPUBoundBenchmark::initializeBenchmark() 7930 "{\n" 7931 " vec4 v = vPosition;\n" 7932 " v.xy += uOffset;\n" 7933 - " gl_Position = v;\n" 7934 + " gl_Position = v;\n" 7935 "}\n"; 7936 7937 const std::string &fs = 7938 @@ -371,7 +371,7 @@ void MultiviewGPUBoundBenchmark::initializeBenchmark() 7939 " frag_Col3 = vert_Col3;\n" 7940 " frag_Col4 = vert_Col4;\n" 7941 " frag_Col5 = vert_Col5;\n" 7942 - " gl_Position = vPosition;\n" 7943 + " gl_Position = vPosition;\n" 7944 "}\n"; 7945 7946 const std::string &fs = 7947 diff --git a/src/tests/third_party/rapidjson/include/rapidjson/prettywriter.h b/src/tests/third_party/rapidjson/include/rapidjson/prettywriter.h 7948 index ce2dac5a1..1d7c70f02 100644 7949 --- a/src/tests/third_party/rapidjson/include/rapidjson/prettywriter.h 7950 +++ b/src/tests/third_party/rapidjson/include/rapidjson/prettywriter.h 7951 @@ -89,7 +89,7 @@ public: 7952 } 7953 7954 bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } 7955 - 7956 + 7957 bool EndObject(SizeType memberCount = 0) { 7958 (void)memberCount; 7959 RAPIDJSON_ASSERT(Base::level_stack_.GetSize() >= sizeof(typename Base::Level)); 7960 diff --git a/src/tests/third_party/rapidjson/include/rapidjson/reader.h b/src/tests/third_party/rapidjson/include/rapidjson/reader.h 7961 index 08425eb9e..bc5cdcf2d 100644 7962 --- a/src/tests/third_party/rapidjson/include/rapidjson/reader.h 7963 +++ b/src/tests/third_party/rapidjson/include/rapidjson/reader.h 7964 @@ -261,23 +261,23 @@ void SkipWhitespace(InputStream& is) { 7965 #ifdef RAPIDJSON_SSE42 7966 //! Skip whitespace with SSE 4.2 pcmpistrm instruction, testing 16 8-byte characters at once. 7967 inline const char *SkipWhitespace_SIMD(const char* p) { 7968 - // Fast return for single non-whitespace 7969 - if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') 7970 - ++p; 7971 - else 7972 - return p; 7973 - 7974 - // 16-byte align to the next boundary 7975 - const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & ~15); 7976 - while (p != nextAligned) 7977 - if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') 7978 - ++p; 7979 - else 7980 - return p; 7981 + // Fast return for single non-whitespace 7982 + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') 7983 + ++p; 7984 + else 7985 + return p; 7986 + 7987 + // 16-byte align to the next boundary 7988 + const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & ~15); 7989 + while (p != nextAligned) 7990 + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') 7991 + ++p; 7992 + else 7993 + return p; 7994 7995 // The rest of string using SIMD 7996 - static const char whitespace[16] = " \n\r\t"; 7997 - const __m128i w = _mm_loadu_si128((const __m128i *)&whitespace[0]); 7998 + static const char whitespace[16] = " \n\r\t"; 7999 + const __m128i w = _mm_loadu_si128((const __m128i *)&whitespace[0]); 8000 8001 for (;; p += 16) { 8002 const __m128i s = _mm_load_si128((const __m128i *)p); 8003 @@ -298,31 +298,31 @@ inline const char *SkipWhitespace_SIMD(const char* p) { 8004 8005 //! Skip whitespace with SSE2 instructions, testing 16 8-byte characters at once. 8006 inline const char *SkipWhitespace_SIMD(const char* p) { 8007 - // Fast return for single non-whitespace 8008 - if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') 8009 - ++p; 8010 - else 8011 - return p; 8012 + // Fast return for single non-whitespace 8013 + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') 8014 + ++p; 8015 + else 8016 + return p; 8017 8018 // 16-byte align to the next boundary 8019 - const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & ~15); 8020 - while (p != nextAligned) 8021 - if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') 8022 - ++p; 8023 - else 8024 - return p; 8025 + const char* nextAligned = reinterpret_cast<const char*>((reinterpret_cast<size_t>(p) + 15) & ~15); 8026 + while (p != nextAligned) 8027 + if (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t') 8028 + ++p; 8029 + else 8030 + return p; 8031 8032 // The rest of string 8033 - static const char whitespaces[4][17] = { 8034 - " ", 8035 - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", 8036 - "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r", 8037 - "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"}; 8038 - 8039 - const __m128i w0 = _mm_loadu_si128((const __m128i *)&whitespaces[0][0]); 8040 - const __m128i w1 = _mm_loadu_si128((const __m128i *)&whitespaces[1][0]); 8041 - const __m128i w2 = _mm_loadu_si128((const __m128i *)&whitespaces[2][0]); 8042 - const __m128i w3 = _mm_loadu_si128((const __m128i *)&whitespaces[3][0]); 8043 + static const char whitespaces[4][17] = { 8044 + " ", 8045 + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", 8046 + "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r", 8047 + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"}; 8048 + 8049 + const __m128i w0 = _mm_loadu_si128((const __m128i *)&whitespaces[0][0]); 8050 + const __m128i w1 = _mm_loadu_si128((const __m128i *)&whitespaces[1][0]); 8051 + const __m128i w2 = _mm_loadu_si128((const __m128i *)&whitespaces[2][0]); 8052 + const __m128i w3 = _mm_loadu_si128((const __m128i *)&whitespaces[3][0]); 8053 8054 for (;; p += 16) { 8055 const __m128i s = _mm_load_si128((const __m128i *)p); 8056 diff --git a/src/tests/third_party/rapidjson/include/rapidjson/writer.h b/src/tests/third_party/rapidjson/include/rapidjson/writer.h 8057 index 6daa78330..98931fe31 100644 8058 --- a/src/tests/third_party/rapidjson/include/rapidjson/writer.h 8059 +++ b/src/tests/third_party/rapidjson/include/rapidjson/writer.h 8060 @@ -134,7 +134,7 @@ public: 8061 } 8062 8063 bool Key(const Ch* str, SizeType length, bool copy = false) { return String(str, length, copy); } 8064 - 8065 + 8066 bool EndObject(SizeType memberCount = 0) { 8067 (void)memberCount; 8068 RAPIDJSON_ASSERT(level_stack_.GetSize() >= sizeof(Level));
Note: See TracChangeset
for help on using the changeset viewer.