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