const PageSizePair& format = *formIter;
const PageSizeStruct& page = format.second;
+ if (target == GL_TEXTURE_BUFFER) {
+ /* filter out invalid texture buffer formats according to ARB_texture_buffer_object */
+ switch (format.first) {
+ case GL_RGB10_A2:
+ case GL_RGB10_A2UI:
+ case GL_R11F_G11F_B10F:
+ case GL_RGB9_E5:
+ case GL_RGB565:
+ case GL_R8_SNORM:
+ case GL_RG8_SNORM:
+ case GL_RGBA8_SNORM:
+ case GL_R16_SNORM:
+ case GL_RG16_SNORM:
+ case GL_RGBA16_SNORM:
+ continue;
+ default:
+ break;
+ }
+ }
+
GLint pageSizeX;
GLint pageSizeY;
GLint pageSizeZ;
* @return target Structure of token strings
*/
SparseTexture2CommitmentTestCase::TokenStrings SparseTexture2CommitmentTestCase::createShaderTokens(
- GLint target, GLint format, GLint sample, const std::string outputBase, const std::string inputBase)
+ GLint target, GLint verifyTarget, GLint format, GLint sample, const std::string outputBase, const std::string inputBase)
{
TokenStrings s;
std::string prefix;
if (target == GL_TEXTURE_1D)
{
- s.outputType = "u" + outputBase + "2D";
s.inputType = prefix + inputBase + "1D";
s.pointType = "int";
s.pointDef = "gl_WorkGroupID.x";
}
else if (target == GL_TEXTURE_1D_ARRAY)
{
- s.outputType = "u" + outputBase + "2D_ARRAY";
s.inputType = prefix + inputBase + "1DArray";
s.pointType = "ivec2";
s.pointDef = "gl_WorkGroupID.x, gl_WorkGroupID.z";
}
else if (target == GL_TEXTURE_2D_ARRAY)
{
- s.outputType = "u" + outputBase + "2DArray";
s.inputType = prefix + inputBase + "2DArray";
s.pointType = "ivec3";
s.pointDef = "gl_WorkGroupID.x, gl_WorkGroupID.y, gl_WorkGroupID.z";
}
else if (target == GL_TEXTURE_CUBE_MAP)
{
- s.outputType = "u" + outputBase + "2DArray";
s.inputType = prefix + inputBase + "Cube";
s.pointType = "ivec3";
s.pointDef = "gl_WorkGroupID.x, gl_WorkGroupID.y, gl_WorkGroupID.z % 6";
}
else if (target == GL_TEXTURE_CUBE_MAP_ARRAY)
{
- s.outputType = "u" + outputBase + "2DArray";
s.inputType = prefix + inputBase + "CubeArray";
s.pointType = "ivec3";
s.pointDef = "gl_WorkGroupID.x, gl_WorkGroupID.y, gl_WorkGroupID.z";
}
else if (target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
{
- s.outputType = "u" + outputBase + "2DArray";
s.inputType = prefix + inputBase + "2DMSArray";
s.pointType = "ivec3";
s.pointDef = "gl_WorkGroupID.x, gl_WorkGroupID.y, gl_WorkGroupID.z";
s.sampleDef = ", " + de::toString(sample);
}
+ if (verifyTarget == GL_TEXTURE_2D)
+ {
+ s.outputType = "u" + outputBase + "2D";
+ }
+ else
+ {
+ s.outputType = "u" + outputBase + "2DArray";
+ }
return s;
}
std::string shader = st2_compute_textureFill;
// Adjust shader source to texture format
- TokenStrings s = createShaderTokens(target, format, sample);
+ GLint verifyTarget;
+ if (target == GL_TEXTURE_2D_MULTISAMPLE || target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE)
+ verifyTarget = GL_TEXTURE_2D;
+ else
+ verifyTarget = GL_TEXTURE_2D_ARRAY;
+ TokenStrings s = createShaderTokens(target, verifyTarget, format, sample);
replaceToken("<INPUT_TYPE>", s.inputType.c_str(), shader);
replaceToken("<POINT_TYPE>", s.pointType.c_str(), shader);
// Create verifying texture
GLint verifyTarget;
- if (target == GL_TEXTURE_2D_MULTISAMPLE)
+ if (target == GL_TEXTURE_2D_MULTISAMPLE || target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE)
verifyTarget = GL_TEXTURE_2D;
else
verifyTarget = GL_TEXTURE_2D_ARRAY;
std::string shader = st2_compute_textureVerify;
// Adjust shader source to texture format
- TokenStrings s = createShaderTokens(target, format, sample);
+ TokenStrings s = createShaderTokens(target, verifyTarget, format, sample);
replaceToken("<OUTPUT_TYPE>", s.outputType.c_str(), shader);
replaceToken("<FORMAT>", s.format.c_str(), shader);
{
GLubyte* dataRegion = exp_data + ((x + y * width) + z * width * height);
GLubyte* outDataRegion = out_data + ((x + y * width) + z * width * height);
- if (dataRegion[0] != outDataRegion[0])
+ if (dataRegion[0] != outDataRegion[0]) {
+ m_testCtx.getLog() << tcu::TestLog::Message << mLog.str() <<
+ "Error detected at " << x << "," << y << "," << z << " for sample " << sample <<
+ ": expected [" << (unsigned)dataRegion[0] << "] got [" <<
+ (unsigned)outDataRegion[0] << "]" << tcu::TestLog::EndMessage;
result = false;
+ goto out;
+ }
}
}
else
result = false;
}
}
-
+out:
Texture::Delete(gl, verifyTexture);
}
if (result && level == 0 && target != GL_TEXTURE_RECTANGLE && target != GL_TEXTURE_2D_MULTISAMPLE &&
target != GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
{
+ /* Khronos bugzilla #9471 states that mipmap generation with integer formats
+ * is unsupported, so skip this test
+ */
+ switch (format) {
+ case GL_RGB10_A2UI:
+ case GL_R8I:
+ case GL_R8UI:
+ case GL_R16I:
+ case GL_R16UI:
+ case GL_R32I:
+ case GL_R32UI:
+ case GL_RG8I:
+ case GL_RG8UI:
+ case GL_RG16I:
+ case GL_RG16UI:
+ case GL_RG32I:
+ case GL_RG32UI:
+ case GL_RGBA8I:
+ case GL_RGBA8UI:
+ case GL_RGBA16I:
+ case GL_RGBA16UI:
+ case GL_RGBA32I:
+ case GL_RGBA32UI:
+ return result;
+ }
mLog << "Mipmap Generate - ";
Texture::Bind(gl, texture, target);
gl.generateMipmap(target);
GLU_EXPECT_NO_ERROR(gl.getError(), "Texture::GetData");
//Verify only uncommitted region
- for (GLint x = widthCommitted; x < width; ++x)
- for (GLint y = 0; y < height; ++y)
- for (GLint z = 0; z < depth; ++z)
+ for (GLint x = widthCommitted; result && x < width; ++x)
+ for (GLint y = 0; result && y < height; ++y)
+ for (GLint z = 0; result && z < depth; ++z)
{
int pixelSize = mState.format.getPixelSize();
GLubyte* dataRegion = exp_data + ((x + y * width) * pixelSize);
GLubyte* outDataRegion = out_data + ((x + y * width) * pixelSize);
- if (deMemCmp(dataRegion, outDataRegion, pixelSize) != 0)
+ if (deMemCmp(dataRegion, outDataRegion, pixelSize) != 0) {
+ mLog <<
+ "Error detected at " << x << "," << y << "," << z <<
+ ": expected [ ";
+ for (int e = 0; e < pixelSize; e++)
+ mLog << (unsigned)dataRegion[e] << " ";
+ mLog << "] got [ ";
+ for (int e = 0; e < pixelSize; e++)
+ mLog <<(unsigned)outDataRegion[e] << " ";
+ mLog << "] ";
result = false;
+ }
}
}
// Verify texture using API glGetTexImage* (Only cube map as it has to be verified for subtargets)
GLU_EXPECT_NO_ERROR(gl.getError(), "Texture::GetData");
//Verify only uncommitted region
- for (GLint x = widthCommitted; x < width; ++x)
- for (GLint y = 0; y < height; ++y)
- for (GLint z = 0; z < depth; ++z)
+ for (GLint x = widthCommitted; result && x < width; ++x)
+ for (GLint y = 0; result && y < height; ++y)
+ for (GLint z = 0; result && z < depth; ++z)
{
int pixelSize = mState.format.getPixelSize();
GLubyte* dataRegion = exp_data + ((x + y * width) * pixelSize);
GLubyte* outDataRegion = out_data + ((x + y * width) * pixelSize);
- if (deMemCmp(dataRegion, outDataRegion, pixelSize) != 0)
+ if (deMemCmp(dataRegion, outDataRegion, pixelSize) != 0) {
+ mLog <<
+ "Error detected at " << x << "," << y << "," << z <<
+ ": expected [ ";
+ for (int e = 0; e < pixelSize; e++)
+ mLog << (unsigned)dataRegion[e] << " ";
+ mLog << "] got [ ";
+ for (int e = 0; e < pixelSize; e++)
+ mLog <<(unsigned)outDataRegion[e] << " ";
+ mLog << "] ";
result = false;
+ }
}
if (!result)
{
// Create verifying texture
GLint verifyTarget;
- if (target == GL_TEXTURE_2D_MULTISAMPLE)
+ if (target == GL_TEXTURE_2D_MULTISAMPLE || target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE)
verifyTarget = GL_TEXTURE_2D;
else
verifyTarget = GL_TEXTURE_2D_ARRAY;
if (target == GL_TEXTURE_CUBE_MAP)
depth = depth * 6;
+ if (depth == 1 && mState.samples == 1)
+ target = GL_TEXTURE_2D;
GLint texSize = width * height * depth;
std::string shader = st2_compute_textureVerify;
// Adjust shader source to texture format
- TokenStrings s = createShaderTokens(target, format, sample);
+ TokenStrings s = createShaderTokens(target, verifyTarget, format, sample);
replaceToken("<OUTPUT_TYPE>", s.outputType.c_str(), shader);
replaceToken("<FORMAT>", s.format.c_str(), shader);
gl.bindImageTexture(0, //unit
verifyTexture,
0, //level
- GL_FALSE, //layered
+ depth > 1, //layered
0, //layer
GL_WRITE_ONLY, GL_R8UI);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture");
gl.bindImageTexture(1, //unit
texture,
level, //level
- GL_FALSE, //layered
+ depth > 1, //layered
0, //layer
GL_READ_ONLY, format);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture");
{
GLubyte* dataRegion = exp_data + ((x + y * width) + z * width * height);
GLubyte* outDataRegion = out_data + ((x + y * width) + z * width * height);
- if (dataRegion[0] != outDataRegion[0])
+ if (dataRegion[0] != outDataRegion[0]) {
+ m_testCtx.getLog() << tcu::TestLog::Message << mLog.str() <<
+ "Error detected at " << x << "," << y << "," << z << " for sample " << sample <<
+ ": expected [" << (unsigned)dataRegion[0] << "] got [" <<
+ (unsigned)outDataRegion[0] << "]" << tcu::TestLog::EndMessage;
result = false;
+ goto out;
+ }
}
}
else
result = false;
}
}
-
+out:
Texture::Delete(gl, verifyTexture);
}
// Create verifying texture
GLint verifyTarget;
- if (target == GL_TEXTURE_2D_MULTISAMPLE)
+ if (target == GL_TEXTURE_2D_MULTISAMPLE || target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE)
verifyTarget = GL_TEXTURE_2D;
else
verifyTarget = GL_TEXTURE_2D_ARRAY;
+ if (target == GL_TEXTURE_CUBE_MAP)
+ depth = depth * 6;
+ if (depth == 1 && mState.samples == 1)
+ target = GL_TEXTURE_2D;
GLint texSize = width * height * depth;
std::string shader = st2_compute_atomicVerify;
// Adjust shader source to texture format
- TokenStrings s = createShaderTokens(target, format, sample);
+ TokenStrings s = createShaderTokens(target, verifyTarget, format, sample);
std::string dataType = (s.returnType == "ivec4" ? "int" : "uint");
replaceToken("<OUTPUT_TYPE>", s.outputType.c_str(), shader);
gl.bindImageTexture(0, //unit
verifyTexture,
0, //level
- GL_FALSE, //layered
+ depth > 1, //layered
0, //layer
GL_WRITE_ONLY, GL_R8UI);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture");
gl.bindImageTexture(1, //unit
texture,
level, //level
- GL_FALSE, //layered
+ depth > 1, //layered
0, //layer
GL_READ_ONLY, format);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture");
{
GLubyte* dataRegion = exp_data + ((x + y * width) + z * width * height);
GLubyte* outDataRegion = out_data + ((x + y * width) + z * width * height);
- if (dataRegion[0] != outDataRegion[0])
- {
- printf("%d:%d ", dataRegion[0], outDataRegion[0]);
- result = false;
- }
+ if (dataRegion[0] != outDataRegion[0]) {
+ m_testCtx.getLog() << tcu::TestLog::Message << mLog.str() <<
+ "Error detected at " << x << "," << y << "," << z << " for sample " << sample <<
+ ": expected [" << (unsigned)dataRegion[0] << "] got [" <<
+ (unsigned)outDataRegion[0] << "]" << tcu::TestLog::EndMessage;
+ result = false;
+ goto out;
+ }
}
}
else
result = false;
}
}
-
+out:
Texture::Delete(gl, verifyTexture);
return result;
* @return Returns extended token strings structure.
*/
SparseTexture2LookupTestCase::TokenStringsExt SparseTexture2LookupTestCase::createLookupShaderTokens(
- GLint target, GLint format, GLint level, GLint sample, FunctionToken& funcToken)
+ GLint target, GLint verifyTarget, GLint format, GLint level, GLint sample, FunctionToken& funcToken)
{
std::string funcName = funcToken.name;
inputType = "sampler";
// Copy data from TokenStrings to TokenStringsExt
- TokenStrings ss = createShaderTokens(target, format, sample, "image", inputType);
+ TokenStrings ss = createShaderTokens(target, verifyTarget, format, sample, "image", inputType);
s.epsilon = ss.epsilon;
s.format = ss.format;
s.inputType = ss.inputType;
std::string shader = st2_compute_textureFill;
// Adjust shader source to texture format
- TokenStrings s = createShaderTokens(target, format, sample);
+ GLint verifyTarget;
+ if (target == GL_TEXTURE_2D_MULTISAMPLE || target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE)
+ verifyTarget = GL_TEXTURE_2D;
+ else
+ verifyTarget = GL_TEXTURE_2D_ARRAY;
+ TokenStrings s = createShaderTokens(target, verifyTarget, format, sample);
replaceToken("<INPUT_TYPE>", s.inputType.c_str(), shader);
replaceToken("<POINT_TYPE>", s.pointType.c_str(), shader);
{
gl.useProgram(program.getProgram());
GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram");
- gl.bindImageTexture(0 /* unit */, texture, level /* level */, GL_FALSE /* layered */, 0 /* layer */,
+ gl.bindImageTexture(0 /* unit */, texture, level /* level */, depth > 1 /* layered */, 0 /* layer */,
GL_WRITE_ONLY, convFormat);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindImageTexture");
gl.uniform1i(1, 0 /* image_unit */);
// Create verifying texture
GLint verifyTarget;
- if (target == GL_TEXTURE_2D_MULTISAMPLE)
+ if (target == GL_TEXTURE_2D_MULTISAMPLE || target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE)
verifyTarget = GL_TEXTURE_2D;
else
verifyTarget = GL_TEXTURE_2D_ARRAY;
std::string shader = st2_compute_lookupVerify;
// Adjust shader source to texture format
- TokenStringsExt s = createLookupShaderTokens(target, format, level, sample, f);
+ TokenStringsExt s = createLookupShaderTokens(target, verifyTarget, format, level, sample, f);
replaceToken("<FUNCTION>", f.name.c_str(), shader);
replaceToken("<ARGUMENTS>", f.arguments.c_str(), shader);
{
GLubyte* dataRegion = exp_data + x + y * width + z * width * height;
GLubyte* outDataRegion = out_data + x + y * width + z * width * height;
- if (dataRegion[0] != outDataRegion[0])
+ if (dataRegion[0] != outDataRegion[0]) {
+ m_testCtx.getLog() << tcu::TestLog::Message << mLog.str() <<
+ "Error detected at " << x << "," << y << "," << z << " for sample " << sample <<
+ ": expected [" << (unsigned)dataRegion[0] << "] got [" <<
+ (unsigned)outDataRegion[0] << "]" << tcu::TestLog::EndMessage;
result = false;
+ goto out;
+ }
}
}
else
result = false;
}
}
-
+out:
Texture::Delete(gl, verifyTexture);
return result;
FunctionToken f = funcToken;
// Adjust shader source to texture format
- TokenStringsExt s = createLookupShaderTokens(target, format, level, sample, f);
+ TokenStringsExt s = createLookupShaderTokens(target, verifyTarget, format, level, sample, f);
replaceToken("<COORD_TYPE>", s.coordType.c_str(), vertex);
gl.bindTexture(target, texture);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture");
+ gl.texParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
+ gl.texParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
draw(target, z, program);
{
GLubyte* dataRegion = exp_data + x + y * width;
GLubyte* outDataRegion = out_data + x + y * width;
- if (dataRegion[0] != outDataRegion[0])
+ if (dataRegion[0] != outDataRegion[0]) {
+ m_testCtx.getLog() << tcu::TestLog::Message << mLog.str() <<
+ "Error detected at " << x << "," << y << "," << z <<
+ ": expected [" << (unsigned)dataRegion[0] << "] got [" <<
+ (unsigned)outDataRegion[0] << "]" << tcu::TestLog::EndMessage;
result = false;
+ goto out;
+ }
}
}
}
result = false;
}
}
-
+out:
gl.bindFramebuffer(GL_FRAMEBUFFER, 0);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer");
std::string shader = stc_compute_textureFill;
// Adjust shader source to texture format
- TokenStrings s = createShaderTokens(target, format, sample);
+ GLint verifyTarget;
+ if (target == GL_TEXTURE_2D_MULTISAMPLE || target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE)
+ verifyTarget = GL_TEXTURE_2D;
+ else
+ verifyTarget = GL_TEXTURE_2D_ARRAY;
+ TokenStrings s = createShaderTokens(target, verifyTarget, format, sample);
GLint convFormat = format;
if (format == GL_DEPTH_COMPONENT16)
std::string functionDef = generateFunctionDef(f.name);
// Adjust shader source to texture format
- TokenStringsExt s = createLookupShaderTokens(target, format, level, sample, f);
+ TokenStringsExt s = createLookupShaderTokens(target, verifyTarget, format, level, sample, f);
// Change expected result as it has to be adjusted to different levels
s.resultExpected = generateExpectedResult(s.returnType, level, format);
gl.bindTexture(target, texture);
GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture");
+ gl.texParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
+ gl.texParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
draw(target, z, program);