blob: 43c72766536715b498cc64522989e1caef4dfcd4 [file] [log] [blame]
/*-------------------------------------------------------------------------
* OpenGL Conformance Test Suite
* -----------------------------
*
* Copyright (c) 2014-2016 The Khronos Group Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/ /*!
* \file
* \brief
*/ /*-------------------------------------------------------------------*/
#include "es31cShaderBitfieldOperationTests.hpp"
#include "deMath.h"
#include "deRandom.hpp"
#include "deString.h"
#include "deStringUtil.hpp"
#include "deFloat16.h"
#include "gluContextInfo.hpp"
#include "gluDrawUtil.hpp"
#include "gluPixelTransfer.hpp"
#include "gluShaderProgram.hpp"
#include "glw.h"
#include "glwFunctions.hpp"
#include "tcuCommandLine.hpp"
#include "tcuStringTemplate.hpp"
#include "tcuSurface.hpp"
#include "tcuTestLog.hpp"
namespace glcts
{
using tcu::TestLog;
using std::string;
using std::vector;
using glcts::Context;
static std::string specializeVersion(const std::string& source, glu::GLSLVersion version, const char* testStatement)
{
DE_ASSERT(version == glu::GLSL_VERSION_310_ES || version >= glu::GLSL_VERSION_430);
std::map<std::string, std::string> args;
args["VERSION_DECL"] = glu::getGLSLVersionDeclaration(version);
args["TEST_STATEMENT"] = testStatement;
return tcu::StringTemplate(source.c_str()).specialize(args);
}
struct Data
{
Data()
{
memset(this, 0, sizeof *this);
}
Data(Data const& init)
{
memcpy(this, &init, sizeof *this);
}
GLuint inUvec4[4];
GLint inIvec4[4];
GLfloat inVec4[4];
GLuint in2Uvec4[4];
GLint in2Ivec4[4];
GLfloat in2Vec4[4];
GLint offset;
GLint bits;
GLint padding[2];
GLuint outUvec4[4];
GLint outIvec4[4];
GLfloat outVec4[4];
GLuint out2Uvec4[4];
GLint out2Ivec4[4];
GLfloat out2Vec4[4];
};
struct Uvec4 : public Data
{
Uvec4(GLuint x = 0, GLuint y = 0, GLuint z = 0, GLuint w = 0)
{
inUvec4[0] = x;
inUvec4[1] = y;
inUvec4[2] = z;
inUvec4[3] = w;
}
};
struct Ivec4 : public Data
{
Ivec4(GLint x = 0, GLint y = 0, GLint z = 0, GLint w = 0)
{
inIvec4[0] = x;
inIvec4[1] = y;
inIvec4[2] = z;
inIvec4[3] = w;
}
};
struct Vec4 : public Data
{
Vec4(GLfloat x = 0.0f, GLfloat y = 0.0f, GLfloat z = 0.0f, GLfloat w = 0.0f)
{
inVec4[0] = x;
inVec4[1] = y;
inVec4[2] = z;
inVec4[3] = w;
}
};
class ShaderBitfieldOperationCase : public TestCase
{
public:
ShaderBitfieldOperationCase(Context& context, const char* name, const char* description,
glu::GLSLVersion glslVersion, Data const& data, char const* testStatement);
~ShaderBitfieldOperationCase();
IterateResult iterate();
protected:
glu::GLSLVersion m_glslVersion;
Data m_data;
std::string m_testStatement;
virtual bool test(Data const* data) = 0;
};
ShaderBitfieldOperationCase::ShaderBitfieldOperationCase(Context& context, const char* name, const char* description,
glu::GLSLVersion glslVersion, Data const& data,
char const* testStatement)
: TestCase(context, name, description), m_glslVersion(glslVersion), m_data(data), m_testStatement(testStatement)
{
DE_ASSERT(glslVersion == glu::GLSL_VERSION_310_ES || glslVersion >= glu::GLSL_VERSION_430);
}
ShaderBitfieldOperationCase::~ShaderBitfieldOperationCase()
{
}
ShaderBitfieldOperationCase::IterateResult ShaderBitfieldOperationCase::iterate()
{
const glw::Functions& gl = m_context.getRenderContext().getFunctions();
bool isOk = true;
GLuint data;
gl.genBuffers(1, &data);
gl.bindBuffer(GL_SHADER_STORAGE_BUFFER, data);
gl.bufferData(GL_SHADER_STORAGE_BUFFER, sizeof(Data), &m_data, GL_STATIC_DRAW);
gl.bindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, data);
char const* css = "${VERSION_DECL}\n"
"\n"
"layout(local_size_x = 1) in;\n"
"\n"
"layout(binding = 0, std430) buffer Data {\n"
" uvec4 inUvec4;\n"
" ivec4 inIvec4;\n"
" vec4 inVec4;\n"
"\n"
" uvec4 in2Uvec4;\n"
" ivec4 in2Ivec4;\n"
" vec4 in2Vec4;\n"
"\n"
" int offset;\n"
" int bits;\n"
"\n"
" uvec4 outUvec4;\n"
" ivec4 outIvec4;\n"
" vec4 outVec4;\n"
"\n"
" uvec4 out2Uvec4;\n"
" ivec4 out2Ivec4;\n"
" vec4 out2Vec4;\n"
"};\n"
"\n"
"void main()\n"
"{\n"
" ${TEST_STATEMENT};\n"
"}\n";
GLuint cs = gl.createShader(GL_COMPUTE_SHADER);
std::string csString = specializeVersion(css, m_glslVersion, m_testStatement.c_str());
char const* strings[1] = { csString.c_str() };
gl.shaderSource(cs, 1, strings, 0);
gl.compileShader(cs);
GLint compileSuccess = 0;
gl.getShaderiv(cs, GL_COMPILE_STATUS, &compileSuccess);
if (!compileSuccess)
{
TCU_FAIL("Compile failed");
}
GLuint pgm = gl.createProgram();
gl.attachShader(pgm, cs);
gl.linkProgram(pgm);
GLint linkSuccess = 0;
gl.getProgramiv(pgm, GL_LINK_STATUS, &linkSuccess);
if (!linkSuccess)
{
gl.deleteShader(cs);
TCU_FAIL("Link failed");
}
gl.useProgram(pgm);
gl.dispatchCompute(1, 1, 1);
Data const* results = (Data const*)gl.mapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(Data), GL_MAP_READ_BIT);
isOk = test(results);
gl.unmapBuffer(GL_SHADER_STORAGE_BUFFER);
gl.useProgram(0);
gl.deleteProgram(pgm);
gl.deleteShader(cs);
gl.deleteBuffers(1, &data);
m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL, isOk ? "Pass" : "Fail");
return STOP;
}
class ShaderBitfieldOperationCaseFrexp : public ShaderBitfieldOperationCase
{
public:
ShaderBitfieldOperationCaseFrexp(Context& context, const char* name, glu::GLSLVersion glslVersion, Data const& data,
int components, char const* testStatement)
: ShaderBitfieldOperationCase(context, name, "", glslVersion, data, testStatement), m_components(components)
{
}
private:
int m_components;
virtual bool test(Data const* data)
{
for (int i = 0; i < m_components; ++i)
{
if (data->inVec4[i] == 0.0)
{
if (data->outVec4[i] != 0.0 || data->outIvec4[i] != 0)
{
return false;
}
}
else if (deFloatAbs(data->outVec4[i]) < 0.5 || deFloatAbs(data->outVec4[i]) >= 1.0)
{
return false;
}
float result = data->outVec4[i] * deFloatPow(2.0, (float)data->outIvec4[i]);
if (deFloatAbs(result - data->inVec4[i]) > 0.0001f)
{
return false;
}
}
return true;
}
};
class ShaderBitfieldOperationCaseFrexpFloat : public ShaderBitfieldOperationCaseFrexp
{
public:
ShaderBitfieldOperationCaseFrexpFloat(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data)
: ShaderBitfieldOperationCaseFrexp(context, name, glslVersion, data, 1,
"outVec4.x = frexp(inVec4.x, outIvec4.x)")
{
}
};
class ShaderBitfieldOperationCaseFrexpVec2 : public ShaderBitfieldOperationCaseFrexp
{
public:
ShaderBitfieldOperationCaseFrexpVec2(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data)
: ShaderBitfieldOperationCaseFrexp(context, name, glslVersion, data, 2,
"outVec4.xy = frexp(inVec4.xy, outIvec4.xy)")
{
}
};
class ShaderBitfieldOperationCaseFrexpVec3 : public ShaderBitfieldOperationCaseFrexp
{
public:
ShaderBitfieldOperationCaseFrexpVec3(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data)
: ShaderBitfieldOperationCaseFrexp(context, name, glslVersion, data, 3,
"outVec4.xyz = frexp(inVec4.xyz, outIvec4.xyz)")
{
}
};
class ShaderBitfieldOperationCaseFrexpVec4 : public ShaderBitfieldOperationCaseFrexp
{
public:
ShaderBitfieldOperationCaseFrexpVec4(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data)
: ShaderBitfieldOperationCaseFrexp(context, name, glslVersion, data, 4, "outVec4 = frexp(inVec4, outIvec4)")
{
}
};
class ShaderBitfieldOperationCaseLdexp : public ShaderBitfieldOperationCase
{
public:
ShaderBitfieldOperationCaseLdexp(Context& context, const char* name, glu::GLSLVersion glslVersion, Data const& data,
int components, char const* testStatement)
: ShaderBitfieldOperationCase(context, name, "", glslVersion, data, testStatement), m_components(components)
{
}
private:
int m_components;
virtual bool test(Data const* data)
{
for (int i = 0; i < m_components; ++i)
{
float expected = deFloatLdExp(data->inVec4[i], data->inIvec4[i]);
if (deFloatAbs(expected - data->outVec4[i]) > 0.0001f)
{
return false;
}
}
return true;
}
};
class ShaderBitfieldOperationCaseLdexpFloat : public ShaderBitfieldOperationCaseLdexp
{
public:
ShaderBitfieldOperationCaseLdexpFloat(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, Data const& exp)
: ShaderBitfieldOperationCaseLdexp(context, name, glslVersion, data, 1,
"outVec4.x = ldexp(inVec4.x, inIvec4.x)")
{
m_data.inIvec4[0] = exp.inIvec4[0];
}
};
class ShaderBitfieldOperationCaseLdexpVec2 : public ShaderBitfieldOperationCaseLdexp
{
public:
ShaderBitfieldOperationCaseLdexpVec2(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, Data const& exp)
: ShaderBitfieldOperationCaseLdexp(context, name, glslVersion, data, 2,
"outVec4.xy = ldexp(inVec4.xy, inIvec4.xy)")
{
m_data.inIvec4[0] = exp.inIvec4[0];
m_data.inIvec4[1] = exp.inIvec4[1];
}
};
class ShaderBitfieldOperationCaseLdexpVec3 : public ShaderBitfieldOperationCaseLdexp
{
public:
ShaderBitfieldOperationCaseLdexpVec3(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, Data const& exp)
: ShaderBitfieldOperationCaseLdexp(context, name, glslVersion, data, 3,
"outVec4.xyz = ldexp(inVec4.xyz, inIvec4.xyz)")
{
m_data.inIvec4[0] = exp.inIvec4[0];
m_data.inIvec4[1] = exp.inIvec4[1];
m_data.inIvec4[2] = exp.inIvec4[2];
}
};
class ShaderBitfieldOperationCaseLdexpVec4 : public ShaderBitfieldOperationCaseLdexp
{
public:
ShaderBitfieldOperationCaseLdexpVec4(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, Data const& exp)
: ShaderBitfieldOperationCaseLdexp(context, name, glslVersion, data, 4, "outVec4 = ldexp(inVec4, inIvec4)")
{
m_data.inIvec4[0] = exp.inIvec4[0];
m_data.inIvec4[1] = exp.inIvec4[1];
m_data.inIvec4[2] = exp.inIvec4[2];
m_data.inIvec4[3] = exp.inIvec4[3];
}
};
static float reduce32PrecisionTo16(float f)
{
return deFloat16To32(deFloat32To16(f));
}
static GLuint pack(float x, float y, float z, float w, float range)
{
return ((int(deFloatFloor(x * range + 0.5f)) & 0xFF) << 0) |
((int(deFloatFloor(y * range + 0.5f)) & 0xFF) << 8) |
((int(deFloatFloor(z * range + 0.5f)) & 0xFF) << 16)|
((int(deFloatFloor(w * range + 0.5f)) & 0xFF) << 24);
}
static bool checkOutData(GLuint result, const GLfloat input[4], float range)
{
GLuint expected = pack(input[0], input[1], input[2], input[3], range);
GLuint expected_mp = pack(reduce32PrecisionTo16(input[0]),
reduce32PrecisionTo16(input[1]),
reduce32PrecisionTo16(input[2]),
reduce32PrecisionTo16(input[3]),
range);
return (expected == result || expected_mp == result);
}
class ShaderBitfieldOperationCasePackUnorm : public ShaderBitfieldOperationCase
{
public:
ShaderBitfieldOperationCasePackUnorm(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data)
: ShaderBitfieldOperationCase(context, name, "", glslVersion, data, "outUvec4.x = packUnorm4x8(inVec4)")
{
}
private:
virtual bool test(Data const* data)
{
return checkOutData(data->outUvec4[0], data->inVec4, 255.0f);
}
};
class ShaderBitfieldOperationCasePackSnorm : public ShaderBitfieldOperationCase
{
public:
ShaderBitfieldOperationCasePackSnorm(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data)
: ShaderBitfieldOperationCase(context, name, "", glslVersion, data, "outUvec4.x = packSnorm4x8(inVec4)")
{
}
private:
virtual bool test(Data const* data)
{
return checkOutData(data->outUvec4[0], data->inVec4, 127.0f);
}
};
class ShaderBitfieldOperationCaseUnpackUnorm : public ShaderBitfieldOperationCase
{
public:
ShaderBitfieldOperationCaseUnpackUnorm(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data)
: ShaderBitfieldOperationCase(context, name, "", glslVersion, data, "outVec4 = unpackUnorm4x8(inUvec4.x)")
{
}
private:
virtual bool test(Data const* data)
{
GLfloat x = float((data->inUvec4[0] >> 0) & 0xFF) / 255.0f;
if (deFloatAbs(data->outVec4[0] - x) > 0.0001f)
{
return false;
}
GLfloat y = float((data->inUvec4[0] >> 8) & 0xFF) / 255.0f;
if (deFloatAbs(data->outVec4[1] - y) > 0.0001f)
{
return false;
}
GLfloat z = float((data->inUvec4[0] >> 16) & 0xFF) / 255.0f;
if (deFloatAbs(data->outVec4[2] - z) > 0.0001f)
{
return false;
}
GLfloat w = float((data->inUvec4[0] >> 24) & 0xFF) / 255.0f;
if (deFloatAbs(data->outVec4[3] - w) > 0.0001f)
{
return false;
}
return true;
}
};
class ShaderBitfieldOperationCaseUnpackSnorm : public ShaderBitfieldOperationCase
{
public:
ShaderBitfieldOperationCaseUnpackSnorm(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data)
: ShaderBitfieldOperationCase(context, name, "", glslVersion, data, "outVec4 = unpackSnorm4x8(inUvec4.x)")
{
}
private:
virtual bool test(Data const* data)
{
GLfloat x = float((signed char)((data->inUvec4[0] >> 0) & 0xFF)) / 127.0f;
x = de::clamp<GLfloat>(x, -1.0f, 1.0f);
if (deFloatAbs(data->outVec4[0] - x) > 0.0001f)
{
return false;
}
GLfloat y = float((signed char)((data->inUvec4[0] >> 8) & 0xFF)) / 127.0f;
y = de::clamp<GLfloat>(y, -1.0f, 1.0f);
if (deFloatAbs(data->outVec4[1] - y) > 0.0001f)
{
return false;
}
GLfloat z = float((signed char)((data->inUvec4[0] >> 16) & 0xFF)) / 127.0f;
z = de::clamp<GLfloat>(z, -1.0f, 1.0f);
if (deFloatAbs(data->outVec4[2] - z) > 0.0001f)
{
return false;
}
GLfloat w = float((signed char)((data->inUvec4[0] >> 24) & 0xFF)) / 127.0f;
w = de::clamp<GLfloat>(w, -1.0f, 1.0f);
if (deFloatAbs(data->outVec4[3] - w) > 0.0001f)
{
return false;
}
return true;
}
};
class ShaderBitfieldOperationCaseBitfieldExtractUint : public ShaderBitfieldOperationCase
{
public:
ShaderBitfieldOperationCaseBitfieldExtractUint(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, int offset, int bits, int components,
char const* testStatement)
: ShaderBitfieldOperationCase(context, name, "", glslVersion, data, testStatement), m_components(components)
{
if (offset + bits > 32)
{
offset -= (offset + bits) - 32;
}
m_data.offset = offset;
m_data.bits = bits;
}
private:
int m_components;
virtual bool test(Data const* data)
{
for (int i = 0; i < m_components; ++i)
{
GLuint expected =
(data->inUvec4[i] >> data->offset) & (data->bits == 32 ? 0xFFFFFFFF : ((1 << data->bits) - 1));
if (data->outUvec4[i] != expected)
{
return false;
}
}
return true;
}
};
class ShaderBitfieldOperationCaseBitfieldExtractUint1 : public ShaderBitfieldOperationCaseBitfieldExtractUint
{
public:
ShaderBitfieldOperationCaseBitfieldExtractUint1(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, int offset, int bits)
: ShaderBitfieldOperationCaseBitfieldExtractUint(context, name, glslVersion, data, offset, bits, 1,
"outUvec4.x = bitfieldExtract(inUvec4.x, offset, bits)")
{
}
};
class ShaderBitfieldOperationCaseBitfieldExtractUint2 : public ShaderBitfieldOperationCaseBitfieldExtractUint
{
public:
ShaderBitfieldOperationCaseBitfieldExtractUint2(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, int offset, int bits)
: ShaderBitfieldOperationCaseBitfieldExtractUint(context, name, glslVersion, data, offset, bits, 2,
"outUvec4.xy = bitfieldExtract(inUvec4.xy, offset, bits)")
{
}
};
class ShaderBitfieldOperationCaseBitfieldExtractUint3 : public ShaderBitfieldOperationCaseBitfieldExtractUint
{
public:
ShaderBitfieldOperationCaseBitfieldExtractUint3(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, int offset, int bits)
: ShaderBitfieldOperationCaseBitfieldExtractUint(context, name, glslVersion, data, offset, bits, 3,
"outUvec4.xyz = bitfieldExtract(inUvec4.xyz, offset, bits)")
{
}
};
class ShaderBitfieldOperationCaseBitfieldExtractUint4 : public ShaderBitfieldOperationCaseBitfieldExtractUint
{
public:
ShaderBitfieldOperationCaseBitfieldExtractUint4(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, int offset, int bits)
: ShaderBitfieldOperationCaseBitfieldExtractUint(context, name, glslVersion, data, offset, bits, 4,
"outUvec4 = bitfieldExtract(inUvec4, offset, bits)")
{
}
};
class ShaderBitfieldOperationCaseBitfieldExtractInt : public ShaderBitfieldOperationCase
{
public:
ShaderBitfieldOperationCaseBitfieldExtractInt(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, int offset, int bits, int components,
char const* testStatement)
: ShaderBitfieldOperationCase(context, name, "", glslVersion, data, testStatement), m_components(components)
{
if (offset + bits > 32)
{
offset -= (offset + bits) - 32;
}
m_data.offset = offset;
m_data.bits = bits;
}
private:
int m_components;
virtual bool test(Data const* data)
{
for (int i = 0; i < m_components; ++i)
{
GLint expected = data->inIvec4[i] << (32 - (data->offset + data->bits));
expected >>= 32 - data->bits;
if (data->outIvec4[i] != expected)
{
return false;
}
}
return true;
}
};
class ShaderBitfieldOperationCaseBitfieldExtractInt1 : public ShaderBitfieldOperationCaseBitfieldExtractInt
{
public:
ShaderBitfieldOperationCaseBitfieldExtractInt1(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, int offset, int bits)
: ShaderBitfieldOperationCaseBitfieldExtractInt(context, name, glslVersion, data, offset, bits, 1,
"outIvec4.x = bitfieldExtract(inIvec4.x, offset, bits)")
{
}
};
class ShaderBitfieldOperationCaseBitfieldExtractInt2 : public ShaderBitfieldOperationCaseBitfieldExtractInt
{
public:
ShaderBitfieldOperationCaseBitfieldExtractInt2(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, int offset, int bits)
: ShaderBitfieldOperationCaseBitfieldExtractInt(context, name, glslVersion, data, offset, bits, 2,
"outIvec4.xy = bitfieldExtract(inIvec4.xy, offset, bits)")
{
}
};
class ShaderBitfieldOperationCaseBitfieldExtractInt3 : public ShaderBitfieldOperationCaseBitfieldExtractInt
{
public:
ShaderBitfieldOperationCaseBitfieldExtractInt3(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, int offset, int bits)
: ShaderBitfieldOperationCaseBitfieldExtractInt(context, name, glslVersion, data, offset, bits, 3,
"outIvec4.xyz = bitfieldExtract(inIvec4.xyz, offset, bits)")
{
}
};
class ShaderBitfieldOperationCaseBitfieldExtractInt4 : public ShaderBitfieldOperationCaseBitfieldExtractInt
{
public:
ShaderBitfieldOperationCaseBitfieldExtractInt4(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, int offset, int bits)
: ShaderBitfieldOperationCaseBitfieldExtractInt(context, name, glslVersion, data, offset, bits, 4,
"outIvec4 = bitfieldExtract(inIvec4, offset, bits)")
{
}
};
class ShaderBitfieldOperationCaseBitfieldInsertUint : public ShaderBitfieldOperationCase
{
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)
: ShaderBitfieldOperationCase(context, name, "", glslVersion, data, testStatement), m_components(components)
{
for (int i = 0; i < components; ++i)
{
m_data.in2Uvec4[i] = insert.inUvec4[i];
}
if (offset + bits > 32)
{
offset -= (offset + bits) - 32;
}
m_data.offset = offset;
m_data.bits = bits;
}
private:
int m_components;
virtual bool test(Data const* data)
{
for (int i = 0; i < m_components; ++i)
{
GLuint mask = (data->bits == 32) ? ~0u : (1 << data->bits) - 1;
GLuint expected =
(data->inUvec4[i] & ~(mask << data->offset)) | ((data->in2Uvec4[i] & mask) << data->offset);
if (data->outUvec4[i] != expected)
{
return false;
}
}
return true;
}
};
class ShaderBitfieldOperationCaseBitfieldInsertUint1 : public ShaderBitfieldOperationCaseBitfieldInsertUint
{
public:
ShaderBitfieldOperationCaseBitfieldInsertUint1(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, Data const& insert, int offset, int bits)
: ShaderBitfieldOperationCaseBitfieldInsertUint(
context, name, glslVersion, data, insert, offset, bits, 1,
"outUvec4.x = bitfieldInsert(inUvec4.x, in2Uvec4.x, offset, bits)")
{
}
};
class ShaderBitfieldOperationCaseBitfieldInsertUint2 : public ShaderBitfieldOperationCaseBitfieldInsertUint
{
public:
ShaderBitfieldOperationCaseBitfieldInsertUint2(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, Data const& insert, int offset, int bits)
: ShaderBitfieldOperationCaseBitfieldInsertUint(
context, name, glslVersion, data, insert, offset, bits, 2,
"outUvec4.xy = bitfieldInsert(inUvec4.xy, in2Uvec4.xy, offset, bits)")
{
}
};
class ShaderBitfieldOperationCaseBitfieldInsertUint3 : public ShaderBitfieldOperationCaseBitfieldInsertUint
{
public:
ShaderBitfieldOperationCaseBitfieldInsertUint3(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, Data const& insert, int offset, int bits)
: ShaderBitfieldOperationCaseBitfieldInsertUint(
context, name, glslVersion, data, insert, offset, bits, 3,
"outUvec4.xyz = bitfieldInsert(inUvec4.xyz, in2Uvec4.xyz, offset, bits)")
{
}
};
class ShaderBitfieldOperationCaseBitfieldInsertUint4 : public ShaderBitfieldOperationCaseBitfieldInsertUint
{
public:
ShaderBitfieldOperationCaseBitfieldInsertUint4(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, Data const& insert, int offset, int bits)
: ShaderBitfieldOperationCaseBitfieldInsertUint(context, name, glslVersion, data, insert, offset, bits, 4,
"outUvec4 = bitfieldInsert(inUvec4, in2Uvec4, offset, bits)")
{
}
};
class ShaderBitfieldOperationCaseBitfieldInsertInt : public ShaderBitfieldOperationCase
{
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)
: ShaderBitfieldOperationCase(context, name, "", glslVersion, data, testStatement), m_components(components)
{
for (int i = 0; i < components; ++i)
{
m_data.in2Ivec4[i] = insert.inIvec4[i];
}
if (offset + bits > 32)
{
offset -= (offset + bits) - 32;
}
m_data.offset = offset;
m_data.bits = bits;
}
private:
int m_components;
virtual bool test(Data const* data)
{
for (int i = 0; i < m_components; ++i)
{
GLuint mask = (data->bits == 32) ? ~0u : (1 << data->bits) - 1;
GLint expected =
(data->inIvec4[i] & ~(mask << data->offset)) | ((data->in2Ivec4[i] & mask) << data->offset);
if (data->outIvec4[i] != expected)
{
return false;
}
}
return true;
}
};
class ShaderBitfieldOperationCaseBitfieldInsertInt1 : public ShaderBitfieldOperationCaseBitfieldInsertInt
{
public:
ShaderBitfieldOperationCaseBitfieldInsertInt1(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, Data const& insert, int offset, int bits)
: ShaderBitfieldOperationCaseBitfieldInsertInt(
context, name, glslVersion, data, insert, offset, bits, 1,
"outIvec4.x = bitfieldInsert(inIvec4.x, in2Ivec4.x, offset, bits)")
{
}
};
class ShaderBitfieldOperationCaseBitfieldInsertInt2 : public ShaderBitfieldOperationCaseBitfieldInsertInt
{
public:
ShaderBitfieldOperationCaseBitfieldInsertInt2(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, Data const& insert, int offset, int bits)
: ShaderBitfieldOperationCaseBitfieldInsertInt(
context, name, glslVersion, data, insert, offset, bits, 2,
"outIvec4.xy = bitfieldInsert(inIvec4.xy, in2Ivec4.xy, offset, bits)")
{
}
};
class ShaderBitfieldOperationCaseBitfieldInsertInt3 : public ShaderBitfieldOperationCaseBitfieldInsertInt
{
public:
ShaderBitfieldOperationCaseBitfieldInsertInt3(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, Data const& insert, int offset, int bits)
: ShaderBitfieldOperationCaseBitfieldInsertInt(
context, name, glslVersion, data, insert, offset, bits, 3,
"outIvec4.xyz = bitfieldInsert(inIvec4.xyz, in2Ivec4.xyz, offset, bits)")
{
}
};
class ShaderBitfieldOperationCaseBitfieldInsertInt4 : public ShaderBitfieldOperationCaseBitfieldInsertInt
{
public:
ShaderBitfieldOperationCaseBitfieldInsertInt4(Context& context, const char* name, glu::GLSLVersion glslVersion,
Data const& data, Data const& insert, int offset, int bits)
: ShaderBitfieldOperationCaseBitfieldInsertInt(context, name, glslVersion, data, insert, offset, bits, 4,
"outIvec4 = bitfieldInsert(inIvec4, in2Ivec4, offset, bits)")
{
}
};
typedef GLuint (*UnaryUFunc)(GLuint input);
typedef GLint (*UnaryIFunc)(GLint input);
static GLuint bitfieldReverse(GLuint input)
{
GLuint result = 0;
for (int i = 0; i < 32; ++i)
{
result >>= 1;
result |= (input & 0x80000000);
input <<= 1;
}
return result;
}
static GLuint bitCount(GLuint input)
{
GLuint result = 0;
while (input)
{
if (input & 1)
{
result += 1;
}
input >>= 1;
}
return result;
}
static GLuint findLSB(GLuint input)
{
if (!input)
{
return -1;
}
for (GLuint result = 0;; ++result)
{
if (input & 1)
{
return result;
}
input >>= 1;
}
}
static GLuint findMSBU(GLuint input)
{
if (!input)
{
return -1;
}
for (GLuint result = 31;; --result)
{
if (input & 0x80000000)
{
return result;
}
input <<= 1;
}
}
static GLint findMSBI(GLint input)
{
if (input == 0 || input == -1)
{
return -1;
}
else if (input > 0)
{
for (GLuint result = 31;; --result)
{
if (input & 0x80000000)
{
return result;
}
input <<= 1;
}
}
else
{
for (GLuint result = 31;; --result)
{
if (!(input & 0x80000000))
{
return result;
}
input <<= 1;
}
}
}
class ShaderBitfieldOperationCaseUnaryUint : public ShaderBitfieldOperationCase
{
public:
ShaderBitfieldOperationCaseUnaryUint(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* funcName, UnaryUFunc func, Data const& data, int components,
char const* testStatement)
: ShaderBitfieldOperationCase(context, name, "", glslVersion, data, testStatement)
, m_components(components)
, m_func(func)
{
size_t pos = m_testStatement.find("func");
m_testStatement.replace(pos, 4, funcName);
}
private:
int m_components;
UnaryUFunc m_func;
virtual bool test(Data const* data)
{
for (int i = 0; i < m_components; ++i)
{
GLuint expected = m_func(data->inUvec4[i]);
GLuint output = data->outUvec4[i];
if (m_func == (UnaryUFunc)glcts::bitCount || m_func == (UnaryUFunc)glcts::findLSB ||
m_func == (UnaryUFunc)glcts::findMSBU || m_func == (UnaryUFunc)glcts::findMSBI)
{
/* The built-in bitCount, findLSB and findMSB functions
* return a lowp int, which can be encoded with as little
* as 9 bits. Since findLSB and findMSB can return negative
* values (namely, -1), we cannot compare the value directly
* against a (32-bit) GLuint.
*/
GLuint output_9bits = output & 0x1ff;
GLuint sign_extend = output_9bits & 0x100 ? 0xfffffe00 : 0;
output = output_9bits | sign_extend;
}
if (output != expected)
{
return false;
}
}
return true;
}
};
class ShaderBitfieldOperationCaseUnaryUint1 : public ShaderBitfieldOperationCaseUnaryUint
{
public:
ShaderBitfieldOperationCaseUnaryUint1(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* funcName, UnaryUFunc func, Data const& data)
: ShaderBitfieldOperationCaseUnaryUint(context, name, glslVersion, funcName, func, data, 1,
"outUvec4.x = uint(func(inUvec4.x))")
{
}
};
class ShaderBitfieldOperationCaseUnaryUint2 : public ShaderBitfieldOperationCaseUnaryUint
{
public:
ShaderBitfieldOperationCaseUnaryUint2(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* funcName, UnaryUFunc func, Data const& data)
: ShaderBitfieldOperationCaseUnaryUint(context, name, glslVersion, funcName, func, data, 2,
"outUvec4.xy = uvec2(func(inUvec4.xy))")
{
}
};
class ShaderBitfieldOperationCaseUnaryUint3 : public ShaderBitfieldOperationCaseUnaryUint
{
public:
ShaderBitfieldOperationCaseUnaryUint3(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* funcName, UnaryUFunc func, Data const& data)
: ShaderBitfieldOperationCaseUnaryUint(context, name, glslVersion, funcName, func, data, 3,
"outUvec4.xyz = uvec3(func(inUvec4.xyz))")
{
}
};
class ShaderBitfieldOperationCaseUnaryUint4 : public ShaderBitfieldOperationCaseUnaryUint
{
public:
ShaderBitfieldOperationCaseUnaryUint4(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* funcName, UnaryUFunc func, Data const& data)
: ShaderBitfieldOperationCaseUnaryUint(context, name, glslVersion, funcName, func, data, 4,
"outUvec4 = uvec4(func(inUvec4))")
{
}
};
class ShaderBitfieldOperationCaseUnaryInt : public ShaderBitfieldOperationCase
{
public:
ShaderBitfieldOperationCaseUnaryInt(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* funcName, UnaryIFunc func, Data const& data, int components,
char const* testStatement)
: ShaderBitfieldOperationCase(context, name, "", glslVersion, data, testStatement)
, m_components(components)
, m_func(func)
{
size_t pos = m_testStatement.find("func");
m_testStatement.replace(pos, 4, funcName);
}
private:
int m_components;
UnaryIFunc m_func;
virtual bool test(Data const* data)
{
for (int i = 0; i < m_components; ++i)
{
GLint expected = m_func(data->inIvec4[i]);
if (data->outIvec4[i] != expected)
{
return false;
}
}
return true;
}
};
class ShaderBitfieldOperationCaseUnaryInt1 : public ShaderBitfieldOperationCaseUnaryInt
{
public:
ShaderBitfieldOperationCaseUnaryInt1(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* funcName, UnaryIFunc func, Data const& data)
: ShaderBitfieldOperationCaseUnaryInt(context, name, glslVersion, funcName, func, data, 1,
"outIvec4.x = func(inIvec4.x)")
{
}
};
class ShaderBitfieldOperationCaseUnaryInt2 : public ShaderBitfieldOperationCaseUnaryInt
{
public:
ShaderBitfieldOperationCaseUnaryInt2(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* funcName, UnaryIFunc func, Data const& data)
: ShaderBitfieldOperationCaseUnaryInt(context, name, glslVersion, funcName, func, data, 2,
"outIvec4.xy = func(inIvec4.xy)")
{
}
};
class ShaderBitfieldOperationCaseUnaryInt3 : public ShaderBitfieldOperationCaseUnaryInt
{
public:
ShaderBitfieldOperationCaseUnaryInt3(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* funcName, UnaryIFunc func, Data const& data)
: ShaderBitfieldOperationCaseUnaryInt(context, name, glslVersion, funcName, func, data, 3,
"outIvec4.xyz = func(inIvec4.xyz)")
{
}
};
class ShaderBitfieldOperationCaseUnaryInt4 : public ShaderBitfieldOperationCaseUnaryInt
{
public:
ShaderBitfieldOperationCaseUnaryInt4(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* funcName, UnaryIFunc func, Data const& data)
: ShaderBitfieldOperationCaseUnaryInt(context, name, glslVersion, funcName, func, data, 4,
"outIvec4 = func(inIvec4)")
{
}
};
typedef GLuint (*BinaryUFunc)(GLuint input, GLuint input2, GLuint& output2);
typedef GLint (*BinaryIFunc)(GLint input, GLint input2, GLint& output2);
static GLuint uaddCarry(GLuint input, GLuint input2, GLuint& output2)
{
GLuint result = input + input2;
output2 = (input > result) ? 1 : 0;
return result;
}
static GLuint usubBorrow(GLuint input, GLuint input2, GLuint& output2)
{
output2 = (input2 > input) ? 1 : 0;
return input - input2;
}
static GLuint umulExtended(GLuint input, GLuint input2, GLuint& output2)
{
GLuint64 result = static_cast<GLuint64>(input) * static_cast<GLuint64>(input2);
output2 = GLuint(result & 0xFFFFFFFF);
return GLuint(result >> 32);
}
static GLint imulExtended(GLint input, GLint input2, GLint& output2)
{
GLint64 result = static_cast<GLint64>(input) * static_cast<GLint64>(input2);
output2 = GLint(result & 0xFFFFFFFF);
return GLint(result >> 32);
}
class ShaderBitfieldOperationCaseBinaryUint : public ShaderBitfieldOperationCase
{
public:
ShaderBitfieldOperationCaseBinaryUint(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* testStatement, BinaryUFunc func, Data const& input,
Data const& input2, int components)
: ShaderBitfieldOperationCase(context, name, "", glslVersion, input, testStatement)
, m_components(components)
, m_func(func)
{
for (int i = 0; i < components; ++i)
{
m_data.in2Uvec4[i] = input2.inUvec4[i];
}
}
private:
int m_components;
BinaryUFunc m_func;
virtual bool test(Data const* data)
{
for (int i = 0; i < m_components; ++i)
{
GLuint expected2 = 0;
GLuint expected = m_func(data->inUvec4[i], data->in2Uvec4[i], expected2);
if (data->outUvec4[i] != expected || data->out2Uvec4[i] != expected2)
{
return false;
}
}
return true;
}
};
class ShaderBitfieldOperationCaseBinaryUint1 : public ShaderBitfieldOperationCaseBinaryUint
{
public:
ShaderBitfieldOperationCaseBinaryUint1(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* testStatement, BinaryUFunc func, Data const& input,
Data const& input2)
: ShaderBitfieldOperationCaseBinaryUint(context, name, glslVersion, testStatement, func, input, input2, 1)
{
}
};
class ShaderBitfieldOperationCaseBinaryUint2 : public ShaderBitfieldOperationCaseBinaryUint
{
public:
ShaderBitfieldOperationCaseBinaryUint2(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* testStatement, BinaryUFunc func, Data const& input,
Data const& input2)
: ShaderBitfieldOperationCaseBinaryUint(context, name, glslVersion, testStatement, func, input, input2, 2)
{
}
};
class ShaderBitfieldOperationCaseBinaryUint3 : public ShaderBitfieldOperationCaseBinaryUint
{
public:
ShaderBitfieldOperationCaseBinaryUint3(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* testStatement, BinaryUFunc func, Data const& input,
Data const& input2)
: ShaderBitfieldOperationCaseBinaryUint(context, name, glslVersion, testStatement, func, input, input2, 3)
{
}
};
class ShaderBitfieldOperationCaseBinaryUint4 : public ShaderBitfieldOperationCaseBinaryUint
{
public:
ShaderBitfieldOperationCaseBinaryUint4(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* testStatement, BinaryUFunc func, Data const& input,
Data const& input2)
: ShaderBitfieldOperationCaseBinaryUint(context, name, glslVersion, testStatement, func, input, input2, 4)
{
}
};
class ShaderBitfieldOperationCaseBinaryInt : public ShaderBitfieldOperationCase
{
public:
ShaderBitfieldOperationCaseBinaryInt(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* testStatement, BinaryIFunc func, Data const& input,
Data const& input2, int components)
: ShaderBitfieldOperationCase(context, name, "", glslVersion, input, testStatement)
, m_components(components)
, m_func(func)
{
for (int i = 0; i < components; ++i)
{
m_data.in2Ivec4[i] = input2.inIvec4[i];
}
}
private:
int m_components;
BinaryIFunc m_func;
virtual bool test(Data const* data)
{
for (int i = 0; i < m_components; ++i)
{
GLint expected2 = 0;
GLint expected = m_func(data->inIvec4[i], data->in2Ivec4[i], expected2);
if (data->outIvec4[i] != expected || data->out2Ivec4[i] != expected2)
{
return false;
}
}
return true;
}
};
class ShaderBitfieldOperationCaseBinaryInt1 : public ShaderBitfieldOperationCaseBinaryInt
{
public:
ShaderBitfieldOperationCaseBinaryInt1(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* testStatement, BinaryIFunc func, Data const& input,
Data const& input2)
: ShaderBitfieldOperationCaseBinaryInt(context, name, glslVersion, testStatement, func, input, input2, 1)
{
}
};
class ShaderBitfieldOperationCaseBinaryInt2 : public ShaderBitfieldOperationCaseBinaryInt
{
public:
ShaderBitfieldOperationCaseBinaryInt2(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* testStatement, BinaryIFunc func, Data const& input,
Data const& input2)
: ShaderBitfieldOperationCaseBinaryInt(context, name, glslVersion, testStatement, func, input, input2, 2)
{
}
};
class ShaderBitfieldOperationCaseBinaryInt3 : public ShaderBitfieldOperationCaseBinaryInt
{
public:
ShaderBitfieldOperationCaseBinaryInt3(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* testStatement, BinaryIFunc func, Data const& input,
Data const& input2)
: ShaderBitfieldOperationCaseBinaryInt(context, name, glslVersion, testStatement, func, input, input2, 3)
{
}
};
class ShaderBitfieldOperationCaseBinaryInt4 : public ShaderBitfieldOperationCaseBinaryInt
{
public:
ShaderBitfieldOperationCaseBinaryInt4(Context& context, const char* name, glu::GLSLVersion glslVersion,
char const* testStatement, BinaryIFunc func, Data const& input,
Data const& input2)
: ShaderBitfieldOperationCaseBinaryInt(context, name, glslVersion, testStatement, func, input, input2, 4)
{
}
};
ShaderBitfieldOperationTests::ShaderBitfieldOperationTests(Context& context, glu::GLSLVersion glslVersion)
: TestCaseGroup(context, "shader_bitfield_operation", "Shader Bitfield Operation tests"), m_glslVersion(glslVersion)
{
}
ShaderBitfieldOperationTests::~ShaderBitfieldOperationTests(void)
{
}
void ShaderBitfieldOperationTests::init(void)
{
de::Random rnd(m_context.getTestContext().getCommandLine().getBaseSeed());
// shader_bitfield_operation.frexp
tcu::TestCaseGroup* frexpGroup = new tcu::TestCaseGroup(m_testCtx, "frexp", "");
addChild(frexpGroup);
frexpGroup->addChild(new ShaderBitfieldOperationCaseFrexpFloat(m_context, "float_zero", m_glslVersion, Vec4(0.0)));
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "float_" << i;
frexpGroup->addChild(new ShaderBitfieldOperationCaseFrexpFloat(m_context, ss.str().c_str(), m_glslVersion,
Vec4(rnd.getFloat())));
}
frexpGroup->addChild(
new ShaderBitfieldOperationCaseFrexpVec2(m_context, "vec2_zero", m_glslVersion, Vec4(0.0, 0.0)));
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "vec2_" << i;
frexpGroup->addChild(new ShaderBitfieldOperationCaseFrexpVec2(m_context, ss.str().c_str(), m_glslVersion,
Vec4(rnd.getFloat(), -rnd.getFloat())));
}
frexpGroup->addChild(
new ShaderBitfieldOperationCaseFrexpVec3(m_context, "vec3_zero", m_glslVersion, Vec4(0.0, 0.0, 0.0)));
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "vec3_" << i;
frexpGroup->addChild(new ShaderBitfieldOperationCaseFrexpVec3(
m_context, ss.str().c_str(), m_glslVersion, Vec4(rnd.getFloat(), -rnd.getFloat(), rnd.getFloat())));
}
frexpGroup->addChild(
new ShaderBitfieldOperationCaseFrexpVec4(m_context, "vec4_zero", m_glslVersion, Vec4(0.0, 0.0, 0.0, 0.0)));
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "vec4_" << i;
frexpGroup->addChild(new ShaderBitfieldOperationCaseFrexpVec4(
m_context, ss.str().c_str(), m_glslVersion,
Vec4(rnd.getFloat(), -rnd.getFloat(), rnd.getFloat(), -rnd.getFloat())));
}
// shader_bitfield_operation.ldexp
tcu::TestCaseGroup* ldexpGroup = new tcu::TestCaseGroup(m_testCtx, "ldexp", "");
addChild(ldexpGroup);
ldexpGroup->addChild(
new ShaderBitfieldOperationCaseLdexpFloat(m_context, "float_zero", m_glslVersion, Vec4(0.0), Ivec4(0)));
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "float_" << i;
ldexpGroup->addChild(new ShaderBitfieldOperationCaseLdexpFloat(m_context, ss.str().c_str(), m_glslVersion,
Vec4(rnd.getFloat()), Ivec4(rnd.getInt(-8, 8))));
}
ldexpGroup->addChild(
new ShaderBitfieldOperationCaseLdexpVec2(m_context, "vec2_zero", m_glslVersion, Vec4(0.0, 0.0), Ivec4(0, 0)));
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "vec2_" << i;
ldexpGroup->addChild(new ShaderBitfieldOperationCaseLdexpVec2(m_context, ss.str().c_str(), m_glslVersion,
Vec4(rnd.getFloat(), -rnd.getFloat()),
Ivec4(rnd.getInt(-8, 8), rnd.getInt(-8, 8))));
}
ldexpGroup->addChild(new ShaderBitfieldOperationCaseLdexpVec3(m_context, "vec3_zero", m_glslVersion,
Vec4(0.0, 0.0, 0.0), Ivec4(0, 0, 0)));
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "vec3_" << i;
ldexpGroup->addChild(new ShaderBitfieldOperationCaseLdexpVec3(
m_context, ss.str().c_str(), m_glslVersion, Vec4(rnd.getFloat(), -rnd.getFloat(), rnd.getFloat()),
Ivec4(rnd.getInt(-8, 8), rnd.getInt(-8, 8), rnd.getInt(-8, 8))));
}
ldexpGroup->addChild(new ShaderBitfieldOperationCaseLdexpVec4(m_context, "vec4_zero", m_glslVersion,
Vec4(0.0, 0.0, 0.0, 0.0), Ivec4(0, 0, 0, 0)));
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "vec4_" << i;
ldexpGroup->addChild(new ShaderBitfieldOperationCaseLdexpVec4(
m_context, ss.str().c_str(), m_glslVersion,
Vec4(rnd.getFloat(), -rnd.getFloat(), rnd.getFloat(), -rnd.getFloat()),
Ivec4(rnd.getInt(-8, 8), rnd.getInt(-8, 8), rnd.getInt(-8, 8), rnd.getInt(-8, 8))));
}
// shader_bitfield_operation.packUnorm4x8
tcu::TestCaseGroup* packUnormGroup = new tcu::TestCaseGroup(m_testCtx, "packUnorm4x8", "");
addChild(packUnormGroup);
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << i;
packUnormGroup->addChild(new ShaderBitfieldOperationCasePackUnorm(
m_context, ss.str().c_str(), m_glslVersion,
Vec4(rnd.getFloat(), rnd.getFloat(), rnd.getFloat(), rnd.getFloat())));
}
// shader_bitfield_operation.packSnorm4x8
tcu::TestCaseGroup* packSnormGroup = new tcu::TestCaseGroup(m_testCtx, "packSnorm4x8", "");
addChild(packSnormGroup);
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << i;
packSnormGroup->addChild(new ShaderBitfieldOperationCasePackSnorm(
m_context, ss.str().c_str(), m_glslVersion,
Vec4(rnd.getFloat(), -rnd.getFloat(), rnd.getFloat(), -rnd.getFloat())));
}
// shader_bitfield_operation.unpackUnorm4x8
tcu::TestCaseGroup* unpackUnormGroup = new tcu::TestCaseGroup(m_testCtx, "unpackUnorm4x8", "");
addChild(unpackUnormGroup);
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << i;
unpackUnormGroup->addChild(new ShaderBitfieldOperationCaseUnpackUnorm(m_context, ss.str().c_str(),
m_glslVersion, Uvec4(rnd.getUint32())));
}
// shader_bitfield_operation.unpackSnorm4x8
tcu::TestCaseGroup* unpackSnormGroup = new tcu::TestCaseGroup(m_testCtx, "unpackSnorm4x8", "");
addChild(unpackSnormGroup);
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << i;
unpackSnormGroup->addChild(new ShaderBitfieldOperationCaseUnpackSnorm(m_context, ss.str().c_str(),
m_glslVersion, Uvec4(rnd.getUint32())));
}
// shader_bitfield_operation.bitfieldExtract
tcu::TestCaseGroup* bitfieldExtractGroup = new tcu::TestCaseGroup(m_testCtx, "bitfieldExtract", "");
addChild(bitfieldExtractGroup);
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uint_" << i;
bitfieldExtractGroup->addChild(new ShaderBitfieldOperationCaseBitfieldExtractUint1(
m_context, ss.str().c_str(), m_glslVersion, Uvec4(rnd.getUint32()), rnd.getInt(0, 31), rnd.getInt(1, 32)));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uvec2_" << i;
bitfieldExtractGroup->addChild(new ShaderBitfieldOperationCaseBitfieldExtractUint2(
m_context, ss.str().c_str(), m_glslVersion, Uvec4(rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31),
rnd.getInt(1, 32)));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uvec3_" << i;
bitfieldExtractGroup->addChild(new ShaderBitfieldOperationCaseBitfieldExtractUint3(
m_context, ss.str().c_str(), m_glslVersion, Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
rnd.getInt(0, 31), rnd.getInt(1, 32)));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uvec4_" << i;
bitfieldExtractGroup->addChild(new ShaderBitfieldOperationCaseBitfieldExtractUint4(
m_context, ss.str().c_str(), m_glslVersion,
Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31),
rnd.getInt(1, 32)));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "int_" << i;
bitfieldExtractGroup->addChild(new ShaderBitfieldOperationCaseBitfieldExtractInt1(
m_context, ss.str().c_str(), m_glslVersion, Ivec4(rnd.getUint32()), rnd.getInt(0, 31), rnd.getInt(1, 32)));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "ivec2_" << i;
bitfieldExtractGroup->addChild(new ShaderBitfieldOperationCaseBitfieldExtractInt2(
m_context, ss.str().c_str(), m_glslVersion, Ivec4(rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31),
rnd.getInt(1, 32)));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "ivec3_" << i;
bitfieldExtractGroup->addChild(new ShaderBitfieldOperationCaseBitfieldExtractInt3(
m_context, ss.str().c_str(), m_glslVersion, Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
rnd.getInt(0, 31), rnd.getInt(1, 32)));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "ivec4_" << i;
bitfieldExtractGroup->addChild(new ShaderBitfieldOperationCaseBitfieldExtractInt4(
m_context, ss.str().c_str(), m_glslVersion,
Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31),
rnd.getInt(1, 32)));
}
// shader_bitfield_operation.bitfieldInsert
tcu::TestCaseGroup* bitfieldInsertGroup = new tcu::TestCaseGroup(m_testCtx, "bitfieldInsert", "");
addChild(bitfieldInsertGroup);
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uint_" << i;
bitfieldInsertGroup->addChild(new ShaderBitfieldOperationCaseBitfieldInsertUint1(
m_context, ss.str().c_str(), m_glslVersion, Uvec4(rnd.getUint32()), Uvec4(rnd.getUint32()),
rnd.getInt(0, 31), rnd.getInt(1, 32)));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uvec2_" << i;
bitfieldInsertGroup->addChild(new ShaderBitfieldOperationCaseBitfieldInsertUint2(
m_context, ss.str().c_str(), m_glslVersion, Uvec4(rnd.getUint32(), rnd.getUint32()),
Uvec4(rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31), rnd.getInt(1, 32)));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uvec3_" << i;
bitfieldInsertGroup->addChild(new ShaderBitfieldOperationCaseBitfieldInsertUint3(
m_context, ss.str().c_str(), m_glslVersion, Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31), rnd.getInt(1, 32)));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uvec4_" << i;
bitfieldInsertGroup->addChild(new ShaderBitfieldOperationCaseBitfieldInsertUint4(
m_context, ss.str().c_str(), m_glslVersion,
Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31),
rnd.getInt(1, 32)));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "int_" << i;
bitfieldInsertGroup->addChild(new ShaderBitfieldOperationCaseBitfieldInsertInt1(
m_context, ss.str().c_str(), m_glslVersion, Ivec4(rnd.getUint32()), Ivec4(rnd.getUint32()),
rnd.getInt(0, 31), rnd.getInt(1, 32)));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "ivec2_" << i;
bitfieldInsertGroup->addChild(new ShaderBitfieldOperationCaseBitfieldInsertInt2(
m_context, ss.str().c_str(), m_glslVersion, Ivec4(rnd.getUint32(), rnd.getUint32()),
Ivec4(rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31), rnd.getInt(1, 32)));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "ivec3_" << i;
bitfieldInsertGroup->addChild(new ShaderBitfieldOperationCaseBitfieldInsertInt3(
m_context, ss.str().c_str(), m_glslVersion, Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31), rnd.getInt(1, 32)));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "ivec4_" << i;
bitfieldInsertGroup->addChild(new ShaderBitfieldOperationCaseBitfieldInsertInt4(
m_context, ss.str().c_str(), m_glslVersion,
Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()), rnd.getInt(0, 31),
rnd.getInt(1, 32)));
}
struct UnaryTest
{
char const* funcName;
UnaryUFunc funcU;
UnaryIFunc funcI;
} commonTests[] = {
{ "bitfieldReverse", bitfieldReverse,
reinterpret_cast<UnaryIFunc>(bitfieldReverse) }, // shader_bitfield_operation.bitfieldReverse
{ "bitCount", bitCount, reinterpret_cast<UnaryIFunc>(bitCount) }, // shader_bitfield_operation.bitCount
{ "findLSB", findLSB, reinterpret_cast<UnaryIFunc>(findLSB) }, // shader_bitfield_operation.findLSB
{ "findMSB", findMSBU, findMSBI }, // shader_bitfield_operation.findMSB
};
for (int test = 0; test < DE_LENGTH_OF_ARRAY(commonTests); ++test)
{
tcu::TestCaseGroup* commonGroup = new tcu::TestCaseGroup(m_testCtx, commonTests[test].funcName, "");
addChild(commonGroup);
commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryUint1(
m_context, "uint_zero", m_glslVersion, commonTests[test].funcName, commonTests[test].funcU, Uvec4(0)));
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uint_" << i;
commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryUint1(
m_context, ss.str().c_str(), m_glslVersion, commonTests[test].funcName, commonTests[test].funcU,
Uvec4(rnd.getUint32())));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uvec2_" << i;
commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryUint2(
m_context, ss.str().c_str(), m_glslVersion, commonTests[test].funcName, commonTests[test].funcU,
Uvec4(rnd.getUint32(), rnd.getUint32())));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uvec3_" << i;
commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryUint3(
m_context, ss.str().c_str(), m_glslVersion, commonTests[test].funcName, commonTests[test].funcU,
Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uvec4_" << i;
commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryUint4(
m_context, ss.str().c_str(), m_glslVersion, commonTests[test].funcName, commonTests[test].funcU,
Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
}
commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryInt1(
m_context, "int_zero", m_glslVersion, commonTests[test].funcName, commonTests[test].funcI, Ivec4(0)));
commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryInt1(
m_context, "int_minus_one", m_glslVersion, commonTests[test].funcName, commonTests[test].funcI, Ivec4(-1)));
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "int_" << i;
commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryInt1(
m_context, ss.str().c_str(), m_glslVersion, commonTests[test].funcName, commonTests[test].funcI,
Ivec4(rnd.getUint32())));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "ivec2_" << i;
commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryInt2(
m_context, ss.str().c_str(), m_glslVersion, commonTests[test].funcName, commonTests[test].funcI,
Ivec4(rnd.getUint32(), rnd.getUint32())));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "ivec3_" << i;
commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryInt3(
m_context, ss.str().c_str(), m_glslVersion, commonTests[test].funcName, commonTests[test].funcI,
Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "ivec4_" << i;
commonGroup->addChild(new ShaderBitfieldOperationCaseUnaryInt4(
m_context, ss.str().c_str(), m_glslVersion, commonTests[test].funcName, commonTests[test].funcI,
Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
}
}
// shader_bitfield_operation.uaddCarry
tcu::TestCaseGroup* uaddCarryGroup = new tcu::TestCaseGroup(m_testCtx, "uaddCarry", "");
addChild(uaddCarryGroup);
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uint_" << i;
uaddCarryGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint1(
m_context, ss.str().c_str(), m_glslVersion, "outUvec4.x = uaddCarry(inUvec4.x, in2Uvec4.x, out2Uvec4.x);",
uaddCarry, Uvec4(rnd.getUint32()), Uvec4(rnd.getUint32())));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uvec2_" << i;
uaddCarryGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint2(
m_context, ss.str().c_str(), m_glslVersion,
"outUvec4.xy = uaddCarry(inUvec4.xy, in2Uvec4.xy, out2Uvec4.xy);", uaddCarry,
Uvec4(rnd.getUint32(), rnd.getUint32()), Uvec4(rnd.getUint32(), rnd.getUint32())));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uvec3_" << i;
uaddCarryGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint3(
m_context, ss.str().c_str(), m_glslVersion,
"outUvec4.xyz = uaddCarry(inUvec4.xyz, in2Uvec4.xyz, out2Uvec4.xyz);", uaddCarry,
Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uvec4_" << i;
uaddCarryGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint4(
m_context, ss.str().c_str(), m_glslVersion, "outUvec4 = uaddCarry(inUvec4, in2Uvec4, out2Uvec4);",
uaddCarry, Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
}
// shader_bitfield_operation.usubBorrow
tcu::TestCaseGroup* usubBorrowGroup = new tcu::TestCaseGroup(m_testCtx, "usubBorrow", "");
addChild(usubBorrowGroup);
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uint_" << i;
usubBorrowGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint1(
m_context, ss.str().c_str(), m_glslVersion, "outUvec4.x = usubBorrow(inUvec4.x, in2Uvec4.x, out2Uvec4.x);",
usubBorrow, Uvec4(rnd.getUint32()), Uvec4(rnd.getUint32())));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uvec2_" << i;
usubBorrowGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint2(
m_context, ss.str().c_str(), m_glslVersion,
"outUvec4.xy = usubBorrow(inUvec4.xy, in2Uvec4.xy, out2Uvec4.xy);", usubBorrow,
Uvec4(rnd.getUint32(), rnd.getUint32()), Uvec4(rnd.getUint32(), rnd.getUint32())));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uvec3_" << i;
usubBorrowGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint3(
m_context, ss.str().c_str(), m_glslVersion,
"outUvec4.xyz = usubBorrow(inUvec4.xyz, in2Uvec4.xyz, out2Uvec4.xyz);", usubBorrow,
Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uvec4_" << i;
usubBorrowGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint4(
m_context, ss.str().c_str(), m_glslVersion, "outUvec4 = usubBorrow(inUvec4, in2Uvec4, out2Uvec4);",
usubBorrow, Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
}
// shader_bitfield_operation.umulExtended
tcu::TestCaseGroup* umulExtendedGroup = new tcu::TestCaseGroup(m_testCtx, "umulExtended", "");
addChild(umulExtendedGroup);
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uint_" << i;
umulExtendedGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint1(
m_context, ss.str().c_str(), m_glslVersion, "umulExtended(inUvec4.x, in2Uvec4.x, outUvec4.x, out2Uvec4.x);",
umulExtended, Uvec4(rnd.getUint32()), Uvec4(rnd.getUint32())));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uvec2_" << i;
umulExtendedGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint2(
m_context, ss.str().c_str(), m_glslVersion,
"umulExtended(inUvec4.xy, in2Uvec4.xy, outUvec4.xy, out2Uvec4.xy);", umulExtended,
Uvec4(rnd.getUint32(), rnd.getUint32()), Uvec4(rnd.getUint32(), rnd.getUint32())));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uvec3_" << i;
umulExtendedGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint3(
m_context, ss.str().c_str(), m_glslVersion,
"umulExtended(inUvec4.xyz, in2Uvec4.xyz, outUvec4.xyz, out2Uvec4.xyz);", umulExtended,
Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "uvec4_" << i;
umulExtendedGroup->addChild(new ShaderBitfieldOperationCaseBinaryUint4(
m_context, ss.str().c_str(), m_glslVersion, "umulExtended(inUvec4, in2Uvec4, outUvec4, out2Uvec4);",
umulExtended, Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
Uvec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
}
// shader_bitfield_operation.imulExtended
tcu::TestCaseGroup* imulExtendedGroup = new tcu::TestCaseGroup(m_testCtx, "imulExtended", "");
addChild(imulExtendedGroup);
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "int_" << i;
imulExtendedGroup->addChild(new ShaderBitfieldOperationCaseBinaryInt1(
m_context, ss.str().c_str(), m_glslVersion, "imulExtended(inIvec4.x, in2Ivec4.x, outIvec4.x, out2Ivec4.x);",
imulExtended, Ivec4(rnd.getUint32()), Ivec4(rnd.getUint32())));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "ivec2_" << i;
imulExtendedGroup->addChild(new ShaderBitfieldOperationCaseBinaryInt2(
m_context, ss.str().c_str(), m_glslVersion,
"imulExtended(inIvec4.xy, in2Ivec4.xy, outIvec4.xy, out2Ivec4.xy);", imulExtended,
Ivec4(rnd.getUint32(), rnd.getUint32()), Ivec4(rnd.getUint32(), rnd.getUint32())));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "ivec3_" << i;
imulExtendedGroup->addChild(new ShaderBitfieldOperationCaseBinaryInt3(
m_context, ss.str().c_str(), m_glslVersion,
"imulExtended(inIvec4.xyz, in2Ivec4.xyz, outIvec4.xyz, out2Ivec4.xyz);", imulExtended,
Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
}
for (int i = 0; i < ITERATIONS; ++i)
{
std::stringstream ss;
ss << "ivec4_" << i;
imulExtendedGroup->addChild(new ShaderBitfieldOperationCaseBinaryInt4(
m_context, ss.str().c_str(), m_glslVersion, "imulExtended(inIvec4, in2Ivec4, outIvec4, out2Ivec4);",
imulExtended, Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32()),
Ivec4(rnd.getUint32(), rnd.getUint32(), rnd.getUint32(), rnd.getUint32())));
}
}
} // glcts