xref: /aosp_15_r20/external/deqp/modules/gles31/functional/es31fTextureStateQueryTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program OpenGL ES 3.1 Module
3  * -------------------------------------------------
4  *
5  * Copyright 2015 The Android Open Source Project
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  *//*!
20  * \file
21  * \brief Texture Param State Query tests.
22  *//*--------------------------------------------------------------------*/
23 
24 #include "es31fTextureStateQueryTests.hpp"
25 #include "glsTextureStateQueryTests.hpp"
26 #include "glsStateQueryUtil.hpp"
27 #include "glwEnums.hpp"
28 
29 namespace deqp
30 {
31 namespace gles31
32 {
33 namespace Functional
34 {
35 
36 using namespace gls::StateQueryUtil;
37 using namespace gls::TextureStateQueryTests;
38 
getVerifierSuffix(QueryType type)39 static const char *getVerifierSuffix(QueryType type)
40 {
41     switch (type)
42     {
43     case QUERY_TEXTURE_PARAM_FLOAT:
44     case QUERY_TEXTURE_PARAM_FLOAT_VEC4:
45         return "_float";
46 
47     case QUERY_TEXTURE_PARAM_INTEGER:
48     case QUERY_TEXTURE_PARAM_INTEGER_VEC4:
49         return "_integer";
50 
51     case QUERY_TEXTURE_PARAM_PURE_INTEGER:
52     case QUERY_TEXTURE_PARAM_PURE_INTEGER_VEC4:
53         return "_pure_int";
54 
55     case QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER:
56     case QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER_VEC4:
57         return "_pure_uint";
58 
59     default:
60         DE_ASSERT(false);
61         return DE_NULL;
62     }
63 }
64 
isIsVectorQuery(TesterType tester)65 static bool isIsVectorQuery(TesterType tester)
66 {
67     return tester == TESTER_TEXTURE_BORDER_COLOR;
68 }
69 
isExtendedParamQuery(TesterType tester)70 static bool isExtendedParamQuery(TesterType tester)
71 {
72     return tester == TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER || tester == TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER ||
73            tester == TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER;
74 }
75 
TextureStateQueryTests(Context & context)76 TextureStateQueryTests::TextureStateQueryTests(Context &context)
77     : TestCaseGroup(context, "texture", "Texture State Query tests")
78 {
79 }
80 
~TextureStateQueryTests(void)81 TextureStateQueryTests::~TextureStateQueryTests(void)
82 {
83 }
84 
init(void)85 void TextureStateQueryTests::init(void)
86 {
87     static const QueryType scalarVerifiers[] = {
88         QUERY_TEXTURE_PARAM_INTEGER,
89         QUERY_TEXTURE_PARAM_FLOAT,
90         QUERY_TEXTURE_PARAM_PURE_INTEGER,
91         QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER,
92     };
93     static const QueryType nonPureVerifiers[] = {
94         QUERY_TEXTURE_PARAM_INTEGER,
95         QUERY_TEXTURE_PARAM_FLOAT,
96     };
97     static const QueryType vec4Verifiers[] = {
98         QUERY_TEXTURE_PARAM_INTEGER_VEC4,
99         QUERY_TEXTURE_PARAM_FLOAT_VEC4,
100         QUERY_TEXTURE_PARAM_PURE_INTEGER_VEC4,
101         QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER_VEC4,
102     };
103 
104 #define FOR_EACH_VERIFIER(VERIFIERS, X)                                                   \
105     for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(VERIFIERS); ++verifierNdx) \
106     {                                                                                     \
107         const char *verifierSuffix = getVerifierSuffix((VERIFIERS)[verifierNdx]);         \
108         const QueryType verifier   = (VERIFIERS)[verifierNdx];                            \
109         targetGroup->addChild(X);                                                         \
110     }
111 
112     static const struct
113     {
114         const char *name;
115         glw::GLenum target;
116         bool newInGLES31;
117     } textureTargets[] = {
118         {
119             "texture_2d",
120             GL_TEXTURE_2D,
121             false,
122         },
123         {
124             "texture_3d",
125             GL_TEXTURE_3D,
126             false,
127         },
128         {
129             "texture_2d_array",
130             GL_TEXTURE_2D_ARRAY,
131             false,
132         },
133         {
134             "texture_cube_map",
135             GL_TEXTURE_CUBE_MAP,
136             false,
137         },
138         {
139             "texture_2d_multisample",
140             GL_TEXTURE_2D_MULTISAMPLE,
141             true,
142         },
143         {
144             "texture_2d_multisample_array",
145             GL_TEXTURE_2D_MULTISAMPLE_ARRAY,
146             true,
147         }, // GL_OES_texture_storage_multisample_2d_array
148         {
149             "texture_buffer",
150             GL_TEXTURE_BUFFER,
151             true,
152         }, // GL_EXT_texture_buffer
153         {
154             "texture_cube_array",
155             GL_TEXTURE_CUBE_MAP_ARRAY,
156             true,
157         }, // GL_EXT_texture_cube_map_array
158     };
159     static const struct
160     {
161         const char *name;
162         const char *desc;
163         TesterType tester;
164         bool newInGLES31;
165     } states[] = {
166         {"texture_swizzle_r", "TEXTURE_SWIZZLE_R", TESTER_TEXTURE_SWIZZLE_R, false},
167         {"texture_swizzle_g", "TEXTURE_SWIZZLE_G", TESTER_TEXTURE_SWIZZLE_G, false},
168         {"texture_swizzle_b", "TEXTURE_SWIZZLE_B", TESTER_TEXTURE_SWIZZLE_B, false},
169         {"texture_swizzle_a", "TEXTURE_SWIZZLE_A", TESTER_TEXTURE_SWIZZLE_A, false},
170         {"texture_wrap_s", "TEXTURE_WRAP_S", TESTER_TEXTURE_WRAP_S, false},
171         {"texture_wrap_t", "TEXTURE_WRAP_T", TESTER_TEXTURE_WRAP_T, false},
172         {"texture_wrap_r", "TEXTURE_WRAP_R", TESTER_TEXTURE_WRAP_R, false},
173         {"texture_mag_filter", "TEXTURE_MAG_FILTER", TESTER_TEXTURE_MAG_FILTER, false},
174         {"texture_min_filter", "TEXTURE_MIN_FILTER", TESTER_TEXTURE_MIN_FILTER, false},
175         {"texture_min_lod", "TEXTURE_MIN_LOD", TESTER_TEXTURE_MIN_LOD, false},
176         {"texture_max_lod", "TEXTURE_MAX_LOD", TESTER_TEXTURE_MAX_LOD, false},
177         {"texture_base_level", "TEXTURE_BASE_LEVEL", TESTER_TEXTURE_BASE_LEVEL, false},
178         {"texture_max_level", "TEXTURE_MAX_LEVEL", TESTER_TEXTURE_MAX_LEVEL, false},
179         {"texture_compare_mode", "TEXTURE_COMPARE_MODE", TESTER_TEXTURE_COMPARE_MODE, false},
180         {"texture_compare_func", "TEXTURE_COMPARE_FUNC", TESTER_TEXTURE_COMPARE_FUNC, false},
181         {"texture_immutable_levels", "TEXTURE_IMMUTABLE_LEVELS", TESTER_TEXTURE_IMMUTABLE_LEVELS, false},
182         {"texture_immutable_format", "TEXTURE_IMMUTABLE_FORMAT", TESTER_TEXTURE_IMMUTABLE_FORMAT, false},
183         {"depth_stencil_mode", "DEPTH_STENCIL_TEXTURE_MODE", TESTER_DEPTH_STENCIL_TEXTURE_MODE, true},
184         {"texture_srgb_decode", "TEXTURE_SRGB_DECODE_EXT", TESTER_TEXTURE_SRGB_DECODE_EXT, true},
185         {"texture_border_color", "TEXTURE_BORDER_COLOR", TESTER_TEXTURE_BORDER_COLOR, true},
186         {"texture_wrap_s_clamp_to_border", "TEXTURE_WRAP_S_CLAMP_TO_BORDER", TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER,
187          true},
188         {"texture_wrap_t_clamp_to_border", "TEXTURE_WRAP_T_CLAMP_TO_BORDER", TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER,
189          true},
190         {"texture_wrap_r_clamp_to_border", "TEXTURE_WRAP_R_CLAMP_TO_BORDER", TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER,
191          true},
192     };
193     static const struct
194     {
195         const char *name;
196         const char *desc;
197         QueryType verifier;
198     } pureSetters[] = {
199         {"set_pure_int", "Set state with pure int", QUERY_TEXTURE_PARAM_PURE_INTEGER},
200         {"set_pure_uint", "Set state with pure unsigned int", QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER},
201     };
202     static const struct
203     {
204         const char *name;
205         const char *desc;
206         TesterType intTester;
207         TesterType uintTester;
208     } pureStates[] = {
209         {"texture_swizzle_r", "TEXTURE_SWIZZLE_R", TESTER_TEXTURE_SWIZZLE_R_SET_PURE_INT,
210          TESTER_TEXTURE_SWIZZLE_R_SET_PURE_UINT},
211         {"texture_swizzle_g", "TEXTURE_SWIZZLE_G", TESTER_TEXTURE_SWIZZLE_G_SET_PURE_INT,
212          TESTER_TEXTURE_SWIZZLE_G_SET_PURE_UINT},
213         {"texture_swizzle_b", "TEXTURE_SWIZZLE_B", TESTER_TEXTURE_SWIZZLE_B_SET_PURE_INT,
214          TESTER_TEXTURE_SWIZZLE_B_SET_PURE_UINT},
215         {"texture_swizzle_a", "TEXTURE_SWIZZLE_A", TESTER_TEXTURE_SWIZZLE_A_SET_PURE_INT,
216          TESTER_TEXTURE_SWIZZLE_A_SET_PURE_UINT},
217         {"texture_wrap_s", "TEXTURE_WRAP_S", TESTER_TEXTURE_WRAP_S_SET_PURE_INT, TESTER_TEXTURE_WRAP_S_SET_PURE_UINT},
218         {"texture_wrap_t", "TEXTURE_WRAP_T", TESTER_TEXTURE_WRAP_T_SET_PURE_INT, TESTER_TEXTURE_WRAP_T_SET_PURE_UINT},
219         {"texture_wrap_r", "TEXTURE_WRAP_R", TESTER_TEXTURE_WRAP_R_SET_PURE_INT, TESTER_TEXTURE_WRAP_R_SET_PURE_UINT},
220         {"texture_mag_filter", "TEXTURE_MAG_FILTER", TESTER_TEXTURE_MAG_FILTER_SET_PURE_INT,
221          TESTER_TEXTURE_MAG_FILTER_SET_PURE_UINT},
222         {"texture_min_filter", "TEXTURE_MIN_FILTER", TESTER_TEXTURE_MIN_FILTER_SET_PURE_INT,
223          TESTER_TEXTURE_MIN_FILTER_SET_PURE_UINT},
224         {"texture_min_lod", "TEXTURE_MIN_LOD", TESTER_TEXTURE_MIN_LOD_SET_PURE_INT,
225          TESTER_TEXTURE_MIN_LOD_SET_PURE_UINT},
226         {"texture_max_lod", "TEXTURE_MAX_LOD", TESTER_TEXTURE_MAX_LOD_SET_PURE_INT,
227          TESTER_TEXTURE_MAX_LOD_SET_PURE_UINT},
228         {"texture_base_level", "TEXTURE_BASE_LEVEL", TESTER_TEXTURE_BASE_LEVEL_SET_PURE_INT,
229          TESTER_TEXTURE_BASE_LEVEL_SET_PURE_UINT},
230         {"texture_max_level", "TEXTURE_MAX_LEVEL", TESTER_TEXTURE_MAX_LEVEL_SET_PURE_INT,
231          TESTER_TEXTURE_MAX_LEVEL_SET_PURE_UINT},
232         {"texture_compare_mode", "TEXTURE_COMPARE_MODE", TESTER_TEXTURE_COMPARE_MODE_SET_PURE_INT,
233          TESTER_TEXTURE_COMPARE_MODE_SET_PURE_UINT},
234         {"texture_compare_func", "TEXTURE_COMPARE_FUNC", TESTER_TEXTURE_COMPARE_FUNC_SET_PURE_INT,
235          TESTER_TEXTURE_COMPARE_FUNC_SET_PURE_UINT},
236         // \note texture_immutable_levels is not settable
237         // \note texture_immutable_format is not settable
238         {"depth_stencil_mode", "DEPTH_STENCIL_TEXTURE_MODE", TESTER_DEPTH_STENCIL_TEXTURE_MODE_SET_PURE_INT,
239          TESTER_DEPTH_STENCIL_TEXTURE_MODE_SET_PURE_UINT},
240         {"texture_srgb_decode", "TEXTURE_SRGB_DECODE_EXT", TESTER_TEXTURE_SRGB_DECODE_EXT_SET_PURE_INT,
241          TESTER_TEXTURE_SRGB_DECODE_EXT_SET_PURE_UINT},
242         // \note texture_border_color is already checked
243         // \note texture_wrap_*_clamp_to_border brings no additional coverage
244     };
245 
246     for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(textureTargets); ++targetNdx)
247     {
248         tcu::TestCaseGroup *const targetGroup =
249             new tcu::TestCaseGroup(m_testCtx, textureTargets[targetNdx].name, textureTargets[targetNdx].name);
250         addChild(targetGroup);
251 
252         if (textureTargets[targetNdx].newInGLES31)
253         {
254             targetGroup->addChild(createIsTextureTest(m_testCtx, m_context.getRenderContext(), "is_texture",
255                                                       "IsTexture", textureTargets[targetNdx].target));
256         }
257 
258         for (int stateNdx = 0; stateNdx < DE_LENGTH_OF_ARRAY(states); ++stateNdx)
259         {
260             if (!isLegalTesterForTarget(textureTargets[targetNdx].target, states[stateNdx].tester))
261                 continue;
262 
263             // for old targets, check only new states
264             if (!textureTargets[targetNdx].newInGLES31 && !states[stateNdx].newInGLES31)
265                 continue;
266 
267             if (isExtendedParamQuery(states[stateNdx].tester))
268             {
269                 // no need to cover for all getters if the only thing new is the param name
270                 FOR_EACH_VERIFIER(nonPureVerifiers,
271                                   createTexParamTest(m_testCtx, m_context.getRenderContext(),
272                                                      std::string() + states[stateNdx].name + verifierSuffix,
273                                                      states[stateNdx].desc, verifier, textureTargets[targetNdx].target,
274                                                      states[stateNdx].tester))
275             }
276             else if (isIsVectorQuery(states[stateNdx].tester))
277             {
278                 FOR_EACH_VERIFIER(vec4Verifiers,
279                                   createTexParamTest(m_testCtx, m_context.getRenderContext(),
280                                                      std::string() + states[stateNdx].name + verifierSuffix,
281                                                      states[stateNdx].desc, verifier, textureTargets[targetNdx].target,
282                                                      states[stateNdx].tester))
283             }
284             else
285             {
286                 FOR_EACH_VERIFIER(scalarVerifiers,
287                                   createTexParamTest(m_testCtx, m_context.getRenderContext(),
288                                                      std::string() + states[stateNdx].name + verifierSuffix,
289                                                      states[stateNdx].desc, verifier, textureTargets[targetNdx].target,
290                                                      states[stateNdx].tester))
291             }
292         }
293     }
294 
295 #undef FOR_EACH_VERIFIER
296 
297     // set_pure_uint
298     // set_pure_int
299     for (int setterNdx = 0; setterNdx < DE_LENGTH_OF_ARRAY(pureSetters); ++setterNdx)
300     {
301         tcu::TestCaseGroup *const targetGroup =
302             new tcu::TestCaseGroup(m_testCtx, pureSetters[setterNdx].name, pureSetters[setterNdx].desc);
303         addChild(targetGroup);
304 
305         for (int stateNdx = 0; stateNdx < DE_LENGTH_OF_ARRAY(pureStates); ++stateNdx)
306         {
307             const TesterType tester = (pureSetters[setterNdx].verifier == QUERY_TEXTURE_PARAM_PURE_INTEGER) ?
308                                           (pureStates[stateNdx].intTester) :
309                                       (pureSetters[setterNdx].verifier == QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER) ?
310                                           (pureStates[stateNdx].uintTester) :
311                                           (TESTER_LAST);
312             // need 3d texture to test R wrap
313             const glw::GLenum target = (pureStates[stateNdx].intTester == TESTER_TEXTURE_WRAP_R_SET_PURE_INT) ?
314                                            (GL_TEXTURE_3D) :
315                                            (GL_TEXTURE_2D);
316 
317             targetGroup->addChild(
318                 createTexParamTest(m_testCtx, m_context.getRenderContext(), std::string() + pureStates[stateNdx].name,
319                                    pureStates[stateNdx].desc, pureSetters[setterNdx].verifier, target, tester));
320         }
321     }
322 }
323 
324 } // namespace Functional
325 } // namespace gles31
326 } // namespace deqp
327