1 //
2 // Copyright 2022 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6
7 // KTXCompressedTextureTest.cpp: Tests of reading compressed texture stored in
8 // .ktx formats
9
10 #include "image_util/loadimage.h"
11 #include "test_utils/ANGLETest.h"
12 #include "test_utils/gl_raii.h"
13
14 #include "media/pixel.inc"
15
16 using namespace angle;
17
18 class KTXCompressedTextureTest : public ANGLETest<>
19 {
20 protected:
KTXCompressedTextureTest()21 KTXCompressedTextureTest()
22 {
23 setWindowWidth(768);
24 setWindowHeight(512);
25 setConfigRedBits(8);
26 setConfigGreenBits(8);
27 setConfigBlueBits(8);
28 setConfigAlphaBits(8);
29 }
30 };
31
32 // Verify that ANGLE can store and sample the ETC1 compressed texture stored in
33 // KTX container
TEST_P(KTXCompressedTextureTest,CompressedTexImageETC1)34 TEST_P(KTXCompressedTextureTest, CompressedTexImageETC1)
35 {
36 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_compressed_ETC1_RGB8_texture"));
37 ANGLE_GL_PROGRAM(textureProgram, essl1_shaders::vs::Texture2D(),
38 essl1_shaders::fs::Texture2D());
39 glUseProgram(textureProgram);
40 GLTexture compressedETC1Texture;
41 glBindTexture(GL_TEXTURE_2D, compressedETC1Texture);
42 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
43 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
44 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
45 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
46 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_ETC1_RGB8_OES, ktx_etc1_width, ktx_etc1_height, 0,
47 ktx_etc1_size, ktx_etc1_data);
48 EXPECT_GL_NO_ERROR();
49 GLint textureUniformLocation =
50 glGetUniformLocation(textureProgram, essl1_shaders::Texture2DUniform());
51 glUniform1i(textureUniformLocation, 0);
52 drawQuad(textureProgram, essl1_shaders::PositionAttrib(), 0.5f);
53 EXPECT_GL_NO_ERROR();
54
55 // Uncompress ETC1 texture data to RGBA texture data
56 constexpr size_t kDecompressedPixelCount = ktx_etc1_width * ktx_etc1_height;
57 constexpr size_t kDecompressedBytesPerPixel = 4;
58 std::vector<GLubyte> decompressedTextureData(
59 kDecompressedPixelCount * kDecompressedBytesPerPixel, 0);
60 LoadETC1RGB8ToRGBA8({}, ktx_etc1_width, ktx_etc1_height, 1, ktx_etc1_data,
61 ktx_etc1_width / 4 * 8, 0, decompressedTextureData.data(),
62 kDecompressedBytesPerPixel * ktx_etc1_width, 0);
63
64 constexpr size_t kComparePixelX = ktx_etc1_width / 2;
65 constexpr size_t kComparePixelY = ktx_etc1_height / 2;
66 constexpr size_t kDecompressedPixelIndex =
67 ktx_etc1_width * kDecompressedBytesPerPixel * (kComparePixelY) +
68 kComparePixelX * kDecompressedBytesPerPixel;
69
70 const GLColor expect(decompressedTextureData[kDecompressedPixelIndex],
71 decompressedTextureData[kDecompressedPixelIndex + 1],
72 decompressedTextureData[kDecompressedPixelIndex + 2],
73 decompressedTextureData[kDecompressedPixelIndex + 3]);
74
75 EXPECT_PIXEL_COLOR_EQ(kComparePixelX, kComparePixelY, expect);
76 EXPECT_GL_NO_ERROR();
77 }
78
79 ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(KTXCompressedTextureTest);
80