xref: /aosp_15_r20/external/angle/src/tests/gl_tests/DXT1CompressedTextureTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
8*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "media/pixel.inc"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker class DXT1CompressedTextureTest : public ANGLETest<>
15*8975f5c5SAndroid Build Coastguard Worker {
16*8975f5c5SAndroid Build Coastguard Worker   protected:
DXT1CompressedTextureTest()17*8975f5c5SAndroid Build Coastguard Worker     DXT1CompressedTextureTest()
18*8975f5c5SAndroid Build Coastguard Worker     {
19*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(512);
20*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(512);
21*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
22*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
23*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
24*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
25*8975f5c5SAndroid Build Coastguard Worker     }
26*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()27*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
28*8975f5c5SAndroid Build Coastguard Worker     {
29*8975f5c5SAndroid Build Coastguard Worker         constexpr char kVS[] = R"(precision highp float;
30*8975f5c5SAndroid Build Coastguard Worker attribute vec4 position;
31*8975f5c5SAndroid Build Coastguard Worker varying vec2 texcoord;
32*8975f5c5SAndroid Build Coastguard Worker 
33*8975f5c5SAndroid Build Coastguard Worker void main()
34*8975f5c5SAndroid Build Coastguard Worker {
35*8975f5c5SAndroid Build Coastguard Worker     gl_Position = position;
36*8975f5c5SAndroid Build Coastguard Worker     texcoord = (position.xy * 0.5) + 0.5;
37*8975f5c5SAndroid Build Coastguard Worker     texcoord.y = 1.0 - texcoord.y;
38*8975f5c5SAndroid Build Coastguard Worker })";
39*8975f5c5SAndroid Build Coastguard Worker 
40*8975f5c5SAndroid Build Coastguard Worker         constexpr char kFS[] = R"(precision highp float;
41*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D tex;
42*8975f5c5SAndroid Build Coastguard Worker varying vec2 texcoord;
43*8975f5c5SAndroid Build Coastguard Worker 
44*8975f5c5SAndroid Build Coastguard Worker void main()
45*8975f5c5SAndroid Build Coastguard Worker {
46*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = texture2D(tex, texcoord);
47*8975f5c5SAndroid Build Coastguard Worker })";
48*8975f5c5SAndroid Build Coastguard Worker 
49*8975f5c5SAndroid Build Coastguard Worker         mTextureProgram = CompileProgram(kVS, kFS);
50*8975f5c5SAndroid Build Coastguard Worker         if (mTextureProgram == 0)
51*8975f5c5SAndroid Build Coastguard Worker         {
52*8975f5c5SAndroid Build Coastguard Worker             FAIL() << "shader compilation failed.";
53*8975f5c5SAndroid Build Coastguard Worker         }
54*8975f5c5SAndroid Build Coastguard Worker 
55*8975f5c5SAndroid Build Coastguard Worker         mTextureUniformLocation = glGetUniformLocation(mTextureProgram, "tex");
56*8975f5c5SAndroid Build Coastguard Worker 
57*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
58*8975f5c5SAndroid Build Coastguard Worker     }
59*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()60*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override { glDeleteProgram(mTextureProgram); }
61*8975f5c5SAndroid Build Coastguard Worker 
62*8975f5c5SAndroid Build Coastguard Worker     GLuint mTextureProgram;
63*8975f5c5SAndroid Build Coastguard Worker     GLint mTextureUniformLocation;
64*8975f5c5SAndroid Build Coastguard Worker };
65*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(DXT1CompressedTextureTest,CompressedTexImage)66*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTest, CompressedTexImage)
67*8975f5c5SAndroid Build Coastguard Worker {
68*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
69*8975f5c5SAndroid Build Coastguard Worker 
70*8975f5c5SAndroid Build Coastguard Worker     GLuint texture;
71*8975f5c5SAndroid Build Coastguard Worker     glGenTextures(1, &texture);
72*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
73*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
74*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
75*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
76*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
77*8975f5c5SAndroid Build Coastguard Worker 
78*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
79*8975f5c5SAndroid Build Coastguard Worker                            pixel_0_height, 0, pixel_0_size, pixel_0_data);
80*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_width,
81*8975f5c5SAndroid Build Coastguard Worker                            pixel_1_height, 0, pixel_1_size, pixel_1_data);
82*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 2, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_width,
83*8975f5c5SAndroid Build Coastguard Worker                            pixel_2_height, 0, pixel_2_size, pixel_2_data);
84*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 3, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_width,
85*8975f5c5SAndroid Build Coastguard Worker                            pixel_3_height, 0, pixel_3_size, pixel_3_data);
86*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_width,
87*8975f5c5SAndroid Build Coastguard Worker                            pixel_4_height, 0, pixel_4_size, pixel_4_data);
88*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 5, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_width,
89*8975f5c5SAndroid Build Coastguard Worker                            pixel_5_height, 0, pixel_5_size, pixel_5_data);
90*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 6, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_width,
91*8975f5c5SAndroid Build Coastguard Worker                            pixel_6_height, 0, pixel_6_size, pixel_6_data);
92*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 7, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_width,
93*8975f5c5SAndroid Build Coastguard Worker                            pixel_7_height, 0, pixel_7_size, pixel_7_data);
94*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 8, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_width,
95*8975f5c5SAndroid Build Coastguard Worker                            pixel_8_height, 0, pixel_8_size, pixel_8_data);
96*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 9, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_width,
97*8975f5c5SAndroid Build Coastguard Worker                            pixel_9_height, 0, pixel_9_size, pixel_9_data);
98*8975f5c5SAndroid Build Coastguard Worker 
99*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
100*8975f5c5SAndroid Build Coastguard Worker 
101*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mTextureProgram);
102*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureUniformLocation, 0);
103*8975f5c5SAndroid Build Coastguard Worker 
104*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureProgram, "position", 0.5f);
105*8975f5c5SAndroid Build Coastguard Worker 
106*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
107*8975f5c5SAndroid Build Coastguard Worker 
108*8975f5c5SAndroid Build Coastguard Worker     glDeleteTextures(1, &texture);
109*8975f5c5SAndroid Build Coastguard Worker 
110*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
111*8975f5c5SAndroid Build Coastguard Worker }
112*8975f5c5SAndroid Build Coastguard Worker 
113*8975f5c5SAndroid Build Coastguard Worker // Verify that DXT1 RGB textures have 1.0 alpha when sampled
TEST_P(DXT1CompressedTextureTest,DXT1Alpha)114*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTest, DXT1Alpha)
115*8975f5c5SAndroid Build Coastguard Worker {
116*8975f5c5SAndroid Build Coastguard Worker     auto test = [&](const std::string &extName, GLenum format) {
117*8975f5c5SAndroid Build Coastguard Worker         ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled(extName));
118*8975f5c5SAndroid Build Coastguard Worker 
119*8975f5c5SAndroid Build Coastguard Worker         // On platforms without native support for DXT1 RGB or texture swizzling (such as D3D or
120*8975f5c5SAndroid Build Coastguard Worker         // some Metal configurations), this test is allowed to succeed with transparent black
121*8975f5c5SAndroid Build Coastguard Worker         // instead of opaque black.
122*8975f5c5SAndroid Build Coastguard Worker         const bool opaque = !IsD3D() && !(IsMetal() && !IsMetalTextureSwizzleAvailable());
123*8975f5c5SAndroid Build Coastguard Worker 
124*8975f5c5SAndroid Build Coastguard Worker         GLTexture texture;
125*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, texture);
126*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
127*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
128*8975f5c5SAndroid Build Coastguard Worker 
129*8975f5c5SAndroid Build Coastguard Worker         // Image using pixels with the code for transparent black:
130*8975f5c5SAndroid Build Coastguard Worker         //          "BLACK,             if color0 <= color1 and code(x,y) == 3"
131*8975f5c5SAndroid Build Coastguard Worker         constexpr uint8_t CompressedImageDXT1[] = {0, 0, 0, 0, 255, 255, 255, 255};
132*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 0, format, 4, 4, 0, sizeof(CompressedImageDXT1),
133*8975f5c5SAndroid Build Coastguard Worker                                CompressedImageDXT1);
134*8975f5c5SAndroid Build Coastguard Worker 
135*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
136*8975f5c5SAndroid Build Coastguard Worker 
137*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(mTextureProgram);
138*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(mTextureUniformLocation, 0);
139*8975f5c5SAndroid Build Coastguard Worker 
140*8975f5c5SAndroid Build Coastguard Worker         constexpr GLint kDrawSize = 4;
141*8975f5c5SAndroid Build Coastguard Worker         // The image is one 4x4 block, make the viewport only 4x4.
142*8975f5c5SAndroid Build Coastguard Worker         glViewport(0, 0, kDrawSize, kDrawSize);
143*8975f5c5SAndroid Build Coastguard Worker 
144*8975f5c5SAndroid Build Coastguard Worker         drawQuad(mTextureProgram, "position", 0.5f);
145*8975f5c5SAndroid Build Coastguard Worker 
146*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
147*8975f5c5SAndroid Build Coastguard Worker 
148*8975f5c5SAndroid Build Coastguard Worker         for (GLint y = 0; y < kDrawSize; y++)
149*8975f5c5SAndroid Build Coastguard Worker         {
150*8975f5c5SAndroid Build Coastguard Worker             for (GLint x = 0; x < kDrawSize; x++)
151*8975f5c5SAndroid Build Coastguard Worker             {
152*8975f5c5SAndroid Build Coastguard Worker                 EXPECT_PIXEL_EQ(x, y, 0, 0, 0, opaque ? 255 : 0)
153*8975f5c5SAndroid Build Coastguard Worker                     << "at (" << x << ", " << y << ") for " << extName;
154*8975f5c5SAndroid Build Coastguard Worker             }
155*8975f5c5SAndroid Build Coastguard Worker         }
156*8975f5c5SAndroid Build Coastguard Worker     };
157*8975f5c5SAndroid Build Coastguard Worker 
158*8975f5c5SAndroid Build Coastguard Worker     test("GL_EXT_texture_compression_dxt1", GL_COMPRESSED_RGB_S3TC_DXT1_EXT);
159*8975f5c5SAndroid Build Coastguard Worker     test("GL_EXT_texture_compression_s3tc_srgb", GL_COMPRESSED_SRGB_S3TC_DXT1_EXT);
160*8975f5c5SAndroid Build Coastguard Worker }
161*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(DXT1CompressedTextureTest,CompressedTexStorage)162*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTest, CompressedTexStorage)
163*8975f5c5SAndroid Build Coastguard Worker {
164*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
165*8975f5c5SAndroid Build Coastguard Worker 
166*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
167*8975f5c5SAndroid Build Coastguard Worker                        (!IsGLExtensionEnabled("GL_EXT_texture_storage") ||
168*8975f5c5SAndroid Build Coastguard Worker                         !IsGLExtensionEnabled("GL_OES_rgb8_rgba8")));
169*8975f5c5SAndroid Build Coastguard Worker 
170*8975f5c5SAndroid Build Coastguard Worker     GLuint texture;
171*8975f5c5SAndroid Build Coastguard Worker     glGenTextures(1, &texture);
172*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
173*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
174*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
175*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
176*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
177*8975f5c5SAndroid Build Coastguard Worker 
178*8975f5c5SAndroid Build Coastguard Worker     if (getClientMajorVersion() < 3)
179*8975f5c5SAndroid Build Coastguard Worker     {
180*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2DEXT(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
181*8975f5c5SAndroid Build Coastguard Worker                           pixel_0_width, pixel_0_height);
182*8975f5c5SAndroid Build Coastguard Worker     }
183*8975f5c5SAndroid Build Coastguard Worker     else
184*8975f5c5SAndroid Build Coastguard Worker     {
185*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
186*8975f5c5SAndroid Build Coastguard Worker                        pixel_0_height);
187*8975f5c5SAndroid Build Coastguard Worker     }
188*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
189*8975f5c5SAndroid Build Coastguard Worker 
190*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pixel_0_width, pixel_0_height,
191*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_size, pixel_0_data);
192*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, pixel_1_width, pixel_1_height,
193*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_size, pixel_1_data);
194*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, pixel_2_width, pixel_2_height,
195*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_size, pixel_2_data);
196*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 3, 0, 0, pixel_3_width, pixel_3_height,
197*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_size, pixel_3_data);
198*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 4, 0, 0, pixel_4_width, pixel_4_height,
199*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_size, pixel_4_data);
200*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 5, 0, 0, pixel_5_width, pixel_5_height,
201*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_size, pixel_5_data);
202*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 6, 0, 0, pixel_6_width, pixel_6_height,
203*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_size, pixel_6_data);
204*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 7, 0, 0, pixel_7_width, pixel_7_height,
205*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_size, pixel_7_data);
206*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 8, 0, 0, pixel_8_width, pixel_8_height,
207*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_size, pixel_8_data);
208*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 9, 0, 0, pixel_9_width, pixel_9_height,
209*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_size, pixel_9_data);
210*8975f5c5SAndroid Build Coastguard Worker 
211*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
212*8975f5c5SAndroid Build Coastguard Worker 
213*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mTextureProgram);
214*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureUniformLocation, 0);
215*8975f5c5SAndroid Build Coastguard Worker 
216*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureProgram, "position", 0.5f);
217*8975f5c5SAndroid Build Coastguard Worker 
218*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
219*8975f5c5SAndroid Build Coastguard Worker 
220*8975f5c5SAndroid Build Coastguard Worker     glDeleteTextures(1, &texture);
221*8975f5c5SAndroid Build Coastguard Worker 
222*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
223*8975f5c5SAndroid Build Coastguard Worker }
224*8975f5c5SAndroid Build Coastguard Worker 
225*8975f5c5SAndroid Build Coastguard Worker // Test validation of non block sizes, width 672 and height 114 and multiple mip levels
TEST_P(DXT1CompressedTextureTest,NonBlockSizesMipLevels)226*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTest, NonBlockSizesMipLevels)
227*8975f5c5SAndroid Build Coastguard Worker {
228*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
229*8975f5c5SAndroid Build Coastguard Worker 
230*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
231*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
232*8975f5c5SAndroid Build Coastguard Worker 
233*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kWidth  = 674;
234*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kHeight = 114;
235*8975f5c5SAndroid Build Coastguard Worker 
236*8975f5c5SAndroid Build Coastguard Worker     // From EXT_texture_compression_s3tc specifications:
237*8975f5c5SAndroid Build Coastguard Worker     // When an S3TC image with a width of <w>, height of <h>, and block size of
238*8975f5c5SAndroid Build Coastguard Worker     // <blocksize> (8 or 16 bytes) is decoded, the corresponding image size (in
239*8975f5c5SAndroid Build Coastguard Worker     // bytes) is:
240*8975f5c5SAndroid Build Coastguard Worker     //     ceil(<w>/4) * ceil(<h>/4) * blocksize.
241*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kImageSize = ((kWidth + 3) / 4) * ((kHeight + 3) / 4) * 8;
242*8975f5c5SAndroid Build Coastguard Worker 
243*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, kWidth, kHeight, 0,
244*8975f5c5SAndroid Build Coastguard Worker                            kImageSize, nullptr);
245*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
246*8975f5c5SAndroid Build Coastguard Worker 
247*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kImageSize1 = ((kWidth / 2 + 3) / 4) * ((kHeight / 2 + 3) / 4) * 8;
248*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, kWidth / 2,
249*8975f5c5SAndroid Build Coastguard Worker                            kHeight / 2, 0, kImageSize1, nullptr);
250*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
251*8975f5c5SAndroid Build Coastguard Worker 
252*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kImageSize2 = ((kWidth / 4 + 3) / 4) * ((kHeight / 4 + 3) / 4) * 8;
253*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, kWidth / 4,
254*8975f5c5SAndroid Build Coastguard Worker                            kHeight / 4, 0, kImageSize2, nullptr);
255*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
256*8975f5c5SAndroid Build Coastguard Worker }
257*8975f5c5SAndroid Build Coastguard Worker 
258*8975f5c5SAndroid Build Coastguard Worker // Test validation of glCompressedTexSubImage2D with DXT formats
TEST_P(DXT1CompressedTextureTest,CompressedTexSubImageValidation)259*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTest, CompressedTexSubImageValidation)
260*8975f5c5SAndroid Build Coastguard Worker {
261*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
262*8975f5c5SAndroid Build Coastguard Worker 
263*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
264*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
265*8975f5c5SAndroid Build Coastguard Worker 
266*8975f5c5SAndroid Build Coastguard Worker     // Size mip 0 to a large size
267*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
268*8975f5c5SAndroid Build Coastguard Worker                            pixel_0_height, 0, pixel_0_size, nullptr);
269*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
270*8975f5c5SAndroid Build Coastguard Worker 
271*8975f5c5SAndroid Build Coastguard Worker     // Set a sub image with an offset that isn't a multiple of the block size
272*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 1, 3, pixel_1_width, pixel_1_height,
273*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_size, pixel_1_data);
274*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_OPERATION);
275*8975f5c5SAndroid Build Coastguard Worker 
276*8975f5c5SAndroid Build Coastguard Worker     // Set a sub image with a negative offset
277*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, -1, 0, 4, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8,
278*8975f5c5SAndroid Build Coastguard Worker                               pixel_1_data);
279*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_VALUE);
280*8975f5c5SAndroid Build Coastguard Worker 
281*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, -1, 4, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8,
282*8975f5c5SAndroid Build Coastguard Worker                               pixel_1_data);
283*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_VALUE);
284*8975f5c5SAndroid Build Coastguard Worker }
285*8975f5c5SAndroid Build Coastguard Worker 
286*8975f5c5SAndroid Build Coastguard Worker // Test that it's not possible to call CopyTexSubImage2D on a compressed texture
TEST_P(DXT1CompressedTextureTest,CopyTexSubImage2DDisallowed)287*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTest, CopyTexSubImage2DDisallowed)
288*8975f5c5SAndroid Build Coastguard Worker {
289*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
290*8975f5c5SAndroid Build Coastguard Worker 
291*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
292*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
293*8975f5c5SAndroid Build Coastguard Worker 
294*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
295*8975f5c5SAndroid Build Coastguard Worker                            pixel_0_height, 0, pixel_0_size, nullptr);
296*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
297*8975f5c5SAndroid Build Coastguard Worker 
298*8975f5c5SAndroid Build Coastguard Worker     glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 4, 4);
299*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_OPERATION);
300*8975f5c5SAndroid Build Coastguard Worker }
301*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(DXT1CompressedTextureTest,PBOCompressedTexStorage)302*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTest, PBOCompressedTexStorage)
303*8975f5c5SAndroid Build Coastguard Worker {
304*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
305*8975f5c5SAndroid Build Coastguard Worker 
306*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
307*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
308*8975f5c5SAndroid Build Coastguard Worker 
309*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
310*8975f5c5SAndroid Build Coastguard Worker                        (!IsGLExtensionEnabled("GL_EXT_texture_storage") ||
311*8975f5c5SAndroid Build Coastguard Worker                         !IsGLExtensionEnabled("GL_OES_rgb8_rgba8")));
312*8975f5c5SAndroid Build Coastguard Worker 
313*8975f5c5SAndroid Build Coastguard Worker     GLuint texture;
314*8975f5c5SAndroid Build Coastguard Worker     glGenTextures(1, &texture);
315*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
316*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
317*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
318*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
319*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
320*8975f5c5SAndroid Build Coastguard Worker 
321*8975f5c5SAndroid Build Coastguard Worker     if (getClientMajorVersion() < 3)
322*8975f5c5SAndroid Build Coastguard Worker     {
323*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2DEXT(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
324*8975f5c5SAndroid Build Coastguard Worker                           pixel_0_width, pixel_0_height);
325*8975f5c5SAndroid Build Coastguard Worker     }
326*8975f5c5SAndroid Build Coastguard Worker     else
327*8975f5c5SAndroid Build Coastguard Worker     {
328*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
329*8975f5c5SAndroid Build Coastguard Worker                        pixel_0_height);
330*8975f5c5SAndroid Build Coastguard Worker     }
331*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
332*8975f5c5SAndroid Build Coastguard Worker 
333*8975f5c5SAndroid Build Coastguard Worker     GLuint buffer;
334*8975f5c5SAndroid Build Coastguard Worker     glGenBuffers(1, &buffer);
335*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
336*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, pixel_0_size, nullptr, GL_STREAM_DRAW);
337*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
338*8975f5c5SAndroid Build Coastguard Worker 
339*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_0_size, pixel_0_data);
340*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pixel_0_width, pixel_0_height,
341*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_size, nullptr);
342*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_1_size, pixel_1_data);
343*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, pixel_1_width, pixel_1_height,
344*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_size, nullptr);
345*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_2_size, pixel_2_data);
346*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, pixel_2_width, pixel_2_height,
347*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_size, nullptr);
348*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_3_size, pixel_3_data);
349*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 3, 0, 0, pixel_3_width, pixel_3_height,
350*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_size, nullptr);
351*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_4_size, pixel_4_data);
352*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 4, 0, 0, pixel_4_width, pixel_4_height,
353*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_size, nullptr);
354*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_5_size, pixel_5_data);
355*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 5, 0, 0, pixel_5_width, pixel_5_height,
356*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_size, nullptr);
357*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_6_size, pixel_6_data);
358*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 6, 0, 0, pixel_6_width, pixel_6_height,
359*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_size, nullptr);
360*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_7_size, pixel_7_data);
361*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 7, 0, 0, pixel_7_width, pixel_7_height,
362*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_size, nullptr);
363*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_8_size, pixel_8_data);
364*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 8, 0, 0, pixel_8_width, pixel_8_height,
365*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_size, nullptr);
366*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_9_size, pixel_9_data);
367*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 9, 0, 0, pixel_9_width, pixel_9_height,
368*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_size, nullptr);
369*8975f5c5SAndroid Build Coastguard Worker 
370*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
371*8975f5c5SAndroid Build Coastguard Worker 
372*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mTextureProgram);
373*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureUniformLocation, 0);
374*8975f5c5SAndroid Build Coastguard Worker 
375*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureProgram, "position", 0.5f);
376*8975f5c5SAndroid Build Coastguard Worker 
377*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
378*8975f5c5SAndroid Build Coastguard Worker 
379*8975f5c5SAndroid Build Coastguard Worker     glDeleteTextures(1, &texture);
380*8975f5c5SAndroid Build Coastguard Worker 
381*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
382*8975f5c5SAndroid Build Coastguard Worker }
383*8975f5c5SAndroid Build Coastguard Worker 
384*8975f5c5SAndroid Build Coastguard Worker class DXT1CompressedTextureTestES3 : public DXT1CompressedTextureTest
385*8975f5c5SAndroid Build Coastguard Worker {};
386*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(DXT1CompressedTextureTestES3,PBOCompressedTexImage)387*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTestES3, PBOCompressedTexImage)
388*8975f5c5SAndroid Build Coastguard Worker {
389*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
390*8975f5c5SAndroid Build Coastguard Worker 
391*8975f5c5SAndroid Build Coastguard Worker     GLuint texture;
392*8975f5c5SAndroid Build Coastguard Worker     glGenTextures(1, &texture);
393*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
394*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
395*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
396*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
397*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
398*8975f5c5SAndroid Build Coastguard Worker 
399*8975f5c5SAndroid Build Coastguard Worker     GLuint buffer;
400*8975f5c5SAndroid Build Coastguard Worker     glGenBuffers(1, &buffer);
401*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
402*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_PIXEL_UNPACK_BUFFER, pixel_0_size, nullptr, GL_STREAM_DRAW);
403*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
404*8975f5c5SAndroid Build Coastguard Worker 
405*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_0_size, pixel_0_data);
406*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
407*8975f5c5SAndroid Build Coastguard Worker                            pixel_0_height, 0, pixel_0_size, nullptr);
408*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_1_size, pixel_1_data);
409*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_width,
410*8975f5c5SAndroid Build Coastguard Worker                            pixel_1_height, 0, pixel_1_size, nullptr);
411*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_2_size, pixel_2_data);
412*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 2, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_width,
413*8975f5c5SAndroid Build Coastguard Worker                            pixel_2_height, 0, pixel_2_size, nullptr);
414*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_3_size, pixel_3_data);
415*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 3, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_width,
416*8975f5c5SAndroid Build Coastguard Worker                            pixel_3_height, 0, pixel_3_size, nullptr);
417*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_4_size, pixel_4_data);
418*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_width,
419*8975f5c5SAndroid Build Coastguard Worker                            pixel_4_height, 0, pixel_4_size, nullptr);
420*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_5_size, pixel_5_data);
421*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 5, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_width,
422*8975f5c5SAndroid Build Coastguard Worker                            pixel_5_height, 0, pixel_5_size, nullptr);
423*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_6_size, pixel_6_data);
424*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 6, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_width,
425*8975f5c5SAndroid Build Coastguard Worker                            pixel_6_height, 0, pixel_6_size, nullptr);
426*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_7_size, pixel_7_data);
427*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 7, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_width,
428*8975f5c5SAndroid Build Coastguard Worker                            pixel_7_height, 0, pixel_7_size, nullptr);
429*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_8_size, pixel_8_data);
430*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 8, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_width,
431*8975f5c5SAndroid Build Coastguard Worker                            pixel_8_height, 0, pixel_8_size, nullptr);
432*8975f5c5SAndroid Build Coastguard Worker     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_9_size, pixel_9_data);
433*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 9, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_width,
434*8975f5c5SAndroid Build Coastguard Worker                            pixel_9_height, 0, pixel_9_size, nullptr);
435*8975f5c5SAndroid Build Coastguard Worker 
436*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
437*8975f5c5SAndroid Build Coastguard Worker 
438*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mTextureProgram);
439*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureUniformLocation, 0);
440*8975f5c5SAndroid Build Coastguard Worker 
441*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureProgram, "position", 0.5f);
442*8975f5c5SAndroid Build Coastguard Worker 
443*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
444*8975f5c5SAndroid Build Coastguard Worker 
445*8975f5c5SAndroid Build Coastguard Worker     glDeleteTextures(1, &buffer);
446*8975f5c5SAndroid Build Coastguard Worker     glDeleteTextures(1, &texture);
447*8975f5c5SAndroid Build Coastguard Worker 
448*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
449*8975f5c5SAndroid Build Coastguard Worker }
450*8975f5c5SAndroid Build Coastguard Worker 
451*8975f5c5SAndroid Build Coastguard Worker // Test validation of glCompressedTexSubImage3D with DXT formats
TEST_P(DXT1CompressedTextureTestES3,CompressedTexSubImageValidation)452*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTestES3, CompressedTexSubImageValidation)
453*8975f5c5SAndroid Build Coastguard Worker {
454*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
455*8975f5c5SAndroid Build Coastguard Worker 
456*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
457*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
458*8975f5c5SAndroid Build Coastguard Worker 
459*8975f5c5SAndroid Build Coastguard Worker     // Size mip 0 to a large size
460*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
461*8975f5c5SAndroid Build Coastguard Worker                            pixel_0_height, 1, 0, pixel_0_size, nullptr);
462*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
463*8975f5c5SAndroid Build Coastguard Worker 
464*8975f5c5SAndroid Build Coastguard Worker     // Set a sub image with a negative offset
465*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, -1, 0, 0, 4, 4, 1,
466*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, pixel_1_data);
467*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_VALUE);
468*8975f5c5SAndroid Build Coastguard Worker 
469*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, -1, 0, 4, 4, 1,
470*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, pixel_1_data);
471*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_VALUE);
472*8975f5c5SAndroid Build Coastguard Worker 
473*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, -1, 4, 4, 1,
474*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, pixel_1_data);
475*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_VALUE);
476*8975f5c5SAndroid Build Coastguard Worker }
477*8975f5c5SAndroid Build Coastguard Worker 
478*8975f5c5SAndroid Build Coastguard Worker // Test validation of glCompressedTexSubImage3D with per-slice data uploads
TEST_P(DXT1CompressedTextureTestES3,CompressedTexSubImage3DValidationPerSlice)479*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTestES3, CompressedTexSubImage3DValidationPerSlice)
480*8975f5c5SAndroid Build Coastguard Worker {
481*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
482*8975f5c5SAndroid Build Coastguard Worker 
483*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
484*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
485*8975f5c5SAndroid Build Coastguard Worker     const GLenum format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
486*8975f5c5SAndroid Build Coastguard Worker 
487*8975f5c5SAndroid Build Coastguard Worker     // 8x8x2, 4x4x2, 2x2x2, 1x1x2
488*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_2D_ARRAY, 4, format, 8, 8, 2);
489*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
490*8975f5c5SAndroid Build Coastguard Worker 
491*8975f5c5SAndroid Build Coastguard Worker     uint8_t data[32] = {};
492*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 8, 8, 1, format, 32, data);
493*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
494*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 1, 8, 8, 1, format, 32, data);
495*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
496*8975f5c5SAndroid Build Coastguard Worker 
497*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 1, 0, 0, 0, 4, 4, 1, format, 8, data);
498*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
499*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 1, 0, 0, 1, 4, 4, 1, format, 8, data);
500*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
501*8975f5c5SAndroid Build Coastguard Worker 
502*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 2, 0, 0, 0, 2, 2, 1, format, 8, data);
503*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
504*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 2, 0, 0, 1, 2, 2, 1, format, 8, data);
505*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
506*8975f5c5SAndroid Build Coastguard Worker 
507*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 3, 0, 0, 0, 1, 1, 1, format, 8, data);
508*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
509*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 3, 0, 0, 1, 1, 1, 1, format, 8, data);
510*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
511*8975f5c5SAndroid Build Coastguard Worker }
512*8975f5c5SAndroid Build Coastguard Worker 
513*8975f5c5SAndroid Build Coastguard Worker // Test validation of glCompressedTexSubImage3D with combined per-level data uploads
TEST_P(DXT1CompressedTextureTestES3,CompressedTexSubImage3DValidationPerLevel)514*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTestES3, CompressedTexSubImage3DValidationPerLevel)
515*8975f5c5SAndroid Build Coastguard Worker {
516*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
517*8975f5c5SAndroid Build Coastguard Worker 
518*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
519*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
520*8975f5c5SAndroid Build Coastguard Worker     const GLenum format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
521*8975f5c5SAndroid Build Coastguard Worker 
522*8975f5c5SAndroid Build Coastguard Worker     // 8x8x2, 4x4x2, 2x2x2, 1x1x2
523*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_2D_ARRAY, 4, format, 8, 8, 2);
524*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
525*8975f5c5SAndroid Build Coastguard Worker 
526*8975f5c5SAndroid Build Coastguard Worker     uint8_t data[64] = {};
527*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 8, 8, 2, format, 64, data);
528*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
529*8975f5c5SAndroid Build Coastguard Worker 
530*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 1, 0, 0, 0, 4, 4, 2, format, 16, data);
531*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
532*8975f5c5SAndroid Build Coastguard Worker 
533*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 2, 0, 0, 0, 2, 2, 2, format, 16, data);
534*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
535*8975f5c5SAndroid Build Coastguard Worker 
536*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 3, 0, 0, 0, 1, 1, 2, format, 16, data);
537*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
538*8975f5c5SAndroid Build Coastguard Worker }
539*8975f5c5SAndroid Build Coastguard Worker 
540*8975f5c5SAndroid Build Coastguard Worker // Test validation of glCompressedTexSubImage3D with DXT formats
TEST_P(DXT1CompressedTextureTestES3,CopyTexSubImage3DDisallowed)541*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTestES3, CopyTexSubImage3DDisallowed)
542*8975f5c5SAndroid Build Coastguard Worker {
543*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
544*8975f5c5SAndroid Build Coastguard Worker 
545*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
546*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
547*8975f5c5SAndroid Build Coastguard Worker 
548*8975f5c5SAndroid Build Coastguard Worker     GLsizei depth = 4;
549*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
550*8975f5c5SAndroid Build Coastguard Worker                            pixel_0_height, depth, 0, pixel_0_size * depth, nullptr);
551*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
552*8975f5c5SAndroid Build Coastguard Worker 
553*8975f5c5SAndroid Build Coastguard Worker     glCopyTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 0, 0, 4, 4);
554*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_ERROR(GL_INVALID_OPERATION);
555*8975f5c5SAndroid Build Coastguard Worker }
556*8975f5c5SAndroid Build Coastguard Worker 
557*8975f5c5SAndroid Build Coastguard Worker class DXT1CompressedTextureTestWebGL2 : public DXT1CompressedTextureTest
558*8975f5c5SAndroid Build Coastguard Worker {
559*8975f5c5SAndroid Build Coastguard Worker   protected:
DXT1CompressedTextureTestWebGL2()560*8975f5c5SAndroid Build Coastguard Worker     DXT1CompressedTextureTestWebGL2()
561*8975f5c5SAndroid Build Coastguard Worker     {
562*8975f5c5SAndroid Build Coastguard Worker         setWebGLCompatibilityEnabled(true);
563*8975f5c5SAndroid Build Coastguard Worker         setRobustResourceInit(true);
564*8975f5c5SAndroid Build Coastguard Worker     }
565*8975f5c5SAndroid Build Coastguard Worker };
566*8975f5c5SAndroid Build Coastguard Worker 
567*8975f5c5SAndroid Build Coastguard Worker // Regression test for https://crbug.com/1289428
TEST_P(DXT1CompressedTextureTestWebGL2,InitializeTextureContents)568*8975f5c5SAndroid Build Coastguard Worker TEST_P(DXT1CompressedTextureTestWebGL2, InitializeTextureContents)
569*8975f5c5SAndroid Build Coastguard Worker {
570*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
571*8975f5c5SAndroid Build Coastguard Worker 
572*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mTextureProgram);
573*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mTextureUniformLocation, 0);
574*8975f5c5SAndroid Build Coastguard Worker 
575*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0, 0, 1, 1);
576*8975f5c5SAndroid Build Coastguard Worker 
577*8975f5c5SAndroid Build Coastguard Worker     const std::array<uint8_t, 8> kGreen = {0xE0, 0x07, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00};
578*8975f5c5SAndroid Build Coastguard Worker 
579*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
580*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
581*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
582*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
583*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
584*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
585*8975f5c5SAndroid Build Coastguard Worker 
586*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4);
587*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
588*8975f5c5SAndroid Build Coastguard Worker 
589*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
590*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureProgram, "position", 0.5f, 1.0f, true);
591*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
592*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::black);
593*8975f5c5SAndroid Build Coastguard Worker 
594*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8,
595*8975f5c5SAndroid Build Coastguard Worker                               kGreen.data());
596*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
597*8975f5c5SAndroid Build Coastguard Worker 
598*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
599*8975f5c5SAndroid Build Coastguard Worker     drawQuad(mTextureProgram, "position", 0.5f, 1.0f, true);
600*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
601*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::green);
602*8975f5c5SAndroid Build Coastguard Worker }
603*8975f5c5SAndroid Build Coastguard Worker 
604*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(DXT1CompressedTextureTest);
605*8975f5c5SAndroid Build Coastguard Worker 
606*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DXT1CompressedTextureTestES3);
607*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3_AND(DXT1CompressedTextureTestES3,
608*8975f5c5SAndroid Build Coastguard Worker                                ES3_VULKAN().enable(angle::Feature::ForceRobustResourceInit));
609*8975f5c5SAndroid Build Coastguard Worker 
610*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(DXT1CompressedTextureTestWebGL2);
611