xref: /aosp_15_r20/external/angle/src/tests/gl_tests/KTXCompressedTextureTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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