1 /*-------------------------------------------------------------------------
2 * OpenGL Conformance Test Suite
3 * -----------------------------
4 *
5 * Copyright (c) 2014-2016 The Khronos Group Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 */ /*!
20 * \file
21 * \brief
22 */ /*-------------------------------------------------------------------*/
23
24 #include "es31cShaderBitfieldOperationTests.hpp"
25 #include "deMath.h"
26 #include "deRandom.hpp"
27 #include "deString.h"
28 #include "deStringUtil.hpp"
29 #include "deFloat16.h"
30 #include "gluContextInfo.hpp"
31 #include "gluDrawUtil.hpp"
32 #include "gluPixelTransfer.hpp"
33 #include "gluShaderProgram.hpp"
34 #include "glw.h"
35 #include "glwFunctions.hpp"
36 #include "tcuCommandLine.hpp"
37 #include "tcuStringTemplate.hpp"
38 #include "tcuSurface.hpp"
39 #include "tcuTestLog.hpp"
40
41 namespace glcts
42 {
43
44 using glcts::Context;
45 using std::string;
46 using std::vector;
47 using tcu::TestLog;
48
specializeVersion(const std::string & source,glu::GLSLVersion version,const char * testStatement)49 static std::string specializeVersion(const std::string &source, glu::GLSLVersion version, const char *testStatement)
50 {
51 DE_ASSERT(version == glu::GLSL_VERSION_310_ES || version >= glu::GLSL_VERSION_430);
52 std::map<std::string, std::string> args;
53 args["VERSION_DECL"] = glu::getGLSLVersionDeclaration(version);
54 args["TEST_STATEMENT"] = testStatement;
55 return tcu::StringTemplate(source.c_str()).specialize(args);
56 }
57
58 struct Data
59 {
Dataglcts::Data60 Data()
61 {
62 memset(this, 0, sizeof *this);
63 }
Dataglcts::Data64 Data(Data const &init)
65 {
66 memcpy(this, &init, sizeof *this);
67 }
68
69 GLuint inUvec4[4];
70 GLint inIvec4[4];
71 GLfloat inVec4[4];
72
73 GLuint in2Uvec4[4];
74 GLint in2Ivec4[4];
75 GLfloat in2Vec4[4];
76
77 GLint offset;
78 GLint bits;
79 GLint padding[2];
80
81 GLuint outUvec4[4];
82 GLint outIvec4[4];
83 GLfloat outVec4[4];
84
85 GLuint out2Uvec4[4];
86 GLint out2Ivec4[4];
87 GLfloat out2Vec4[4];
88 };
89
90 struct Uvec4 : public Data
91 {
Uvec4glcts::Uvec492 Uvec4(GLuint x = 0, GLuint y = 0, GLuint z = 0, GLuint w = 0)
93 {
94 inUvec4[0] = x;
95 inUvec4[1] = y;
96 inUvec4[2] = z;
97 inUvec4[3] = w;
98 }
99 };
100
101 struct Ivec4 : public Data
102 {
Ivec4glcts::Ivec4103 Ivec4(GLint x = 0, GLint y = 0, GLint z = 0, GLint w = 0)
104 {
105 inIvec4[0] = x;
106 inIvec4[1] = y;
107 inIvec4[2] = z;
108 inIvec4[3] = w;
109 }
110 };
111
112 struct Vec4 : public Data
113 {
Vec4glcts::Vec4114 Vec4(GLfloat x = 0.0f, GLfloat y = 0.0f, GLfloat z = 0.0f, GLfloat w = 0.0f)
115 {
116 inVec4[0] = x;
117 inVec4[1] = y;
118 inVec4[2] = z;
119 inVec4[3] = w;
120 }
121 };
122
123 class ShaderBitfieldOperationCase : public TestCase
124 {
125 public:
126 ShaderBitfieldOperationCase(Context &context, const char *name, const char *description,
127 glu::GLSLVersion glslVersion, Data const &data, char const *testStatement);
128 ~ShaderBitfieldOperationCase();
129
130 IterateResult iterate();
131
132 protected:
133 glu::GLSLVersion m_glslVersion;
134 Data m_data;
135 std::string m_testStatement;
136
137 virtual bool test(Data const *data) = 0;
138 };
139
ShaderBitfieldOperationCase(Context & context,const char * name,const char * description,glu::GLSLVersion glslVersion,Data const & data,char const * testStatement)140 ShaderBitfieldOperationCase::ShaderBitfieldOperationCase(Context &context, const char *name, const char *description,
141 glu::GLSLVersion glslVersion, Data const &data,
142 char const *testStatement)
143 : TestCase(context, name, description)
144 , m_glslVersion(glslVersion)
145 , m_data(data)
146 , m_testStatement(testStatement)
147 {
148 DE_ASSERT(glslVersion == glu::GLSL_VERSION_310_ES || glslVersion >= glu::GLSL_VERSION_430);
149 }
150
~ShaderBitfieldOperationCase()151 ShaderBitfieldOperationCase::~ShaderBitfieldOperationCase()
152 {
153 }
154
iterate()155 ShaderBitfieldOperationCase::IterateResult ShaderBitfieldOperationCase::iterate()
156 {
157 const glw::Functions &gl = m_context.getRenderContext().getFunctions();
158 bool isOk = true;
159
160 GLuint data;
161 gl.genBuffers(1, &data);
162 gl.bindBuffer(GL_SHADER_STORAGE_BUFFER, data);
163 gl.bufferData(GL_SHADER_STORAGE_BUFFER, sizeof(Data), &m_data, GL_STATIC_DRAW);
164 gl.bindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, data);
165
166 char const *css = "${VERSION_DECL}\n"
167 "\n"
168 "layout(local_size_x = 1) in;\n"
169 "\n"
170 "layout(binding = 0, std430) buffer Data {\n"
171 " uvec4 inUvec4;\n"
172 " ivec4 inIvec4;\n"
173 " vec4 inVec4;\n"
174 "\n"
175 " uvec4 in2Uvec4;\n"
176 " ivec4 in2Ivec4;\n"
177 " vec4 in2Vec4;\n"
178 "\n"
179 " int offset;\n"
180 " int bits;\n"
181 "\n"
182 " uvec4 outUvec4;\n"
183 " ivec4 outIvec4;\n"
184 " vec4 outVec4;\n"
185 "\n"
186 " uvec4 out2Uvec4;\n"
187 " ivec4 out2Ivec4;\n"
188 " vec4 out2Vec4;\n"
189 "};\n"
190 "\n"
191 "void main()\n"
192 "{\n"
193 " ${TEST_STATEMENT};\n"
194 "}\n";
195
196 GLuint cs = gl.createShader(GL_COMPUTE_SHADER);
197 std::string csString = specializeVersion(css, m_glslVersion, m_testStatement.c_str());
198 char const *strings[1] = {csString.c_str()};
199 gl.shaderSource(cs, 1, strings, 0);
200 gl.compileShader(cs);
201 GLint compileSuccess = 0;
202 gl.getShaderiv(cs, GL_COMPILE_STATUS, &compileSuccess);
203 if (!compileSuccess)
204 {
205 TCU_FAIL("Compile failed");
206 }
207
208 GLuint pgm = gl.createProgram();
209 gl.attachShader(pgm, cs);
210 gl.linkProgram(pgm);
211 GLint linkSuccess = 0;
212 gl.getProgramiv(pgm, GL_LINK_STATUS, &linkSuccess);
213 if (!linkSuccess)
214 {
215 gl.deleteShader(cs);
216 TCU_FAIL("Link failed");
217 }
218
219 gl.useProgram(pgm);
220
221 gl.dispatchCompute(1, 1, 1);
222
223 Data const *results = (Data const *)gl.mapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(Data), GL_MAP_READ_BIT);
224 isOk = test(results);
225 gl.unmapBuffer(GL_SHADER_STORAGE_BUFFER);
226
227 gl.useProgram(0);
228 gl.deleteProgram(pgm);
229 gl.deleteShader(cs);
230
231 gl.deleteBuffers(1, &data);
232
233 m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL, isOk ? "Pass" : "Fail");
234 return STOP;
235 }
236
237 class ShaderBitfieldOperationCaseFrexp : public ShaderBitfieldOperationCase
238 {
239 public:
ShaderBitfieldOperationCaseFrexp(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,int components,char const * testStatement)240 ShaderBitfieldOperationCaseFrexp(Context &context, const char *name, glu::GLSLVersion glslVersion, Data const &data,
241 int components, char const *testStatement)
242 : ShaderBitfieldOperationCase(context, name, "", glslVersion, data, testStatement)
243 , m_components(components)
244 {
245 }
246
247 private:
248 int m_components;
249
test(Data const * data)250 virtual bool test(Data const *data)
251 {
252 for (int i = 0; i < m_components; ++i)
253 {
254 if (data->inVec4[i] == 0.0)
255 {
256 if (data->outVec4[i] != 0.0 || data->outIvec4[i] != 0)
257 {
258 return false;
259 }
260 }
261 else if (deFloatAbs(data->outVec4[i]) < 0.5 || deFloatAbs(data->outVec4[i]) >= 1.0)
262 {
263 return false;
264 }
265
266 float result = data->outVec4[i] * deFloatPow(2.0, (float)data->outIvec4[i]);
267 if (deFloatAbs(result - data->inVec4[i]) > 0.0001f)
268 {
269 return false;
270 }
271 }
272 return true;
273 }
274 };
275
276 class ShaderBitfieldOperationCaseFrexpFloat : public ShaderBitfieldOperationCaseFrexp
277 {
278 public:
ShaderBitfieldOperationCaseFrexpFloat(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data)279 ShaderBitfieldOperationCaseFrexpFloat(Context &context, const char *name, glu::GLSLVersion glslVersion,
280 Data const &data)
281 : ShaderBitfieldOperationCaseFrexp(context, name, glslVersion, data, 1,
282 "outVec4.x = frexp(inVec4.x, outIvec4.x)")
283 {
284 }
285 };
286
287 class ShaderBitfieldOperationCaseFrexpVec2 : public ShaderBitfieldOperationCaseFrexp
288 {
289 public:
ShaderBitfieldOperationCaseFrexpVec2(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data)290 ShaderBitfieldOperationCaseFrexpVec2(Context &context, const char *name, glu::GLSLVersion glslVersion,
291 Data const &data)
292 : ShaderBitfieldOperationCaseFrexp(context, name, glslVersion, data, 2,
293 "outVec4.xy = frexp(inVec4.xy, outIvec4.xy)")
294 {
295 }
296 };
297
298 class ShaderBitfieldOperationCaseFrexpVec3 : public ShaderBitfieldOperationCaseFrexp
299 {
300 public:
ShaderBitfieldOperationCaseFrexpVec3(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data)301 ShaderBitfieldOperationCaseFrexpVec3(Context &context, const char *name, glu::GLSLVersion glslVersion,
302 Data const &data)
303 : ShaderBitfieldOperationCaseFrexp(context, name, glslVersion, data, 3,
304 "outVec4.xyz = frexp(inVec4.xyz, outIvec4.xyz)")
305 {
306 }
307 };
308
309 class ShaderBitfieldOperationCaseFrexpVec4 : public ShaderBitfieldOperationCaseFrexp
310 {
311 public:
ShaderBitfieldOperationCaseFrexpVec4(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data)312 ShaderBitfieldOperationCaseFrexpVec4(Context &context, const char *name, glu::GLSLVersion glslVersion,
313 Data const &data)
314 : ShaderBitfieldOperationCaseFrexp(context, name, glslVersion, data, 4, "outVec4 = frexp(inVec4, outIvec4)")
315 {
316 }
317 };
318
319 class ShaderBitfieldOperationCaseLdexp : public ShaderBitfieldOperationCase
320 {
321 public:
ShaderBitfieldOperationCaseLdexp(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,int components,char const * testStatement)322 ShaderBitfieldOperationCaseLdexp(Context &context, const char *name, glu::GLSLVersion glslVersion, Data const &data,
323 int components, char const *testStatement)
324 : ShaderBitfieldOperationCase(context, name, "", glslVersion, data, testStatement)
325 , m_components(components)
326 {
327 }
328
329 private:
330 int m_components;
331
test(Data const * data)332 virtual bool test(Data const *data)
333 {
334 for (int i = 0; i < m_components; ++i)
335 {
336 float expected = deFloatLdExp(data->inVec4[i], data->inIvec4[i]);
337 if (deFloatAbs(expected - data->outVec4[i]) > 0.0001f)
338 {
339 return false;
340 }
341 }
342 return true;
343 }
344 };
345
346 class ShaderBitfieldOperationCaseLdexpFloat : public ShaderBitfieldOperationCaseLdexp
347 {
348 public:
ShaderBitfieldOperationCaseLdexpFloat(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,Data const & exp)349 ShaderBitfieldOperationCaseLdexpFloat(Context &context, const char *name, glu::GLSLVersion glslVersion,
350 Data const &data, Data const &exp)
351 : ShaderBitfieldOperationCaseLdexp(context, name, glslVersion, data, 1,
352 "outVec4.x = ldexp(inVec4.x, inIvec4.x)")
353 {
354 m_data.inIvec4[0] = exp.inIvec4[0];
355 }
356 };
357
358 class ShaderBitfieldOperationCaseLdexpVec2 : public ShaderBitfieldOperationCaseLdexp
359 {
360 public:
ShaderBitfieldOperationCaseLdexpVec2(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,Data const & exp)361 ShaderBitfieldOperationCaseLdexpVec2(Context &context, const char *name, glu::GLSLVersion glslVersion,
362 Data const &data, Data const &exp)
363 : ShaderBitfieldOperationCaseLdexp(context, name, glslVersion, data, 2,
364 "outVec4.xy = ldexp(inVec4.xy, inIvec4.xy)")
365 {
366 m_data.inIvec4[0] = exp.inIvec4[0];
367 m_data.inIvec4[1] = exp.inIvec4[1];
368 }
369 };
370
371 class ShaderBitfieldOperationCaseLdexpVec3 : public ShaderBitfieldOperationCaseLdexp
372 {
373 public:
ShaderBitfieldOperationCaseLdexpVec3(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,Data const & exp)374 ShaderBitfieldOperationCaseLdexpVec3(Context &context, const char *name, glu::GLSLVersion glslVersion,
375 Data const &data, Data const &exp)
376 : ShaderBitfieldOperationCaseLdexp(context, name, glslVersion, data, 3,
377 "outVec4.xyz = ldexp(inVec4.xyz, inIvec4.xyz)")
378 {
379 m_data.inIvec4[0] = exp.inIvec4[0];
380 m_data.inIvec4[1] = exp.inIvec4[1];
381 m_data.inIvec4[2] = exp.inIvec4[2];
382 }
383 };
384
385 class ShaderBitfieldOperationCaseLdexpVec4 : public ShaderBitfieldOperationCaseLdexp
386 {
387 public:
ShaderBitfieldOperationCaseLdexpVec4(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,Data const & exp)388 ShaderBitfieldOperationCaseLdexpVec4(Context &context, const char *name, glu::GLSLVersion glslVersion,
389 Data const &data, Data const &exp)
390 : ShaderBitfieldOperationCaseLdexp(context, name, glslVersion, data, 4, "outVec4 = ldexp(inVec4, inIvec4)")
391 {
392 m_data.inIvec4[0] = exp.inIvec4[0];
393 m_data.inIvec4[1] = exp.inIvec4[1];
394 m_data.inIvec4[2] = exp.inIvec4[2];
395 m_data.inIvec4[3] = exp.inIvec4[3];
396 }
397 };
398
reduce32PrecisionTo16(float f)399 static float reduce32PrecisionTo16(float f)
400 {
401 return deFloat16To32(deFloat32To16(f));
402 }
403
pack(float x,float y,float z,float w,float range)404 static GLuint pack(float x, float y, float z, float w, float range)
405 {
406 return ((int(deFloatFloor(x * range + 0.5f)) & 0xFF) << 0) | ((int(deFloatFloor(y * range + 0.5f)) & 0xFF) << 8) |
407 ((int(deFloatFloor(z * range + 0.5f)) & 0xFF) << 16) | ((int(deFloatFloor(w * range + 0.5f)) & 0xFF) << 24);
408 }
409
checkOutData(GLuint result,const GLfloat input[4],float range)410 static bool checkOutData(GLuint result, const GLfloat input[4], float range)
411 {
412 GLuint expected = pack(input[0], input[1], input[2], input[3], range);
413
414 GLuint expected_mp = pack(reduce32PrecisionTo16(input[0]), reduce32PrecisionTo16(input[1]),
415 reduce32PrecisionTo16(input[2]), reduce32PrecisionTo16(input[3]), range);
416
417 return (expected == result || expected_mp == result);
418 }
419
420 class ShaderBitfieldOperationCasePackUnorm : public ShaderBitfieldOperationCase
421 {
422 public:
ShaderBitfieldOperationCasePackUnorm(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data)423 ShaderBitfieldOperationCasePackUnorm(Context &context, const char *name, glu::GLSLVersion glslVersion,
424 Data const &data)
425 : ShaderBitfieldOperationCase(context, name, "", glslVersion, data, "outUvec4.x = packUnorm4x8(inVec4)")
426 {
427 }
428
429 private:
test(Data const * data)430 virtual bool test(Data const *data)
431 {
432 return checkOutData(data->outUvec4[0], data->inVec4, 255.0f);
433 }
434 };
435
436 class ShaderBitfieldOperationCasePackSnorm : public ShaderBitfieldOperationCase
437 {
438 public:
ShaderBitfieldOperationCasePackSnorm(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data)439 ShaderBitfieldOperationCasePackSnorm(Context &context, const char *name, glu::GLSLVersion glslVersion,
440 Data const &data)
441 : ShaderBitfieldOperationCase(context, name, "", glslVersion, data, "outUvec4.x = packSnorm4x8(inVec4)")
442 {
443 }
444
445 private:
test(Data const * data)446 virtual bool test(Data const *data)
447 {
448 return checkOutData(data->outUvec4[0], data->inVec4, 127.0f);
449 }
450 };
451
452 class ShaderBitfieldOperationCaseUnpackUnorm : public ShaderBitfieldOperationCase
453 {
454 public:
ShaderBitfieldOperationCaseUnpackUnorm(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data)455 ShaderBitfieldOperationCaseUnpackUnorm(Context &context, const char *name, glu::GLSLVersion glslVersion,
456 Data const &data)
457 : ShaderBitfieldOperationCase(context, name, "", glslVersion, data, "outVec4 = unpackUnorm4x8(inUvec4.x)")
458 {
459 }
460
461 private:
test(Data const * data)462 virtual bool test(Data const *data)
463 {
464 GLfloat x = float((data->inUvec4[0] >> 0) & 0xFF) / 255.0f;
465 if (deFloatAbs(data->outVec4[0] - x) > 0.0001f)
466 {
467 return false;
468 }
469 GLfloat y = float((data->inUvec4[0] >> 8) & 0xFF) / 255.0f;
470 if (deFloatAbs(data->outVec4[1] - y) > 0.0001f)
471 {
472 return false;
473 }
474 GLfloat z = float((data->inUvec4[0] >> 16) & 0xFF) / 255.0f;
475 if (deFloatAbs(data->outVec4[2] - z) > 0.0001f)
476 {
477 return false;
478 }
479 GLfloat w = float((data->inUvec4[0] >> 24) & 0xFF) / 255.0f;
480 if (deFloatAbs(data->outVec4[3] - w) > 0.0001f)
481 {
482 return false;
483 }
484
485 return true;
486 }
487 };
488
489 class ShaderBitfieldOperationCaseUnpackSnorm : public ShaderBitfieldOperationCase
490 {
491 public:
ShaderBitfieldOperationCaseUnpackSnorm(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data)492 ShaderBitfieldOperationCaseUnpackSnorm(Context &context, const char *name, glu::GLSLVersion glslVersion,
493 Data const &data)
494 : ShaderBitfieldOperationCase(context, name, "", glslVersion, data, "outVec4 = unpackSnorm4x8(inUvec4.x)")
495 {
496 }
497
498 private:
test(Data const * data)499 virtual bool test(Data const *data)
500 {
501 GLfloat x = float((signed char)((data->inUvec4[0] >> 0) & 0xFF)) / 127.0f;
502 x = de::clamp<GLfloat>(x, -1.0f, 1.0f);
503 if (deFloatAbs(data->outVec4[0] - x) > 0.0001f)
504 {
505 return false;
506 }
507 GLfloat y = float((signed char)((data->inUvec4[0] >> 8) & 0xFF)) / 127.0f;
508 y = de::clamp<GLfloat>(y, -1.0f, 1.0f);
509 if (deFloatAbs(data->outVec4[1] - y) > 0.0001f)
510 {
511 return false;
512 }
513 GLfloat z = float((signed char)((data->inUvec4[0] >> 16) & 0xFF)) / 127.0f;
514 z = de::clamp<GLfloat>(z, -1.0f, 1.0f);
515 if (deFloatAbs(data->outVec4[2] - z) > 0.0001f)
516 {
517 return false;
518 }
519 GLfloat w = float((signed char)((data->inUvec4[0] >> 24) & 0xFF)) / 127.0f;
520 w = de::clamp<GLfloat>(w, -1.0f, 1.0f);
521 if (deFloatAbs(data->outVec4[3] - w) > 0.0001f)
522 {
523 return false;
524 }
525
526 return true;
527 }
528 };
529
530 class ShaderBitfieldOperationCaseBitfieldExtractUint : public ShaderBitfieldOperationCase
531 {
532 public:
ShaderBitfieldOperationCaseBitfieldExtractUint(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,int offset,int bits,int components,char const * testStatement)533 ShaderBitfieldOperationCaseBitfieldExtractUint(Context &context, const char *name, glu::GLSLVersion glslVersion,
534 Data const &data, int offset, int bits, int components,
535 char const *testStatement)
536 : ShaderBitfieldOperationCase(context, name, "", glslVersion, data, testStatement)
537 , m_components(components)
538 {
539 if (offset + bits > 32)
540 {
541 offset -= (offset + bits) - 32;
542 }
543 m_data.offset = offset;
544 m_data.bits = bits;
545 }
546
547 private:
548 int m_components;
549
test(Data const * data)550 virtual bool test(Data const *data)
551 {
552 for (int i = 0; i < m_components; ++i)
553 {
554 GLuint expected =
555 (data->inUvec4[i] >> data->offset) & (data->bits == 32 ? 0xFFFFFFFF : ((1u << data->bits) - 1));
556 if (data->outUvec4[i] != expected)
557 {
558 return false;
559 }
560 }
561 return true;
562 }
563 };
564
565 class ShaderBitfieldOperationCaseBitfieldExtractUint1 : public ShaderBitfieldOperationCaseBitfieldExtractUint
566 {
567 public:
ShaderBitfieldOperationCaseBitfieldExtractUint1(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,int offset,int bits)568 ShaderBitfieldOperationCaseBitfieldExtractUint1(Context &context, const char *name, glu::GLSLVersion glslVersion,
569 Data const &data, int offset, int bits)
570 : ShaderBitfieldOperationCaseBitfieldExtractUint(context, name, glslVersion, data, offset, bits, 1,
571 "outUvec4.x = bitfieldExtract(inUvec4.x, offset, bits)")
572 {
573 }
574 };
575
576 class ShaderBitfieldOperationCaseBitfieldExtractUint2 : public ShaderBitfieldOperationCaseBitfieldExtractUint
577 {
578 public:
ShaderBitfieldOperationCaseBitfieldExtractUint2(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,int offset,int bits)579 ShaderBitfieldOperationCaseBitfieldExtractUint2(Context &context, const char *name, glu::GLSLVersion glslVersion,
580 Data const &data, int offset, int bits)
581 : ShaderBitfieldOperationCaseBitfieldExtractUint(context, name, glslVersion, data, offset, bits, 2,
582 "outUvec4.xy = bitfieldExtract(inUvec4.xy, offset, bits)")
583 {
584 }
585 };
586
587 class ShaderBitfieldOperationCaseBitfieldExtractUint3 : public ShaderBitfieldOperationCaseBitfieldExtractUint
588 {
589 public:
ShaderBitfieldOperationCaseBitfieldExtractUint3(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,int offset,int bits)590 ShaderBitfieldOperationCaseBitfieldExtractUint3(Context &context, const char *name, glu::GLSLVersion glslVersion,
591 Data const &data, int offset, int bits)
592 : ShaderBitfieldOperationCaseBitfieldExtractUint(context, name, glslVersion, data, offset, bits, 3,
593 "outUvec4.xyz = bitfieldExtract(inUvec4.xyz, offset, bits)")
594 {
595 }
596 };
597
598 class ShaderBitfieldOperationCaseBitfieldExtractUint4 : public ShaderBitfieldOperationCaseBitfieldExtractUint
599 {
600 public:
ShaderBitfieldOperationCaseBitfieldExtractUint4(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,int offset,int bits)601 ShaderBitfieldOperationCaseBitfieldExtractUint4(Context &context, const char *name, glu::GLSLVersion glslVersion,
602 Data const &data, int offset, int bits)
603 : ShaderBitfieldOperationCaseBitfieldExtractUint(context, name, glslVersion, data, offset, bits, 4,
604 "outUvec4 = bitfieldExtract(inUvec4, offset, bits)")
605 {
606 }
607 };
608
609 class ShaderBitfieldOperationCaseBitfieldExtractInt : public ShaderBitfieldOperationCase
610 {
611 public:
ShaderBitfieldOperationCaseBitfieldExtractInt(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,int offset,int bits,int components,char const * testStatement)612 ShaderBitfieldOperationCaseBitfieldExtractInt(Context &context, const char *name, glu::GLSLVersion glslVersion,
613 Data const &data, int offset, int bits, int components,
614 char const *testStatement)
615 : ShaderBitfieldOperationCase(context, name, "", glslVersion, data, testStatement)
616 , m_components(components)
617 {
618 if (offset + bits > 32)
619 {
620 offset -= (offset + bits) - 32;
621 }
622 m_data.offset = offset;
623 m_data.bits = bits;
624 }
625
626 private:
627 int m_components;
628
test(Data const * data)629 virtual bool test(Data const *data)
630 {
631 for (int i = 0; i < m_components; ++i)
632 {
633 GLint expected = data->inIvec4[i] << (32 - (data->offset + data->bits));
634 expected >>= 32 - data->bits;
635 if (data->outIvec4[i] != expected)
636 {
637 return false;
638 }
639 }
640 return true;
641 }
642 };
643
644 class ShaderBitfieldOperationCaseBitfieldExtractInt1 : public ShaderBitfieldOperationCaseBitfieldExtractInt
645 {
646 public:
ShaderBitfieldOperationCaseBitfieldExtractInt1(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,int offset,int bits)647 ShaderBitfieldOperationCaseBitfieldExtractInt1(Context &context, const char *name, glu::GLSLVersion glslVersion,
648 Data const &data, int offset, int bits)
649 : ShaderBitfieldOperationCaseBitfieldExtractInt(context, name, glslVersion, data, offset, bits, 1,
650 "outIvec4.x = bitfieldExtract(inIvec4.x, offset, bits)")
651 {
652 }
653 };
654
655 class ShaderBitfieldOperationCaseBitfieldExtractInt2 : public ShaderBitfieldOperationCaseBitfieldExtractInt
656 {
657 public:
ShaderBitfieldOperationCaseBitfieldExtractInt2(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,int offset,int bits)658 ShaderBitfieldOperationCaseBitfieldExtractInt2(Context &context, const char *name, glu::GLSLVersion glslVersion,
659 Data const &data, int offset, int bits)
660 : ShaderBitfieldOperationCaseBitfieldExtractInt(context, name, glslVersion, data, offset, bits, 2,
661 "outIvec4.xy = bitfieldExtract(inIvec4.xy, offset, bits)")
662 {
663 }
664 };
665
666 class ShaderBitfieldOperationCaseBitfieldExtractInt3 : public ShaderBitfieldOperationCaseBitfieldExtractInt
667 {
668 public:
ShaderBitfieldOperationCaseBitfieldExtractInt3(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,int offset,int bits)669 ShaderBitfieldOperationCaseBitfieldExtractInt3(Context &context, const char *name, glu::GLSLVersion glslVersion,
670 Data const &data, int offset, int bits)
671 : ShaderBitfieldOperationCaseBitfieldExtractInt(context, name, glslVersion, data, offset, bits, 3,
672 "outIvec4.xyz = bitfieldExtract(inIvec4.xyz, offset, bits)")
673 {
674 }
675 };
676
677 class ShaderBitfieldOperationCaseBitfieldExtractInt4 : public ShaderBitfieldOperationCaseBitfieldExtractInt
678 {
679 public:
ShaderBitfieldOperationCaseBitfieldExtractInt4(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,int offset,int bits)680 ShaderBitfieldOperationCaseBitfieldExtractInt4(Context &context, const char *name, glu::GLSLVersion glslVersion,
681 Data const &data, int offset, int bits)
682 : ShaderBitfieldOperationCaseBitfieldExtractInt(context, name, glslVersion, data, offset, bits, 4,
683 "outIvec4 = bitfieldExtract(inIvec4, offset, bits)")
684 {
685 }
686 };
687
688 class ShaderBitfieldOperationCaseBitfieldInsertUint : public ShaderBitfieldOperationCase
689 {
690 public:
ShaderBitfieldOperationCaseBitfieldInsertUint(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,Data const & insert,int offset,int bits,int components,char const * testStatement)691 ShaderBitfieldOperationCaseBitfieldInsertUint(Context &context, const char *name, glu::GLSLVersion glslVersion,
692 Data const &data, Data const &insert, int offset, int bits,
693 int components, char const *testStatement)
694 : ShaderBitfieldOperationCase(context, name, "", glslVersion, data, testStatement)
695 , m_components(components)
696 {
697 for (int i = 0; i < components; ++i)
698 {
699 m_data.in2Uvec4[i] = insert.inUvec4[i];
700 }
701 if (offset + bits > 32)
702 {
703 offset -= (offset + bits) - 32;
704 }
705 m_data.offset = offset;
706 m_data.bits = bits;
707 }
708
709 private:
710 int m_components;
711
test(Data const * data)712 virtual bool test(Data const *data)
713 {
714 for (int i = 0; i < m_components; ++i)
715 {
716 GLuint mask = (data->bits == 32) ? ~0u : (1 << data->bits) - 1;
717 GLuint expected =
718 (data->inUvec4[i] & ~(mask << data->offset)) | ((data->in2Uvec4[i] & mask) << data->offset);
719 if (data->outUvec4[i] != expected)
720 {
721 return false;
722 }
723 }
724 return true;
725 }
726 };
727
728 class ShaderBitfieldOperationCaseBitfieldInsertUint1 : public ShaderBitfieldOperationCaseBitfieldInsertUint
729 {
730 public:
ShaderBitfieldOperationCaseBitfieldInsertUint1(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,Data const & insert,int offset,int bits)731 ShaderBitfieldOperationCaseBitfieldInsertUint1(Context &context, const char *name, glu::GLSLVersion glslVersion,
732 Data const &data, Data const &insert, int offset, int bits)
733 : ShaderBitfieldOperationCaseBitfieldInsertUint(
734 context, name, glslVersion, data, insert, offset, bits, 1,
735 "outUvec4.x = bitfieldInsert(inUvec4.x, in2Uvec4.x, offset, bits)")
736 {
737 }
738 };
739
740 class ShaderBitfieldOperationCaseBitfieldInsertUint2 : public ShaderBitfieldOperationCaseBitfieldInsertUint
741 {
742 public:
ShaderBitfieldOperationCaseBitfieldInsertUint2(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,Data const & insert,int offset,int bits)743 ShaderBitfieldOperationCaseBitfieldInsertUint2(Context &context, const char *name, glu::GLSLVersion glslVersion,
744 Data const &data, Data const &insert, int offset, int bits)
745 : ShaderBitfieldOperationCaseBitfieldInsertUint(
746 context, name, glslVersion, data, insert, offset, bits, 2,
747 "outUvec4.xy = bitfieldInsert(inUvec4.xy, in2Uvec4.xy, offset, bits)")
748 {
749 }
750 };
751
752 class ShaderBitfieldOperationCaseBitfieldInsertUint3 : public ShaderBitfieldOperationCaseBitfieldInsertUint
753 {
754 public:
ShaderBitfieldOperationCaseBitfieldInsertUint3(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,Data const & insert,int offset,int bits)755 ShaderBitfieldOperationCaseBitfieldInsertUint3(Context &context, const char *name, glu::GLSLVersion glslVersion,
756 Data const &data, Data const &insert, int offset, int bits)
757 : ShaderBitfieldOperationCaseBitfieldInsertUint(
758 context, name, glslVersion, data, insert, offset, bits, 3,
759 "outUvec4.xyz = bitfieldInsert(inUvec4.xyz, in2Uvec4.xyz, offset, bits)")
760 {
761 }
762 };
763
764 class ShaderBitfieldOperationCaseBitfieldInsertUint4 : public ShaderBitfieldOperationCaseBitfieldInsertUint
765 {
766 public:
ShaderBitfieldOperationCaseBitfieldInsertUint4(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,Data const & insert,int offset,int bits)767 ShaderBitfieldOperationCaseBitfieldInsertUint4(Context &context, const char *name, glu::GLSLVersion glslVersion,
768 Data const &data, Data const &insert, int offset, int bits)
769 : ShaderBitfieldOperationCaseBitfieldInsertUint(context, name, glslVersion, data, insert, offset, bits, 4,
770 "outUvec4 = bitfieldInsert(inUvec4, in2Uvec4, offset, bits)")
771 {
772 }
773 };
774
775 class ShaderBitfieldOperationCaseBitfieldInsertInt : public ShaderBitfieldOperationCase
776 {
777 public:
ShaderBitfieldOperationCaseBitfieldInsertInt(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,Data const & insert,int offset,int bits,int components,char const * testStatement)778 ShaderBitfieldOperationCaseBitfieldInsertInt(Context &context, const char *name, glu::GLSLVersion glslVersion,
779 Data const &data, Data const &insert, int offset, int bits,
780 int components, char const *testStatement)
781 : ShaderBitfieldOperationCase(context, name, "", glslVersion, data, testStatement)
782 , m_components(components)
783 {
784 for (int i = 0; i < components; ++i)
785 {
786 m_data.in2Ivec4[i] = insert.inIvec4[i];
787 }
788 if (offset + bits > 32)
789 {
790 offset -= (offset + bits) - 32;
791 }
792 m_data.offset = offset;
793 m_data.bits = bits;
794 }
795
796 private:
797 int m_components;
798
test(Data const * data)799 virtual bool test(Data const *data)
800 {
801 for (int i = 0; i < m_components; ++i)
802 {
803 GLuint mask = (data->bits == 32) ? ~0u : (1 << data->bits) - 1;
804 GLint expected =
805 (data->inIvec4[i] & ~(mask << data->offset)) | ((data->in2Ivec4[i] & mask) << data->offset);
806 if (data->outIvec4[i] != expected)
807 {
808 return false;
809 }
810 }
811 return true;
812 }
813 };
814
815 class ShaderBitfieldOperationCaseBitfieldInsertInt1 : public ShaderBitfieldOperationCaseBitfieldInsertInt
816 {
817 public:
ShaderBitfieldOperationCaseBitfieldInsertInt1(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,Data const & insert,int offset,int bits)818 ShaderBitfieldOperationCaseBitfieldInsertInt1(Context &context, const char *name, glu::GLSLVersion glslVersion,
819 Data const &data, Data const &insert, int offset, int bits)
820 : ShaderBitfieldOperationCaseBitfieldInsertInt(
821 context, name, glslVersion, data, insert, offset, bits, 1,
822 "outIvec4.x = bitfieldInsert(inIvec4.x, in2Ivec4.x, offset, bits)")
823 {
824 }
825 };
826
827 class ShaderBitfieldOperationCaseBitfieldInsertInt2 : public ShaderBitfieldOperationCaseBitfieldInsertInt
828 {
829 public:
ShaderBitfieldOperationCaseBitfieldInsertInt2(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,Data const & insert,int offset,int bits)830 ShaderBitfieldOperationCaseBitfieldInsertInt2(Context &context, const char *name, glu::GLSLVersion glslVersion,
831 Data const &data, Data const &insert, int offset, int bits)
832 : ShaderBitfieldOperationCaseBitfieldInsertInt(
833 context, name, glslVersion, data, insert, offset, bits, 2,
834 "outIvec4.xy = bitfieldInsert(inIvec4.xy, in2Ivec4.xy, offset, bits)")
835 {
836 }
837 };
838
839 class ShaderBitfieldOperationCaseBitfieldInsertInt3 : public ShaderBitfieldOperationCaseBitfieldInsertInt
840 {
841 public:
ShaderBitfieldOperationCaseBitfieldInsertInt3(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,Data const & insert,int offset,int bits)842 ShaderBitfieldOperationCaseBitfieldInsertInt3(Context &context, const char *name, glu::GLSLVersion glslVersion,
843 Data const &data, Data const &insert, int offset, int bits)
844 : ShaderBitfieldOperationCaseBitfieldInsertInt(
845 context, name, glslVersion, data, insert, offset, bits, 3,
846 "outIvec4.xyz = bitfieldInsert(inIvec4.xyz, in2Ivec4.xyz, offset, bits)")
847 {
848 }
849 };
850
851 class ShaderBitfieldOperationCaseBitfieldInsertInt4 : public ShaderBitfieldOperationCaseBitfieldInsertInt
852 {
853 public:
ShaderBitfieldOperationCaseBitfieldInsertInt4(Context & context,const char * name,glu::GLSLVersion glslVersion,Data const & data,Data const & insert,int offset,int bits)854 ShaderBitfieldOperationCaseBitfieldInsertInt4(Context &context, const char *name, glu::GLSLVersion glslVersion,
855 Data const &data, Data const &insert, int offset, int bits)
856 : ShaderBitfieldOperationCaseBitfieldInsertInt(context, name, glslVersion, data, insert, offset, bits, 4,
857 "outIvec4 = bitfieldInsert(inIvec4, in2Ivec4, offset, bits)")
858 {
859 }
860 };
861
862 typedef GLuint (*UnaryUFunc)(GLuint input);
863 typedef GLint (*UnaryIFunc)(GLint input);
864
bitfieldReverse(GLuint input)865 static GLuint bitfieldReverse(GLuint input)
866 {
867 GLuint result = 0;
868 for (int i = 0; i < 32; ++i)
869 {
870 result >>= 1;
871 result |= (input & 0x80000000);
872 input <<= 1;
873 }
874 return result;
875 }
876
bitCount(GLuint input)877 static GLuint bitCount(GLuint input)
878 {
879 GLuint result = 0;
880 while (input)
881 {
882 if (input & 1)
883 {
884 result += 1;
885 }
886 input >>= 1;
887 }
888 return result;
889 }
890
findLSB(GLuint input)891 static GLuint findLSB(GLuint input)
892 {
893 if (!input)
894 {
895 return -1;
896 }
897 for (GLuint result = 0;; ++result)
898 {
899 if (input & 1)
900 {
901 return result;
902 }
903 input >>= 1;
904 }
905 }
906
findMSBU(GLuint input)907 static GLuint findMSBU(GLuint input)
908 {
909 if (!input)
910 {
911 return -1;
912 }
913 for (GLuint result = 31;; --result)
914 {
915 if (input & 0x80000000)
916 {
917 return result;
918 }
919 input <<= 1;
920 }
921 }
922
findMSBI(GLint input)923 static GLint findMSBI(GLint input)
924 {
925 if (input == 0 || input == -1)
926 {
927 return -1;
928 }
929 else if (input > 0)
930 {
931 for (GLuint result = 31;; --result)
932 {
933 if (input & 0x80000000)
934 {
935 return result;
936 }
937 input <<= 1;
938 }
939 }
940 else
941 {
942 for (GLuint result = 31;; --result)
943 {
944 if (!(input & 0x80000000))
945 {
946 return result;
947 }
948 input <<= 1;
949 }
950 }
951 }
952
953 class ShaderBitfieldOperationCaseUnaryUint : public ShaderBitfieldOperationCase
954 {
955 public:
ShaderBitfieldOperationCaseUnaryUint(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * funcName,UnaryUFunc func,Data const & data,int components,char const * testStatement)956 ShaderBitfieldOperationCaseUnaryUint(Context &context, const char *name, glu::GLSLVersion glslVersion,
957 char const *funcName, UnaryUFunc func, Data const &data, int components,
958 char const *testStatement)
959 : ShaderBitfieldOperationCase(context, name, "", glslVersion, data, testStatement)
960 , m_components(components)
961 , m_func(func)
962 {
963 size_t pos = m_testStatement.find("func");
964 m_testStatement.replace(pos, 4, funcName);
965 }
966
967 private:
968 int m_components;
969 UnaryUFunc m_func;
970
test(Data const * data)971 virtual bool test(Data const *data)
972 {
973 for (int i = 0; i < m_components; ++i)
974 {
975 GLuint expected = m_func(data->inUvec4[i]);
976 GLuint output = data->outUvec4[i];
977 if (m_func == (UnaryUFunc)glcts::bitCount || m_func == (UnaryUFunc)glcts::findLSB ||
978 m_func == (UnaryUFunc)glcts::findMSBU || m_func == (UnaryUFunc)glcts::findMSBI)
979 {
980 /* The built-in bitCount, findLSB and findMSB functions
981 * return a lowp int, which can be encoded with as little
982 * as 9 bits. Since findLSB and findMSB can return negative
983 * values (namely, -1), we cannot compare the value directly
984 * against a (32-bit) GLuint.
985 */
986 GLuint output_9bits = output & 0x1ff;
987 GLuint sign_extend = output_9bits & 0x100 ? 0xfffffe00 : 0;
988 output = output_9bits | sign_extend;
989 }
990
991 if (output != expected)
992 {
993 return false;
994 }
995 }
996 return true;
997 }
998 };
999
1000 class ShaderBitfieldOperationCaseUnaryUint1 : public ShaderBitfieldOperationCaseUnaryUint
1001 {
1002 public:
ShaderBitfieldOperationCaseUnaryUint1(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * funcName,UnaryUFunc func,Data const & data)1003 ShaderBitfieldOperationCaseUnaryUint1(Context &context, const char *name, glu::GLSLVersion glslVersion,
1004 char const *funcName, UnaryUFunc func, Data const &data)
1005 : ShaderBitfieldOperationCaseUnaryUint(context, name, glslVersion, funcName, func, data, 1,
1006 "outUvec4.x = uint(func(inUvec4.x))")
1007 {
1008 }
1009 };
1010
1011 class ShaderBitfieldOperationCaseUnaryUint2 : public ShaderBitfieldOperationCaseUnaryUint
1012 {
1013 public:
ShaderBitfieldOperationCaseUnaryUint2(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * funcName,UnaryUFunc func,Data const & data)1014 ShaderBitfieldOperationCaseUnaryUint2(Context &context, const char *name, glu::GLSLVersion glslVersion,
1015 char const *funcName, UnaryUFunc func, Data const &data)
1016 : ShaderBitfieldOperationCaseUnaryUint(context, name, glslVersion, funcName, func, data, 2,
1017 "outUvec4.xy = uvec2(func(inUvec4.xy))")
1018 {
1019 }
1020 };
1021
1022 class ShaderBitfieldOperationCaseUnaryUint3 : public ShaderBitfieldOperationCaseUnaryUint
1023 {
1024 public:
ShaderBitfieldOperationCaseUnaryUint3(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * funcName,UnaryUFunc func,Data const & data)1025 ShaderBitfieldOperationCaseUnaryUint3(Context &context, const char *name, glu::GLSLVersion glslVersion,
1026 char const *funcName, UnaryUFunc func, Data const &data)
1027 : ShaderBitfieldOperationCaseUnaryUint(context, name, glslVersion, funcName, func, data, 3,
1028 "outUvec4.xyz = uvec3(func(inUvec4.xyz))")
1029 {
1030 }
1031 };
1032
1033 class ShaderBitfieldOperationCaseUnaryUint4 : public ShaderBitfieldOperationCaseUnaryUint
1034 {
1035 public:
ShaderBitfieldOperationCaseUnaryUint4(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * funcName,UnaryUFunc func,Data const & data)1036 ShaderBitfieldOperationCaseUnaryUint4(Context &context, const char *name, glu::GLSLVersion glslVersion,
1037 char const *funcName, UnaryUFunc func, Data const &data)
1038 : ShaderBitfieldOperationCaseUnaryUint(context, name, glslVersion, funcName, func, data, 4,
1039 "outUvec4 = uvec4(func(inUvec4))")
1040 {
1041 }
1042 };
1043
1044 class ShaderBitfieldOperationCaseUnaryInt : public ShaderBitfieldOperationCase
1045 {
1046 public:
ShaderBitfieldOperationCaseUnaryInt(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * funcName,UnaryIFunc func,Data const & data,int components,char const * testStatement)1047 ShaderBitfieldOperationCaseUnaryInt(Context &context, const char *name, glu::GLSLVersion glslVersion,
1048 char const *funcName, UnaryIFunc func, Data const &data, int components,
1049 char const *testStatement)
1050 : ShaderBitfieldOperationCase(context, name, "", glslVersion, data, testStatement)
1051 , m_components(components)
1052 , m_func(func)
1053 {
1054 size_t pos = m_testStatement.find("func");
1055 m_testStatement.replace(pos, 4, funcName);
1056 }
1057
1058 private:
1059 int m_components;
1060 UnaryIFunc m_func;
1061
test(Data const * data)1062 virtual bool test(Data const *data)
1063 {
1064 for (int i = 0; i < m_components; ++i)
1065 {
1066 GLint expected = m_func(data->inIvec4[i]);
1067 if (data->outIvec4[i] != expected)
1068 {
1069 return false;
1070 }
1071 }
1072 return true;
1073 }
1074 };
1075
1076 class ShaderBitfieldOperationCaseUnaryInt1 : public ShaderBitfieldOperationCaseUnaryInt
1077 {
1078 public:
ShaderBitfieldOperationCaseUnaryInt1(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * funcName,UnaryIFunc func,Data const & data)1079 ShaderBitfieldOperationCaseUnaryInt1(Context &context, const char *name, glu::GLSLVersion glslVersion,
1080 char const *funcName, UnaryIFunc func, Data const &data)
1081 : ShaderBitfieldOperationCaseUnaryInt(context, name, glslVersion, funcName, func, data, 1,
1082 "outIvec4.x = func(inIvec4.x)")
1083 {
1084 }
1085 };
1086
1087 class ShaderBitfieldOperationCaseUnaryInt2 : public ShaderBitfieldOperationCaseUnaryInt
1088 {
1089 public:
ShaderBitfieldOperationCaseUnaryInt2(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * funcName,UnaryIFunc func,Data const & data)1090 ShaderBitfieldOperationCaseUnaryInt2(Context &context, const char *name, glu::GLSLVersion glslVersion,
1091 char const *funcName, UnaryIFunc func, Data const &data)
1092 : ShaderBitfieldOperationCaseUnaryInt(context, name, glslVersion, funcName, func, data, 2,
1093 "outIvec4.xy = func(inIvec4.xy)")
1094 {
1095 }
1096 };
1097
1098 class ShaderBitfieldOperationCaseUnaryInt3 : public ShaderBitfieldOperationCaseUnaryInt
1099 {
1100 public:
ShaderBitfieldOperationCaseUnaryInt3(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * funcName,UnaryIFunc func,Data const & data)1101 ShaderBitfieldOperationCaseUnaryInt3(Context &context, const char *name, glu::GLSLVersion glslVersion,
1102 char const *funcName, UnaryIFunc func, Data const &data)
1103 : ShaderBitfieldOperationCaseUnaryInt(context, name, glslVersion, funcName, func, data, 3,
1104 "outIvec4.xyz = func(inIvec4.xyz)")
1105 {
1106 }
1107 };
1108
1109 class ShaderBitfieldOperationCaseUnaryInt4 : public ShaderBitfieldOperationCaseUnaryInt
1110 {
1111 public:
ShaderBitfieldOperationCaseUnaryInt4(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * funcName,UnaryIFunc func,Data const & data)1112 ShaderBitfieldOperationCaseUnaryInt4(Context &context, const char *name, glu::GLSLVersion glslVersion,
1113 char const *funcName, UnaryIFunc func, Data const &data)
1114 : ShaderBitfieldOperationCaseUnaryInt(context, name, glslVersion, funcName, func, data, 4,
1115 "outIvec4 = func(inIvec4)")
1116 {
1117 }
1118 };
1119
1120 typedef GLuint (*BinaryUFunc)(GLuint input, GLuint input2, GLuint &output2);
1121 typedef GLint (*BinaryIFunc)(GLint input, GLint input2, GLint &output2);
1122
uaddCarry(GLuint input,GLuint input2,GLuint & output2)1123 static GLuint uaddCarry(GLuint input, GLuint input2, GLuint &output2)
1124 {
1125 GLuint result = input + input2;
1126 output2 = (input > result) ? 1 : 0;
1127 return result;
1128 }
1129
usubBorrow(GLuint input,GLuint input2,GLuint & output2)1130 static GLuint usubBorrow(GLuint input, GLuint input2, GLuint &output2)
1131 {
1132 output2 = (input2 > input) ? 1 : 0;
1133 return input - input2;
1134 }
1135
umulExtended(GLuint input,GLuint input2,GLuint & output2)1136 static GLuint umulExtended(GLuint input, GLuint input2, GLuint &output2)
1137 {
1138 GLuint64 result = static_cast<GLuint64>(input) * static_cast<GLuint64>(input2);
1139 output2 = GLuint(result & 0xFFFFFFFF);
1140 return GLuint(result >> 32);
1141 }
1142
imulExtended(GLint input,GLint input2,GLint & output2)1143 static GLint imulExtended(GLint input, GLint input2, GLint &output2)
1144 {
1145 GLint64 result = static_cast<GLint64>(input) * static_cast<GLint64>(input2);
1146 output2 = GLint(result & 0xFFFFFFFF);
1147 return GLint(result >> 32);
1148 }
1149
1150 class ShaderBitfieldOperationCaseBinaryUint : public ShaderBitfieldOperationCase
1151 {
1152 public:
ShaderBitfieldOperationCaseBinaryUint(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * testStatement,BinaryUFunc func,Data const & input,Data const & input2,int components)1153 ShaderBitfieldOperationCaseBinaryUint(Context &context, const char *name, glu::GLSLVersion glslVersion,
1154 char const *testStatement, BinaryUFunc func, Data const &input,
1155 Data const &input2, int components)
1156 : ShaderBitfieldOperationCase(context, name, "", glslVersion, input, testStatement)
1157 , m_components(components)
1158 , m_func(func)
1159 {
1160 for (int i = 0; i < components; ++i)
1161 {
1162 m_data.in2Uvec4[i] = input2.inUvec4[i];
1163 }
1164 }
1165
1166 private:
1167 int m_components;
1168 BinaryUFunc m_func;
1169
test(Data const * data)1170 virtual bool test(Data const *data)
1171 {
1172 for (int i = 0; i < m_components; ++i)
1173 {
1174 GLuint expected2 = 0;
1175 GLuint expected = m_func(data->inUvec4[i], data->in2Uvec4[i], expected2);
1176 if (data->outUvec4[i] != expected || data->out2Uvec4[i] != expected2)
1177 {
1178 return false;
1179 }
1180 }
1181 return true;
1182 }
1183 };
1184
1185 class ShaderBitfieldOperationCaseBinaryUint1 : public ShaderBitfieldOperationCaseBinaryUint
1186 {
1187 public:
ShaderBitfieldOperationCaseBinaryUint1(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * testStatement,BinaryUFunc func,Data const & input,Data const & input2)1188 ShaderBitfieldOperationCaseBinaryUint1(Context &context, const char *name, glu::GLSLVersion glslVersion,
1189 char const *testStatement, BinaryUFunc func, Data const &input,
1190 Data const &input2)
1191 : ShaderBitfieldOperationCaseBinaryUint(context, name, glslVersion, testStatement, func, input, input2, 1)
1192 {
1193 }
1194 };
1195
1196 class ShaderBitfieldOperationCaseBinaryUint2 : public ShaderBitfieldOperationCaseBinaryUint
1197 {
1198 public:
ShaderBitfieldOperationCaseBinaryUint2(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * testStatement,BinaryUFunc func,Data const & input,Data const & input2)1199 ShaderBitfieldOperationCaseBinaryUint2(Context &context, const char *name, glu::GLSLVersion glslVersion,
1200 char const *testStatement, BinaryUFunc func, Data const &input,
1201 Data const &input2)
1202 : ShaderBitfieldOperationCaseBinaryUint(context, name, glslVersion, testStatement, func, input, input2, 2)
1203 {
1204 }
1205 };
1206
1207 class ShaderBitfieldOperationCaseBinaryUint3 : public ShaderBitfieldOperationCaseBinaryUint
1208 {
1209 public:
ShaderBitfieldOperationCaseBinaryUint3(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * testStatement,BinaryUFunc func,Data const & input,Data const & input2)1210 ShaderBitfieldOperationCaseBinaryUint3(Context &context, const char *name, glu::GLSLVersion glslVersion,
1211 char const *testStatement, BinaryUFunc func, Data const &input,
1212 Data const &input2)
1213 : ShaderBitfieldOperationCaseBinaryUint(context, name, glslVersion, testStatement, func, input, input2, 3)
1214 {
1215 }
1216 };
1217
1218 class ShaderBitfieldOperationCaseBinaryUint4 : public ShaderBitfieldOperationCaseBinaryUint
1219 {
1220 public:
ShaderBitfieldOperationCaseBinaryUint4(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * testStatement,BinaryUFunc func,Data const & input,Data const & input2)1221 ShaderBitfieldOperationCaseBinaryUint4(Context &context, const char *name, glu::GLSLVersion glslVersion,
1222 char const *testStatement, BinaryUFunc func, Data const &input,
1223 Data const &input2)
1224 : ShaderBitfieldOperationCaseBinaryUint(context, name, glslVersion, testStatement, func, input, input2, 4)
1225 {
1226 }
1227 };
1228
1229 class ShaderBitfieldOperationCaseBinaryInt : public ShaderBitfieldOperationCase
1230 {
1231 public:
ShaderBitfieldOperationCaseBinaryInt(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * testStatement,BinaryIFunc func,Data const & input,Data const & input2,int components)1232 ShaderBitfieldOperationCaseBinaryInt(Context &context, const char *name, glu::GLSLVersion glslVersion,
1233 char const *testStatement, BinaryIFunc func, Data const &input,
1234 Data const &input2, int components)
1235 : ShaderBitfieldOperationCase(context, name, "", glslVersion, input, testStatement)
1236 , m_components(components)
1237 , m_func(func)
1238 {
1239 for (int i = 0; i < components; ++i)
1240 {
1241 m_data.in2Ivec4[i] = input2.inIvec4[i];
1242 }
1243 }
1244
1245 private:
1246 int m_components;
1247 BinaryIFunc m_func;
1248
test(Data const * data)1249 virtual bool test(Data const *data)
1250 {
1251 for (int i = 0; i < m_components; ++i)
1252 {
1253 GLint expected2 = 0;
1254 GLint expected = m_func(data->inIvec4[i], data->in2Ivec4[i], expected2);
1255 if (data->outIvec4[i] != expected || data->out2Ivec4[i] != expected2)
1256 {
1257 return false;
1258 }
1259 }
1260 return true;
1261 }
1262 };
1263
1264 class ShaderBitfieldOperationCaseBinaryInt1 : public ShaderBitfieldOperationCaseBinaryInt
1265 {
1266 public:
ShaderBitfieldOperationCaseBinaryInt1(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * testStatement,BinaryIFunc func,Data const & input,Data const & input2)1267 ShaderBitfieldOperationCaseBinaryInt1(Context &context, const char *name, glu::GLSLVersion glslVersion,
1268 char const *testStatement, BinaryIFunc func, Data const &input,
1269 Data const &input2)
1270 : ShaderBitfieldOperationCaseBinaryInt(context, name, glslVersion, testStatement, func, input, input2, 1)
1271 {
1272 }
1273 };
1274
1275 class ShaderBitfieldOperationCaseBinaryInt2 : public ShaderBitfieldOperationCaseBinaryInt
1276 {
1277 public:
ShaderBitfieldOperationCaseBinaryInt2(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * testStatement,BinaryIFunc func,Data const & input,Data const & input2)1278 ShaderBitfieldOperationCaseBinaryInt2(Context &context, const char *name, glu::GLSLVersion glslVersion,
1279 char const *testStatement, BinaryIFunc func, Data const &input,
1280 Data const &input2)
1281 : ShaderBitfieldOperationCaseBinaryInt(context, name, glslVersion, testStatement, func, input, input2, 2)
1282 {
1283 }
1284 };
1285
1286 class ShaderBitfieldOperationCaseBinaryInt3 : public ShaderBitfieldOperationCaseBinaryInt
1287 {
1288 public:
ShaderBitfieldOperationCaseBinaryInt3(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * testStatement,BinaryIFunc func,Data const & input,Data const & input2)1289 ShaderBitfieldOperationCaseBinaryInt3(Context &context, const char *name, glu::GLSLVersion glslVersion,
1290 char const *testStatement, BinaryIFunc func, Data const &input,
1291 Data const &input2)
1292 : ShaderBitfieldOperationCaseBinaryInt(context, name, glslVersion, testStatement, func, input, input2, 3)
1293 {
1294 }
1295 };
1296
1297 class ShaderBitfieldOperationCaseBinaryInt4 : public ShaderBitfieldOperationCaseBinaryInt
1298 {
1299 public:
ShaderBitfieldOperationCaseBinaryInt4(Context & context,const char * name,glu::GLSLVersion glslVersion,char const * testStatement,BinaryIFunc func,Data const & input,Data const & input2)1300 ShaderBitfieldOperationCaseBinaryInt4(Context &context, const char *name, glu::GLSLVersion glslVersion,
1301 char const *testStatement, BinaryIFunc func, Data const &input,
1302 Data const &input2)
1303 : ShaderBitfieldOperationCaseBinaryInt(context, name, glslVersion, testStatement, func, input, input2, 4)
1304 {
1305 }
1306 };
1307
ShaderBitfieldOperationTests(Context & context,glu::GLSLVersion glslVersion)1308 ShaderBitfieldOperationTests::ShaderBitfieldOperationTests(Context &context, glu::GLSLVersion glslVersion)
1309 : TestCaseGroup(context, "shader_bitfield_operation", "Shader Bitfield Operation tests")
1310 , m_glslVersion(glslVersion)
1311 {
1312 }
1313
~ShaderBitfieldOperationTests(void)1314 ShaderBitfieldOperationTests::~ShaderBitfieldOperationTests(void)
1315 {
1316 }
1317
init(void)1318 void ShaderBitfieldOperationTests::init(void)
1319 {
1320 de::Random rnd(m_context.getTestContext().getCommandLine().getBaseSeed());
1321
1322 // shader_bitfield_operation.frexp
1323 tcu::TestCaseGroup *frexpGroup = new tcu::TestCaseGroup(m_testCtx, "frexp", "");
1324 addChild(frexpGroup);
1325 frexpGroup->addChild(new ShaderBitfieldOperationCaseFrexpFloat(m_context, "float_zero", m_glslVersion, Vec4(0.0)));
1326 for (int i = 0; i < ITERATIONS; ++i)
1327 {
1328 std::stringstream ss;
1329 ss << "float_" << i;
1330 frexpGroup->addChild(new ShaderBitfieldOperationCaseFrexpFloat(m_context, ss.str().c_str(), m_glslVersion,
1331 Vec4(rnd.getFloat())));
1332 }
1333 frexpGroup->addChild(
1334 new ShaderBitfieldOperationCaseFrexpVec2(m_context, "vec2_zero", m_glslVersion, Vec4(0.0, 0.0)));
1335 for (int i = 0; i < ITERATIONS; ++i)
1336 {
1337 std::stringstream ss;
1338 ss << "vec2_" << i;
1339 frexpGroup->addChild(new ShaderBitfieldOperationCaseFrexpVec2(m_context, ss.str().c_str(), m_glslVersion,
1340 Vec4(rnd.getFloat(), -rnd.getFloat())));
1341 }
1342 frexpGroup->addChild(
1343 new ShaderBitfieldOperationCaseFrexpVec3(m_context, "vec3_zero", m_glslVersion, Vec4(0.0, 0.0, 0.0)));
1344 for (int i = 0; i < ITERATIONS; ++i)
1345 {
1346 std::stringstream ss;
1347 ss << "vec3_" << i;
1348 frexpGroup->addChild(new ShaderBitfieldOperationCaseFrexpVec3(
1349 m_context, ss.str().c_str(), m_glslVersion, Vec4(rnd.getFloat(), -rnd.getFloat(), rnd.getFloat())));
1350 }
1351 frexpGroup->addChild(
1352 new ShaderBitfieldOperationCaseFrexpVec4(m_context, "vec4_zero", m_glslVersion, Vec4(0.0, 0.0, 0.0, 0.0)));
1353 for (int i = 0; i < ITERATIONS; ++i)
1354 {
1355 std::stringstream ss;
1356 ss << "vec4_" << i;
1357 frexpGroup->addChild(new ShaderBitfieldOperationCaseFrexpVec4(
1358 m_context, ss.str().c_str(), m_glslVersion,
1359 Vec4(rnd.getFloat(), -rnd.getFloat(), rnd.getFloat(), -rnd.getFloat())));
1360 }
1361
1362 // shader_bitfield_operation.ldexp
1363 tcu::TestCaseGroup *ldexpGroup = new tcu::TestCaseGroup(m_testCtx, "ldexp", "");
1364 addChild(ldexpGroup);
1365 ldexpGroup->addChild(
1366 new ShaderBitfieldOperationCaseLdexpFloat(m_context, "float_zero", m_glslVersion, Vec4(0.0), Ivec4(0)));
1367 for (int i = 0; i < ITERATIONS; ++i)
1368 {
1369 std::stringstream ss;
1370 ss << "float_" << i;
1371 ldexpGroup->addChild(new ShaderBitfieldOperationCaseLdexpFloat(m_context, ss.str().c_str(), m_glslVersion,
1372 Vec4(rnd.getFloat()), Ivec4(rnd.getInt(-8, 8))));
1373 }
1374 ldexpGroup->addChild(
1375 new ShaderBitfieldOperationCaseLdexpVec2(m_context, "vec2_zero", m_glslVersion, Vec4(0.0, 0.0), Ivec4(0, 0)));
1376 for (int i = 0; i < ITERATIONS; ++i)
1377 {
1378 std::stringstream ss;
1379 ss << "vec2_" << i;
1380 ldexpGroup->addChild(new ShaderBitfieldOperationCaseLdexpVec2(m_context, ss.str().c_str(), m_glslVersion,
1381 Vec4(rnd.getFloat(), -rnd.getFloat()),
1382 Ivec4(rnd.getInt(-8, 8), rnd.getInt(-8, 8))));
1383 }
1384 ldexpGroup->addChild(new ShaderBitfieldOperationCaseLdexpVec3(m_context, "vec3_zero", m_glslVersion,
1385 Vec4(0.0, 0.0, 0.0), Ivec4(0, 0, 0)));
1386 for (int i = 0; i < ITERATIONS; ++i)
1387 {
1388 std::stringstream ss;
1389 ss << "vec3_" << i;
1390 ldexpGroup->addChild(new ShaderBitfieldOperationCaseLdexpVec3(
1391 m_context, ss.str().c_str(), m_glslVersion, Vec4(rnd.getFloat(), -rnd.getFloat(), rnd.getFloat()),
1392 Ivec4(rnd.getInt(-8, 8), rnd.getInt(-8, 8), rnd.getInt(-8, 8))));
1393 }
1394 ldexpGroup->addChild(new ShaderBitfieldOperationCaseLdexpVec4(m_context, "vec4_zero", m_glslVersion,
1395 Vec4(0.0, 0.0, 0.0, 0.0), Ivec4(0, 0, 0, 0)));
1396 for (int i = 0; i < ITERATIONS; ++i)
1397 {
1398 std::stringstream ss;
1399 ss << "vec4_" << i;
1400 ldexpGroup->addChild(new ShaderBitfieldOperationCaseLdexpVec4(
1401 m_context, ss.str().c_str(), m_glslVersion,
1402 Vec4(rnd.getFloat(), -rnd.getFloat(), rnd.getFloat(), -rnd.getFloat()),
1403 Ivec4(rnd.getInt(-8, 8), rnd.getInt(-8, 8), rnd.getInt(-8, 8), rnd.getInt(-8, 8))));
1404 }
1405
1406 // shader_bitfield_operation.packUnorm4x8
1407 tcu::TestCaseGroup *packUnormGroup = new tcu::TestCaseGroup(m_testCtx, "packUnorm4x8", "");
1408 addChild(packUnormGroup);
1409 for (int i = 0; i < ITERATIONS; ++i)
1410 {
1411 std::stringstream ss;
1412 ss << i;
1413 packUnormGroup->addChild(new ShaderBitfieldOperationCasePackUnorm(
1414 m_context, ss.str().c_str(), m_glslVersion,
1415 Vec4(rnd.getFloat(), rnd.getFloat(), rnd.getFloat(), rnd.getFloat())));
1416 }
1417
1418 // shader_bitfield_operation.packSnorm4x8
1419 tcu::TestCaseGroup *packSnormGroup = new tcu::TestCaseGroup(m_testCtx, "packSnorm4x8", "");
1420 addChild(packSnormGroup);
1421 for (int i = 0; i < ITERATIONS; ++i)
1422 {
1423 std::stringstream ss;
1424 ss << i;
1425 packSnormGroup->addChild(new ShaderBitfieldOperationCasePackSnorm(
1426 m_context, ss.str().c_str(), m_glslVersion,
1427 Vec4(rnd.getFloat(), -rnd.getFloat(), rnd.getFloat(), -rnd.getFloat())));
1428 }
1429
1430 // shader_bitfield_operation.unpackUnorm4x8
1431 tcu::TestCaseGroup *unpackUnormGroup = new tcu::TestCaseGroup(m_testCtx, "unpackUnorm4x8", "");
1432 addChild(unpackUnormGroup);
1433 for (int i = 0; i < ITERATIONS; ++i)
1434 {
1435 std::stringstream ss;
1436 ss << i;
1437 unpackUnormGroup->addChild(new ShaderBitfieldOperationCaseUnpackUnorm(m_context, ss.str().c_str(),
1438 m_glslVersion, Uvec4(rnd.getUint32())));
1439 }
1440
1441 // shader_bitfield_operation.unpackSnorm4x8
1442 tcu::TestCaseGroup *unpackSnormGroup = new tcu::TestCaseGroup(m_testCtx, "unpackSnorm4x8", "");
1443 addChild(unpackSnormGroup);
1444 for (int i = 0; i < ITERATIONS; ++i)
1445 {
1446 std::stringstream ss;
1447 ss << i;
1448 unpackSnormGroup->addChild(new ShaderBitfieldOperationCaseUnpackSnorm(m_context, ss.str().c_str(),
1449 m_glslVersion, Uvec4(rnd.getUint32())));
1450 }
1451
1452 // shader_bitfield_operation.bitfieldExtract
1453 tcu::TestCaseGroup *bitfieldExtractGroup = new tcu::TestCaseGroup(m_testCtx, "bitfieldExtract", "");
1454 addChild(bitfieldExtractGroup);
1455 for (int i = 0; i < ITERATIONS; ++i)
1456 {
1457 std::stringstream ss;
1458 ss << "uint_" << i;
1459 bitfieldExtractGroup->addChild(new ShaderBitfieldOperationCaseBitfieldExtractUint1(
1460 m_context, ss.str().c_str(), m_glslVersion, Uvec4(rnd.getUint32()), rnd.getInt(0, 31), rnd.getInt(1, 32)));
1461 }
1462 for (int i = 0; i < ITERATIONS; ++i)
1463 {
1464 std::stringstream ss;
1465 ss << "uvec2_" << i;
1466 bitfieldExtractGroup->addChild(new ShaderBitfieldOperationCaseBitfieldExtractUint2(
1467 m_context, ss.str().c_str(), m_glslVersion, Uvec4(rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31),
1468 rnd.getInt(1, 32)));
1469 }
1470 for (int i = 0; i < ITERATIONS; ++i)
1471 {
1472 std::stringstream ss;
1473 ss << "uvec3_" << i;
1474 bitfieldExtractGroup->addChild(new ShaderBitfieldOperationCaseBitfieldExtractUint3(
1475 m_context, ss.str().c_str(), m_glslVersion, Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
1476 rnd.getInt(0, 31), rnd.getInt(1, 32)));
1477 }
1478 for (int i = 0; i < ITERATIONS; ++i)
1479 {
1480 std::stringstream ss;
1481 ss << "uvec4_" << i;
1482 bitfieldExtractGroup->addChild(new ShaderBitfieldOperationCaseBitfieldExtractUint4(
1483 m_context, ss.str().c_str(), m_glslVersion,
1484 Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31),
1485 rnd.getInt(1, 32)));
1486 }
1487
1488 for (int i = 0; i < ITERATIONS; ++i)
1489 {
1490 std::stringstream ss;
1491 ss << "int_" << i;
1492 bitfieldExtractGroup->addChild(new ShaderBitfieldOperationCaseBitfieldExtractInt1(
1493 m_context, ss.str().c_str(), m_glslVersion, Ivec4(rnd.getUint32()), rnd.getInt(0, 31), rnd.getInt(1, 32)));
1494 }
1495 for (int i = 0; i < ITERATIONS; ++i)
1496 {
1497 std::stringstream ss;
1498 ss << "ivec2_" << i;
1499 bitfieldExtractGroup->addChild(new ShaderBitfieldOperationCaseBitfieldExtractInt2(
1500 m_context, ss.str().c_str(), m_glslVersion, Ivec4(rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31),
1501 rnd.getInt(1, 32)));
1502 }
1503 for (int i = 0; i < ITERATIONS; ++i)
1504 {
1505 std::stringstream ss;
1506 ss << "ivec3_" << i;
1507 bitfieldExtractGroup->addChild(new ShaderBitfieldOperationCaseBitfieldExtractInt3(
1508 m_context, ss.str().c_str(), m_glslVersion, Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
1509 rnd.getInt(0, 31), rnd.getInt(1, 32)));
1510 }
1511 for (int i = 0; i < ITERATIONS; ++i)
1512 {
1513 std::stringstream ss;
1514 ss << "ivec4_" << i;
1515 bitfieldExtractGroup->addChild(new ShaderBitfieldOperationCaseBitfieldExtractInt4(
1516 m_context, ss.str().c_str(), m_glslVersion,
1517 Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31),
1518 rnd.getInt(1, 32)));
1519 }
1520
1521 // shader_bitfield_operation.bitfieldInsert
1522 tcu::TestCaseGroup *bitfieldInsertGroup = new tcu::TestCaseGroup(m_testCtx, "bitfieldInsert", "");
1523 addChild(bitfieldInsertGroup);
1524 for (int i = 0; i < ITERATIONS; ++i)
1525 {
1526 std::stringstream ss;
1527 ss << "uint_" << i;
1528 bitfieldInsertGroup->addChild(new ShaderBitfieldOperationCaseBitfieldInsertUint1(
1529 m_context, ss.str().c_str(), m_glslVersion, Uvec4(rnd.getUint32()), Uvec4(rnd.getUint32()),
1530 rnd.getInt(0, 31), rnd.getInt(1, 32)));
1531 }
1532 for (int i = 0; i < ITERATIONS; ++i)
1533 {
1534 std::stringstream ss;
1535 ss << "uvec2_" << i;
1536 bitfieldInsertGroup->addChild(new ShaderBitfieldOperationCaseBitfieldInsertUint2(
1537 m_context, ss.str().c_str(), m_glslVersion, Uvec4(rnd.getUint32(), rnd.getUint32()),
1538 Uvec4(rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31), rnd.getInt(1, 32)));
1539 }
1540 for (int i = 0; i < ITERATIONS; ++i)
1541 {
1542 std::stringstream ss;
1543 ss << "uvec3_" << i;
1544 bitfieldInsertGroup->addChild(new ShaderBitfieldOperationCaseBitfieldInsertUint3(
1545 m_context, ss.str().c_str(), m_glslVersion, Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
1546 Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31), rnd.getInt(1, 32)));
1547 }
1548 for (int i = 0; i < ITERATIONS; ++i)
1549 {
1550 std::stringstream ss;
1551 ss << "uvec4_" << i;
1552 bitfieldInsertGroup->addChild(new ShaderBitfieldOperationCaseBitfieldInsertUint4(
1553 m_context, ss.str().c_str(), m_glslVersion,
1554 Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
1555 Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31),
1556 rnd.getInt(1, 32)));
1557 }
1558
1559 for (int i = 0; i < ITERATIONS; ++i)
1560 {
1561 std::stringstream ss;
1562 ss << "int_" << i;
1563 bitfieldInsertGroup->addChild(new ShaderBitfieldOperationCaseBitfieldInsertInt1(
1564 m_context, ss.str().c_str(), m_glslVersion, Ivec4(rnd.getUint32()), Ivec4(rnd.getUint32()),
1565 rnd.getInt(0, 31), rnd.getInt(1, 32)));
1566 }
1567 for (int i = 0; i < ITERATIONS; ++i)
1568 {
1569 std::stringstream ss;
1570 ss << "ivec2_" << i;
1571 bitfieldInsertGroup->addChild(new ShaderBitfieldOperationCaseBitfieldInsertInt2(
1572 m_context, ss.str().c_str(), m_glslVersion, Ivec4(rnd.getUint32(), rnd.getUint32()),
1573 Ivec4(rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31), rnd.getInt(1, 32)));
1574 }
1575 for (int i = 0; i < ITERATIONS; ++i)
1576 {
1577 std::stringstream ss;
1578 ss << "ivec3_" << i;
1579 bitfieldInsertGroup->addChild(new ShaderBitfieldOperationCaseBitfieldInsertInt3(
1580 m_context, ss.str().c_str(), m_glslVersion, Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
1581 Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31), rnd.getInt(1, 32)));
1582 }
1583 for (int i = 0; i < ITERATIONS; ++i)
1584 {
1585 std::stringstream ss;
1586 ss << "ivec4_" << i;
1587 bitfieldInsertGroup->addChild(new ShaderBitfieldOperationCaseBitfieldInsertInt4(
1588 m_context, ss.str().c_str(), m_glslVersion,
1589 Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
1590 Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31),
1591 rnd.getInt(1, 32)));
1592 }
1593
1594 struct UnaryTest
1595 {
1596 char const *funcName;
1597 UnaryUFunc funcU;
1598 UnaryIFunc funcI;
1599 } commonTests[] = {
1600 {"bitfieldReverse", bitfieldReverse,
1601 reinterpret_cast<UnaryIFunc>(bitfieldReverse)}, // shader_bitfield_operation.bitfieldReverse
1602 {"bitCount", bitCount, reinterpret_cast<UnaryIFunc>(bitCount)}, // shader_bitfield_operation.bitCount
1603 {"findLSB", findLSB, reinterpret_cast<UnaryIFunc>(findLSB)}, // shader_bitfield_operation.findLSB
1604 {"findMSB", findMSBU, findMSBI}, // shader_bitfield_operation.findMSB
1605 };
1606 for (int test = 0; test < DE_LENGTH_OF_ARRAY(commonTests); ++test)
1607 {
1608 tcu::TestCaseGroup *commonGroup = new tcu::TestCaseGroup(m_testCtx, commonTests[test].funcName, "");
1609 addChild(commonGroup);
1610 commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryUint1(
1611 m_context, "uint_zero", m_glslVersion, commonTests[test].funcName, commonTests[test].funcU, Uvec4(0)));
1612 for (int i = 0; i < ITERATIONS; ++i)
1613 {
1614 std::stringstream ss;
1615 ss << "uint_" << i;
1616 commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryUint1(
1617 m_context, ss.str().c_str(), m_glslVersion, commonTests[test].funcName, commonTests[test].funcU,
1618 Uvec4(rnd.getUint32())));
1619 }
1620 for (int i = 0; i < ITERATIONS; ++i)
1621 {
1622 std::stringstream ss;
1623 ss << "uvec2_" << i;
1624 commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryUint2(
1625 m_context, ss.str().c_str(), m_glslVersion, commonTests[test].funcName, commonTests[test].funcU,
1626 Uvec4(rnd.getUint32(), rnd.getUint32())));
1627 }
1628 for (int i = 0; i < ITERATIONS; ++i)
1629 {
1630 std::stringstream ss;
1631 ss << "uvec3_" << i;
1632 commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryUint3(
1633 m_context, ss.str().c_str(), m_glslVersion, commonTests[test].funcName, commonTests[test].funcU,
1634 Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
1635 }
1636 for (int i = 0; i < ITERATIONS; ++i)
1637 {
1638 std::stringstream ss;
1639 ss << "uvec4_" << i;
1640 commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryUint4(
1641 m_context, ss.str().c_str(), m_glslVersion, commonTests[test].funcName, commonTests[test].funcU,
1642 Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
1643 }
1644
1645 commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryInt1(
1646 m_context, "int_zero", m_glslVersion, commonTests[test].funcName, commonTests[test].funcI, Ivec4(0)));
1647 commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryInt1(
1648 m_context, "int_minus_one", m_glslVersion, commonTests[test].funcName, commonTests[test].funcI, Ivec4(-1)));
1649 for (int i = 0; i < ITERATIONS; ++i)
1650 {
1651 std::stringstream ss;
1652 ss << "int_" << i;
1653 commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryInt1(
1654 m_context, ss.str().c_str(), m_glslVersion, commonTests[test].funcName, commonTests[test].funcI,
1655 Ivec4(rnd.getUint32())));
1656 }
1657 for (int i = 0; i < ITERATIONS; ++i)
1658 {
1659 std::stringstream ss;
1660 ss << "ivec2_" << i;
1661 commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryInt2(
1662 m_context, ss.str().c_str(), m_glslVersion, commonTests[test].funcName, commonTests[test].funcI,
1663 Ivec4(rnd.getUint32(), rnd.getUint32())));
1664 }
1665 for (int i = 0; i < ITERATIONS; ++i)
1666 {
1667 std::stringstream ss;
1668 ss << "ivec3_" << i;
1669 commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryInt3(
1670 m_context, ss.str().c_str(), m_glslVersion, commonTests[test].funcName, commonTests[test].funcI,
1671 Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
1672 }
1673 for (int i = 0; i < ITERATIONS; ++i)
1674 {
1675 std::stringstream ss;
1676 ss << "ivec4_" << i;
1677 commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryInt4(
1678 m_context, ss.str().c_str(), m_glslVersion, commonTests[test].funcName, commonTests[test].funcI,
1679 Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
1680 }
1681 }
1682
1683 // shader_bitfield_operation.uaddCarry
1684 tcu::TestCaseGroup *uaddCarryGroup = new tcu::TestCaseGroup(m_testCtx, "uaddCarry", "");
1685 addChild(uaddCarryGroup);
1686 for (int i = 0; i < ITERATIONS; ++i)
1687 {
1688 std::stringstream ss;
1689 ss << "uint_" << i;
1690 uaddCarryGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint1(
1691 m_context, ss.str().c_str(), m_glslVersion, "outUvec4.x = uaddCarry(inUvec4.x, in2Uvec4.x, out2Uvec4.x);",
1692 uaddCarry, Uvec4(rnd.getUint32()), Uvec4(rnd.getUint32())));
1693 }
1694 for (int i = 0; i < ITERATIONS; ++i)
1695 {
1696 std::stringstream ss;
1697 ss << "uvec2_" << i;
1698 uaddCarryGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint2(
1699 m_context, ss.str().c_str(), m_glslVersion,
1700 "outUvec4.xy = uaddCarry(inUvec4.xy, in2Uvec4.xy, out2Uvec4.xy);", uaddCarry,
1701 Uvec4(rnd.getUint32(), rnd.getUint32()), Uvec4(rnd.getUint32(), rnd.getUint32())));
1702 }
1703 for (int i = 0; i < ITERATIONS; ++i)
1704 {
1705 std::stringstream ss;
1706 ss << "uvec3_" << i;
1707 uaddCarryGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint3(
1708 m_context, ss.str().c_str(), m_glslVersion,
1709 "outUvec4.xyz = uaddCarry(inUvec4.xyz, in2Uvec4.xyz, out2Uvec4.xyz);", uaddCarry,
1710 Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
1711 Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
1712 }
1713 for (int i = 0; i < ITERATIONS; ++i)
1714 {
1715 std::stringstream ss;
1716 ss << "uvec4_" << i;
1717 uaddCarryGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint4(
1718 m_context, ss.str().c_str(), m_glslVersion, "outUvec4 = uaddCarry(inUvec4, in2Uvec4, out2Uvec4);",
1719 uaddCarry, Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
1720 Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
1721 }
1722
1723 // shader_bitfield_operation.usubBorrow
1724 tcu::TestCaseGroup *usubBorrowGroup = new tcu::TestCaseGroup(m_testCtx, "usubBorrow", "");
1725 addChild(usubBorrowGroup);
1726 for (int i = 0; i < ITERATIONS; ++i)
1727 {
1728 std::stringstream ss;
1729 ss << "uint_" << i;
1730 usubBorrowGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint1(
1731 m_context, ss.str().c_str(), m_glslVersion, "outUvec4.x = usubBorrow(inUvec4.x, in2Uvec4.x, out2Uvec4.x);",
1732 usubBorrow, Uvec4(rnd.getUint32()), Uvec4(rnd.getUint32())));
1733 }
1734 for (int i = 0; i < ITERATIONS; ++i)
1735 {
1736 std::stringstream ss;
1737 ss << "uvec2_" << i;
1738 usubBorrowGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint2(
1739 m_context, ss.str().c_str(), m_glslVersion,
1740 "outUvec4.xy = usubBorrow(inUvec4.xy, in2Uvec4.xy, out2Uvec4.xy);", usubBorrow,
1741 Uvec4(rnd.getUint32(), rnd.getUint32()), Uvec4(rnd.getUint32(), rnd.getUint32())));
1742 }
1743 for (int i = 0; i < ITERATIONS; ++i)
1744 {
1745 std::stringstream ss;
1746 ss << "uvec3_" << i;
1747 usubBorrowGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint3(
1748 m_context, ss.str().c_str(), m_glslVersion,
1749 "outUvec4.xyz = usubBorrow(inUvec4.xyz, in2Uvec4.xyz, out2Uvec4.xyz);", usubBorrow,
1750 Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
1751 Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
1752 }
1753 for (int i = 0; i < ITERATIONS; ++i)
1754 {
1755 std::stringstream ss;
1756 ss << "uvec4_" << i;
1757 usubBorrowGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint4(
1758 m_context, ss.str().c_str(), m_glslVersion, "outUvec4 = usubBorrow(inUvec4, in2Uvec4, out2Uvec4);",
1759 usubBorrow, Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
1760 Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
1761 }
1762
1763 // shader_bitfield_operation.umulExtended
1764 tcu::TestCaseGroup *umulExtendedGroup = new tcu::TestCaseGroup(m_testCtx, "umulExtended", "");
1765 addChild(umulExtendedGroup);
1766 for (int i = 0; i < ITERATIONS; ++i)
1767 {
1768 std::stringstream ss;
1769 ss << "uint_" << i;
1770 umulExtendedGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint1(
1771 m_context, ss.str().c_str(), m_glslVersion, "umulExtended(inUvec4.x, in2Uvec4.x, outUvec4.x, out2Uvec4.x);",
1772 umulExtended, Uvec4(rnd.getUint32()), Uvec4(rnd.getUint32())));
1773 }
1774 for (int i = 0; i < ITERATIONS; ++i)
1775 {
1776 std::stringstream ss;
1777 ss << "uvec2_" << i;
1778 umulExtendedGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint2(
1779 m_context, ss.str().c_str(), m_glslVersion,
1780 "umulExtended(inUvec4.xy, in2Uvec4.xy, outUvec4.xy, out2Uvec4.xy);", umulExtended,
1781 Uvec4(rnd.getUint32(), rnd.getUint32()), Uvec4(rnd.getUint32(), rnd.getUint32())));
1782 }
1783 for (int i = 0; i < ITERATIONS; ++i)
1784 {
1785 std::stringstream ss;
1786 ss << "uvec3_" << i;
1787 umulExtendedGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint3(
1788 m_context, ss.str().c_str(), m_glslVersion,
1789 "umulExtended(inUvec4.xyz, in2Uvec4.xyz, outUvec4.xyz, out2Uvec4.xyz);", umulExtended,
1790 Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
1791 Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
1792 }
1793 for (int i = 0; i < ITERATIONS; ++i)
1794 {
1795 std::stringstream ss;
1796 ss << "uvec4_" << i;
1797 umulExtendedGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint4(
1798 m_context, ss.str().c_str(), m_glslVersion, "umulExtended(inUvec4, in2Uvec4, outUvec4, out2Uvec4);",
1799 umulExtended, Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
1800 Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
1801 }
1802
1803 // shader_bitfield_operation.imulExtended
1804 tcu::TestCaseGroup *imulExtendedGroup = new tcu::TestCaseGroup(m_testCtx, "imulExtended", "");
1805 addChild(imulExtendedGroup);
1806 for (int i = 0; i < ITERATIONS; ++i)
1807 {
1808 std::stringstream ss;
1809 ss << "int_" << i;
1810 imulExtendedGroup->addChild(new ShaderBitfieldOperationCaseBinaryInt1(
1811 m_context, ss.str().c_str(), m_glslVersion, "imulExtended(inIvec4.x, in2Ivec4.x, outIvec4.x, out2Ivec4.x);",
1812 imulExtended, Ivec4(rnd.getUint32()), Ivec4(rnd.getUint32())));
1813 }
1814 for (int i = 0; i < ITERATIONS; ++i)
1815 {
1816 std::stringstream ss;
1817 ss << "ivec2_" << i;
1818 imulExtendedGroup->addChild(new ShaderBitfieldOperationCaseBinaryInt2(
1819 m_context, ss.str().c_str(), m_glslVersion,
1820 "imulExtended(inIvec4.xy, in2Ivec4.xy, outIvec4.xy, out2Ivec4.xy);", imulExtended,
1821 Ivec4(rnd.getUint32(), rnd.getUint32()), Ivec4(rnd.getUint32(), rnd.getUint32())));
1822 }
1823 for (int i = 0; i < ITERATIONS; ++i)
1824 {
1825 std::stringstream ss;
1826 ss << "ivec3_" << i;
1827 imulExtendedGroup->addChild(new ShaderBitfieldOperationCaseBinaryInt3(
1828 m_context, ss.str().c_str(), m_glslVersion,
1829 "imulExtended(inIvec4.xyz, in2Ivec4.xyz, outIvec4.xyz, out2Ivec4.xyz);", imulExtended,
1830 Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
1831 Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
1832 }
1833 for (int i = 0; i < ITERATIONS; ++i)
1834 {
1835 std::stringstream ss;
1836 ss << "ivec4_" << i;
1837 imulExtendedGroup->addChild(new ShaderBitfieldOperationCaseBinaryInt4(
1838 m_context, ss.str().c_str(), m_glslVersion, "imulExtended(inIvec4, in2Ivec4, outIvec4, out2Ivec4);",
1839 imulExtended, Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
1840 Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
1841 }
1842 }
1843
1844 } // namespace glcts
1845