xref: /aosp_15_r20/external/angle/src/tests/gl_tests/TextureFixedRateCompressionTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 //
2 // Copyright 2024 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 // TextureFixedRateCompressionTest: Tests for GL_EXT_texture_storage_compression
8 
9 #include "test_utils/ANGLETest.h"
10 #include "test_utils/gl_raii.h"
11 
12 namespace angle
13 {
14 
15 static constexpr GLint kDefaultAttribList[3][3] = {
16     {GL_NONE, GL_NONE, GL_NONE},
17     {GL_SURFACE_COMPRESSION_EXT, GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT, GL_NONE},
18     {GL_SURFACE_COMPRESSION_EXT, GL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT, GL_NONE},
19 };
20 
21 class TextureFixedRateCompressionTest : public ANGLETest<>
22 {
23   protected:
24     void invalidTestHelper(const GLint *attribs);
25     void basicTestHelper(const GLint *attribs);
26 };
27 
invalidTestHelper(const GLint * attribs)28 void TextureFixedRateCompressionTest::invalidTestHelper(const GLint *attribs)
29 {
30     GLTexture tex;
31     glBindTexture(GL_TEXTURE_2D, tex);
32     ASSERT_GL_NO_ERROR();
33 
34     glTexStorageAttribs2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16, attribs);
35     ASSERT_GL_NO_ERROR();
36 
37     /* Query compression rate */
38     GLint compressRate = GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT;
39     glGetTexParameteriv(GL_TEXTURE_2D, GL_SURFACE_COMPRESSION_EXT, &compressRate);
40     ASSERT_GL_NO_ERROR();
41 
42     glBindImageTexture(0, tex, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA8);
43     if (nullptr == attribs)
44     {
45         /* Default attrib which is non-compressed formats will return GL_NO_ERROR. */
46         ASSERT_GL_NO_ERROR();
47     }
48     else if (compressRate == GL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT ||
49              (compressRate >= GL_SURFACE_COMPRESSION_FIXED_RATE_1BPC_EXT &&
50               compressRate <= GL_SURFACE_COMPRESSION_FIXED_RATE_12BPC_EXT))
51     {
52         /* Compressed texture is not supported in glBindImageTexture. */
53         ASSERT_GL_ERROR(GL_INVALID_VALUE);
54     }
55     else if (attribs[1] == GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT || attribs[0] == GL_NONE)
56     {
57         /* Default attrib which is non-compressed formats will return GL_NO_ERROR. */
58         ASSERT_GL_NO_ERROR();
59     }
60 }
61 
basicTestHelper(const GLint * attribs)62 void TextureFixedRateCompressionTest::basicTestHelper(const GLint *attribs)
63 {
64     GLTexture texture;
65     glBindTexture(GL_TEXTURE_2D, texture);
66     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
67     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
68     ASSERT_GL_NO_ERROR();
69 
70     glTexStorageAttribs2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16, attribs);
71     ASSERT_GL_NO_ERROR();
72 
73     /* Query and check the compression rate */
74     GLint compressRate;
75     glGetTexParameteriv(GL_TEXTURE_2D, GL_SURFACE_COMPRESSION_EXT, &compressRate);
76     ASSERT_GL_NO_ERROR();
77 
78     if (nullptr != attribs && compressRate != GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT &&
79         attribs[1] != GL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT)
80     {
81         EXPECT_EQ(compressRate, attribs[1]);
82     }
83 
84     GLFramebuffer fbo;
85     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
86     ASSERT_GL_NO_ERROR();
87     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
88     ASSERT_GL_NO_ERROR();
89     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
90 
91     ANGLE_GL_PROGRAM(drawRed, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
92     drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0);
93     EXPECT_PIXEL_RECT_EQ(0, 0, 16, 16, GLColor::red);
94     ASSERT_GL_NO_ERROR();
95 }
96 
97 // Invalid attrib list, GL_INVALID_VALUE is generated.
TEST_P(TextureFixedRateCompressionTest,Invalidate)98 TEST_P(TextureFixedRateCompressionTest, Invalidate)
99 {
100     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage_compression"));
101 
102     constexpr GLint kAttribListInvalid[3] = {GL_SURFACE_COMPRESSION_EXT, GL_SURFACE_COMPRESSION_EXT,
103                                              GL_NONE};
104 
105     GLTexture texture;
106     glBindTexture(GL_TEXTURE_2D, texture);
107     ASSERT_GL_NO_ERROR();
108 
109     glTexStorageAttribs2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8, 16, 16, kAttribListInvalid);
110     ASSERT_GL_ERROR(GL_INVALID_VALUE);
111 
112     for (const GLint *attribs : kDefaultAttribList)
113     {
114         invalidTestHelper(attribs);
115     }
116     invalidTestHelper(nullptr);
117 }
118 
119 // Test basic usage of glTexStorageAttribs2DEXT
TEST_P(TextureFixedRateCompressionTest,TexStorageAttribs2DEXT)120 TEST_P(TextureFixedRateCompressionTest, TexStorageAttribs2DEXT)
121 {
122     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_storage_compression"));
123 
124     for (const GLint *attribs : kDefaultAttribList)
125     {
126         basicTestHelper(attribs);
127     }
128 }
129 
130 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
131 // tests should be run against.
132 ANGLE_INSTANTIATE_TEST_ES31_AND(TextureFixedRateCompressionTest);
133 
134 }  // namespace angle
135