GetDevices: Also allow `\.` to be part of the host name
[platform/upstream/VK-GL-CTS.git] / modules / glshared / glsTextureStateQueryTests.cpp
1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program OpenGL (ES) 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 State Query tests.
22  *//*--------------------------------------------------------------------*/
23
24 #include "glsTextureStateQueryTests.hpp"
25 #include "gluStrUtil.hpp"
26 #include "gluObjectWrapper.hpp"
27 #include "gluCallLogWrapper.hpp"
28 #include "gluContextInfo.hpp"
29 #include "gluTextureUtil.hpp"
30 #include "glwEnums.hpp"
31 #include "deUniquePtr.hpp"
32 #include "deRandom.hpp"
33 #include "deStringUtil.hpp"
34
35 namespace deqp
36 {
37 namespace gls
38 {
39 namespace TextureStateQueryTests
40 {
41 namespace
42 {
43
44 using namespace glw;
45 using namespace gls::StateQueryUtil;
46
47 static glw::GLenum mapTesterToPname (TesterType tester)
48 {
49
50 #define CASE_ALL_SETTERS(X) case X: case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT
51
52         switch (tester)
53         {
54                 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_R):                             return GL_TEXTURE_SWIZZLE_R;
55                 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_G):                             return GL_TEXTURE_SWIZZLE_G;
56                 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_B):                             return GL_TEXTURE_SWIZZLE_B;
57                 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_A):                             return GL_TEXTURE_SWIZZLE_A;
58
59                 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S):
60                 case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER:                             return GL_TEXTURE_WRAP_S;
61
62                 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T):
63                 case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER:                             return GL_TEXTURE_WRAP_T;
64
65                 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R):
66                 case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER:                             return GL_TEXTURE_WRAP_R;
67
68                 CASE_ALL_SETTERS(TESTER_TEXTURE_MAG_FILTER):                    return GL_TEXTURE_MAG_FILTER;
69                 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_FILTER):                    return GL_TEXTURE_MIN_FILTER;
70                 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_LOD):                               return GL_TEXTURE_MIN_LOD;
71                 CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LOD):                               return GL_TEXTURE_MAX_LOD;
72                 CASE_ALL_SETTERS(TESTER_TEXTURE_BASE_LEVEL):                    return GL_TEXTURE_BASE_LEVEL;
73                 CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LEVEL):                             return GL_TEXTURE_MAX_LEVEL;
74                 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE):                  return GL_TEXTURE_COMPARE_MODE;
75                 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC):                  return GL_TEXTURE_COMPARE_FUNC;
76                 case TESTER_TEXTURE_IMMUTABLE_LEVELS:                                   return GL_TEXTURE_IMMUTABLE_LEVELS;
77                 case TESTER_TEXTURE_IMMUTABLE_FORMAT:                                   return GL_TEXTURE_IMMUTABLE_FORMAT;
78                 CASE_ALL_SETTERS(TESTER_DEPTH_STENCIL_TEXTURE_MODE):    return GL_DEPTH_STENCIL_TEXTURE_MODE;
79                 CASE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT):               return GL_TEXTURE_SRGB_DECODE_EXT;
80                 case TESTER_TEXTURE_BORDER_COLOR:                                               return GL_TEXTURE_BORDER_COLOR;
81
82                 default:
83                         DE_ASSERT(false);
84                         return -1;
85         }
86
87 #undef CASE_PURE_SETTERS
88 }
89
90 static bool querySupportsSigned (QueryType type)
91 {
92         return  type != QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER &&
93                         type != QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER;
94 }
95
96 static bool isPureIntTester (TesterType tester)
97 {
98 #define HANDLE_ALL_SETTERS(X) \
99                 case X: \
100                 case X ## _SET_PURE_UINT: return false; \
101                 case X ## _SET_PURE_INT: return true;
102
103         switch (tester)
104         {
105                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_R)
106                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_G)
107                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_B)
108                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_A)
109                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S)
110                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T)
111                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R)
112                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MAG_FILTER)
113                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MIN_FILTER)
114                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MIN_LOD)
115                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MAX_LOD)
116                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_BASE_LEVEL)
117                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MAX_LEVEL)
118                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE)
119                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC)
120                 HANDLE_ALL_SETTERS(TESTER_DEPTH_STENCIL_TEXTURE_MODE)
121                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT)
122
123                 case TESTER_TEXTURE_IMMUTABLE_LEVELS:
124                 case TESTER_TEXTURE_IMMUTABLE_FORMAT:
125                 case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER:
126                 case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER:
127                 case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER:
128                 case TESTER_TEXTURE_BORDER_COLOR:
129                         return false;
130
131                 default:
132                         DE_ASSERT(false);
133                         return false;
134         }
135
136 #undef HANDLE_ALL_SETTERS
137 }
138
139 static bool isPureUintTester (TesterType tester)
140 {
141 #define HANDLE_ALL_SETTERS(X) \
142                 case X: \
143                 case X ## _SET_PURE_INT: return false; \
144                 case X ## _SET_PURE_UINT: return true;
145
146         switch (tester)
147         {
148                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_R)
149                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_G)
150                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_B)
151                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_A)
152                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S)
153                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T)
154                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R)
155                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MAG_FILTER)
156                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MIN_FILTER)
157                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MIN_LOD)
158                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MAX_LOD)
159                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_BASE_LEVEL)
160                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_MAX_LEVEL)
161                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE)
162                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC)
163                 HANDLE_ALL_SETTERS(TESTER_DEPTH_STENCIL_TEXTURE_MODE)
164                 HANDLE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT)
165
166                 case TESTER_TEXTURE_IMMUTABLE_LEVELS:
167                 case TESTER_TEXTURE_IMMUTABLE_FORMAT:
168                 case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER:
169                 case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER:
170                 case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER:
171                 case TESTER_TEXTURE_BORDER_COLOR:
172                         return false;
173
174                 default:
175                         DE_ASSERT(false);
176                         return false;
177         }
178
179 #undef HANDLE_ALL_SETTERS
180 }
181
182 class RequiredExtensions
183 {
184 public:
185                                                                 RequiredExtensions      (void)                                                                  { }
186         explicit                                        RequiredExtensions      (const char* ext)                                               { add(ext);                             }
187                                                                 RequiredExtensions      (const char* extA, const char* extB)    { add(extA); add(extB); }
188
189         void                                            add                                     (const char* ext);
190         void                                            add                                     (const RequiredExtensions& other);
191         void                                            check                           (const glu::ContextInfo&) const;
192
193 private:
194         std::vector<const char*>        m_extensions;
195 };
196
197 void RequiredExtensions::add (const char* ext)
198 {
199         for (int ndx = 0; ndx < (int)m_extensions.size(); ++ndx)
200                 if (deStringEqual(m_extensions[ndx], ext) == DE_TRUE)
201                         return;
202         m_extensions.push_back(ext);
203 }
204
205 void RequiredExtensions::add (const RequiredExtensions& other)
206 {
207         for (int ndx = 0; ndx < (int)other.m_extensions.size(); ++ndx)
208                 add(other.m_extensions[ndx]);
209 }
210
211 void RequiredExtensions::check (const glu::ContextInfo& ctxInfo) const
212 {
213         std::vector<const char*> failedExtensions;
214
215         for (int ndx = 0; ndx < (int)m_extensions.size(); ++ndx)
216                 if (!ctxInfo.isExtensionSupported(m_extensions[ndx]))
217                         failedExtensions.push_back(m_extensions[ndx]);
218
219         if (!failedExtensions.empty())
220         {
221                 std::ostringstream buf;
222                 buf << "Test requires extension: ";
223
224                 for (int ndx = 0; ndx < (int)failedExtensions.size(); ++ndx)
225                 {
226                         if (ndx)
227                                 buf << ", ";
228                         buf << failedExtensions[ndx];
229                 }
230
231                 throw tcu::NotSupportedError(buf.str());
232         }
233 }
234
235 namespace es30
236 {
237
238 static bool isCoreTextureTarget (glw::GLenum target)
239 {
240         return  target == GL_TEXTURE_2D                 ||
241                         target == GL_TEXTURE_3D                 ||
242                         target == GL_TEXTURE_2D_ARRAY   ||
243                         target == GL_TEXTURE_CUBE_MAP;
244 }
245
246 static RequiredExtensions getTextureTargetExtension (glw::GLenum target)
247 {
248         DE_UNREF(target);
249         DE_ASSERT(false);
250         return RequiredExtensions();
251 }
252
253 static bool isCoreTextureParam (glw::GLenum pname)
254 {
255         return  pname == GL_TEXTURE_BASE_LEVEL                  ||
256                         pname == GL_TEXTURE_COMPARE_MODE                ||
257                         pname == GL_TEXTURE_COMPARE_FUNC                ||
258                         pname == GL_TEXTURE_MAG_FILTER                  ||
259                         pname == GL_TEXTURE_MAX_LEVEL                   ||
260                         pname == GL_TEXTURE_MAX_LOD                             ||
261                         pname == GL_TEXTURE_MIN_FILTER                  ||
262                         pname == GL_TEXTURE_MIN_LOD                             ||
263                         pname == GL_TEXTURE_SWIZZLE_R                   ||
264                         pname == GL_TEXTURE_SWIZZLE_G                   ||
265                         pname == GL_TEXTURE_SWIZZLE_B                   ||
266                         pname == GL_TEXTURE_SWIZZLE_A                   ||
267                         pname == GL_TEXTURE_WRAP_S                              ||
268                         pname == GL_TEXTURE_WRAP_T                              ||
269                         pname == GL_TEXTURE_WRAP_R                              ||
270                         pname == GL_TEXTURE_IMMUTABLE_FORMAT    ||
271                         pname == GL_TEXTURE_IMMUTABLE_LEVELS;
272 }
273
274 static RequiredExtensions getTextureParamExtension (glw::GLenum pname)
275 {
276         DE_UNREF(pname);
277         DE_ASSERT(false);
278         return RequiredExtensions();
279 }
280
281 static bool isCoreQuery (QueryType query)
282 {
283         return  query == QUERY_TEXTURE_PARAM_INTEGER            ||
284                         query == QUERY_TEXTURE_PARAM_FLOAT                      ||
285                         query == QUERY_TEXTURE_PARAM_INTEGER_VEC4       ||
286                         query == QUERY_TEXTURE_PARAM_FLOAT_VEC4         ||
287                         query == QUERY_SAMPLER_PARAM_INTEGER            ||
288                         query == QUERY_SAMPLER_PARAM_FLOAT                      ||
289                         query == QUERY_SAMPLER_PARAM_INTEGER_VEC4       ||
290                         query == QUERY_SAMPLER_PARAM_FLOAT_VEC4;
291 }
292
293 static RequiredExtensions getQueryExtension (QueryType query)
294 {
295         DE_UNREF(query);
296         DE_ASSERT(false);
297         return RequiredExtensions();
298 }
299
300 static bool isCoreTester (TesterType tester)
301 {
302         return  tester == TESTER_TEXTURE_SWIZZLE_R                      ||
303                         tester == TESTER_TEXTURE_SWIZZLE_G                      ||
304                         tester == TESTER_TEXTURE_SWIZZLE_B                      ||
305                         tester == TESTER_TEXTURE_SWIZZLE_A                      ||
306                         tester == TESTER_TEXTURE_WRAP_S                         ||
307                         tester == TESTER_TEXTURE_WRAP_T                         ||
308                         tester == TESTER_TEXTURE_WRAP_R                         ||
309                         tester == TESTER_TEXTURE_MAG_FILTER                     ||
310                         tester == TESTER_TEXTURE_MIN_FILTER                     ||
311                         tester == TESTER_TEXTURE_MIN_LOD                        ||
312                         tester == TESTER_TEXTURE_MAX_LOD                        ||
313                         tester == TESTER_TEXTURE_BASE_LEVEL                     ||
314                         tester == TESTER_TEXTURE_MAX_LEVEL                      ||
315                         tester == TESTER_TEXTURE_COMPARE_MODE           ||
316                         tester == TESTER_TEXTURE_COMPARE_FUNC           ||
317                         tester == TESTER_TEXTURE_IMMUTABLE_LEVELS       ||
318                         tester == TESTER_TEXTURE_IMMUTABLE_FORMAT;
319 }
320
321 static RequiredExtensions getTesterExtension (TesterType tester)
322 {
323         DE_UNREF(tester);
324         DE_ASSERT(false);
325         return RequiredExtensions();
326 }
327
328 } // es30
329
330 namespace es31
331 {
332
333 static bool isCoreTextureTarget (glw::GLenum target)
334 {
335         return  es30::isCoreTextureTarget(target) ||
336                         target == GL_TEXTURE_2D_MULTISAMPLE;
337 }
338
339 static RequiredExtensions getTextureTargetExtension (glw::GLenum target)
340 {
341         switch (target)
342         {
343                 case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:   return RequiredExtensions("GL_OES_texture_storage_multisample_2d_array");
344                 case GL_TEXTURE_BUFFER:                                 return RequiredExtensions("GL_EXT_texture_buffer");
345                 case GL_TEXTURE_CUBE_MAP_ARRAY:                 return RequiredExtensions("GL_EXT_texture_cube_map_array");
346                 default:
347                         DE_ASSERT(false);
348                         return RequiredExtensions();
349         }
350 }
351
352 static bool isCoreTextureParam (glw::GLenum pname)
353 {
354         return  es30::isCoreTextureParam(pname) ||
355                         pname == GL_DEPTH_STENCIL_TEXTURE_MODE;
356 }
357
358 static RequiredExtensions getTextureParamExtension (glw::GLenum pname)
359 {
360         switch (pname)
361         {
362                 case GL_TEXTURE_SRGB_DECODE_EXT:        return RequiredExtensions("GL_EXT_texture_sRGB_decode");
363                 case GL_TEXTURE_BORDER_COLOR:           return RequiredExtensions("GL_EXT_texture_border_clamp");
364                 default:
365                         DE_ASSERT(false);
366                         return RequiredExtensions();
367         }
368 }
369
370 static bool isCoreQuery (QueryType query)
371 {
372         return es30::isCoreQuery(query);
373 }
374
375 static RequiredExtensions getQueryExtension (QueryType query)
376 {
377         switch (query)
378         {
379                 case QUERY_TEXTURE_PARAM_PURE_INTEGER:
380                 case QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER:
381                 case QUERY_TEXTURE_PARAM_PURE_INTEGER_VEC4:
382                 case QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER_VEC4:
383                 case QUERY_SAMPLER_PARAM_PURE_INTEGER:
384                 case QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER:
385                 case QUERY_SAMPLER_PARAM_PURE_INTEGER_VEC4:
386                 case QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER_VEC4:
387                         return RequiredExtensions("GL_EXT_texture_border_clamp");
388
389                 default:
390                         DE_ASSERT(false);
391                         return RequiredExtensions();
392         }
393 }
394
395 static bool isCoreTester (TesterType tester)
396 {
397         return  es30::isCoreTester(tester)                                                      ||
398                         tester == TESTER_DEPTH_STENCIL_TEXTURE_MODE;
399 }
400
401 static RequiredExtensions getTesterExtension (TesterType tester)
402 {
403 #define CASE_PURE_SETTERS(X) case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT
404
405         switch (tester)
406         {
407                 CASE_PURE_SETTERS(TESTER_TEXTURE_SWIZZLE_R):
408                 CASE_PURE_SETTERS(TESTER_TEXTURE_SWIZZLE_G):
409                 CASE_PURE_SETTERS(TESTER_TEXTURE_SWIZZLE_B):
410                 CASE_PURE_SETTERS(TESTER_TEXTURE_SWIZZLE_A):
411                 CASE_PURE_SETTERS(TESTER_TEXTURE_WRAP_S):
412                 CASE_PURE_SETTERS(TESTER_TEXTURE_WRAP_T):
413                 CASE_PURE_SETTERS(TESTER_TEXTURE_WRAP_R):
414                 CASE_PURE_SETTERS(TESTER_TEXTURE_MAG_FILTER):
415                 CASE_PURE_SETTERS(TESTER_TEXTURE_MIN_FILTER):
416                 CASE_PURE_SETTERS(TESTER_TEXTURE_MIN_LOD):
417                 CASE_PURE_SETTERS(TESTER_TEXTURE_MAX_LOD):
418                 CASE_PURE_SETTERS(TESTER_TEXTURE_BASE_LEVEL):
419                 CASE_PURE_SETTERS(TESTER_TEXTURE_MAX_LEVEL):
420                 CASE_PURE_SETTERS(TESTER_TEXTURE_COMPARE_MODE):
421                 CASE_PURE_SETTERS(TESTER_TEXTURE_COMPARE_FUNC):
422                 CASE_PURE_SETTERS(TESTER_DEPTH_STENCIL_TEXTURE_MODE):
423                 case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER:
424                 case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER:
425                 case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER:
426                 case TESTER_TEXTURE_BORDER_COLOR:
427                         return RequiredExtensions("GL_EXT_texture_border_clamp");
428
429                 case TESTER_TEXTURE_SRGB_DECODE_EXT:
430                         return RequiredExtensions("GL_EXT_texture_sRGB_decode");
431
432                 CASE_PURE_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT):
433                         return RequiredExtensions("GL_EXT_texture_sRGB_decode", "GL_EXT_texture_border_clamp");
434
435                 default:
436                         DE_ASSERT(false);
437                         return RequiredExtensions();
438         }
439
440 #undef CASE_PURE_SETTERS
441 }
442
443 } // es31
444
445 static bool isCoreTextureTarget (const glu::ContextType& contextType, glw::GLenum target)
446 {
447         if (contextSupports(contextType, glu::ApiType::es(3,1)))
448                 return es31::isCoreTextureTarget(target);
449         else if (contextSupports(contextType, glu::ApiType::es(3,0)))
450                 return es30::isCoreTextureTarget(target);
451         else
452         {
453                 DE_ASSERT(false);
454                 return DE_NULL;
455         }
456 }
457
458 static bool isCoreTextureParam (const glu::ContextType& contextType, glw::GLenum pname)
459 {
460         if (contextSupports(contextType, glu::ApiType::es(3,1)))
461                 return es31::isCoreTextureParam(pname);
462         else if (contextSupports(contextType, glu::ApiType::es(3,0)))
463                 return es30::isCoreTextureParam(pname);
464         else
465         {
466                 DE_ASSERT(false);
467                 return DE_NULL;
468         }
469 }
470
471 static bool isCoreQuery (const glu::ContextType& contextType, QueryType query)
472 {
473         if (contextSupports(contextType, glu::ApiType::es(3,1)))
474                 return es31::isCoreQuery(query);
475         else if (contextSupports(contextType, glu::ApiType::es(3,0)))
476                 return es30::isCoreQuery(query);
477         else
478         {
479                 DE_ASSERT(false);
480                 return DE_NULL;
481         }
482 }
483
484 static bool isCoreTester (const glu::ContextType& contextType, TesterType tester)
485 {
486         if (contextSupports(contextType, glu::ApiType::es(3,1)))
487                 return es31::isCoreTester(tester);
488         else if (contextSupports(contextType, glu::ApiType::es(3,0)))
489                 return es30::isCoreTester(tester);
490         else
491         {
492                 DE_ASSERT(false);
493                 return DE_NULL;
494         }
495 }
496
497 static RequiredExtensions getTextureTargetExtension (const glu::ContextType& contextType, glw::GLenum target)
498 {
499         DE_ASSERT(!isCoreTextureTarget(contextType, target));
500
501         if (contextSupports(contextType, glu::ApiType::es(3,1)))
502                 return es31::getTextureTargetExtension(target);
503         else if (contextSupports(contextType, glu::ApiType::es(3,0)))
504                 return es30::getTextureTargetExtension(target);
505         else
506         {
507                 DE_ASSERT(false);
508                 return RequiredExtensions();
509         }
510 }
511
512 static RequiredExtensions getTextureParamExtension (const glu::ContextType& contextType, glw::GLenum pname)
513 {
514         DE_ASSERT(!isCoreTextureParam(contextType, pname));
515
516         if (contextSupports(contextType, glu::ApiType::es(3,1)))
517                 return es31::getTextureParamExtension(pname);
518         else if (contextSupports(contextType, glu::ApiType::es(3,0)))
519                 return es30::getTextureParamExtension(pname);
520         else
521         {
522                 DE_ASSERT(false);
523                 return RequiredExtensions();
524         }
525 }
526
527 static RequiredExtensions getQueryExtension (const glu::ContextType& contextType, QueryType query)
528 {
529         DE_ASSERT(!isCoreQuery(contextType, query));
530
531         if (contextSupports(contextType, glu::ApiType::es(3,1)))
532                 return es31::getQueryExtension(query);
533         else if (contextSupports(contextType, glu::ApiType::es(3,0)))
534                 return es30::getQueryExtension(query);
535         else
536         {
537                 DE_ASSERT(false);
538                 return RequiredExtensions();
539         }
540 }
541
542 static RequiredExtensions getTesterExtension (const glu::ContextType& contextType, TesterType tester)
543 {
544         DE_ASSERT(!isCoreTester(contextType, tester));
545
546         if (contextSupports(contextType, glu::ApiType::es(3,1)))
547                 return es31::getTesterExtension(tester);
548         else if (contextSupports(contextType, glu::ApiType::es(3,0)))
549                 return es30::getTesterExtension(tester);
550         else
551         {
552                 DE_ASSERT(false);
553                 return RequiredExtensions();
554         }
555 }
556
557 class TextureTest : public tcu::TestCase
558 {
559 public:
560                                                 TextureTest     (tcu::TestContext&                      testCtx,
561                                                                          const glu::RenderContext&      renderCtx,
562                                                                          const char*                            name,
563                                                                          const char*                            desc,
564                                                                          glw::GLenum                            target,
565                                                                          TesterType                                     tester,
566                                                                          QueryType                                      type);
567
568         void                            init            (void);
569         IterateResult           iterate         (void);
570
571         virtual void            test            (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const = 0;
572
573 protected:
574         const glu::RenderContext&       m_renderCtx;
575         const glw::GLenum                       m_target;
576         const glw::GLenum                       m_pname;
577         const TesterType                        m_tester;
578         const QueryType                         m_type;
579 };
580
581 TextureTest::TextureTest (tcu::TestContext&                     testCtx,
582                                                   const glu::RenderContext&     renderCtx,
583                                                   const char*                           name,
584                                                   const char*                           desc,
585                                                   glw::GLenum                           target,
586                                                   TesterType                            tester,
587                                                   QueryType                                     type)
588         : TestCase              (testCtx, name, desc)
589         , m_renderCtx   (renderCtx)
590         , m_target              (target)
591         , m_pname               (mapTesterToPname(tester))
592         , m_tester              (tester)
593         , m_type                (type)
594 {
595 }
596
597 void TextureTest::init (void)
598 {
599         const de::UniquePtr<glu::ContextInfo>   ctxInfo         (glu::ContextInfo::create(m_renderCtx));
600         RequiredExtensions                                              extensions;
601
602         // target
603         if (!isCoreTextureTarget(m_renderCtx.getType(), m_target))
604                 extensions.add(getTextureTargetExtension(m_renderCtx.getType(), m_target));
605
606         // param
607         if (!isCoreTextureParam(m_renderCtx.getType(), m_pname))
608                 extensions.add(getTextureParamExtension(m_renderCtx.getType(), m_pname));
609
610         // query
611         if (!isCoreQuery(m_renderCtx.getType(), m_type))
612                 extensions.add(getQueryExtension(m_renderCtx.getType(), m_type));
613
614         // test type
615         if (!isCoreTester(m_renderCtx.getType(), m_tester))
616                 extensions.add(getTesterExtension(m_renderCtx.getType(), m_tester));
617
618         extensions.check(*ctxInfo);
619 }
620
621 TextureTest::IterateResult TextureTest::iterate (void)
622 {
623         glu::CallLogWrapper             gl              (m_renderCtx.getFunctions(), m_testCtx.getLog());
624         tcu::ResultCollector    result  (m_testCtx.getLog(), " // ERROR: ");
625
626         gl.enableLogging(true);
627         test(gl, result);
628
629         result.setTestContextResult(m_testCtx);
630         return STOP;
631 }
632
633 class IsTextureCase : public tcu::TestCase
634 {
635 public:
636                                                                 IsTextureCase   (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target);
637
638         void                                            init                    (void);
639         IterateResult                           iterate                 (void);
640
641 protected:
642         const glu::RenderContext&       m_renderCtx;
643         const glw::GLenum                       m_target;
644 };
645
646 IsTextureCase::IsTextureCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target)
647         : tcu::TestCase (testCtx, name, desc)
648         , m_renderCtx   (renderCtx)
649         , m_target              (target)
650 {
651 }
652
653 void IsTextureCase::init (void)
654 {
655         const de::UniquePtr<glu::ContextInfo>   ctxInfo         (glu::ContextInfo::create(m_renderCtx));
656         RequiredExtensions                                              extensions;
657
658         // target
659         if (!isCoreTextureTarget(m_renderCtx.getType(), m_target))
660                 extensions.add(getTextureTargetExtension(m_renderCtx.getType(), m_target));
661
662         extensions.check(*ctxInfo);
663 }
664
665 IsTextureCase::IterateResult IsTextureCase::iterate (void)
666 {
667         glu::CallLogWrapper             gl                      (m_renderCtx.getFunctions(), m_testCtx.getLog());
668         tcu::ResultCollector    result          (m_testCtx.getLog(), " // ERROR: ");
669         glw::GLuint                             textureId       = 0;
670
671         gl.enableLogging(true);
672
673         gl.glGenTextures(1, &textureId);
674         gl.glBindTexture(m_target, textureId);
675         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
676
677         verifyStateObjectBoolean(result, gl, textureId, true, QUERY_ISTEXTURE);
678
679         gl.glDeleteTextures(1, &textureId);
680         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
681
682         verifyStateObjectBoolean(result, gl, textureId, false, QUERY_ISTEXTURE);
683
684         result.setTestContextResult(m_testCtx);
685         return STOP;
686 }
687
688 class DepthStencilModeCase : public TextureTest
689 {
690 public:
691                         DepthStencilModeCase    (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
692         void    test                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
693 };
694
695 DepthStencilModeCase::DepthStencilModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
696         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
697 {
698 }
699
700 void DepthStencilModeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
701 {
702         const bool              isPureCase      = isPureIntTester(m_tester) || isPureUintTester(m_tester);
703         glu::Texture    texture         (m_renderCtx);
704
705         gl.glBindTexture(m_target, *texture);
706         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind");
707
708         if (!isPureCase)
709         {
710                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
711                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
712         }
713
714         if (!isPureCase)
715         {
716                 const tcu::ScopedLogSection     section                         (m_testCtx.getLog(), "Toggle", "Toggle");
717                 const glw::GLint                        depthComponentInt       = GL_DEPTH_COMPONENT;
718                 const glw::GLfloat                      depthComponentFloat     = (glw::GLfloat)GL_DEPTH_COMPONENT;
719
720                 gl.glTexParameteri(m_target, m_pname, GL_STENCIL_INDEX);
721                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
722                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type);
723
724                 gl.glTexParameteriv(m_target, m_pname, &depthComponentInt);
725                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
726                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
727
728                 gl.glTexParameterf(m_target, m_pname, GL_STENCIL_INDEX);
729                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
730                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type);
731
732                 gl.glTexParameterfv(m_target, m_pname, &depthComponentFloat);
733                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
734                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
735         }
736
737         if (isPureIntTester(m_tester))
738         {
739                 const glw::GLint depthComponent = GL_DEPTH_COMPONENT;
740                 const glw::GLint stencilIndex   = GL_STENCIL_INDEX;
741
742                 gl.glTexParameterIiv(m_target, m_pname, &stencilIndex);
743                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
744                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type);
745
746                 gl.glTexParameterIiv(m_target, m_pname, &depthComponent);
747                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
748                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
749         }
750
751         if (isPureUintTester(m_tester))
752         {
753                 const glw::GLuint depthComponent        = GL_DEPTH_COMPONENT;
754                 const glw::GLuint stencilIndex  = GL_STENCIL_INDEX;
755
756                 gl.glTexParameterIuiv(m_target, m_pname, &stencilIndex);
757                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
758                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type);
759
760                 gl.glTexParameterIuiv(m_target, m_pname, &depthComponent);
761                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
762                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
763         }
764 }
765
766 class TextureSRGBDecodeCase : public TextureTest
767 {
768 public:
769                         TextureSRGBDecodeCase   (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
770         void    test                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
771 };
772
773 TextureSRGBDecodeCase::TextureSRGBDecodeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
774         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
775 {
776 }
777
778 void TextureSRGBDecodeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
779 {
780         const bool              isPureCase      = isPureIntTester(m_tester) || isPureUintTester(m_tester);
781         glu::Texture    texture         (m_renderCtx);
782
783         gl.glBindTexture(m_target, *texture);
784         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind");
785
786         if (!isPureCase)
787         {
788                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
789                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
790         }
791
792         if (!isPureCase)
793         {
794                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Toggle", "Toggle");
795                 const glw::GLint                        decodeInt               = GL_DECODE_EXT;
796                 const glw::GLfloat                      decodeFloat             = (glw::GLfloat)GL_DECODE_EXT;
797
798                 gl.glTexParameteri(m_target, m_pname, GL_SKIP_DECODE_EXT);
799                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
800                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
801
802                 gl.glTexParameteriv(m_target, m_pname, &decodeInt);
803                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
804                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
805
806                 gl.glTexParameterf(m_target, m_pname, GL_SKIP_DECODE_EXT);
807                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
808                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
809
810                 gl.glTexParameterfv(m_target, m_pname, &decodeFloat);
811                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
812                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
813         }
814
815         if (isPureIntTester(m_tester))
816         {
817                 const glw::GLint skipDecode     = GL_SKIP_DECODE_EXT;
818                 const glw::GLint decode         = GL_DECODE_EXT;
819
820                 gl.glTexParameterIiv(m_target, m_pname, &skipDecode);
821                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
822                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
823
824                 gl.glTexParameterIiv(m_target, m_pname, &decode);
825                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
826                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
827         }
828
829         if (isPureUintTester(m_tester))
830         {
831                 const glw::GLuint skipDecode    = GL_SKIP_DECODE_EXT;
832                 const glw::GLuint decode                = GL_DECODE_EXT;
833
834                 gl.glTexParameterIuiv(m_target, m_pname, &skipDecode);
835                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
836                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
837
838                 gl.glTexParameterIuiv(m_target, m_pname, &decode);
839                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
840                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
841         }
842 }
843
844 class TextureSwizzleCase : public TextureTest
845 {
846 public:
847                         TextureSwizzleCase      (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
848         void    test                            (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
849 };
850
851 TextureSwizzleCase::TextureSwizzleCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
852         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
853 {
854 }
855
856 void TextureSwizzleCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
857 {
858         const bool      isPureCase              = isPureIntTester(m_tester) || isPureUintTester(m_tester);
859         const int       initialValue    = (m_pname == GL_TEXTURE_SWIZZLE_R) ? (GL_RED) :
860                                                                   (m_pname == GL_TEXTURE_SWIZZLE_G) ? (GL_GREEN) :
861                                                                   (m_pname == GL_TEXTURE_SWIZZLE_B) ? (GL_BLUE) :
862                                                                   (m_pname == GL_TEXTURE_SWIZZLE_A) ? (GL_ALPHA) :
863                                                                   (-1);
864
865         if (!isPureCase)
866         {
867                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
868                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initialValue, m_type);
869         }
870
871         {
872                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
873                 const GLenum                            swizzleValues[] = {GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_ZERO, GL_ONE};
874
875                 if (isPureCase)
876                 {
877                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(swizzleValues); ++ndx)
878                         {
879                                 if (isPureIntTester(m_tester))
880                                 {
881                                         const glw::GLint value = (glw::GLint)swizzleValues[ndx];
882                                         gl.glTexParameterIiv(m_target, m_pname, &value);
883                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
884                                 }
885                                 else
886                                 {
887                                         DE_ASSERT(isPureUintTester(m_tester));
888
889                                         const glw::GLuint value = swizzleValues[ndx];
890                                         gl.glTexParameterIuiv(m_target, m_pname, &value);
891                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
892                                 }
893
894                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, swizzleValues[ndx], m_type);
895                         }
896                 }
897                 else
898                 {
899                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(swizzleValues); ++ndx)
900                         {
901                                 gl.glTexParameteri(m_target, m_pname, swizzleValues[ndx]);
902                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
903
904                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, swizzleValues[ndx], m_type);
905                         }
906
907                         //check unit conversions with float
908
909                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(swizzleValues); ++ndx)
910                         {
911                                 gl.glTexParameterf(m_target, m_pname, (GLfloat)swizzleValues[ndx]);
912                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
913
914                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, swizzleValues[ndx], m_type);
915                         }
916                 }
917         }
918 }
919
920 class TextureWrapCase : public TextureTest
921 {
922 public:
923                         TextureWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
924         void    test                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
925 };
926
927 TextureWrapCase::TextureWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
928         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
929 {
930 }
931
932 void TextureWrapCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
933 {
934         const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
935
936         if (!isPureCase)
937         {
938                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
939                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_REPEAT, m_type);
940         }
941
942         {
943                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
944                 const GLenum                            wrapValues[]    = {GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT};
945
946                 if (isPureCase)
947                 {
948                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
949                         {
950                                 if (isPureIntTester(m_tester))
951                                 {
952                                         const glw::GLint value = (glw::GLint)wrapValues[ndx];
953                                         gl.glTexParameterIiv(m_target, m_pname, &value);
954                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
955                                 }
956                                 else
957                                 {
958                                         DE_ASSERT(isPureUintTester(m_tester));
959
960                                         const glw::GLuint value = wrapValues[ndx];
961                                         gl.glTexParameterIuiv(m_target, m_pname, &value);
962                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
963                                 }
964
965                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
966                         }
967                 }
968                 else
969                 {
970                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
971                         {
972                                 gl.glTexParameteri(m_target, m_pname, wrapValues[ndx]);
973                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
974
975                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
976                         }
977
978                         //check unit conversions with float
979
980                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
981                         {
982                                 gl.glTexParameterf(m_target, m_pname, (GLfloat)wrapValues[ndx]);
983                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
984
985                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
986                         }
987                 }
988         }
989 }
990
991 class TextureFilterCase : public TextureTest
992 {
993 public:
994                         TextureFilterCase       (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
995         void    test                            (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
996 };
997
998 TextureFilterCase::TextureFilterCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
999         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1000 {
1001 }
1002
1003 void TextureFilterCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1004 {
1005         const bool                      isPureCase      = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1006         const glw::GLenum       initial         = (m_pname == GL_TEXTURE_MAG_FILTER) ? (GL_LINEAR)
1007                                                                         : (m_pname == GL_TEXTURE_MIN_FILTER) ? (GL_NEAREST_MIPMAP_LINEAR)
1008                                                                         : (0);
1009
1010         if (!isPureCase)
1011         {
1012                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1013                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initial, m_type);
1014         }
1015
1016         {
1017                 const tcu::ScopedLogSection     section         (m_testCtx.getLog(), "Set", "Set");
1018                 std::vector<GLenum>                     values;
1019
1020                 values.push_back(GL_NEAREST);
1021                 values.push_back(GL_LINEAR);
1022                 if (m_pname == GL_TEXTURE_MIN_FILTER)
1023                 {
1024                         values.push_back(GL_NEAREST_MIPMAP_NEAREST);
1025                         values.push_back(GL_NEAREST_MIPMAP_LINEAR);
1026                         values.push_back(GL_LINEAR_MIPMAP_NEAREST);
1027                         values.push_back(GL_LINEAR_MIPMAP_LINEAR);
1028                 }
1029
1030                 if (isPureCase)
1031                 {
1032                         for (int ndx = 0; ndx < (int)values.size(); ++ndx)
1033                         {
1034                                 if (isPureIntTester(m_tester))
1035                                 {
1036                                         const glw::GLint value = (glw::GLint)values[ndx];
1037                                         gl.glTexParameterIiv(m_target, m_pname, &value);
1038                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1039                                 }
1040                                 else
1041                                 {
1042                                         DE_ASSERT(isPureUintTester(m_tester));
1043
1044                                         const glw::GLuint value = values[ndx];
1045                                         gl.glTexParameterIuiv(m_target, m_pname, &value);
1046                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1047                                 }
1048
1049                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
1050                         }
1051                 }
1052                 else
1053                 {
1054                         for (int ndx = 0; ndx < (int)values.size(); ++ndx)
1055                         {
1056                                 gl.glTexParameteri(m_target, m_pname, values[ndx]);
1057                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1058
1059                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
1060                         }
1061
1062                         //check unit conversions with float
1063
1064                         for (int ndx = 0; ndx < (int)values.size(); ++ndx)
1065                         {
1066                                 gl.glTexParameterf(m_target, m_pname, (GLfloat)values[ndx]);
1067                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1068
1069                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
1070                         }
1071                 }
1072         }
1073 }
1074
1075 class TextureLODCase : public TextureTest
1076 {
1077 public:
1078                         TextureLODCase  (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1079         void    test                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1080 };
1081
1082 TextureLODCase::TextureLODCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1083         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1084 {
1085 }
1086
1087 void TextureLODCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1088 {
1089         const bool      isPureCase              = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1090         const int       initialValue    = (m_pname == GL_TEXTURE_MIN_LOD) ? (-1000)
1091                                                                 : (m_pname == GL_TEXTURE_MAX_LOD) ? (1000)
1092                                                                 : (-1);
1093
1094         if ((querySupportsSigned(m_type) || initialValue >= 0) && !isPureCase)
1095         {
1096                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1097                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initialValue, m_type);
1098         }
1099
1100         {
1101                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
1102                 const int                                       numIterations   = 20;
1103                 de::Random                                      rnd                             (0xabcdef);
1104
1105                 if (isPureCase)
1106                 {
1107                         if (isPureIntTester(m_tester))
1108                         {
1109                                 for (int ndx = 0; ndx < numIterations; ++ndx)
1110                                 {
1111                                         const GLint ref = rnd.getInt(-1000, 1000);
1112
1113                                         gl.glTexParameterIiv(m_target, m_pname, &ref);
1114                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1115
1116                                         verifyStateTextureParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
1117                                 }
1118                         }
1119                         else
1120                         {
1121                                 DE_ASSERT(isPureUintTester(m_tester));
1122
1123                                 for (int ndx = 0; ndx < numIterations; ++ndx)
1124                                 {
1125                                         const GLuint ref = (glw::GLuint)rnd.getInt(0, 1000);
1126
1127                                         gl.glTexParameterIuiv(m_target, m_pname, &ref);
1128                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1129
1130                                         verifyStateTextureParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
1131                                 }
1132                         }
1133                 }
1134                 else
1135                 {
1136                         const int minLimit = (querySupportsSigned(m_type)) ? (-1000) : (0);
1137
1138                         for (int ndx = 0; ndx < numIterations; ++ndx)
1139                         {
1140                                 const GLfloat ref = rnd.getFloat((float)minLimit, 1000.f);
1141
1142                                 gl.glTexParameterf(m_target, m_pname, ref);
1143                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1144
1145                                 verifyStateTextureParamFloat(result, gl, m_target, m_pname, ref, m_type);
1146                         }
1147
1148                         // check unit conversions with int
1149
1150                         for (int ndx = 0; ndx < numIterations; ++ndx)
1151                         {
1152                                 const GLint ref = rnd.getInt(minLimit, 1000);
1153
1154                                 gl.glTexParameteri(m_target, m_pname, ref);
1155                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1156
1157                                 verifyStateTextureParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
1158                         }
1159                 }
1160         }
1161 }
1162
1163 class TextureLevelCase : public TextureTest
1164 {
1165 public:
1166                         TextureLevelCase        (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1167         void    test                            (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1168 };
1169
1170 TextureLevelCase::TextureLevelCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1171         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1172 {
1173 }
1174
1175 void TextureLevelCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1176 {
1177         const bool      isPureCase              = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1178         const int       initialValue    = (m_pname == GL_TEXTURE_BASE_LEVEL) ? (0)
1179                                                                 : (m_pname == GL_TEXTURE_MAX_LEVEL)     ? (1000)
1180                                                                 : (-1);
1181
1182         if (!isPureCase)
1183         {
1184                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1185                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initialValue, m_type);
1186         }
1187
1188         if (m_target == GL_TEXTURE_2D_MULTISAMPLE               ||
1189                 m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
1190         {
1191                 // only 0 allowed
1192                 {
1193                         const tcu::ScopedLogSection section(m_testCtx.getLog(), "Set", "Set");
1194
1195                         gl.glTexParameteri(m_target, m_pname, 0);
1196                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1197                         verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1198
1199                         gl.glTexParameterf(m_target, m_pname, 0.0f);
1200                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1201                         verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1202                 }
1203         }
1204         else
1205         {
1206                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
1207                 const int                                       numIterations   = 20;
1208                 de::Random                                      rnd                             (0xabcdef);
1209
1210                 if (isPureCase)
1211                 {
1212                         for (int ndx = 0; ndx < numIterations; ++ndx)
1213                         {
1214                                 const GLint             ref             = rnd.getInt(0, 64000);
1215                                 const GLuint    uRef    = (glw::GLuint)ref;
1216
1217                                 if (isPureIntTester(m_tester))
1218                                 {
1219                                         gl.glTexParameterIiv(m_target, m_pname, &ref);
1220                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1221                                 }
1222                                 else
1223                                 {
1224                                         DE_ASSERT(isPureUintTester(m_tester));
1225                                         gl.glTexParameterIuiv(m_target, m_pname, &uRef);
1226                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1227                                 }
1228
1229                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, ref, m_type);
1230                         }
1231                 }
1232                 else
1233                 {
1234                         for (int ndx = 0; ndx < numIterations; ++ndx)
1235                         {
1236                                 const GLint ref = rnd.getInt(0, 64000);
1237
1238                                 gl.glTexParameteri(m_target, m_pname, ref);
1239                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1240
1241                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, ref, m_type);
1242                         }
1243
1244                         // check unit conversions with float
1245
1246                         const float nonSignificantOffsets[] = {-0.45f, -0.25f, 0, 0.45f}; // offsets O so that for any integers z in Z, o in O roundToClosestInt(z+o)==z
1247
1248                         const int numConversionIterations = 30;
1249                         for (int ndx = 0; ndx < numConversionIterations; ++ndx)
1250                         {
1251                                 const GLint ref = rnd.getInt(1, 64000);
1252
1253                                 for (int offsetNdx = 0; offsetNdx < DE_LENGTH_OF_ARRAY(nonSignificantOffsets); ++offsetNdx)
1254                                 {
1255                                         gl.glTexParameterf(m_target, m_pname, ((GLfloat)ref) + nonSignificantOffsets[offsetNdx]);
1256                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1257
1258                                         verifyStateTextureParamInteger(result, gl, m_target, m_pname, ref, m_type);
1259                                 }
1260                         }
1261                 }
1262         }
1263 }
1264
1265 class TextureCompareModeCase : public TextureTest
1266 {
1267 public:
1268                         TextureCompareModeCase  (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1269         void    test                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1270 };
1271
1272 TextureCompareModeCase::TextureCompareModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1273         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1274 {
1275 }
1276
1277 void TextureCompareModeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1278 {
1279         const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1280
1281         if (!isPureCase)
1282         {
1283                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1284                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_NONE, m_type);
1285         }
1286
1287         {
1288                 const tcu::ScopedLogSection     section         (m_testCtx.getLog(), "Set", "Set");
1289                 const GLenum                            modes[]         = {GL_COMPARE_REF_TO_TEXTURE, GL_NONE};
1290
1291                 if (isPureCase)
1292                 {
1293                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
1294                         {
1295                                 if (isPureIntTester(m_tester))
1296                                 {
1297                                         const glw::GLint value = (glw::GLint)modes[ndx];
1298                                         gl.glTexParameterIiv(m_target, m_pname, &value);
1299                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1300                                 }
1301                                 else
1302                                 {
1303                                         DE_ASSERT(isPureUintTester(m_tester));
1304
1305                                         const glw::GLuint value = modes[ndx];
1306                                         gl.glTexParameterIuiv(m_target, m_pname, &value);
1307                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1308                                 }
1309
1310                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
1311                         }
1312                 }
1313                 else
1314                 {
1315                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
1316                         {
1317                                 gl.glTexParameteri(m_target, m_pname, modes[ndx]);
1318                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1319
1320                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
1321                         }
1322
1323                         //check unit conversions with float
1324
1325                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
1326                         {
1327                                 gl.glTexParameterf(m_target, m_pname, (GLfloat)modes[ndx]);
1328                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1329
1330                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
1331                         }
1332                 }
1333         }
1334 }
1335
1336 class TextureCompareFuncCase : public TextureTest
1337 {
1338 public:
1339                         TextureCompareFuncCase  (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1340         void    test                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1341 };
1342
1343 TextureCompareFuncCase::TextureCompareFuncCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1344         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1345 {
1346 }
1347
1348 void TextureCompareFuncCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1349 {
1350         const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1351
1352         if (!isPureCase)
1353         {
1354                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1355                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_LEQUAL, m_type);
1356         }
1357
1358         {
1359                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
1360                 const GLenum                            compareFuncs[]  = {GL_LEQUAL, GL_GEQUAL, GL_LESS, GL_GREATER, GL_EQUAL, GL_NOTEQUAL, GL_ALWAYS, GL_NEVER};
1361
1362                 if (isPureCase)
1363                 {
1364                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
1365                         {
1366                                 if (isPureIntTester(m_tester))
1367                                 {
1368                                         const glw::GLint value = (glw::GLint)compareFuncs[ndx];
1369                                         gl.glTexParameterIiv(m_target, m_pname, &value);
1370                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1371                                 }
1372                                 else
1373                                 {
1374                                         DE_ASSERT(isPureUintTester(m_tester));
1375
1376                                         const glw::GLuint value = compareFuncs[ndx];
1377                                         gl.glTexParameterIuiv(m_target, m_pname, &value);
1378                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1379                                 }
1380
1381                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
1382                         }
1383                 }
1384                 else
1385                 {
1386                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
1387                         {
1388                                 gl.glTexParameteri(m_target, m_pname, compareFuncs[ndx]);
1389                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1390
1391                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
1392                         }
1393
1394                         //check unit conversions with float
1395
1396                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
1397                         {
1398                                 gl.glTexParameterf(m_target, m_pname, (GLfloat)compareFuncs[ndx]);
1399                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1400
1401                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
1402                         }
1403                 }
1404         }
1405 }
1406
1407 class TextureImmutableLevelsCase : public TextureTest
1408 {
1409 public:
1410                         TextureImmutableLevelsCase      (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, QueryType type);
1411         void    test                                            (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1412 };
1413
1414 TextureImmutableLevelsCase::TextureImmutableLevelsCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1415         : TextureTest(testCtx, renderCtx, name, desc, target, TESTER_TEXTURE_IMMUTABLE_LEVELS, type)
1416 {
1417 }
1418
1419 void TextureImmutableLevelsCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1420 {
1421         {
1422                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1423                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1424         }
1425
1426         if (m_target == GL_TEXTURE_2D_MULTISAMPLE               ||
1427                 m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
1428         {
1429                 // no levels
1430                 const tcu::ScopedLogSection     section         (m_testCtx.getLog(), "Level", "Level");
1431                 GLuint                                          textureID       = 0;
1432
1433                 gl.glGenTextures(1, &textureID);
1434                 gl.glBindTexture(m_target, textureID);
1435                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
1436
1437                 if (m_target == GL_TEXTURE_2D_MULTISAMPLE)
1438                         gl.glTexStorage2DMultisample(m_target, 2, GL_RGB8, 64, 64, GL_FALSE);
1439                 else if (m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
1440                         gl.glTexStorage3DMultisample(m_target, 2, GL_RGB8, 64, 64, 2, GL_FALSE);
1441                 else
1442                         DE_ASSERT(false);
1443                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexStorage");
1444
1445                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 1, m_type);
1446
1447                 gl.glDeleteTextures(1, &textureID);
1448                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
1449         }
1450         else
1451         {
1452                 for (int level = 1; level <= 7; ++level)
1453                 {
1454                         const tcu::ScopedLogSection     section         (m_testCtx.getLog(), "Levels", "Levels = " + de::toString(level));
1455                         GLuint                                          textureID       = 0;
1456
1457                         gl.glGenTextures(1, &textureID);
1458                         gl.glBindTexture(m_target, textureID);
1459                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
1460
1461                         if (m_target == GL_TEXTURE_2D || m_target == GL_TEXTURE_CUBE_MAP)
1462                                 gl.glTexStorage2D(m_target, level, GL_RGB8, 64, 64);
1463                         else if (m_target == GL_TEXTURE_2D_ARRAY || m_target == GL_TEXTURE_3D)
1464                                 gl.glTexStorage3D(m_target, level, GL_RGB8, 64, 64, 64);
1465                         else if (m_target == GL_TEXTURE_CUBE_MAP_ARRAY)
1466                                 gl.glTexStorage3D(m_target, level, GL_RGB8, 64, 64, 6 * 2);
1467                         else
1468                                 DE_ASSERT(false);
1469                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexStorage");
1470
1471                         verifyStateTextureParamInteger(result, gl, m_target, m_pname, level, m_type);
1472
1473                         gl.glDeleteTextures(1, &textureID);
1474                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
1475                 }
1476         }
1477 }
1478
1479 class TextureImmutableFormatCase : public TextureTest
1480 {
1481 public:
1482                         TextureImmutableFormatCase      (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, QueryType type);
1483         void    test                                            (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1484 };
1485
1486 TextureImmutableFormatCase::TextureImmutableFormatCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1487         : TextureTest(testCtx, renderCtx, name, desc, target, TESTER_TEXTURE_IMMUTABLE_FORMAT, type)
1488 {
1489 }
1490
1491 void TextureImmutableFormatCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1492 {
1493         {
1494                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1495                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1496         }
1497
1498         {
1499                 const tcu::ScopedLogSection     subsection      (m_testCtx.getLog(), "Immutable", "Immutable");
1500                 GLuint                                          textureID       = 0;
1501
1502                 gl.glGenTextures(1, &textureID);
1503                 gl.glBindTexture(m_target, textureID);
1504                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
1505
1506                 switch (m_target)
1507                 {
1508                         case GL_TEXTURE_2D:
1509                         case GL_TEXTURE_CUBE_MAP:
1510                         {
1511                                 gl.glTexStorage2D(m_target, 1, GL_RGBA8, 32, 32);
1512                                 break;
1513                         }
1514                         case GL_TEXTURE_2D_ARRAY:
1515                         case GL_TEXTURE_3D:
1516                         {
1517                                 gl.glTexStorage3D(m_target, 1, GL_RGBA8, 32, 32, 8);
1518                                 break;
1519                         }
1520                         case GL_TEXTURE_2D_MULTISAMPLE:
1521                         {
1522                                 gl.glTexStorage2DMultisample(m_target, 2, GL_RGB8, 64, 64, GL_FALSE);
1523                                 break;
1524                         }
1525                         case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
1526                         {
1527                                 gl.glTexStorage3DMultisample(m_target, 2, GL_RGB8, 64, 64, 2, GL_FALSE);
1528                                 break;
1529                         }
1530                         case GL_TEXTURE_CUBE_MAP_ARRAY:
1531                         {
1532                                 gl.glTexStorage3D(m_target, 1, GL_RGBA8, 32, 32, 6 * 2);
1533                                 break;
1534                         }
1535                         default:
1536                                 DE_ASSERT(false);
1537                 }
1538                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup texture");
1539
1540                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 1, m_type);
1541
1542                 gl.glDeleteTextures(1, &textureID);
1543                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
1544         }
1545
1546         // no mutable
1547         if (m_target == GL_TEXTURE_2D_MULTISAMPLE ||
1548                 m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
1549                 return;
1550
1551         // test mutable
1552         {
1553                 const tcu::ScopedLogSection     subsection              (m_testCtx.getLog(), "Mutable", "Mutable");
1554                 GLuint                                          textureID               = 0;
1555
1556                 gl.glGenTextures(1, &textureID);
1557                 gl.glBindTexture(m_target, textureID);
1558                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
1559
1560                 switch (m_target)
1561                 {
1562                         case GL_TEXTURE_2D:
1563                         {
1564                                 gl.glTexImage2D(m_target, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1565                                 break;
1566                         }
1567                         case GL_TEXTURE_CUBE_MAP:
1568                         {
1569                                 gl.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1570                                 break;
1571                         }
1572                         case GL_TEXTURE_2D_ARRAY:
1573                         case GL_TEXTURE_3D:
1574                         {
1575                                 gl.glTexImage3D(m_target, 0, GL_RGBA8, 32, 32, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1576                                 break;
1577                         }
1578                         case GL_TEXTURE_CUBE_MAP_ARRAY:
1579                         {
1580                                 gl.glTexImage3D(m_target, 0, GL_RGBA8, 32, 32, 6 * 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1581                                 break;
1582                         }
1583                         default:
1584                                 DE_ASSERT(false);
1585                 }
1586                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup texture");
1587
1588                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1589
1590                 gl.glDeleteTextures(1, &textureID);
1591                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
1592         }
1593 }
1594
1595 class TextureWrapClampToBorderCase : public TextureTest
1596 {
1597 public:
1598                         TextureWrapClampToBorderCase    (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1599         void    test                                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1600 };
1601
1602 TextureWrapClampToBorderCase::TextureWrapClampToBorderCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1603         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1604 {
1605 }
1606
1607 void TextureWrapClampToBorderCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1608 {
1609         gl.glTexParameteri(m_target, m_pname, GL_CLAMP_TO_BORDER_EXT);
1610         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1611         verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type);
1612
1613         gl.glTexParameteri(m_target, m_pname, GL_REPEAT);
1614         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1615
1616         gl.glTexParameterf(m_target, m_pname, (GLfloat)GL_CLAMP_TO_BORDER_EXT);
1617         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1618
1619         verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type);
1620 }
1621
1622 class TextureBorderColorCase : public TextureTest
1623 {
1624 public:
1625                         TextureBorderColorCase  (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, QueryType type);
1626         void    test                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1627 };
1628
1629 TextureBorderColorCase::TextureBorderColorCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1630         : TextureTest(testCtx, renderCtx, name, desc, target, TESTER_TEXTURE_BORDER_COLOR, type)
1631 {
1632 }
1633
1634 void TextureBorderColorCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1635 {
1636         // border color is undefined if queried with pure type and was not set to pure value
1637         if (m_type == QUERY_TEXTURE_PARAM_INTEGER_VEC4 || m_type == QUERY_TEXTURE_PARAM_FLOAT_VEC4)
1638         {
1639                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1640                 verifyStateTextureParamFloatVec4(result, gl, m_target, m_pname, tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), m_type);
1641         }
1642
1643         if (m_type == QUERY_TEXTURE_PARAM_PURE_INTEGER_VEC4)
1644         {
1645                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
1646                 const tcu::IVec4                        color                   (0x7FFFFFFF, -2, 3, -128);
1647
1648                 gl.glTexParameterIiv(m_target, m_pname, color.getPtr());
1649                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1650
1651                 verifyStateTextureParamIntegerVec4(result, gl, m_target, m_pname, color, m_type);
1652         }
1653         else if (m_type == QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER_VEC4)
1654         {
1655                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
1656                 const tcu::UVec4                        color                   (0x8000000ul, 2, 3, 128);
1657
1658                 gl.glTexParameterIuiv(m_target, m_pname, color.getPtr());
1659                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1660
1661                 verifyStateTextureParamUnsignedIntegerVec4(result, gl, m_target, m_pname, color, m_type);
1662         }
1663         else
1664         {
1665                 DE_ASSERT(m_type == QUERY_TEXTURE_PARAM_INTEGER_VEC4 || m_type == QUERY_TEXTURE_PARAM_FLOAT_VEC4);
1666
1667                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
1668                 const tcu::Vec4                         color                   (0.25f, 1.0f, 0.0f, 0.77f);
1669                 const tcu::IVec4                        icolor                  (0x8000000ul, 0x7FFFFFFF, 0, 0x0FFFFFFF);
1670
1671                 gl.glTexParameterfv(m_target, m_pname, color.getPtr());
1672                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterfv");
1673
1674                 verifyStateTextureParamFloatVec4(result, gl, m_target, m_pname, color, m_type);
1675
1676                 gl.glTexParameteriv(m_target, m_pname, icolor.getPtr());
1677                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteriv");
1678
1679                 verifyStateTextureParamNormalizedI32Vec4(result, gl, m_target, m_pname, icolor, m_type);
1680         }
1681 }
1682
1683 class SamplerTest : public tcu::TestCase
1684 {
1685 public:
1686                                                 SamplerTest     (tcu::TestContext&                      testCtx,
1687                                                                          const glu::RenderContext&      renderCtx,
1688                                                                          const char*                            name,
1689                                                                          const char*                            desc,
1690                                                                          TesterType                                     tester,
1691                                                                          QueryType                                      type);
1692
1693         void                            init            (void);
1694         IterateResult           iterate         (void);
1695
1696         virtual void            test            (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const = 0;
1697
1698 protected:
1699         const glu::RenderContext&       m_renderCtx;
1700         const glw::GLenum                       m_pname;
1701         const TesterType                        m_tester;
1702         const QueryType                         m_type;
1703         glw::GLuint                                     m_target;
1704 };
1705
1706 SamplerTest::SamplerTest (tcu::TestContext&                     testCtx,
1707                                                   const glu::RenderContext&     renderCtx,
1708                                                   const char*                           name,
1709                                                   const char*                           desc,
1710                                                   TesterType                            tester,
1711                                                   QueryType                                     type)
1712         : TestCase              (testCtx, name, desc)
1713         , m_renderCtx   (renderCtx)
1714         , m_pname               (mapTesterToPname(tester))
1715         , m_tester              (tester)
1716         , m_type                (type)
1717         , m_target              (0)
1718 {
1719 }
1720
1721 void SamplerTest::init (void)
1722 {
1723         const de::UniquePtr<glu::ContextInfo>   ctxInfo         (glu::ContextInfo::create(m_renderCtx));
1724         RequiredExtensions                                              extensions;
1725
1726         // param
1727         if (!isCoreTextureParam(m_renderCtx.getType(), m_pname))
1728                 extensions.add(getTextureParamExtension(m_renderCtx.getType(), m_pname));
1729
1730         // query
1731         if (!isCoreQuery(m_renderCtx.getType(), m_type))
1732                 extensions.add(getQueryExtension(m_renderCtx.getType(), m_type));
1733
1734         // test type
1735         if (!isCoreTester(m_renderCtx.getType(), m_tester))
1736                 extensions.add(getTesterExtension(m_renderCtx.getType(), m_tester));
1737
1738         extensions.check(*ctxInfo);
1739 }
1740
1741 SamplerTest::IterateResult SamplerTest::iterate (void)
1742 {
1743         glu::CallLogWrapper             gl              (m_renderCtx.getFunctions(), m_testCtx.getLog());
1744         tcu::ResultCollector    result  (m_testCtx.getLog(), " // ERROR: ");
1745         glu::Sampler                    sampler (m_renderCtx);
1746
1747         gl.enableLogging(true);
1748
1749         m_target = *sampler;
1750         test(gl, result);
1751         m_target = 0;
1752
1753         result.setTestContextResult(m_testCtx);
1754         return STOP;
1755 }
1756
1757 class SamplerWrapCase : public SamplerTest
1758 {
1759 public:
1760                         SamplerWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
1761         void    test                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1762 };
1763
1764 SamplerWrapCase::SamplerWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
1765         : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
1766 {
1767 }
1768
1769 void SamplerWrapCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1770 {
1771         const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1772
1773         if (!isPureCase)
1774         {
1775                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1776                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_REPEAT, m_type);
1777         }
1778
1779         {
1780                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
1781                 const GLenum                            wrapValues[]    = {GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT};
1782
1783                 if (isPureCase)
1784                 {
1785                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
1786                         {
1787                                 if (isPureIntTester(m_tester))
1788                                 {
1789                                         const glw::GLint value = (glw::GLint)wrapValues[ndx];
1790                                         gl.glSamplerParameterIiv(m_target, m_pname, &value);
1791                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
1792                                 }
1793                                 else
1794                                 {
1795                                         DE_ASSERT(isPureUintTester(m_tester));
1796
1797                                         const glw::GLuint value = wrapValues[ndx];
1798                                         gl.glSamplerParameterIuiv(m_target, m_pname, &value);
1799                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
1800                                 }
1801
1802                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
1803                         }
1804                 }
1805                 else
1806                 {
1807                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
1808                         {
1809                                 gl.glSamplerParameteri(m_target, m_pname, wrapValues[ndx]);
1810                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
1811
1812                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
1813                         }
1814
1815                         //check unit conversions with float
1816
1817                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
1818                         {
1819                                 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)wrapValues[ndx]);
1820                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
1821
1822                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
1823                         }
1824                 }
1825         }
1826 }
1827
1828 class SamplerFilterCase : public SamplerTest
1829 {
1830 public:
1831                         SamplerFilterCase       (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
1832         void    test                            (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1833 };
1834
1835 SamplerFilterCase::SamplerFilterCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
1836         : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
1837 {
1838 }
1839
1840 void SamplerFilterCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1841 {
1842         const bool                      isPureCase      = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1843         const glw::GLenum       initial         = (m_pname == GL_TEXTURE_MAG_FILTER) ? (GL_LINEAR)
1844                                                                         : (m_pname == GL_TEXTURE_MIN_FILTER) ? (GL_NEAREST_MIPMAP_LINEAR)
1845                                                                         : (0);
1846
1847         if (!isPureCase)
1848         {
1849                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1850                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, initial, m_type);
1851         }
1852
1853         {
1854                 const tcu::ScopedLogSection     section         (m_testCtx.getLog(), "Set", "Set");
1855                 std::vector<GLenum>                     values;
1856
1857                 values.push_back(GL_NEAREST);
1858                 values.push_back(GL_LINEAR);
1859                 if (m_pname == GL_TEXTURE_MIN_FILTER)
1860                 {
1861                         values.push_back(GL_NEAREST_MIPMAP_NEAREST);
1862                         values.push_back(GL_NEAREST_MIPMAP_LINEAR);
1863                         values.push_back(GL_LINEAR_MIPMAP_NEAREST);
1864                         values.push_back(GL_LINEAR_MIPMAP_LINEAR);
1865                 }
1866
1867                 if (isPureCase)
1868                 {
1869                         for (int ndx = 0; ndx < (int)values.size(); ++ndx)
1870                         {
1871                                 if (isPureIntTester(m_tester))
1872                                 {
1873                                         const glw::GLint value = (glw::GLint)values[ndx];
1874                                         gl.glSamplerParameterIiv(m_target, m_pname, &value);
1875                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
1876                                 }
1877                                 else
1878                                 {
1879                                         DE_ASSERT(isPureUintTester(m_tester));
1880
1881                                         const glw::GLuint value = values[ndx];
1882                                         gl.glSamplerParameterIuiv(m_target, m_pname, &value);
1883                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
1884                                 }
1885
1886                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
1887                         }
1888                 }
1889                 else
1890                 {
1891                         for (int ndx = 0; ndx < (int)values.size(); ++ndx)
1892                         {
1893                                 gl.glSamplerParameteri(m_target, m_pname, values[ndx]);
1894                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
1895
1896                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
1897                         }
1898
1899                         //check unit conversions with float
1900
1901                         for (int ndx = 0; ndx < (int)values.size(); ++ndx)
1902                         {
1903                                 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)values[ndx]);
1904                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
1905
1906                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
1907                         }
1908                 }
1909         }
1910 }
1911
1912 class SamplerLODCase : public SamplerTest
1913 {
1914 public:
1915                         SamplerLODCase  (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
1916         void    test                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1917 };
1918
1919 SamplerLODCase::SamplerLODCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
1920         : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
1921 {
1922 }
1923
1924 void SamplerLODCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1925 {
1926         const bool      isPureCase              = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1927         const int       initialValue    = (m_pname == GL_TEXTURE_MIN_LOD) ? (-1000)
1928                                                                 : (m_pname == GL_TEXTURE_MAX_LOD) ? (1000)
1929                                                                 : (-1);
1930
1931         if ((querySupportsSigned(m_type) || initialValue >= 0) && !isPureCase)
1932         {
1933                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1934                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, initialValue, m_type);
1935         }
1936
1937         {
1938                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
1939                 const int                                       numIterations   = 20;
1940                 de::Random                                      rnd                             (0xabcdef);
1941
1942                 if (isPureCase)
1943                 {
1944                         if (isPureIntTester(m_tester))
1945                         {
1946                                 for (int ndx = 0; ndx < numIterations; ++ndx)
1947                                 {
1948                                         const GLint ref = rnd.getInt(-1000, 1000);
1949
1950                                         gl.glSamplerParameterIiv(m_target, m_pname, &ref);
1951                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
1952
1953                                         verifyStateSamplerParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
1954                                 }
1955                         }
1956                         else
1957                         {
1958                                 DE_ASSERT(isPureUintTester(m_tester));
1959
1960                                 for (int ndx = 0; ndx < numIterations; ++ndx)
1961                                 {
1962                                         const GLuint ref = (glw::GLuint)rnd.getInt(0, 1000);
1963
1964                                         gl.glSamplerParameterIuiv(m_target, m_pname, &ref);
1965                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
1966
1967                                         verifyStateSamplerParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
1968                                 }
1969                         }
1970                 }
1971                 else
1972                 {
1973                         const int minLimit = (querySupportsSigned(m_type)) ? (-1000) : (0);
1974
1975                         for (int ndx = 0; ndx < numIterations; ++ndx)
1976                         {
1977                                 const GLfloat ref = rnd.getFloat((float)minLimit, 1000.f);
1978
1979                                 gl.glSamplerParameterf(m_target, m_pname, ref);
1980                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
1981
1982                                 verifyStateSamplerParamFloat(result, gl, m_target, m_pname, ref, m_type);
1983                         }
1984
1985                         // check unit conversions with int
1986
1987                         for (int ndx = 0; ndx < numIterations; ++ndx)
1988                         {
1989                                 const GLint ref = rnd.getInt(minLimit, 1000);
1990
1991                                 gl.glSamplerParameteri(m_target, m_pname, ref);
1992                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
1993
1994                                 verifyStateSamplerParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
1995                         }
1996                 }
1997         }
1998 }
1999
2000 class SamplerCompareModeCase : public SamplerTest
2001 {
2002 public:
2003                         SamplerCompareModeCase  (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
2004         void    test                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2005 };
2006
2007 SamplerCompareModeCase::SamplerCompareModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
2008         : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
2009 {
2010 }
2011
2012 void SamplerCompareModeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2013 {
2014         const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
2015
2016         if (!isPureCase)
2017         {
2018                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
2019                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_NONE, m_type);
2020         }
2021
2022         {
2023                 const tcu::ScopedLogSection     section         (m_testCtx.getLog(), "Set", "Set");
2024                 const GLenum                            modes[]         = {GL_COMPARE_REF_TO_TEXTURE, GL_NONE};
2025
2026                 if (isPureCase)
2027                 {
2028                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
2029                         {
2030                                 if (isPureIntTester(m_tester))
2031                                 {
2032                                         const glw::GLint value = (glw::GLint)modes[ndx];
2033                                         gl.glSamplerParameterIiv(m_target, m_pname, &value);
2034                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2035                                 }
2036                                 else
2037                                 {
2038                                         DE_ASSERT(isPureUintTester(m_tester));
2039
2040                                         const glw::GLuint value = modes[ndx];
2041                                         gl.glSamplerParameterIuiv(m_target, m_pname, &value);
2042                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2043                                 }
2044
2045                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
2046                         }
2047                 }
2048                 else
2049                 {
2050                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
2051                         {
2052                                 gl.glSamplerParameteri(m_target, m_pname, modes[ndx]);
2053                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2054
2055                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
2056                         }
2057
2058                         //check unit conversions with float
2059
2060                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
2061                         {
2062                                 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)modes[ndx]);
2063                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
2064
2065                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
2066                         }
2067                 }
2068         }
2069 }
2070
2071 class SamplerCompareFuncCase : public SamplerTest
2072 {
2073 public:
2074                         SamplerCompareFuncCase  (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
2075         void    test                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2076 };
2077
2078 SamplerCompareFuncCase::SamplerCompareFuncCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
2079         : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
2080 {
2081 }
2082
2083 void SamplerCompareFuncCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2084 {
2085         const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
2086
2087         if (!isPureCase)
2088         {
2089                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
2090                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_LEQUAL, m_type);
2091         }
2092
2093         {
2094                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
2095                 const GLenum                            compareFuncs[]  = {GL_LEQUAL, GL_GEQUAL, GL_LESS, GL_GREATER, GL_EQUAL, GL_NOTEQUAL, GL_ALWAYS, GL_NEVER};
2096
2097                 if (isPureCase)
2098                 {
2099                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
2100                         {
2101                                 if (isPureIntTester(m_tester))
2102                                 {
2103                                         const glw::GLint value = (glw::GLint)compareFuncs[ndx];
2104                                         gl.glSamplerParameterIiv(m_target, m_pname, &value);
2105                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2106                                 }
2107                                 else
2108                                 {
2109                                         DE_ASSERT(isPureUintTester(m_tester));
2110
2111                                         const glw::GLuint value = compareFuncs[ndx];
2112                                         gl.glSamplerParameterIuiv(m_target, m_pname, &value);
2113                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2114                                 }
2115
2116                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
2117                         }
2118                 }
2119                 else
2120                 {
2121                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
2122                         {
2123                                 gl.glSamplerParameteri(m_target, m_pname, compareFuncs[ndx]);
2124                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2125
2126                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
2127                         }
2128
2129                         //check unit conversions with float
2130
2131                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
2132                         {
2133                                 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)compareFuncs[ndx]);
2134                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
2135
2136                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
2137                         }
2138                 }
2139         }
2140 }
2141
2142 class SamplerWrapClampToBorderCase : public SamplerTest
2143 {
2144 public:
2145                         SamplerWrapClampToBorderCase    (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
2146         void    test                                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2147 };
2148
2149 SamplerWrapClampToBorderCase::SamplerWrapClampToBorderCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
2150         : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
2151 {
2152 }
2153
2154 void SamplerWrapClampToBorderCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2155 {
2156         gl.glSamplerParameteri(m_target, m_pname, GL_CLAMP_TO_BORDER_EXT);
2157         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2158         verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type);
2159
2160         gl.glSamplerParameteri(m_target, m_pname, GL_REPEAT);
2161         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2162
2163         gl.glSamplerParameterf(m_target, m_pname, (GLfloat)GL_CLAMP_TO_BORDER_EXT);
2164         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
2165
2166         verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type);
2167 }
2168
2169 class SamplerSRGBDecodeCase : public SamplerTest
2170 {
2171 public:
2172                         SamplerSRGBDecodeCase   (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
2173         void    test                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2174 };
2175
2176 SamplerSRGBDecodeCase::SamplerSRGBDecodeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
2177         : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
2178 {
2179 }
2180
2181 void SamplerSRGBDecodeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2182 {
2183         const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
2184
2185         if (!isPureCase)
2186         {
2187                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
2188                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2189         }
2190
2191         {
2192                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Toggle", "Toggle");
2193                 const glw::GLint                        decodeInt               = GL_DECODE_EXT;
2194                 const glw::GLfloat                      decodeFloat             = (glw::GLfloat)GL_DECODE_EXT;
2195
2196                 gl.glSamplerParameteri(m_target, m_pname, GL_SKIP_DECODE_EXT);
2197                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
2198                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
2199
2200                 gl.glSamplerParameteriv(m_target, m_pname, &decodeInt);
2201                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
2202                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2203
2204                 gl.glSamplerParameterf(m_target, m_pname, GL_SKIP_DECODE_EXT);
2205                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
2206                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
2207
2208                 gl.glSamplerParameterfv(m_target, m_pname, &decodeFloat);
2209                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
2210                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2211         }
2212
2213         if (isPureIntTester(m_tester))
2214         {
2215                 const glw::GLint skipDecode     = GL_SKIP_DECODE_EXT;
2216                 const glw::GLint decode         = GL_DECODE_EXT;
2217
2218                 gl.glSamplerParameterIiv(m_target, m_pname, &skipDecode);
2219                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2220                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
2221
2222                 gl.glSamplerParameterIiv(m_target, m_pname, &decode);
2223                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2224                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2225         }
2226
2227         if (isPureUintTester(m_tester))
2228         {
2229                 const glw::GLuint skipDecode    = GL_SKIP_DECODE_EXT;
2230                 const glw::GLuint decode                = GL_DECODE_EXT;
2231
2232                 gl.glSamplerParameterIuiv(m_target, m_pname, &skipDecode);
2233                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2234                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
2235
2236                 gl.glSamplerParameterIuiv(m_target, m_pname, &decode);
2237                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2238                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2239         }
2240 }
2241
2242 class SamplerBorderColorCase : public SamplerTest
2243 {
2244 public:
2245                         SamplerBorderColorCase  (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, QueryType type);
2246         void    test                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2247 };
2248
2249 SamplerBorderColorCase::SamplerBorderColorCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, QueryType type)
2250         : SamplerTest(testCtx, renderCtx, name, desc, TESTER_TEXTURE_BORDER_COLOR, type)
2251 {
2252         DE_ASSERT(m_type == QUERY_SAMPLER_PARAM_INTEGER_VEC4                                    ||
2253                           m_type == QUERY_SAMPLER_PARAM_FLOAT_VEC4                                              ||
2254                           m_type == QUERY_SAMPLER_PARAM_PURE_INTEGER_VEC4                               ||
2255                           m_type == QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER_VEC4);
2256 }
2257
2258 void SamplerBorderColorCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2259 {
2260         // border color is undefined if queried with pure type and was not set to pure value
2261         if (m_type == QUERY_SAMPLER_PARAM_INTEGER_VEC4 || m_type == QUERY_SAMPLER_PARAM_FLOAT_VEC4)
2262         {
2263                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
2264                 verifyStateSamplerParamFloatVec4(result, gl, m_target, m_pname, tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), m_type);
2265         }
2266
2267         if (m_type == QUERY_SAMPLER_PARAM_PURE_INTEGER_VEC4)
2268         {
2269                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
2270                 const tcu::IVec4                        color                   (0x7FFFFFFF, -2, 3, -128);
2271
2272                 gl.glSamplerParameterIiv(m_target, m_pname, color.getPtr());
2273                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2274
2275                 verifyStateSamplerParamIntegerVec4(result, gl, m_target, m_pname, color, m_type);
2276         }
2277         else if (m_type == QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER_VEC4)
2278         {
2279                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
2280                 const tcu::UVec4                        color                   (0x8000000ul, 2, 3, 128);
2281
2282                 gl.glSamplerParameterIuiv(m_target, m_pname, color.getPtr());
2283                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2284
2285                 verifyStateSamplerParamUnsignedIntegerVec4(result, gl, m_target, m_pname, color, m_type);
2286         }
2287         else
2288         {
2289                 DE_ASSERT(m_type == QUERY_SAMPLER_PARAM_INTEGER_VEC4 || m_type == QUERY_SAMPLER_PARAM_FLOAT_VEC4);
2290
2291                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
2292                 const tcu::Vec4                         color                   (0.25f, 1.0f, 0.0f, 0.77f);
2293                 const tcu::IVec4                        icolor                  (0x8000000ul, 0x7FFFFFFF, 0, 0x0FFFFFFF);
2294
2295                 gl.glSamplerParameterfv(m_target, m_pname, color.getPtr());
2296                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterfv");
2297
2298                 verifyStateSamplerParamFloatVec4(result, gl, m_target, m_pname, color, m_type);
2299
2300                 gl.glSamplerParameteriv(m_target, m_pname, icolor.getPtr());
2301                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteriv");
2302
2303                 verifyStateSamplerParamNormalizedI32Vec4(result, gl, m_target, m_pname, icolor, m_type);
2304         }
2305 }
2306
2307 } // anonymous
2308
2309 bool isLegalTesterForTarget (glw::GLenum target, TesterType tester)
2310 {
2311         // no 3d filtering on 2d targets
2312         if ((tester == TESTER_TEXTURE_WRAP_R || tester == TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER) &&  target != GL_TEXTURE_3D)
2313                 return false;
2314
2315         // no sampling on multisample
2316         if (isMultisampleTarget(target) && isSamplerStateTester(tester))
2317                 return false;
2318
2319         // no states in buffer
2320         if (target == GL_TEXTURE_BUFFER)
2321                 return false;
2322
2323         return true;
2324 }
2325
2326 bool isMultisampleTarget (glw::GLenum target)
2327 {
2328         return  target == GL_TEXTURE_2D_MULTISAMPLE                     ||
2329                         target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY;
2330 }
2331
2332 bool isSamplerStateTester (TesterType tester)
2333 {
2334         return  tester == TESTER_TEXTURE_WRAP_S                                 ||
2335                         tester == TESTER_TEXTURE_WRAP_T                                 ||
2336                         tester == TESTER_TEXTURE_WRAP_R                                 ||
2337                         tester == TESTER_TEXTURE_MAG_FILTER                             ||
2338                         tester == TESTER_TEXTURE_MIN_FILTER                             ||
2339                         tester == TESTER_TEXTURE_MIN_LOD                                ||
2340                         tester == TESTER_TEXTURE_MAX_LOD                                ||
2341                         tester == TESTER_TEXTURE_COMPARE_MODE                   ||
2342                         tester == TESTER_TEXTURE_COMPARE_FUNC                   ||
2343                         tester == TESTER_TEXTURE_SRGB_DECODE_EXT                ||
2344                         tester == TESTER_TEXTURE_BORDER_COLOR                   ||
2345                         tester == TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER ||
2346                         tester == TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER ||
2347                         tester == TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER;
2348 }
2349
2350 tcu::TestCase* createIsTextureTest (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const std::string& name, const std::string& description, glw::GLenum target)
2351 {
2352         return new IsTextureCase(testCtx, renderCtx, name.c_str(), description.c_str(), target);
2353 }
2354
2355 tcu::TestCase* createTexParamTest (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const std::string& name, const std::string& description, QueryType queryType, glw::GLenum target, TesterType tester)
2356 {
2357         if (isMultisampleTarget(target) && isSamplerStateTester(tester))
2358         {
2359                 DE_ASSERT(!"Multisample textures have no sampler state");
2360                 return DE_NULL;
2361         }
2362         if (target == GL_TEXTURE_BUFFER)
2363         {
2364                 DE_ASSERT(!"Buffer textures have no texture state");
2365                 return DE_NULL;
2366         }
2367         if (target != GL_TEXTURE_3D && mapTesterToPname(tester) == GL_TEXTURE_WRAP_R)
2368         {
2369                 DE_ASSERT(!"Only 3D textures have wrap r filter");
2370                 return DE_NULL;
2371         }
2372
2373 #define CASE_ALL_SETTERS(X) case X: case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT
2374
2375         switch (tester)
2376         {
2377                 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_R):
2378                 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_G):
2379                 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_B):
2380                 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_A):
2381                         return new TextureSwizzleCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2382
2383                 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S):
2384                 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T):
2385                 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R):
2386                         return new TextureWrapCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2387
2388                 CASE_ALL_SETTERS(TESTER_TEXTURE_MAG_FILTER):
2389                 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_FILTER):
2390                         return new TextureFilterCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2391
2392                 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_LOD):
2393                 CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LOD):
2394                         return new TextureLODCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2395
2396                 CASE_ALL_SETTERS(TESTER_TEXTURE_BASE_LEVEL):
2397                 CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LEVEL):
2398                         return new TextureLevelCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2399
2400                 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE):
2401                         return new TextureCompareModeCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2402
2403                 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC):
2404                         return new TextureCompareFuncCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2405
2406                 case TESTER_TEXTURE_IMMUTABLE_LEVELS:
2407                         return new TextureImmutableLevelsCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, queryType);
2408
2409                 case TESTER_TEXTURE_IMMUTABLE_FORMAT:
2410                         return new TextureImmutableFormatCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, queryType);
2411
2412                 case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER:
2413                 case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER:
2414                 case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER:
2415                         return new TextureWrapClampToBorderCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2416
2417                 CASE_ALL_SETTERS(TESTER_DEPTH_STENCIL_TEXTURE_MODE):
2418                         return new DepthStencilModeCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2419
2420                 CASE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT):
2421                         return new TextureSRGBDecodeCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2422
2423                 case TESTER_TEXTURE_BORDER_COLOR:
2424                         return new TextureBorderColorCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, queryType);
2425
2426                 default:
2427                         break;
2428         }
2429
2430 #undef CASE_ALL_SETTERS
2431
2432         DE_ASSERT(false);
2433         return DE_NULL;
2434 }
2435
2436 tcu::TestCase* createSamplerParamTest (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const std::string& name, const std::string& description, StateQueryUtil::QueryType queryType, TesterType tester)
2437 {
2438 #define CASE_ALL_SETTERS(X) case X: case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT
2439
2440         switch (tester)
2441         {
2442                 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S):
2443                 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T):
2444                 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R):
2445                         return new SamplerWrapCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2446
2447                 CASE_ALL_SETTERS(TESTER_TEXTURE_MAG_FILTER):
2448                 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_FILTER):
2449                         return new SamplerFilterCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2450
2451                 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_LOD):
2452                 CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LOD):
2453                         return new SamplerLODCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2454
2455                 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE):
2456                         return new SamplerCompareModeCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2457
2458                 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC):
2459                         return new SamplerCompareFuncCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2460
2461                 case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER:
2462                 case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER:
2463                 case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER:
2464                         return new SamplerWrapClampToBorderCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2465
2466                 CASE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT):
2467                         return new SamplerSRGBDecodeCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2468
2469                 case TESTER_TEXTURE_BORDER_COLOR:
2470                         return new SamplerBorderColorCase(testCtx, renderCtx, name.c_str(), description.c_str(), queryType);
2471
2472                 default:
2473                         break;
2474         }
2475
2476 #undef CASE_ALL_SETTERS
2477
2478         DE_ASSERT(false);
2479         return DE_NULL;
2480 }
2481
2482 } // TextureStateQueryTests
2483 } // gls
2484 } // deqp