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