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