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
9 #include "media/pixel.inl"
10
11 using namespace angle;
12
13 class DXT1CompressedTextureTest : public ANGLETest
14 {
15 protected:
DXT1CompressedTextureTest()16 DXT1CompressedTextureTest()
17 {
18 setWindowWidth(512);
19 setWindowHeight(512);
20 setConfigRedBits(8);
21 setConfigGreenBits(8);
22 setConfigBlueBits(8);
23 setConfigAlphaBits(8);
24 }
25
SetUp()26 virtual void SetUp()
27 {
28 ANGLETest::SetUp();
29
30 const std::string vsSource = SHADER_SOURCE
31 (
32 precision highp float;
33 attribute vec4 position;
34 varying vec2 texcoord;
35
36 void main()
37 {
38 gl_Position = position;
39 texcoord = (position.xy * 0.5) + 0.5;
40 texcoord.y = 1.0 - texcoord.y;
41 }
42 );
43
44 const std::string textureFSSource = SHADER_SOURCE
45 (
46 precision highp float;
47 uniform sampler2D tex;
48 varying vec2 texcoord;
49
50 void main()
51 {
52 gl_FragColor = texture2D(tex, texcoord);
53 }
54 );
55
56 mTextureProgram = CompileProgram(vsSource, textureFSSource);
57 if (mTextureProgram == 0)
58 {
59 FAIL() << "shader compilation failed.";
60 }
61
62 mTextureUniformLocation = glGetUniformLocation(mTextureProgram, "tex");
63
64 ASSERT_GL_NO_ERROR();
65 }
66
TearDown()67 virtual void TearDown()
68 {
69 glDeleteProgram(mTextureProgram);
70
71 ANGLETest::TearDown();
72 }
73
74 GLuint mTextureProgram;
75 GLint mTextureUniformLocation;
76 };
77
TEST_P(DXT1CompressedTextureTest,CompressedTexImage)78 TEST_P(DXT1CompressedTextureTest, CompressedTexImage)
79 {
80 if (!extensionEnabled("GL_EXT_texture_compression_dxt1"))
81 {
82 std::cout << "Test skipped because GL_EXT_texture_compression_dxt1 is not available." << std::endl;
83 return;
84 }
85
86 GLuint texture;
87 glGenTextures(1, &texture);
88 glBindTexture(GL_TEXTURE_2D, texture);
89 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
90 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
91 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
92 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
93
94 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width, pixel_0_height, 0, pixel_0_size, pixel_0_data);
95 glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_width, pixel_1_height, 0, pixel_1_size, pixel_1_data);
96 glCompressedTexImage2D(GL_TEXTURE_2D, 2, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_width, pixel_2_height, 0, pixel_2_size, pixel_2_data);
97 glCompressedTexImage2D(GL_TEXTURE_2D, 3, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_width, pixel_3_height, 0, pixel_3_size, pixel_3_data);
98 glCompressedTexImage2D(GL_TEXTURE_2D, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_width, pixel_4_height, 0, pixel_4_size, pixel_4_data);
99 glCompressedTexImage2D(GL_TEXTURE_2D, 5, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_width, pixel_5_height, 0, pixel_5_size, pixel_5_data);
100 glCompressedTexImage2D(GL_TEXTURE_2D, 6, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_width, pixel_6_height, 0, pixel_6_size, pixel_6_data);
101 glCompressedTexImage2D(GL_TEXTURE_2D, 7, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_width, pixel_7_height, 0, pixel_7_size, pixel_7_data);
102 glCompressedTexImage2D(GL_TEXTURE_2D, 8, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_width, pixel_8_height, 0, pixel_8_size, pixel_8_data);
103 glCompressedTexImage2D(GL_TEXTURE_2D, 9, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_width, pixel_9_height, 0, pixel_9_size, pixel_9_data);
104
105 EXPECT_GL_NO_ERROR();
106
107 glUseProgram(mTextureProgram);
108 glUniform1i(mTextureUniformLocation, 0);
109
110 drawQuad(mTextureProgram, "position", 0.5f);
111
112 EXPECT_GL_NO_ERROR();
113
114 glDeleteTextures(1, &texture);
115
116 EXPECT_GL_NO_ERROR();
117 }
118
TEST_P(DXT1CompressedTextureTest,CompressedTexStorage)119 TEST_P(DXT1CompressedTextureTest, CompressedTexStorage)
120 {
121 if (!extensionEnabled("GL_EXT_texture_compression_dxt1"))
122 {
123 std::cout << "Test skipped due to missing GL_EXT_texture_compression_dxt1" << std::endl;
124 return;
125 }
126
127 if (getClientMajorVersion() < 3 &&
128 (!extensionEnabled("GL_EXT_texture_storage") || !extensionEnabled("GL_OES_rgb8_rgba8")))
129 {
130 std::cout << "Test skipped due to missing ES3 or GL_EXT_texture_storage or GL_OES_rgb8_rgba8" << std::endl;
131 return;
132 }
133
134 GLuint texture;
135 glGenTextures(1, &texture);
136 glBindTexture(GL_TEXTURE_2D, texture);
137 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
138 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
139 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
140 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
141
142 if (getClientMajorVersion() < 3)
143 {
144 glTexStorage2DEXT(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width, pixel_0_height);
145 }
146 else
147 {
148 glTexStorage2D(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width, pixel_0_height);
149 }
150 EXPECT_GL_NO_ERROR();
151
152 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pixel_0_width, pixel_0_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_size, pixel_0_data);
153 glCompressedTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, pixel_1_width, pixel_1_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_size, pixel_1_data);
154 glCompressedTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, pixel_2_width, pixel_2_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_size, pixel_2_data);
155 glCompressedTexSubImage2D(GL_TEXTURE_2D, 3, 0, 0, pixel_3_width, pixel_3_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_size, pixel_3_data);
156 glCompressedTexSubImage2D(GL_TEXTURE_2D, 4, 0, 0, pixel_4_width, pixel_4_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_size, pixel_4_data);
157 glCompressedTexSubImage2D(GL_TEXTURE_2D, 5, 0, 0, pixel_5_width, pixel_5_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_size, pixel_5_data);
158 glCompressedTexSubImage2D(GL_TEXTURE_2D, 6, 0, 0, pixel_6_width, pixel_6_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_size, pixel_6_data);
159 glCompressedTexSubImage2D(GL_TEXTURE_2D, 7, 0, 0, pixel_7_width, pixel_7_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_size, pixel_7_data);
160 glCompressedTexSubImage2D(GL_TEXTURE_2D, 8, 0, 0, pixel_8_width, pixel_8_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_size, pixel_8_data);
161 glCompressedTexSubImage2D(GL_TEXTURE_2D, 9, 0, 0, pixel_9_width, pixel_9_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_size, pixel_9_data);
162
163 EXPECT_GL_NO_ERROR();
164
165 glUseProgram(mTextureProgram);
166 glUniform1i(mTextureUniformLocation, 0);
167
168 drawQuad(mTextureProgram, "position", 0.5f);
169
170 EXPECT_GL_NO_ERROR();
171
172 glDeleteTextures(1, &texture);
173
174 EXPECT_GL_NO_ERROR();
175 }
176
177 class DXT1CompressedTextureTestES3 : public DXT1CompressedTextureTest { };
178
179 class DXT1CompressedTextureTestD3D11 : public DXT1CompressedTextureTest { };
180
TEST_P(DXT1CompressedTextureTestES3,PBOCompressedTexImage)181 TEST_P(DXT1CompressedTextureTestES3, PBOCompressedTexImage)
182 {
183 if (!extensionEnabled("GL_EXT_texture_compression_dxt1"))
184 {
185 std::cout << "Test skipped because GL_EXT_texture_compression_dxt1 is not available."
186 << std::endl;
187 return;
188 }
189
190 GLuint texture;
191 glGenTextures(1, &texture);
192 glBindTexture(GL_TEXTURE_2D, texture);
193 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
194 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
195 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
196 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
197
198 GLuint buffer;
199 glGenBuffers(1, &buffer);
200 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
201 glBufferData(GL_PIXEL_UNPACK_BUFFER, pixel_0_size, NULL, GL_STREAM_DRAW);
202 EXPECT_GL_NO_ERROR();
203
204 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_0_size, pixel_0_data);
205 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width, pixel_0_height, 0, pixel_0_size, NULL);
206 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_1_size, pixel_1_data);
207 glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_width, pixel_1_height, 0, pixel_1_size, NULL);
208 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_2_size, pixel_2_data);
209 glCompressedTexImage2D(GL_TEXTURE_2D, 2, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_width, pixel_2_height, 0, pixel_2_size, NULL);
210 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_3_size, pixel_3_data);
211 glCompressedTexImage2D(GL_TEXTURE_2D, 3, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_width, pixel_3_height, 0, pixel_3_size, NULL);
212 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_4_size, pixel_4_data);
213 glCompressedTexImage2D(GL_TEXTURE_2D, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_width, pixel_4_height, 0, pixel_4_size, NULL);
214 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_5_size, pixel_5_data);
215 glCompressedTexImage2D(GL_TEXTURE_2D, 5, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_width, pixel_5_height, 0, pixel_5_size, NULL);
216 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_6_size, pixel_6_data);
217 glCompressedTexImage2D(GL_TEXTURE_2D, 6, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_width, pixel_6_height, 0, pixel_6_size, NULL);
218 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_7_size, pixel_7_data);
219 glCompressedTexImage2D(GL_TEXTURE_2D, 7, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_width, pixel_7_height, 0, pixel_7_size, NULL);
220 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_8_size, pixel_8_data);
221 glCompressedTexImage2D(GL_TEXTURE_2D, 8, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_width, pixel_8_height, 0, pixel_8_size, NULL);
222 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_9_size, pixel_9_data);
223 glCompressedTexImage2D(GL_TEXTURE_2D, 9, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_width, pixel_9_height, 0, pixel_9_size, NULL);
224
225 EXPECT_GL_NO_ERROR();
226
227 glUseProgram(mTextureProgram);
228 glUniform1i(mTextureUniformLocation, 0);
229
230 drawQuad(mTextureProgram, "position", 0.5f);
231
232 EXPECT_GL_NO_ERROR();
233
234 glDeleteTextures(1, &buffer);
235 glDeleteTextures(1, &texture);
236
237 EXPECT_GL_NO_ERROR();
238 }
239
240
TEST_P(DXT1CompressedTextureTestD3D11,PBOCompressedTexStorage)241 TEST_P(DXT1CompressedTextureTestD3D11, PBOCompressedTexStorage)
242 {
243 if (getClientMajorVersion() < 3 && !extensionEnabled("GL_EXT_texture_compression_dxt1"))
244 {
245 return;
246 }
247
248 if (getClientMajorVersion() < 3 &&
249 (!extensionEnabled("GL_EXT_texture_storage") || !extensionEnabled("GL_OES_rgb8_rgba8")))
250 {
251 return;
252 }
253
254 GLuint texture;
255 glGenTextures(1, &texture);
256 glBindTexture(GL_TEXTURE_2D, texture);
257 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
258 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
259 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
260 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
261
262 if (getClientMajorVersion() < 3)
263 {
264 glTexStorage2DEXT(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width, pixel_0_height);
265 }
266 else
267 {
268 glTexStorage2D(GL_TEXTURE_2D, pixel_levels, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width, pixel_0_height);
269 }
270 EXPECT_GL_NO_ERROR();
271
272 GLuint buffer;
273 glGenBuffers(1, &buffer);
274 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
275 glBufferData(GL_PIXEL_UNPACK_BUFFER, pixel_0_size, NULL, GL_STREAM_DRAW);
276 EXPECT_GL_NO_ERROR();
277
278 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_0_size, pixel_0_data);
279 glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pixel_0_width, pixel_0_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_size, NULL);
280 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_1_size, pixel_1_data);
281 glCompressedTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, pixel_1_width, pixel_1_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_1_size, NULL);
282 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_2_size, pixel_2_data);
283 glCompressedTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, pixel_2_width, pixel_2_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_2_size, NULL);
284 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_3_size, pixel_3_data);
285 glCompressedTexSubImage2D(GL_TEXTURE_2D, 3, 0, 0, pixel_3_width, pixel_3_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_3_size, NULL);
286 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_4_size, pixel_4_data);
287 glCompressedTexSubImage2D(GL_TEXTURE_2D, 4, 0, 0, pixel_4_width, pixel_4_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_4_size, NULL);
288 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_5_size, pixel_5_data);
289 glCompressedTexSubImage2D(GL_TEXTURE_2D, 5, 0, 0, pixel_5_width, pixel_5_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_5_size, NULL);
290 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_6_size, pixel_6_data);
291 glCompressedTexSubImage2D(GL_TEXTURE_2D, 6, 0, 0, pixel_6_width, pixel_6_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_6_size, NULL);
292 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_7_size, pixel_7_data);
293 glCompressedTexSubImage2D(GL_TEXTURE_2D, 7, 0, 0, pixel_7_width, pixel_7_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_7_size, NULL);
294 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_8_size, pixel_8_data);
295 glCompressedTexSubImage2D(GL_TEXTURE_2D, 8, 0, 0, pixel_8_width, pixel_8_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_8_size, NULL);
296 glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, pixel_9_size, pixel_9_data);
297 glCompressedTexSubImage2D(GL_TEXTURE_2D, 9, 0, 0, pixel_9_width, pixel_9_height, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_9_size, NULL);
298
299 EXPECT_GL_NO_ERROR();
300
301 glUseProgram(mTextureProgram);
302 glUniform1i(mTextureUniformLocation, 0);
303
304 drawQuad(mTextureProgram, "position", 0.5f);
305
306 EXPECT_GL_NO_ERROR();
307
308 glDeleteTextures(1, &texture);
309
310 EXPECT_GL_NO_ERROR();
311 }
312
313 // Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
314 ANGLE_INSTANTIATE_TEST(DXT1CompressedTextureTest,
315 ES2_D3D9(),
316 ES2_D3D11(),
317 ES2_D3D11_FL9_3(),
318 ES2_OPENGL(),
319 ES3_OPENGL(),
320 ES2_OPENGLES(),
321 ES3_OPENGLES());
322
323 // Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
324 ANGLE_INSTANTIATE_TEST(DXT1CompressedTextureTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
325
326 ANGLE_INSTANTIATE_TEST(DXT1CompressedTextureTestD3D11, ES2_D3D11(), ES3_D3D11(), ES2_D3D11_FL9_3());
327