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