1 //
2 // Copyright 2020 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 // GetTexLevelParameterTest.cpp : Tests of the GL_ANGLE_get_tex_level_parameter extension.
8
9 #include "common/gl_enum_utils.h"
10 #include "test_utils/ANGLETest.h"
11
12 #include "test_utils/gl_raii.h"
13
14 namespace angle
15 {
16
17 class GetTexLevelParameterTest : public ANGLETest<>
18 {
19 protected:
GetTexLevelParameterTest()20 GetTexLevelParameterTest()
21 {
22 setWindowWidth(128);
23 setWindowHeight(128);
24 setConfigRedBits(8);
25 setConfigGreenBits(8);
26 setConfigBlueBits(8);
27 setConfigAlphaBits(8);
28 setExtensionsEnabled(false);
29 }
30 };
31
32 // Extension is requestable so it should be disabled by default.
TEST_P(GetTexLevelParameterTest,ExtensionStringExposed)33 TEST_P(GetTexLevelParameterTest, ExtensionStringExposed)
34 {
35 EXPECT_FALSE(IsGLExtensionEnabled("GL_ANGLE_get_tex_level_parameter"));
36
37 if (IsGLExtensionRequestable("GL_ANGLE_get_tex_level_parameter"))
38 {
39 glRequestExtensionANGLE("GL_ANGLE_get_tex_level_parameter");
40 EXPECT_GL_NO_ERROR();
41
42 EXPECT_TRUE(IsGLExtensionEnabled("GL_ANGLE_get_tex_level_parameter"));
43 }
44 }
45
46 // Test that extension entry points are rejected with extension disabled
TEST_P(GetTexLevelParameterTest,NoExtension)47 TEST_P(GetTexLevelParameterTest, NoExtension)
48 {
49 GLint resulti = 0;
50 glGetTexLevelParameterivANGLE(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &resulti);
51 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
52
53 GLfloat resultf = 0;
54 glGetTexLevelParameterfvANGLE(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &resultf);
55 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
56 }
57
58 // Test valid targets for level queries
TEST_P(GetTexLevelParameterTest,Targets)59 TEST_P(GetTexLevelParameterTest, Targets)
60 {
61 ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_get_tex_level_parameter"));
62
63 GLint result = 0;
64
65 // These tests use default texture objects.
66
67 {
68 glGetTexLevelParameterivANGLE(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &result);
69 EXPECT_GL_NO_ERROR();
70 }
71
72 {
73 glGetTexLevelParameterivANGLE(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_TEXTURE_WIDTH, &result);
74 EXPECT_GL_NO_ERROR();
75 glGetTexLevelParameterivANGLE(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_TEXTURE_WIDTH, &result);
76 EXPECT_GL_NO_ERROR();
77 glGetTexLevelParameterivANGLE(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_TEXTURE_WIDTH, &result);
78 EXPECT_GL_NO_ERROR();
79 glGetTexLevelParameterivANGLE(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_TEXTURE_WIDTH, &result);
80 EXPECT_GL_NO_ERROR();
81 glGetTexLevelParameterivANGLE(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_TEXTURE_WIDTH, &result);
82 EXPECT_GL_NO_ERROR();
83 glGetTexLevelParameterivANGLE(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_TEXTURE_WIDTH, &result);
84 EXPECT_GL_NO_ERROR();
85 }
86
87 {
88 glGetTexLevelParameterivANGLE(GL_TEXTURE_2D_ARRAY, 0, GL_TEXTURE_WIDTH, &result);
89 if (getClientMajorVersion() < 3)
90 {
91 EXPECT_GL_ERROR(GL_INVALID_ENUM);
92 }
93 else
94 {
95 EXPECT_GL_NO_ERROR();
96 }
97 }
98
99 {
100 glGetTexLevelParameterivANGLE(GL_TEXTURE_2D_MULTISAMPLE, 0, GL_TEXTURE_WIDTH, &result);
101 if (getClientMajorVersion() < 3 || getClientMinorVersion() < 1)
102 {
103 EXPECT_GL_ERROR(GL_INVALID_ENUM);
104 if (EnsureGLExtensionEnabled("GL_ANGLE_texture_multisample"))
105 {
106 glGetTexLevelParameterivANGLE(GL_TEXTURE_2D_MULTISAMPLE, 0, GL_TEXTURE_WIDTH,
107 &result);
108 EXPECT_GL_NO_ERROR();
109 }
110 }
111 else
112 {
113 EXPECT_GL_NO_ERROR();
114 }
115 }
116
117 {
118 glGetTexLevelParameterivANGLE(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 0, GL_TEXTURE_WIDTH,
119 &result);
120 if (getClientMajorVersion() < 3 || getClientMinorVersion() < 2)
121 {
122 EXPECT_GL_ERROR(GL_INVALID_ENUM);
123 if (EnsureGLExtensionEnabled("GL_OES_texture_storage_multisample_2d_array"))
124 {
125 glGetTexLevelParameterivANGLE(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 0, GL_TEXTURE_WIDTH,
126 &result);
127 EXPECT_GL_NO_ERROR();
128 }
129 }
130 else
131 {
132 EXPECT_GL_NO_ERROR();
133 }
134 }
135
136 {
137 glGetTexLevelParameterivANGLE(GL_TEXTURE_3D, 0, GL_TEXTURE_WIDTH, &result);
138 if (getClientMajorVersion() < 3)
139 {
140 EXPECT_GL_ERROR(GL_INVALID_ENUM);
141 if (EnsureGLExtensionEnabled("GL_OES_texture_3d"))
142 {
143 glGetTexLevelParameterivANGLE(GL_TEXTURE_3D, 0, GL_TEXTURE_WIDTH, &result);
144 EXPECT_GL_NO_ERROR();
145 }
146 }
147 else
148 {
149 EXPECT_GL_NO_ERROR();
150 }
151 }
152
153 {
154 glGetTexLevelParameterivANGLE(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_TEXTURE_WIDTH, &result);
155 if (getClientMajorVersion() < 3 || getClientMinorVersion() < 2)
156 {
157 EXPECT_GL_ERROR(GL_INVALID_ENUM);
158 if (EnsureGLExtensionEnabled("GL_EXT_texture_cube_map_array") ||
159 EnsureGLExtensionEnabled("GL_OES_texture_cube_map_array"))
160 {
161 glGetTexLevelParameterivANGLE(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_TEXTURE_WIDTH,
162 &result);
163 EXPECT_GL_NO_ERROR();
164 }
165 }
166 else
167 {
168 EXPECT_GL_NO_ERROR();
169 }
170 }
171
172 {
173 glGetTexLevelParameterivANGLE(GL_TEXTURE_BUFFER, 0, GL_TEXTURE_WIDTH, &result);
174 if (getClientMajorVersion() < 3 || getClientMinorVersion() < 2)
175 {
176 EXPECT_GL_ERROR(GL_INVALID_ENUM);
177 if (EnsureGLExtensionEnabled("GL_EXT_texture_buffer") ||
178 EnsureGLExtensionEnabled("GL_OES_texture_buffer"))
179 {
180 glGetTexLevelParameterivANGLE(GL_TEXTURE_BUFFER, 0, GL_TEXTURE_WIDTH, &result);
181 EXPECT_GL_NO_ERROR();
182 }
183 }
184 else
185 {
186 EXPECT_GL_NO_ERROR();
187 }
188 }
189 }
190
191 // Test various queries exposed by GL_ANGLE_get_tex_level_parameter
TEST_P(GetTexLevelParameterTest,Queries)192 TEST_P(GetTexLevelParameterTest, Queries)
193 {
194 ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_get_tex_level_parameter"));
195
196 GLTexture texture;
197 glBindTexture(GL_TEXTURE_2D, texture);
198 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
199
200 {
201 GLint width = 0;
202 glGetTexLevelParameterivANGLE(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
203 EXPECT_GL_NO_ERROR();
204 EXPECT_EQ(1, width);
205 }
206
207 {
208 GLint height = 0;
209 glGetTexLevelParameterivANGLE(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height);
210 EXPECT_GL_NO_ERROR();
211 EXPECT_EQ(2, height);
212 }
213
214 {
215 GLint internalFormat = 0;
216 glGetTexLevelParameterivANGLE(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT,
217 &internalFormat);
218 EXPECT_GL_NO_ERROR();
219 EXPECT_GLENUM_EQ(GL_RGBA, internalFormat);
220 }
221
222 {
223 GLint depth = -1;
224 glGetTexLevelParameterivANGLE(GL_TEXTURE_2D, 0, GL_TEXTURE_DEPTH, &depth);
225 if (getClientMajorVersion() < 3)
226 {
227 EXPECT_GL_ERROR(GL_INVALID_ENUM);
228 if (EnsureGLExtensionEnabled("GL_OES_texture_3d"))
229 {
230 glGetTexLevelParameterivANGLE(GL_TEXTURE_2D, 0, GL_TEXTURE_DEPTH, &depth);
231 EXPECT_GL_NO_ERROR();
232 EXPECT_EQ(depth, 1);
233 }
234 }
235 else
236 {
237 EXPECT_GL_NO_ERROR();
238 EXPECT_EQ(depth, 1);
239 }
240 }
241
242 if (getClientMajorVersion() >= 3)
243 {
244 GLint samples = -1;
245 glGetTexLevelParameterivANGLE(GL_TEXTURE_2D, 0, GL_TEXTURE_SAMPLES, &samples);
246 if (getClientMinorVersion() < 1)
247 {
248 EXPECT_GL_ERROR(GL_INVALID_ENUM);
249 }
250 else
251 {
252 EXPECT_GL_NO_ERROR();
253 EXPECT_EQ(samples, 0);
254 }
255
256 GLint fixedLocations = 0;
257 glGetTexLevelParameterivANGLE(GL_TEXTURE_2D, 0, GL_TEXTURE_FIXED_SAMPLE_LOCATIONS,
258 &fixedLocations);
259 if (getClientMinorVersion() < 1)
260 {
261 EXPECT_GL_ERROR(GL_INVALID_ENUM);
262 }
263 else
264 {
265 EXPECT_GL_NO_ERROR();
266 EXPECT_TRUE(fixedLocations);
267 }
268
269 if (getClientMinorVersion() < 1 && EnsureGLExtensionEnabled("GL_ANGLE_texture_multisample"))
270 {
271 glGetTexLevelParameterivANGLE(GL_TEXTURE_2D, 0, GL_TEXTURE_SAMPLES, &samples);
272 EXPECT_GL_NO_ERROR();
273 EXPECT_EQ(samples, 0);
274
275 glGetTexLevelParameterivANGLE(GL_TEXTURE_2D, 0, GL_TEXTURE_FIXED_SAMPLE_LOCATIONS,
276 &fixedLocations);
277 EXPECT_GL_NO_ERROR();
278 EXPECT_TRUE(fixedLocations);
279 }
280 }
281 }
282
283 // Test level validation
TEST_P(GetTexLevelParameterTest,Levels)284 TEST_P(GetTexLevelParameterTest, Levels)
285 {
286 ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_get_tex_level_parameter"));
287
288 const auto getMaxLevel = [](GLenum type, int *level) {
289 int tmp = 0;
290 glGetIntegerv(type, &tmp);
291 ASSERT_GL_NO_ERROR();
292 ASSERT_GT(tmp, 0);
293 *level = gl::log2(tmp);
294 };
295
296 int maxLevel2D = 0;
297 int maxLevel3D = 0;
298 int maxLevelCube = 0;
299 getMaxLevel(GL_MAX_TEXTURE_SIZE, &maxLevel2D);
300 getMaxLevel(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &maxLevelCube);
301 if (getClientMajorVersion() >= 3)
302 {
303 getMaxLevel(GL_MAX_3D_TEXTURE_SIZE, &maxLevel3D);
304 }
305
306 const auto test = [](GLenum target, int maxValid) {
307 GLint result = 0;
308 glGetTexLevelParameterivANGLE(target, 0, GL_TEXTURE_WIDTH, &result);
309 EXPECT_GL_NO_ERROR() << "Target " << gl::GLenumToString(gl::GLESEnum::TextureTarget, target)
310 << " Level " << 0;
311 glGetTexLevelParameterivANGLE(target, maxValid, GL_TEXTURE_WIDTH, &result);
312 EXPECT_GL_NO_ERROR() << "Target " << gl::GLenumToString(gl::GLESEnum::TextureTarget, target)
313 << " Level " << maxValid;
314 glGetTexLevelParameterivANGLE(target, -1, GL_TEXTURE_WIDTH, &result);
315 EXPECT_GL_ERROR(GL_INVALID_VALUE)
316 << "Target " << gl::GLenumToString(gl::GLESEnum::TextureTarget, target) << " Level "
317 << -1;
318 glGetTexLevelParameterivANGLE(target, maxValid + 1, GL_TEXTURE_WIDTH, &result);
319 EXPECT_GL_ERROR(GL_INVALID_VALUE)
320 << "Target " << gl::GLenumToString(gl::GLESEnum::TextureTarget, target) << " Level "
321 << (maxValid + 1);
322 };
323
324 test(GL_TEXTURE_2D, maxLevel2D);
325 test(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, maxLevelCube);
326
327 if (getClientMajorVersion() >= 3)
328 {
329 test(GL_TEXTURE_2D_ARRAY, maxLevel2D);
330 }
331
332 if (getClientMajorVersion() >= 3 || EnsureGLExtensionEnabled("GL_OES_texture_3d"))
333 {
334 test(GL_TEXTURE_3D, maxLevel3D);
335 }
336
337 if ((getClientMajorVersion() >= 3 && getClientMinorVersion() >= 1) ||
338 EnsureGLExtensionEnabled("GL_ANGLE_texture_multisample"))
339 {
340 test(GL_TEXTURE_2D_MULTISAMPLE, 0);
341 }
342
343 if ((getClientMajorVersion() >= 3 && getClientMinorVersion() >= 2) ||
344 EnsureGLExtensionEnabled("GL_OES_texture_storage_multisample_2d_array"))
345 {
346 test(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 0);
347 }
348
349 if ((getClientMajorVersion() >= 3 && getClientMinorVersion() >= 2) ||
350 (EnsureGLExtensionEnabled("GL_EXT_texture_buffer") ||
351 EnsureGLExtensionEnabled("GL_OES_texture_buffer")))
352 {
353 test(GL_TEXTURE_BUFFER, 0);
354 }
355
356 if ((getClientMajorVersion() >= 3 && getClientMinorVersion() >= 2) ||
357 (EnsureGLExtensionEnabled("GL_EXT_texture_cube_map_array") ||
358 EnsureGLExtensionEnabled("GL_OES_texture_cube_map_array")))
359 {
360 test(GL_TEXTURE_CUBE_MAP_ARRAY, maxLevelCube);
361 }
362 }
363
364 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
365 // tests should be run against.
366 ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND_ES31_AND_ES32(GetTexLevelParameterTest);
367 } // namespace angle
368