blob: b81ad1789ff77f96703196a5c880a05a466e7551 [file] [log] [blame]
//
// Copyright 2022 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.
//
// KTXCompressedTextureTest.cpp: Tests of reading compressed texture stored in
// .ktx formats
#include "image_util/loadimage.h"
#include "test_utils/ANGLETest.h"
#include "test_utils/gl_raii.h"
#include "media/pixel.inc"
using namespace angle;
class KTXCompressedTextureTest : public ANGLETest<>
{
protected:
KTXCompressedTextureTest()
{
setWindowWidth(768);
setWindowHeight(512);
setConfigRedBits(8);
setConfigGreenBits(8);
setConfigBlueBits(8);
setConfigAlphaBits(8);
}
};
// Verify that ANGLE can store and sample the ETC1 compressed texture stored in
// KTX container
TEST_P(KTXCompressedTextureTest, CompressedTexImageETC1)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_compressed_ETC1_RGB8_texture"));
ANGLE_GL_PROGRAM(textureProgram, essl1_shaders::vs::Texture2D(),
essl1_shaders::fs::Texture2D());
glUseProgram(textureProgram);
GLTexture compressedETC1Texture;
glBindTexture(GL_TEXTURE_2D, compressedETC1Texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_ETC1_RGB8_OES, ktx_etc1_width, ktx_etc1_height, 0,
ktx_etc1_size, ktx_etc1_data);
EXPECT_GL_NO_ERROR();
GLint textureUniformLocation =
glGetUniformLocation(textureProgram, essl1_shaders::Texture2DUniform());
glUniform1i(textureUniformLocation, 0);
drawQuad(textureProgram, essl1_shaders::PositionAttrib(), 0.5f);
EXPECT_GL_NO_ERROR();
// Uncompress ETC1 texture data to RGBA texture data
constexpr size_t kDecompressedPixelCount = ktx_etc1_width * ktx_etc1_height;
constexpr size_t kDecompressedBytesPerPixel = 4;
std::vector<GLubyte> decompressedTextureData(
kDecompressedPixelCount * kDecompressedBytesPerPixel, 0);
LoadETC1RGB8ToRGBA8({}, ktx_etc1_width, ktx_etc1_height, 1, ktx_etc1_data,
ktx_etc1_width / 4 * 8, 0, decompressedTextureData.data(),
kDecompressedBytesPerPixel * ktx_etc1_width, 0);
constexpr size_t kComparePixelX = ktx_etc1_width / 2;
constexpr size_t kComparePixelY = ktx_etc1_height / 2;
constexpr size_t kDecompressedPixelIndex =
ktx_etc1_width * kDecompressedBytesPerPixel * (kComparePixelY) +
kComparePixelX * kDecompressedBytesPerPixel;
const GLColor expect(decompressedTextureData[kDecompressedPixelIndex],
decompressedTextureData[kDecompressedPixelIndex + 1],
decompressedTextureData[kDecompressedPixelIndex + 2],
decompressedTextureData[kDecompressedPixelIndex + 3]);
EXPECT_PIXEL_COLOR_EQ(kComparePixelX, kComparePixelY, expect);
EXPECT_GL_NO_ERROR();
}
ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(KTXCompressedTextureTest);