blob: 0aa94220b9f0f03163734ce9c947a6d864ac180f [file] [log] [blame]
//
// Copyright 2016 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// DXTSRGBCompressedTextureTest.cpp
// Tests for sRGB DXT textures (GL_EXT_texture_compression_s3tc_srgb)
//
#include "test_utils/ANGLETest.h"
#include "test_utils/gl_raii.h"
#include "media/pixel.inl"
#include "DXTSRGBCompressedTextureTestData.inl"
using namespace angle;
static constexpr int kWindowSize = 64;
class DXTSRGBCompressedTextureTest : public ANGLETest
{
protected:
DXTSRGBCompressedTextureTest()
{
setWindowWidth(kWindowSize);
setWindowHeight(kWindowSize);
setConfigRedBits(8);
setConfigGreenBits(8);
setConfigBlueBits(8);
setConfigAlphaBits(8);
}
void SetUp() override
{
ANGLETest::SetUp();
const std::string vsSource = std::string(
"precision highp float;\n"
"attribute vec4 position;\n"
"varying vec2 texcoord;\n"
"void main() {\n"
" gl_Position = position;\n"
" texcoord = (position.xy * 0.5) + 0.5;\n"
" texcoord.y = 1.0 - texcoord.y;\n"
"}");
const std::string textureFSSource = std::string(
"precision highp float;\n"
"uniform sampler2D tex;\n"
"varying vec2 texcoord;\n"
"void main() {\n"
" gl_FragColor = texture2D(tex, texcoord);\n"
"}\n");
mTextureProgram = CompileProgram(vsSource, textureFSSource);
ASSERT_NE(0u, mTextureProgram);
mTextureUniformLocation = glGetUniformLocation(mTextureProgram, "tex");
ASSERT_NE(-1, mTextureUniformLocation);
ASSERT_GL_NO_ERROR();
}
void TearDown() override
{
glDeleteProgram(mTextureProgram);
ANGLETest::TearDown();
}
void runTestChecks(const TestCase &test)
{
GLColor actual[kWindowSize * kWindowSize] = {0};
drawQuad(mTextureProgram, "position", 0.5f);
ASSERT_GL_NO_ERROR();
glReadPixels(0, 0, kWindowSize, kWindowSize, GL_RGBA, GL_UNSIGNED_BYTE,
reinterpret_cast<void *>(actual));
ASSERT_GL_NO_ERROR();
for (GLsizei y = 0; y < test.height; ++y)
{
for (GLsizei x = 0; x < test.width; ++x)
{
GLColor exp = reinterpret_cast<const GLColor *>(test.expected)[y * test.width + x];
size_t x_actual = (x * kWindowSize + kWindowSize / 2) / test.width;
size_t y_actual =
((test.height - y - 1) * kWindowSize + kWindowSize / 2) / test.height;
GLColor act = actual[y_actual * kWindowSize + x_actual];
EXPECT_COLOR_NEAR(exp, act, 2.0);
}
}
}
void runTest(GLenum format)
{
if (!extensionEnabled("GL_EXT_texture_compression_s3tc_srgb"))
{
std::cout
<< "Test skipped because GL_EXT_texture_compression_s3tc_srgb is not available."
<< std::endl;
return;
}
const TestCase &test = kTests.at(format);
GLTexture texture;
glBindTexture(GL_TEXTURE_2D, texture.get());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glUseProgram(mTextureProgram);
glUniform1i(mTextureUniformLocation, 0);
ASSERT_GL_NO_ERROR();
glCompressedTexImage2D(GL_TEXTURE_2D, 0, format, test.width, test.height, 0, test.dataSize,
test.data);
ASSERT_GL_NO_ERROR() << "glCompressedTexImage2D(format=" << format << ")";
runTestChecks(test);
glCompressedTexImage2D(GL_TEXTURE_2D, 0, format, test.width, test.height, 0, test.dataSize,
nullptr);
ASSERT_GL_NO_ERROR() << "glCompressedTexImage2D(format=" << format << ", data=null)";
glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, test.width, test.height, format,
test.dataSize, test.data);
ASSERT_GL_NO_ERROR() << "glCompressedTexSubImage2D(format=" << format << ")";
runTestChecks(test);
ASSERT_GL_NO_ERROR();
}
GLuint mTextureProgram = 0;
GLint mTextureUniformLocation = -1;
};
// Test correct decompression of 8x8 textures (four 4x4 blocks) of SRGB_S3TC_DXT1
TEST_P(DXTSRGBCompressedTextureTest, Decompression8x8RGBDXT1)
{
runTest(GL_COMPRESSED_SRGB_S3TC_DXT1_EXT);
}
// Test correct decompression of 8x8 textures (four 4x4 blocks) of SRGB_ALPHA_S3TC_DXT1
TEST_P(DXTSRGBCompressedTextureTest, Decompression8x8RGBADXT1)
{
runTest(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT);
}
// Test correct decompression of 8x8 textures (four 4x4 blocks) of SRGB_ALPHA_S3TC_DXT3
TEST_P(DXTSRGBCompressedTextureTest, Decompression8x8RGBADXT3)
{
runTest(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT);
}
// Test correct decompression of 8x8 textures (four 4x4 blocks) of SRGB_ALPHA_S3TC_DXT5
TEST_P(DXTSRGBCompressedTextureTest, Decompression8x8RGBADXT5)
{
runTest(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT);
}
// Use this to select which configurations (e.g. which renderer, which GLES major version) these
// tests should be run against.
ANGLE_INSTANTIATE_TEST(DXTSRGBCompressedTextureTest,
ES2_D3D11(),
ES2_D3D11_FL9_3(),
ES3_D3D11(),
ES2_OPENGL(),
ES3_OPENGL(),
ES2_OPENGLES(),
ES3_OPENGLES());