• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2015 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 #include "test_utils/ANGLETest.h"
8 #include "test_utils/gl_raii.h"
9 
10 #include "media/pixel.inc"
11 
12 using namespace angle;
13 
14 class DXT1CompressedTextureTest : public ANGLETest
15 {
16   protected:
DXT1CompressedTextureTest()17     DXT1CompressedTextureTest()
18     {
19         setWindowWidth(512);
20         setWindowHeight(512);
21         setConfigRedBits(8);
22         setConfigGreenBits(8);
23         setConfigBlueBits(8);
24         setConfigAlphaBits(8);
25     }
26 
testSetUp()27     void testSetUp() override
28     {
29         constexpr char kVS[] = R"(precision highp float;
30 attribute vec4 position;
31 varying vec2 texcoord;
32 
33 void main()
34 {
35     gl_Position = position;
36     texcoord = (position.xy * 0.5) + 0.5;
37     texcoord.y = 1.0 - texcoord.y;
38 })";
39 
40         constexpr char kFS[] = R"(precision highp float;
41 uniform sampler2D tex;
42 varying vec2 texcoord;
43 
44 void main()
45 {
46     gl_FragColor = texture2D(tex, texcoord);
47 })";
48 
49         mTextureProgram = CompileProgram(kVS, kFS);
50         if (mTextureProgram == 0)
51         {
52             FAIL() << "shader compilation failed.";
53         }
54 
55         mTextureUniformLocation = glGetUniformLocation(mTextureProgram, "tex");
56 
57         ASSERT_GL_NO_ERROR();
58     }
59 
testTearDown()60     void testTearDown() override { glDeleteProgram(mTextureProgram); }
61 
62     GLuint mTextureProgram;
63     GLint mTextureUniformLocation;
64 };
65 
TEST_P(DXT1CompressedTextureTest,CompressedTexImage)66 TEST_P(DXT1CompressedTextureTest, CompressedTexImage)
67 {
68     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
69 
70     GLuint texture;
71     glGenTextures(1, &texture);
72     glBindTexture(GL_TEXTURE_2D, texture);
73     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
74     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
75     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
76     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
77 
78     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
79                            pixel_0_height, 0, pixel_0_size, pixel_0_data);
80     glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_width,
81                            pixel_1_height, 0, pixel_1_size, pixel_1_data);
82     glCompressedTexImage2D(GL_TEXTURE_2D, 2, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_width,
83                            pixel_2_height, 0, pixel_2_size, pixel_2_data);
84     glCompressedTexImage2D(GL_TEXTURE_2D, 3, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_width,
85                            pixel_3_height, 0, pixel_3_size, pixel_3_data);
86     glCompressedTexImage2D(GL_TEXTURE_2D, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_width,
87                            pixel_4_height, 0, pixel_4_size, pixel_4_data);
88     glCompressedTexImage2D(GL_TEXTURE_2D, 5, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_width,
89                            pixel_5_height, 0, pixel_5_size, pixel_5_data);
90     glCompressedTexImage2D(GL_TEXTURE_2D, 6, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_width,
91                            pixel_6_height, 0, pixel_6_size, pixel_6_data);
92     glCompressedTexImage2D(GL_TEXTURE_2D, 7, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_width,
93                            pixel_7_height, 0, pixel_7_size, pixel_7_data);
94     glCompressedTexImage2D(GL_TEXTURE_2D, 8, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_width,
95                            pixel_8_height, 0, pixel_8_size, pixel_8_data);
96     glCompressedTexImage2D(GL_TEXTURE_2D, 9, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_width,
97                            pixel_9_height, 0, pixel_9_size, pixel_9_data);
98 
99     EXPECT_GL_NO_ERROR();
100 
101     glUseProgram(mTextureProgram);
102     glUniform1i(mTextureUniformLocation, 0);
103 
104     drawQuad(mTextureProgram, "position", 0.5f);
105 
106     EXPECT_GL_NO_ERROR();
107 
108     glDeleteTextures(1, &texture);
109 
110     EXPECT_GL_NO_ERROR();
111 }
112 
TEST_P(DXT1CompressedTextureTest,CompressedTexStorage)113 TEST_P(DXT1CompressedTextureTest, CompressedTexStorage)
114 {
115     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
116 
117     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
118                        (!IsGLExtensionEnabled("GL_EXT_texture_storage") ||
119                         !IsGLExtensionEnabled("GL_OES_rgb8_rgba8")));
120 
121     GLuint texture;
122     glGenTextures(1, &texture);
123     glBindTexture(GL_TEXTURE_2D, texture);
124     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
125     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
126     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
127     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
128 
129     if (getClientMajorVersion() < 3)
130     {
131         glTexStorage2DEXT(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
132                           pixel_0_width, pixel_0_height);
133     }
134     else
135     {
136         glTexStorage2D(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
137                        pixel_0_height);
138     }
139     EXPECT_GL_NO_ERROR();
140 
141     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pixel_0_width, pixel_0_height,
142                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_size, pixel_0_data);
143     glCompressedTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, pixel_1_width, pixel_1_height,
144                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_size, pixel_1_data);
145     glCompressedTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, pixel_2_width, pixel_2_height,
146                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_size, pixel_2_data);
147     glCompressedTexSubImage2D(GL_TEXTURE_2D, 3, 0, 0, pixel_3_width, pixel_3_height,
148                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_size, pixel_3_data);
149     glCompressedTexSubImage2D(GL_TEXTURE_2D, 4, 0, 0, pixel_4_width, pixel_4_height,
150                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_size, pixel_4_data);
151     glCompressedTexSubImage2D(GL_TEXTURE_2D, 5, 0, 0, pixel_5_width, pixel_5_height,
152                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_size, pixel_5_data);
153     glCompressedTexSubImage2D(GL_TEXTURE_2D, 6, 0, 0, pixel_6_width, pixel_6_height,
154                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_size, pixel_6_data);
155     glCompressedTexSubImage2D(GL_TEXTURE_2D, 7, 0, 0, pixel_7_width, pixel_7_height,
156                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_size, pixel_7_data);
157     glCompressedTexSubImage2D(GL_TEXTURE_2D, 8, 0, 0, pixel_8_width, pixel_8_height,
158                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_size, pixel_8_data);
159     glCompressedTexSubImage2D(GL_TEXTURE_2D, 9, 0, 0, pixel_9_width, pixel_9_height,
160                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_size, pixel_9_data);
161 
162     EXPECT_GL_NO_ERROR();
163 
164     glUseProgram(mTextureProgram);
165     glUniform1i(mTextureUniformLocation, 0);
166 
167     drawQuad(mTextureProgram, "position", 0.5f);
168 
169     EXPECT_GL_NO_ERROR();
170 
171     glDeleteTextures(1, &texture);
172 
173     EXPECT_GL_NO_ERROR();
174 }
175 
176 // Test validation of glCompressedTexSubImage2D with DXT formats
TEST_P(DXT1CompressedTextureTest,CompressedTexSubImageValidation)177 TEST_P(DXT1CompressedTextureTest, CompressedTexSubImageValidation)
178 {
179     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
180 
181     GLTexture texture;
182     glBindTexture(GL_TEXTURE_2D, texture.get());
183 
184     // Size mip 0 to a large size
185     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
186                            pixel_0_height, 0, pixel_0_size, nullptr);
187     ASSERT_GL_NO_ERROR();
188 
189     // Set a sub image with an offset that isn't a multiple of the block size
190     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 1, 3, pixel_1_width, pixel_1_height,
191                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_size, pixel_1_data);
192     ASSERT_GL_ERROR(GL_INVALID_OPERATION);
193 
194     // Set a sub image with a negative offset
195     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, -1, 0, 4, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8,
196                               pixel_1_data);
197     ASSERT_GL_ERROR(GL_INVALID_VALUE);
198 
199     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, -1, 4, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8,
200                               pixel_1_data);
201     ASSERT_GL_ERROR(GL_INVALID_VALUE);
202 }
203 
204 // Test that it's not possible to call CopyTexSubImage2D on a compressed texture
TEST_P(DXT1CompressedTextureTest,CopyTexSubImage2DDisallowed)205 TEST_P(DXT1CompressedTextureTest, CopyTexSubImage2DDisallowed)
206 {
207     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
208 
209     GLTexture texture;
210     glBindTexture(GL_TEXTURE_2D, texture.get());
211 
212     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
213                            pixel_0_height, 0, pixel_0_size, nullptr);
214     ASSERT_GL_NO_ERROR();
215 
216     glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 4, 4);
217     ASSERT_GL_ERROR(GL_INVALID_OPERATION);
218 }
219 
TEST_P(DXT1CompressedTextureTest,PBOCompressedTexStorage)220 TEST_P(DXT1CompressedTextureTest, PBOCompressedTexStorage)
221 {
222     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
223 
224     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
225                        !IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
226 
227     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
228                        (!IsGLExtensionEnabled("GL_EXT_texture_storage") ||
229                         !IsGLExtensionEnabled("GL_OES_rgb8_rgba8")));
230 
231     GLuint texture;
232     glGenTextures(1, &texture);
233     glBindTexture(GL_TEXTURE_2D, texture);
234     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
235     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
236     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
237     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
238 
239     if (getClientMajorVersion() < 3)
240     {
241         glTexStorage2DEXT(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
242                           pixel_0_width, pixel_0_height);
243     }
244     else
245     {
246         glTexStorage2D(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
247                        pixel_0_height);
248     }
249     EXPECT_GL_NO_ERROR();
250 
251     GLuint buffer;
252     glGenBuffers(1, &buffer);
253     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
254     glBufferData(GL_PIXEL_UNPACK_BUFFER, pixel_0_size, nullptr, GL_STREAM_DRAW);
255     EXPECT_GL_NO_ERROR();
256 
257     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_0_size, pixel_0_data);
258     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pixel_0_width, pixel_0_height,
259                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_size, nullptr);
260     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_1_size, pixel_1_data);
261     glCompressedTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, pixel_1_width, pixel_1_height,
262                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_size, nullptr);
263     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_2_size, pixel_2_data);
264     glCompressedTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, pixel_2_width, pixel_2_height,
265                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_size, nullptr);
266     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_3_size, pixel_3_data);
267     glCompressedTexSubImage2D(GL_TEXTURE_2D, 3, 0, 0, pixel_3_width, pixel_3_height,
268                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_size, nullptr);
269     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_4_size, pixel_4_data);
270     glCompressedTexSubImage2D(GL_TEXTURE_2D, 4, 0, 0, pixel_4_width, pixel_4_height,
271                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_size, nullptr);
272     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_5_size, pixel_5_data);
273     glCompressedTexSubImage2D(GL_TEXTURE_2D, 5, 0, 0, pixel_5_width, pixel_5_height,
274                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_size, nullptr);
275     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_6_size, pixel_6_data);
276     glCompressedTexSubImage2D(GL_TEXTURE_2D, 6, 0, 0, pixel_6_width, pixel_6_height,
277                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_size, nullptr);
278     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_7_size, pixel_7_data);
279     glCompressedTexSubImage2D(GL_TEXTURE_2D, 7, 0, 0, pixel_7_width, pixel_7_height,
280                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_size, nullptr);
281     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_8_size, pixel_8_data);
282     glCompressedTexSubImage2D(GL_TEXTURE_2D, 8, 0, 0, pixel_8_width, pixel_8_height,
283                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_size, nullptr);
284     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_9_size, pixel_9_data);
285     glCompressedTexSubImage2D(GL_TEXTURE_2D, 9, 0, 0, pixel_9_width, pixel_9_height,
286                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_size, nullptr);
287 
288     EXPECT_GL_NO_ERROR();
289 
290     glUseProgram(mTextureProgram);
291     glUniform1i(mTextureUniformLocation, 0);
292 
293     drawQuad(mTextureProgram, "position", 0.5f);
294 
295     EXPECT_GL_NO_ERROR();
296 
297     glDeleteTextures(1, &texture);
298 
299     EXPECT_GL_NO_ERROR();
300 }
301 
302 class DXT1CompressedTextureTestES3 : public DXT1CompressedTextureTest
303 {};
304 
TEST_P(DXT1CompressedTextureTestES3,PBOCompressedTexImage)305 TEST_P(DXT1CompressedTextureTestES3, PBOCompressedTexImage)
306 {
307     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
308 
309     GLuint texture;
310     glGenTextures(1, &texture);
311     glBindTexture(GL_TEXTURE_2D, texture);
312     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
313     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
314     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
315     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
316 
317     GLuint buffer;
318     glGenBuffers(1, &buffer);
319     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
320     glBufferData(GL_PIXEL_UNPACK_BUFFER, pixel_0_size, nullptr, GL_STREAM_DRAW);
321     EXPECT_GL_NO_ERROR();
322 
323     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_0_size, pixel_0_data);
324     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
325                            pixel_0_height, 0, pixel_0_size, nullptr);
326     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_1_size, pixel_1_data);
327     glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_width,
328                            pixel_1_height, 0, pixel_1_size, nullptr);
329     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_2_size, pixel_2_data);
330     glCompressedTexImage2D(GL_TEXTURE_2D, 2, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_width,
331                            pixel_2_height, 0, pixel_2_size, nullptr);
332     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_3_size, pixel_3_data);
333     glCompressedTexImage2D(GL_TEXTURE_2D, 3, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_width,
334                            pixel_3_height, 0, pixel_3_size, nullptr);
335     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_4_size, pixel_4_data);
336     glCompressedTexImage2D(GL_TEXTURE_2D, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_width,
337                            pixel_4_height, 0, pixel_4_size, nullptr);
338     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_5_size, pixel_5_data);
339     glCompressedTexImage2D(GL_TEXTURE_2D, 5, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_width,
340                            pixel_5_height, 0, pixel_5_size, nullptr);
341     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_6_size, pixel_6_data);
342     glCompressedTexImage2D(GL_TEXTURE_2D, 6, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_width,
343                            pixel_6_height, 0, pixel_6_size, nullptr);
344     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_7_size, pixel_7_data);
345     glCompressedTexImage2D(GL_TEXTURE_2D, 7, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_width,
346                            pixel_7_height, 0, pixel_7_size, nullptr);
347     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_8_size, pixel_8_data);
348     glCompressedTexImage2D(GL_TEXTURE_2D, 8, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_width,
349                            pixel_8_height, 0, pixel_8_size, nullptr);
350     glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_9_size, pixel_9_data);
351     glCompressedTexImage2D(GL_TEXTURE_2D, 9, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_width,
352                            pixel_9_height, 0, pixel_9_size, nullptr);
353 
354     EXPECT_GL_NO_ERROR();
355 
356     glUseProgram(mTextureProgram);
357     glUniform1i(mTextureUniformLocation, 0);
358 
359     drawQuad(mTextureProgram, "position", 0.5f);
360 
361     EXPECT_GL_NO_ERROR();
362 
363     glDeleteTextures(1, &buffer);
364     glDeleteTextures(1, &texture);
365 
366     EXPECT_GL_NO_ERROR();
367 }
368 
369 // Test validation of glCompressedTexSubImage3D with DXT formats
TEST_P(DXT1CompressedTextureTestES3,CompressedTexSubImageValidation)370 TEST_P(DXT1CompressedTextureTestES3, CompressedTexSubImageValidation)
371 {
372     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
373 
374     GLTexture texture;
375     glBindTexture(GL_TEXTURE_2D_ARRAY, texture.get());
376 
377     // Size mip 0 to a large size
378     glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
379                            pixel_0_height, 1, 0, pixel_0_size, nullptr);
380     ASSERT_GL_NO_ERROR();
381 
382     // Set a sub image with a negative offset
383     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, -1, 0, 0, 4, 4, 1,
384                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, pixel_1_data);
385     ASSERT_GL_ERROR(GL_INVALID_VALUE);
386 
387     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, -1, 0, 4, 4, 1,
388                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, pixel_1_data);
389     ASSERT_GL_ERROR(GL_INVALID_VALUE);
390 
391     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, -1, 4, 4, 1,
392                               GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, pixel_1_data);
393     ASSERT_GL_ERROR(GL_INVALID_VALUE);
394 }
395 
396 // Test validation of glCompressedTexSubImage3D with DXT formats
TEST_P(DXT1CompressedTextureTestES3,CopyTexSubImage3DDisallowed)397 TEST_P(DXT1CompressedTextureTestES3, CopyTexSubImage3DDisallowed)
398 {
399     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
400 
401     GLTexture texture;
402     glBindTexture(GL_TEXTURE_2D_ARRAY, texture.get());
403 
404     GLsizei depth = 4;
405     glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
406                            pixel_0_height, depth, 0, pixel_0_size * depth, nullptr);
407     ASSERT_GL_NO_ERROR();
408 
409     glCopyTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 0, 0, 4, 4);
410     ASSERT_GL_ERROR(GL_INVALID_OPERATION);
411 }
412 
413 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
414 // tests should be run against.
415 ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(DXT1CompressedTextureTest);
416 
417 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
418 // tests should be run against.
419 ANGLE_INSTANTIATE_TEST_ES3(DXT1CompressedTextureTestES3);
420