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
113 // Verify that DXT1 RGB textures have 1.0 alpha when sampled
TEST_P(DXT1CompressedTextureTest,DXT1Alpha)114 TEST_P(DXT1CompressedTextureTest, DXT1Alpha)
115 {
116 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
117
118 // On platforms without native support for DXT1 RGB or texture swizzling (such as D3D or some
119 // Metal configurations), this test is allowed to succeed with transparent black instead of
120 // opaque black.
121 const bool opaque = !IsD3D() && !(IsMetal() && !IsMetalTextureSwizzleAvailable());
122
123 GLTexture texture;
124 glBindTexture(GL_TEXTURE_2D, texture);
125 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
126 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
127
128 // Image using pixels with the code for transparent black:
129 // "BLACK, if color0 <= color1 and code(x,y) == 3"
130 constexpr uint8_t CompressedImageDXT1[] = {0, 0, 0, 0, 255, 255, 255, 255};
131 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 0,
132 sizeof(CompressedImageDXT1), CompressedImageDXT1);
133
134 EXPECT_GL_NO_ERROR();
135
136 glUseProgram(mTextureProgram);
137 glUniform1i(mTextureUniformLocation, 0);
138
139 constexpr GLint kDrawSize = 4;
140 // The image is one 4x4 block, make the viewport only 4x4.
141 glViewport(0, 0, kDrawSize, kDrawSize);
142
143 drawQuad(mTextureProgram, "position", 0.5f);
144
145 EXPECT_GL_NO_ERROR();
146
147 for (GLint y = 0; y < kDrawSize; y++)
148 {
149 for (GLint x = 0; x < kDrawSize; x++)
150 {
151 EXPECT_PIXEL_EQ(x, y, 0, 0, 0, opaque ? 255 : 0) << "at (" << x << ", " << y << ")";
152 }
153 }
154 }
155
TEST_P(DXT1CompressedTextureTest,CompressedTexStorage)156 TEST_P(DXT1CompressedTextureTest, CompressedTexStorage)
157 {
158 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
159
160 ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
161 (!IsGLExtensionEnabled("GL_EXT_texture_storage") ||
162 !IsGLExtensionEnabled("GL_OES_rgb8_rgba8")));
163
164 GLuint texture;
165 glGenTextures(1, &texture);
166 glBindTexture(GL_TEXTURE_2D, texture);
167 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
168 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
169 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
170 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
171
172 if (getClientMajorVersion() < 3)
173 {
174 glTexStorage2DEXT(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
175 pixel_0_width, pixel_0_height);
176 }
177 else
178 {
179 glTexStorage2D(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
180 pixel_0_height);
181 }
182 EXPECT_GL_NO_ERROR();
183
184 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pixel_0_width, pixel_0_height,
185 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_size, pixel_0_data);
186 glCompressedTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, pixel_1_width, pixel_1_height,
187 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_size, pixel_1_data);
188 glCompressedTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, pixel_2_width, pixel_2_height,
189 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_size, pixel_2_data);
190 glCompressedTexSubImage2D(GL_TEXTURE_2D, 3, 0, 0, pixel_3_width, pixel_3_height,
191 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_size, pixel_3_data);
192 glCompressedTexSubImage2D(GL_TEXTURE_2D, 4, 0, 0, pixel_4_width, pixel_4_height,
193 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_size, pixel_4_data);
194 glCompressedTexSubImage2D(GL_TEXTURE_2D, 5, 0, 0, pixel_5_width, pixel_5_height,
195 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_size, pixel_5_data);
196 glCompressedTexSubImage2D(GL_TEXTURE_2D, 6, 0, 0, pixel_6_width, pixel_6_height,
197 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_size, pixel_6_data);
198 glCompressedTexSubImage2D(GL_TEXTURE_2D, 7, 0, 0, pixel_7_width, pixel_7_height,
199 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_size, pixel_7_data);
200 glCompressedTexSubImage2D(GL_TEXTURE_2D, 8, 0, 0, pixel_8_width, pixel_8_height,
201 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_size, pixel_8_data);
202 glCompressedTexSubImage2D(GL_TEXTURE_2D, 9, 0, 0, pixel_9_width, pixel_9_height,
203 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_size, pixel_9_data);
204
205 EXPECT_GL_NO_ERROR();
206
207 glUseProgram(mTextureProgram);
208 glUniform1i(mTextureUniformLocation, 0);
209
210 drawQuad(mTextureProgram, "position", 0.5f);
211
212 EXPECT_GL_NO_ERROR();
213
214 glDeleteTextures(1, &texture);
215
216 EXPECT_GL_NO_ERROR();
217 }
218
219 // Test validation of glCompressedTexSubImage2D with DXT formats
TEST_P(DXT1CompressedTextureTest,CompressedTexSubImageValidation)220 TEST_P(DXT1CompressedTextureTest, CompressedTexSubImageValidation)
221 {
222 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
223
224 GLTexture texture;
225 glBindTexture(GL_TEXTURE_2D, texture.get());
226
227 // Size mip 0 to a large size
228 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
229 pixel_0_height, 0, pixel_0_size, nullptr);
230 ASSERT_GL_NO_ERROR();
231
232 // Set a sub image with an offset that isn't a multiple of the block size
233 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 1, 3, pixel_1_width, pixel_1_height,
234 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_size, pixel_1_data);
235 ASSERT_GL_ERROR(GL_INVALID_OPERATION);
236
237 // Set a sub image with a negative offset
238 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, -1, 0, 4, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8,
239 pixel_1_data);
240 ASSERT_GL_ERROR(GL_INVALID_VALUE);
241
242 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, -1, 4, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8,
243 pixel_1_data);
244 ASSERT_GL_ERROR(GL_INVALID_VALUE);
245 }
246
247 // Test that it's not possible to call CopyTexSubImage2D on a compressed texture
TEST_P(DXT1CompressedTextureTest,CopyTexSubImage2DDisallowed)248 TEST_P(DXT1CompressedTextureTest, CopyTexSubImage2DDisallowed)
249 {
250 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
251
252 GLTexture texture;
253 glBindTexture(GL_TEXTURE_2D, texture.get());
254
255 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
256 pixel_0_height, 0, pixel_0_size, nullptr);
257 ASSERT_GL_NO_ERROR();
258
259 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 4, 4);
260 ASSERT_GL_ERROR(GL_INVALID_OPERATION);
261 }
262
TEST_P(DXT1CompressedTextureTest,PBOCompressedTexStorage)263 TEST_P(DXT1CompressedTextureTest, PBOCompressedTexStorage)
264 {
265 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
266
267 ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
268 !IsGLExtensionEnabled("GL_NV_pixel_buffer_object"));
269
270 ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
271 (!IsGLExtensionEnabled("GL_EXT_texture_storage") ||
272 !IsGLExtensionEnabled("GL_OES_rgb8_rgba8")));
273
274 GLuint texture;
275 glGenTextures(1, &texture);
276 glBindTexture(GL_TEXTURE_2D, texture);
277 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
278 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
279 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
280 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
281
282 if (getClientMajorVersion() < 3)
283 {
284 glTexStorage2DEXT(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
285 pixel_0_width, pixel_0_height);
286 }
287 else
288 {
289 glTexStorage2D(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
290 pixel_0_height);
291 }
292 EXPECT_GL_NO_ERROR();
293
294 GLuint buffer;
295 glGenBuffers(1, &buffer);
296 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
297 glBufferData(GL_PIXEL_UNPACK_BUFFER, pixel_0_size, nullptr, GL_STREAM_DRAW);
298 EXPECT_GL_NO_ERROR();
299
300 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_0_size, pixel_0_data);
301 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pixel_0_width, pixel_0_height,
302 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_size, nullptr);
303 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_1_size, pixel_1_data);
304 glCompressedTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, pixel_1_width, pixel_1_height,
305 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_size, nullptr);
306 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_2_size, pixel_2_data);
307 glCompressedTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, pixel_2_width, pixel_2_height,
308 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_size, nullptr);
309 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_3_size, pixel_3_data);
310 glCompressedTexSubImage2D(GL_TEXTURE_2D, 3, 0, 0, pixel_3_width, pixel_3_height,
311 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_size, nullptr);
312 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_4_size, pixel_4_data);
313 glCompressedTexSubImage2D(GL_TEXTURE_2D, 4, 0, 0, pixel_4_width, pixel_4_height,
314 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_size, nullptr);
315 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_5_size, pixel_5_data);
316 glCompressedTexSubImage2D(GL_TEXTURE_2D, 5, 0, 0, pixel_5_width, pixel_5_height,
317 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_size, nullptr);
318 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_6_size, pixel_6_data);
319 glCompressedTexSubImage2D(GL_TEXTURE_2D, 6, 0, 0, pixel_6_width, pixel_6_height,
320 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_size, nullptr);
321 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_7_size, pixel_7_data);
322 glCompressedTexSubImage2D(GL_TEXTURE_2D, 7, 0, 0, pixel_7_width, pixel_7_height,
323 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_size, nullptr);
324 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_8_size, pixel_8_data);
325 glCompressedTexSubImage2D(GL_TEXTURE_2D, 8, 0, 0, pixel_8_width, pixel_8_height,
326 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_size, nullptr);
327 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_9_size, pixel_9_data);
328 glCompressedTexSubImage2D(GL_TEXTURE_2D, 9, 0, 0, pixel_9_width, pixel_9_height,
329 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_size, nullptr);
330
331 EXPECT_GL_NO_ERROR();
332
333 glUseProgram(mTextureProgram);
334 glUniform1i(mTextureUniformLocation, 0);
335
336 drawQuad(mTextureProgram, "position", 0.5f);
337
338 EXPECT_GL_NO_ERROR();
339
340 glDeleteTextures(1, &texture);
341
342 EXPECT_GL_NO_ERROR();
343 }
344
345 class DXT1CompressedTextureTestES3 : public DXT1CompressedTextureTest
346 {};
347
TEST_P(DXT1CompressedTextureTestES3,PBOCompressedTexImage)348 TEST_P(DXT1CompressedTextureTestES3, PBOCompressedTexImage)
349 {
350 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
351
352 GLuint texture;
353 glGenTextures(1, &texture);
354 glBindTexture(GL_TEXTURE_2D, texture);
355 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
356 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
357 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
358 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
359
360 GLuint buffer;
361 glGenBuffers(1, &buffer);
362 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
363 glBufferData(GL_PIXEL_UNPACK_BUFFER, pixel_0_size, nullptr, GL_STREAM_DRAW);
364 EXPECT_GL_NO_ERROR();
365
366 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_0_size, pixel_0_data);
367 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
368 pixel_0_height, 0, pixel_0_size, nullptr);
369 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_1_size, pixel_1_data);
370 glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_width,
371 pixel_1_height, 0, pixel_1_size, nullptr);
372 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_2_size, pixel_2_data);
373 glCompressedTexImage2D(GL_TEXTURE_2D, 2, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_width,
374 pixel_2_height, 0, pixel_2_size, nullptr);
375 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_3_size, pixel_3_data);
376 glCompressedTexImage2D(GL_TEXTURE_2D, 3, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_width,
377 pixel_3_height, 0, pixel_3_size, nullptr);
378 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_4_size, pixel_4_data);
379 glCompressedTexImage2D(GL_TEXTURE_2D, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_width,
380 pixel_4_height, 0, pixel_4_size, nullptr);
381 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_5_size, pixel_5_data);
382 glCompressedTexImage2D(GL_TEXTURE_2D, 5, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_width,
383 pixel_5_height, 0, pixel_5_size, nullptr);
384 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_6_size, pixel_6_data);
385 glCompressedTexImage2D(GL_TEXTURE_2D, 6, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_width,
386 pixel_6_height, 0, pixel_6_size, nullptr);
387 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_7_size, pixel_7_data);
388 glCompressedTexImage2D(GL_TEXTURE_2D, 7, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_width,
389 pixel_7_height, 0, pixel_7_size, nullptr);
390 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_8_size, pixel_8_data);
391 glCompressedTexImage2D(GL_TEXTURE_2D, 8, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_width,
392 pixel_8_height, 0, pixel_8_size, nullptr);
393 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_9_size, pixel_9_data);
394 glCompressedTexImage2D(GL_TEXTURE_2D, 9, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_width,
395 pixel_9_height, 0, pixel_9_size, nullptr);
396
397 EXPECT_GL_NO_ERROR();
398
399 glUseProgram(mTextureProgram);
400 glUniform1i(mTextureUniformLocation, 0);
401
402 drawQuad(mTextureProgram, "position", 0.5f);
403
404 EXPECT_GL_NO_ERROR();
405
406 glDeleteTextures(1, &buffer);
407 glDeleteTextures(1, &texture);
408
409 EXPECT_GL_NO_ERROR();
410 }
411
412 // Test validation of glCompressedTexSubImage3D with DXT formats
TEST_P(DXT1CompressedTextureTestES3,CompressedTexSubImageValidation)413 TEST_P(DXT1CompressedTextureTestES3, CompressedTexSubImageValidation)
414 {
415 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
416
417 GLTexture texture;
418 glBindTexture(GL_TEXTURE_2D_ARRAY, texture.get());
419
420 // Size mip 0 to a large size
421 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
422 pixel_0_height, 1, 0, pixel_0_size, nullptr);
423 ASSERT_GL_NO_ERROR();
424
425 // Set a sub image with a negative offset
426 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, -1, 0, 0, 4, 4, 1,
427 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, pixel_1_data);
428 ASSERT_GL_ERROR(GL_INVALID_VALUE);
429
430 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, -1, 0, 4, 4, 1,
431 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, pixel_1_data);
432 ASSERT_GL_ERROR(GL_INVALID_VALUE);
433
434 glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, -1, 4, 4, 1,
435 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, pixel_1_data);
436 ASSERT_GL_ERROR(GL_INVALID_VALUE);
437 }
438
439 // Test validation of glCompressedTexSubImage3D with DXT formats
TEST_P(DXT1CompressedTextureTestES3,CopyTexSubImage3DDisallowed)440 TEST_P(DXT1CompressedTextureTestES3, CopyTexSubImage3DDisallowed)
441 {
442 ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
443
444 GLTexture texture;
445 glBindTexture(GL_TEXTURE_2D_ARRAY, texture.get());
446
447 GLsizei depth = 4;
448 glCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width,
449 pixel_0_height, depth, 0, pixel_0_size * depth, nullptr);
450 ASSERT_GL_NO_ERROR();
451
452 glCopyTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 0, 0, 4, 4);
453 ASSERT_GL_ERROR(GL_INVALID_OPERATION);
454 }
455
456 ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(DXT1CompressedTextureTest);
457
458 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DXT1CompressedTextureTestES3);
459 ANGLE_INSTANTIATE_TEST_ES3(DXT1CompressedTextureTestES3);
460