xref: /aosp_15_r20/external/angle/src/tests/gl_tests/GetTexLevelParameterTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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