Fix atomic ssbo xor test am: f0fa05e898 am: b426d8bfad am: 580f143209 am: 73a16f417e...
[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 namespace es32
446 {
447
448 static bool isCoreTextureTarget (glw::GLenum target)
449 {
450         return  es31::isCoreTextureTarget(target)                       ||
451                         target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY       ||
452                         target == GL_TEXTURE_BUFFER                                     ||
453                         target == GL_TEXTURE_CUBE_MAP_ARRAY;
454 }
455
456 static RequiredExtensions getTextureTargetExtension (glw::GLenum target)
457 {
458         DE_UNREF(target);
459         DE_ASSERT(false);
460         return RequiredExtensions();
461 }
462
463 static bool isCoreTextureParam (glw::GLenum pname)
464 {
465         return  es31::isCoreTextureParam(pname)         ||
466                         pname == GL_TEXTURE_BORDER_COLOR;
467 }
468
469 static RequiredExtensions getTextureParamExtension (glw::GLenum pname)
470 {
471         switch (pname)
472         {
473                 case GL_TEXTURE_SRGB_DECODE_EXT:        return RequiredExtensions("GL_EXT_texture_sRGB_decode");
474                 default:
475                         DE_ASSERT(false);
476                         return RequiredExtensions();
477         }
478 }
479
480 static bool isCoreQuery (QueryType query)
481 {
482         return  es31::isCoreQuery(query)                                                                ||
483                         query == QUERY_TEXTURE_PARAM_PURE_INTEGER                               ||
484                         query == QUERY_TEXTURE_PARAM_PURE_INTEGER                               ||
485                         query == QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER              ||
486                         query == QUERY_TEXTURE_PARAM_PURE_INTEGER_VEC4                  ||
487                         query == QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER_VEC4 ||
488                         query == QUERY_SAMPLER_PARAM_PURE_INTEGER                               ||
489                         query == QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER              ||
490                         query == QUERY_SAMPLER_PARAM_PURE_INTEGER_VEC4                  ||
491                         query == QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER_VEC4;
492 }
493
494 static RequiredExtensions getQueryExtension (QueryType query)
495 {
496         DE_UNREF(query);
497         DE_ASSERT(false);
498         return RequiredExtensions();
499 }
500
501 static bool isCoreTester (TesterType tester)
502 {
503 #define COMPARE_PURE_SETTERS(TESTER, X) ((TESTER) == X ## _SET_PURE_INT) || ((TESTER) == X ## _SET_PURE_UINT)
504
505         return  es31::isCoreTester(tester)                                                                              ||
506                         COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_SWIZZLE_R)                  ||
507                         COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_SWIZZLE_G)                  ||
508                         COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_SWIZZLE_B)                  ||
509                         COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_SWIZZLE_A)                  ||
510                         COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_WRAP_S)                             ||
511                         COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_WRAP_T)                             ||
512                         COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_WRAP_R)                             ||
513                         COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_MAG_FILTER)                 ||
514                         COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_MIN_FILTER)                 ||
515                         COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_MIN_LOD)                    ||
516                         COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_MAX_LOD)                    ||
517                         COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_BASE_LEVEL)                 ||
518                         COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_MAX_LEVEL)                  ||
519                         COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_COMPARE_MODE)               ||
520                         COMPARE_PURE_SETTERS(tester, TESTER_TEXTURE_COMPARE_FUNC)               ||
521                         COMPARE_PURE_SETTERS(tester, TESTER_DEPTH_STENCIL_TEXTURE_MODE) ||
522                         tester == TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER                                 ||
523                         tester == TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER                                 ||
524                         tester == TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER                                 ||
525                         tester == TESTER_TEXTURE_BORDER_COLOR;
526
527 #undef COMPARE_PURE_SETTERS
528 }
529
530 static RequiredExtensions getTesterExtension (TesterType tester)
531 {
532 #define CASE_PURE_SETTERS(X) case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT
533
534         switch (tester)
535         {
536                 CASE_PURE_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT):
537                 case TESTER_TEXTURE_SRGB_DECODE_EXT:
538                         return RequiredExtensions("GL_EXT_texture_sRGB_decode");
539
540                 default:
541                         DE_ASSERT(false);
542                         return RequiredExtensions();
543         }
544
545 #undef CASE_PURE_SETTERS
546 }
547
548 } // es32
549
550 static bool isCoreTextureTarget (const glu::ContextType& contextType, glw::GLenum target)
551 {
552         if (contextSupports(contextType, glu::ApiType::es(3,2)))
553                 return es32::isCoreTextureTarget(target);
554         else if (contextSupports(contextType, glu::ApiType::es(3,1)))
555                 return es31::isCoreTextureTarget(target);
556         else if (contextSupports(contextType, glu::ApiType::es(3,0)))
557                 return es30::isCoreTextureTarget(target);
558         else
559         {
560                 DE_ASSERT(false);
561                 return DE_NULL;
562         }
563 }
564
565 static bool isCoreTextureParam (const glu::ContextType& contextType, glw::GLenum pname)
566 {
567         if (contextSupports(contextType, glu::ApiType::es(3,2)))
568                 return es32::isCoreTextureParam(pname);
569         else if (contextSupports(contextType, glu::ApiType::es(3,1)))
570                 return es31::isCoreTextureParam(pname);
571         else if (contextSupports(contextType, glu::ApiType::es(3,0)))
572                 return es30::isCoreTextureParam(pname);
573         else
574         {
575                 DE_ASSERT(false);
576                 return DE_NULL;
577         }
578 }
579
580 static bool isCoreQuery (const glu::ContextType& contextType, QueryType query)
581 {
582         if (contextSupports(contextType, glu::ApiType::es(3,2)))
583                 return es32::isCoreQuery(query);
584         else if (contextSupports(contextType, glu::ApiType::es(3,1)))
585                 return es31::isCoreQuery(query);
586         else if (contextSupports(contextType, glu::ApiType::es(3,0)))
587                 return es30::isCoreQuery(query);
588         else
589         {
590                 DE_ASSERT(false);
591                 return DE_NULL;
592         }
593 }
594
595 static bool isCoreTester (const glu::ContextType& contextType, TesterType tester)
596 {
597         if (contextSupports(contextType, glu::ApiType::es(3,2)))
598                 return es32::isCoreTester(tester);
599         else if (contextSupports(contextType, glu::ApiType::es(3,1)))
600                 return es31::isCoreTester(tester);
601         else if (contextSupports(contextType, glu::ApiType::es(3,0)))
602                 return es30::isCoreTester(tester);
603         else
604         {
605                 DE_ASSERT(false);
606                 return DE_NULL;
607         }
608 }
609
610 static RequiredExtensions getTextureTargetExtension (const glu::ContextType& contextType, glw::GLenum target)
611 {
612         DE_ASSERT(!isCoreTextureTarget(contextType, target));
613
614         if (contextSupports(contextType, glu::ApiType::es(3,2)))
615                 return es32::getTextureTargetExtension(target);
616         if (contextSupports(contextType, glu::ApiType::es(3,1)))
617                 return es31::getTextureTargetExtension(target);
618         else if (contextSupports(contextType, glu::ApiType::es(3,0)))
619                 return es30::getTextureTargetExtension(target);
620         else
621         {
622                 DE_ASSERT(false);
623                 return RequiredExtensions();
624         }
625 }
626
627 static RequiredExtensions getTextureParamExtension (const glu::ContextType& contextType, glw::GLenum pname)
628 {
629         DE_ASSERT(!isCoreTextureParam(contextType, pname));
630
631         if (contextSupports(contextType, glu::ApiType::es(3,2)))
632                 return es32::getTextureParamExtension(pname);
633         else if (contextSupports(contextType, glu::ApiType::es(3,1)))
634                 return es31::getTextureParamExtension(pname);
635         else if (contextSupports(contextType, glu::ApiType::es(3,0)))
636                 return es30::getTextureParamExtension(pname);
637         else
638         {
639                 DE_ASSERT(false);
640                 return RequiredExtensions();
641         }
642 }
643
644 static RequiredExtensions getQueryExtension (const glu::ContextType& contextType, QueryType query)
645 {
646         DE_ASSERT(!isCoreQuery(contextType, query));
647
648         if (contextSupports(contextType, glu::ApiType::es(3,2)))
649                 return es32::getQueryExtension(query);
650         else if (contextSupports(contextType, glu::ApiType::es(3,1)))
651                 return es31::getQueryExtension(query);
652         else if (contextSupports(contextType, glu::ApiType::es(3,0)))
653                 return es30::getQueryExtension(query);
654         else
655         {
656                 DE_ASSERT(false);
657                 return RequiredExtensions();
658         }
659 }
660
661 static RequiredExtensions getTesterExtension (const glu::ContextType& contextType, TesterType tester)
662 {
663         DE_ASSERT(!isCoreTester(contextType, tester));
664
665         if (contextSupports(contextType, glu::ApiType::es(3,2)))
666                 return es32::getTesterExtension(tester);
667         else if (contextSupports(contextType, glu::ApiType::es(3,1)))
668                 return es31::getTesterExtension(tester);
669         else if (contextSupports(contextType, glu::ApiType::es(3,0)))
670                 return es30::getTesterExtension(tester);
671         else
672         {
673                 DE_ASSERT(false);
674                 return RequiredExtensions();
675         }
676 }
677
678 class TextureTest : public tcu::TestCase
679 {
680 public:
681                                                 TextureTest     (tcu::TestContext&                      testCtx,
682                                                                          const glu::RenderContext&      renderCtx,
683                                                                          const char*                            name,
684                                                                          const char*                            desc,
685                                                                          glw::GLenum                            target,
686                                                                          TesterType                                     tester,
687                                                                          QueryType                                      type);
688
689         void                            init            (void);
690         IterateResult           iterate         (void);
691
692         virtual void            test            (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const = 0;
693
694 protected:
695         const glu::RenderContext&       m_renderCtx;
696         const glw::GLenum                       m_target;
697         const glw::GLenum                       m_pname;
698         const TesterType                        m_tester;
699         const QueryType                         m_type;
700 };
701
702 TextureTest::TextureTest (tcu::TestContext&                     testCtx,
703                                                   const glu::RenderContext&     renderCtx,
704                                                   const char*                           name,
705                                                   const char*                           desc,
706                                                   glw::GLenum                           target,
707                                                   TesterType                            tester,
708                                                   QueryType                                     type)
709         : TestCase              (testCtx, name, desc)
710         , m_renderCtx   (renderCtx)
711         , m_target              (target)
712         , m_pname               (mapTesterToPname(tester))
713         , m_tester              (tester)
714         , m_type                (type)
715 {
716 }
717
718 void TextureTest::init (void)
719 {
720         const de::UniquePtr<glu::ContextInfo>   ctxInfo         (glu::ContextInfo::create(m_renderCtx));
721         RequiredExtensions                                              extensions;
722
723         // target
724         if (!isCoreTextureTarget(m_renderCtx.getType(), m_target))
725                 extensions.add(getTextureTargetExtension(m_renderCtx.getType(), m_target));
726
727         // param
728         if (!isCoreTextureParam(m_renderCtx.getType(), m_pname))
729                 extensions.add(getTextureParamExtension(m_renderCtx.getType(), m_pname));
730
731         // query
732         if (!isCoreQuery(m_renderCtx.getType(), m_type))
733                 extensions.add(getQueryExtension(m_renderCtx.getType(), m_type));
734
735         // test type
736         if (!isCoreTester(m_renderCtx.getType(), m_tester))
737                 extensions.add(getTesterExtension(m_renderCtx.getType(), m_tester));
738
739         extensions.check(*ctxInfo);
740 }
741
742 TextureTest::IterateResult TextureTest::iterate (void)
743 {
744         glu::CallLogWrapper             gl              (m_renderCtx.getFunctions(), m_testCtx.getLog());
745         tcu::ResultCollector    result  (m_testCtx.getLog(), " // ERROR: ");
746
747         gl.enableLogging(true);
748         test(gl, result);
749
750         result.setTestContextResult(m_testCtx);
751         return STOP;
752 }
753
754 class IsTextureCase : public tcu::TestCase
755 {
756 public:
757                                                                 IsTextureCase   (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target);
758
759         void                                            init                    (void);
760         IterateResult                           iterate                 (void);
761
762 protected:
763         const glu::RenderContext&       m_renderCtx;
764         const glw::GLenum                       m_target;
765 };
766
767 IsTextureCase::IsTextureCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target)
768         : tcu::TestCase (testCtx, name, desc)
769         , m_renderCtx   (renderCtx)
770         , m_target              (target)
771 {
772 }
773
774 void IsTextureCase::init (void)
775 {
776         const de::UniquePtr<glu::ContextInfo>   ctxInfo         (glu::ContextInfo::create(m_renderCtx));
777         RequiredExtensions                                              extensions;
778
779         // target
780         if (!isCoreTextureTarget(m_renderCtx.getType(), m_target))
781                 extensions.add(getTextureTargetExtension(m_renderCtx.getType(), m_target));
782
783         extensions.check(*ctxInfo);
784 }
785
786 IsTextureCase::IterateResult IsTextureCase::iterate (void)
787 {
788         glu::CallLogWrapper             gl                      (m_renderCtx.getFunctions(), m_testCtx.getLog());
789         tcu::ResultCollector    result          (m_testCtx.getLog(), " // ERROR: ");
790         glw::GLuint                             textureId       = 0;
791
792         gl.enableLogging(true);
793
794         gl.glGenTextures(1, &textureId);
795         gl.glBindTexture(m_target, textureId);
796         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
797
798         verifyStateObjectBoolean(result, gl, textureId, true, QUERY_ISTEXTURE);
799
800         gl.glDeleteTextures(1, &textureId);
801         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
802
803         verifyStateObjectBoolean(result, gl, textureId, false, QUERY_ISTEXTURE);
804
805         result.setTestContextResult(m_testCtx);
806         return STOP;
807 }
808
809 class DepthStencilModeCase : public TextureTest
810 {
811 public:
812                         DepthStencilModeCase    (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
813         void    test                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
814 };
815
816 DepthStencilModeCase::DepthStencilModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
817         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
818 {
819 }
820
821 void DepthStencilModeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
822 {
823         const bool              isPureCase      = isPureIntTester(m_tester) || isPureUintTester(m_tester);
824         glu::Texture    texture         (m_renderCtx);
825
826         gl.glBindTexture(m_target, *texture);
827         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind");
828
829         if (!isPureCase)
830         {
831                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
832                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
833         }
834
835         if (!isPureCase)
836         {
837                 const tcu::ScopedLogSection     section                         (m_testCtx.getLog(), "Toggle", "Toggle");
838                 const glw::GLint                        depthComponentInt       = GL_DEPTH_COMPONENT;
839                 const glw::GLfloat                      depthComponentFloat     = (glw::GLfloat)GL_DEPTH_COMPONENT;
840
841                 gl.glTexParameteri(m_target, m_pname, GL_STENCIL_INDEX);
842                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
843                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type);
844
845                 gl.glTexParameteriv(m_target, m_pname, &depthComponentInt);
846                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
847                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
848
849                 gl.glTexParameterf(m_target, m_pname, GL_STENCIL_INDEX);
850                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
851                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type);
852
853                 gl.glTexParameterfv(m_target, m_pname, &depthComponentFloat);
854                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
855                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
856         }
857
858         if (isPureIntTester(m_tester))
859         {
860                 const glw::GLint depthComponent = GL_DEPTH_COMPONENT;
861                 const glw::GLint stencilIndex   = GL_STENCIL_INDEX;
862
863                 gl.glTexParameterIiv(m_target, m_pname, &stencilIndex);
864                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
865                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type);
866
867                 gl.glTexParameterIiv(m_target, m_pname, &depthComponent);
868                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
869                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
870         }
871
872         if (isPureUintTester(m_tester))
873         {
874                 const glw::GLuint depthComponent        = GL_DEPTH_COMPONENT;
875                 const glw::GLuint stencilIndex  = GL_STENCIL_INDEX;
876
877                 gl.glTexParameterIuiv(m_target, m_pname, &stencilIndex);
878                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
879                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_STENCIL_INDEX, m_type);
880
881                 gl.glTexParameterIuiv(m_target, m_pname, &depthComponent);
882                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
883                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DEPTH_COMPONENT, m_type);
884         }
885 }
886
887 class TextureSRGBDecodeCase : public TextureTest
888 {
889 public:
890                         TextureSRGBDecodeCase   (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
891         void    test                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
892 };
893
894 TextureSRGBDecodeCase::TextureSRGBDecodeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
895         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
896 {
897 }
898
899 void TextureSRGBDecodeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
900 {
901         const bool              isPureCase      = isPureIntTester(m_tester) || isPureUintTester(m_tester);
902         glu::Texture    texture         (m_renderCtx);
903
904         gl.glBindTexture(m_target, *texture);
905         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind");
906
907         if (!isPureCase)
908         {
909                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
910                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
911         }
912
913         if (!isPureCase)
914         {
915                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Toggle", "Toggle");
916                 const glw::GLint                        decodeInt               = GL_DECODE_EXT;
917                 const glw::GLfloat                      decodeFloat             = (glw::GLfloat)GL_DECODE_EXT;
918
919                 gl.glTexParameteri(m_target, m_pname, GL_SKIP_DECODE_EXT);
920                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
921                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
922
923                 gl.glTexParameteriv(m_target, m_pname, &decodeInt);
924                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
925                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
926
927                 gl.glTexParameterf(m_target, m_pname, GL_SKIP_DECODE_EXT);
928                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
929                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
930
931                 gl.glTexParameterfv(m_target, m_pname, &decodeFloat);
932                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
933                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
934         }
935
936         if (isPureIntTester(m_tester))
937         {
938                 const glw::GLint skipDecode     = GL_SKIP_DECODE_EXT;
939                 const glw::GLint decode         = GL_DECODE_EXT;
940
941                 gl.glTexParameterIiv(m_target, m_pname, &skipDecode);
942                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
943                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
944
945                 gl.glTexParameterIiv(m_target, m_pname, &decode);
946                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
947                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
948         }
949
950         if (isPureUintTester(m_tester))
951         {
952                 const glw::GLuint skipDecode    = GL_SKIP_DECODE_EXT;
953                 const glw::GLuint decode                = GL_DECODE_EXT;
954
955                 gl.glTexParameterIuiv(m_target, m_pname, &skipDecode);
956                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
957                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
958
959                 gl.glTexParameterIuiv(m_target, m_pname, &decode);
960                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
961                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
962         }
963 }
964
965 class TextureSwizzleCase : public TextureTest
966 {
967 public:
968                         TextureSwizzleCase      (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
969         void    test                            (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
970 };
971
972 TextureSwizzleCase::TextureSwizzleCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
973         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
974 {
975 }
976
977 void TextureSwizzleCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
978 {
979         const bool      isPureCase              = isPureIntTester(m_tester) || isPureUintTester(m_tester);
980         const int       initialValue    = (m_pname == GL_TEXTURE_SWIZZLE_R) ? (GL_RED) :
981                                                                   (m_pname == GL_TEXTURE_SWIZZLE_G) ? (GL_GREEN) :
982                                                                   (m_pname == GL_TEXTURE_SWIZZLE_B) ? (GL_BLUE) :
983                                                                   (m_pname == GL_TEXTURE_SWIZZLE_A) ? (GL_ALPHA) :
984                                                                   (-1);
985
986         if (!isPureCase)
987         {
988                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
989                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initialValue, m_type);
990         }
991
992         {
993                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
994                 const GLenum                            swizzleValues[] = {GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_ZERO, GL_ONE};
995
996                 if (isPureCase)
997                 {
998                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(swizzleValues); ++ndx)
999                         {
1000                                 if (isPureIntTester(m_tester))
1001                                 {
1002                                         const glw::GLint value = (glw::GLint)swizzleValues[ndx];
1003                                         gl.glTexParameterIiv(m_target, m_pname, &value);
1004                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1005                                 }
1006                                 else
1007                                 {
1008                                         DE_ASSERT(isPureUintTester(m_tester));
1009
1010                                         const glw::GLuint value = swizzleValues[ndx];
1011                                         gl.glTexParameterIuiv(m_target, m_pname, &value);
1012                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1013                                 }
1014
1015                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, swizzleValues[ndx], m_type);
1016                         }
1017                 }
1018                 else
1019                 {
1020                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(swizzleValues); ++ndx)
1021                         {
1022                                 gl.glTexParameteri(m_target, m_pname, swizzleValues[ndx]);
1023                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1024
1025                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, swizzleValues[ndx], m_type);
1026                         }
1027
1028                         //check unit conversions with float
1029
1030                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(swizzleValues); ++ndx)
1031                         {
1032                                 gl.glTexParameterf(m_target, m_pname, (GLfloat)swizzleValues[ndx]);
1033                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1034
1035                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, swizzleValues[ndx], m_type);
1036                         }
1037                 }
1038         }
1039 }
1040
1041 class TextureWrapCase : public TextureTest
1042 {
1043 public:
1044                         TextureWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1045         void    test                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1046 };
1047
1048 TextureWrapCase::TextureWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1049         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1050 {
1051 }
1052
1053 void TextureWrapCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1054 {
1055         const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1056
1057         if (!isPureCase)
1058         {
1059                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1060                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_REPEAT, m_type);
1061         }
1062
1063         {
1064                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
1065                 const GLenum                            wrapValues[]    = {GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT};
1066
1067                 if (isPureCase)
1068                 {
1069                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
1070                         {
1071                                 if (isPureIntTester(m_tester))
1072                                 {
1073                                         const glw::GLint value = (glw::GLint)wrapValues[ndx];
1074                                         gl.glTexParameterIiv(m_target, m_pname, &value);
1075                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1076                                 }
1077                                 else
1078                                 {
1079                                         DE_ASSERT(isPureUintTester(m_tester));
1080
1081                                         const glw::GLuint value = wrapValues[ndx];
1082                                         gl.glTexParameterIuiv(m_target, m_pname, &value);
1083                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1084                                 }
1085
1086                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
1087                         }
1088                 }
1089                 else
1090                 {
1091                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
1092                         {
1093                                 gl.glTexParameteri(m_target, m_pname, wrapValues[ndx]);
1094                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1095
1096                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
1097                         }
1098
1099                         //check unit conversions with float
1100
1101                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
1102                         {
1103                                 gl.glTexParameterf(m_target, m_pname, (GLfloat)wrapValues[ndx]);
1104                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1105
1106                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
1107                         }
1108                 }
1109         }
1110 }
1111
1112 class TextureFilterCase : public TextureTest
1113 {
1114 public:
1115                         TextureFilterCase       (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1116         void    test                            (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1117 };
1118
1119 TextureFilterCase::TextureFilterCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1120         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1121 {
1122 }
1123
1124 void TextureFilterCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1125 {
1126         const bool                      isPureCase      = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1127         const glw::GLenum       initial         = (m_pname == GL_TEXTURE_MAG_FILTER) ? (GL_LINEAR)
1128                                                                         : (m_pname == GL_TEXTURE_MIN_FILTER) ? (GL_NEAREST_MIPMAP_LINEAR)
1129                                                                         : (0);
1130
1131         if (!isPureCase)
1132         {
1133                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1134                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initial, m_type);
1135         }
1136
1137         {
1138                 const tcu::ScopedLogSection     section         (m_testCtx.getLog(), "Set", "Set");
1139                 std::vector<GLenum>                     values;
1140
1141                 values.push_back(GL_NEAREST);
1142                 values.push_back(GL_LINEAR);
1143                 if (m_pname == GL_TEXTURE_MIN_FILTER)
1144                 {
1145                         values.push_back(GL_NEAREST_MIPMAP_NEAREST);
1146                         values.push_back(GL_NEAREST_MIPMAP_LINEAR);
1147                         values.push_back(GL_LINEAR_MIPMAP_NEAREST);
1148                         values.push_back(GL_LINEAR_MIPMAP_LINEAR);
1149                 }
1150
1151                 if (isPureCase)
1152                 {
1153                         for (int ndx = 0; ndx < (int)values.size(); ++ndx)
1154                         {
1155                                 if (isPureIntTester(m_tester))
1156                                 {
1157                                         const glw::GLint value = (glw::GLint)values[ndx];
1158                                         gl.glTexParameterIiv(m_target, m_pname, &value);
1159                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1160                                 }
1161                                 else
1162                                 {
1163                                         DE_ASSERT(isPureUintTester(m_tester));
1164
1165                                         const glw::GLuint value = values[ndx];
1166                                         gl.glTexParameterIuiv(m_target, m_pname, &value);
1167                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1168                                 }
1169
1170                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
1171                         }
1172                 }
1173                 else
1174                 {
1175                         for (int ndx = 0; ndx < (int)values.size(); ++ndx)
1176                         {
1177                                 gl.glTexParameteri(m_target, m_pname, values[ndx]);
1178                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1179
1180                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
1181                         }
1182
1183                         //check unit conversions with float
1184
1185                         for (int ndx = 0; ndx < (int)values.size(); ++ndx)
1186                         {
1187                                 gl.glTexParameterf(m_target, m_pname, (GLfloat)values[ndx]);
1188                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1189
1190                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
1191                         }
1192                 }
1193         }
1194 }
1195
1196 class TextureLODCase : public TextureTest
1197 {
1198 public:
1199                         TextureLODCase  (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1200         void    test                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1201 };
1202
1203 TextureLODCase::TextureLODCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1204         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1205 {
1206 }
1207
1208 void TextureLODCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1209 {
1210         const bool      isPureCase              = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1211         const int       initialValue    = (m_pname == GL_TEXTURE_MIN_LOD) ? (-1000)
1212                                                                 : (m_pname == GL_TEXTURE_MAX_LOD) ? (1000)
1213                                                                 : (-1);
1214
1215         if ((querySupportsSigned(m_type) || initialValue >= 0) && !isPureCase)
1216         {
1217                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1218                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initialValue, m_type);
1219         }
1220
1221         {
1222                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
1223                 const int                                       numIterations   = 20;
1224                 de::Random                                      rnd                             (0xabcdef);
1225
1226                 if (isPureCase)
1227                 {
1228                         if (isPureIntTester(m_tester))
1229                         {
1230                                 for (int ndx = 0; ndx < numIterations; ++ndx)
1231                                 {
1232                                         const GLint ref = rnd.getInt(-1000, 1000);
1233
1234                                         gl.glTexParameterIiv(m_target, m_pname, &ref);
1235                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1236
1237                                         verifyStateTextureParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
1238                                 }
1239                         }
1240                         else
1241                         {
1242                                 DE_ASSERT(isPureUintTester(m_tester));
1243
1244                                 for (int ndx = 0; ndx < numIterations; ++ndx)
1245                                 {
1246                                         const GLuint ref = (glw::GLuint)rnd.getInt(0, 1000);
1247
1248                                         gl.glTexParameterIuiv(m_target, m_pname, &ref);
1249                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1250
1251                                         verifyStateTextureParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
1252                                 }
1253                         }
1254                 }
1255                 else
1256                 {
1257                         const int minLimit = (querySupportsSigned(m_type)) ? (-1000) : (0);
1258
1259                         for (int ndx = 0; ndx < numIterations; ++ndx)
1260                         {
1261                                 const GLfloat ref = rnd.getFloat((float)minLimit, 1000.f);
1262
1263                                 gl.glTexParameterf(m_target, m_pname, ref);
1264                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1265
1266                                 verifyStateTextureParamFloat(result, gl, m_target, m_pname, ref, m_type);
1267                         }
1268
1269                         // check unit conversions with int
1270
1271                         for (int ndx = 0; ndx < numIterations; ++ndx)
1272                         {
1273                                 const GLint ref = rnd.getInt(minLimit, 1000);
1274
1275                                 gl.glTexParameteri(m_target, m_pname, ref);
1276                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1277
1278                                 verifyStateTextureParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
1279                         }
1280                 }
1281         }
1282 }
1283
1284 class TextureLevelCase : public TextureTest
1285 {
1286 public:
1287                         TextureLevelCase        (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1288         void    test                            (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1289 };
1290
1291 TextureLevelCase::TextureLevelCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1292         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1293 {
1294 }
1295
1296 void TextureLevelCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1297 {
1298         const bool      isPureCase              = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1299         const int       initialValue    = (m_pname == GL_TEXTURE_BASE_LEVEL) ? (0)
1300                                                                 : (m_pname == GL_TEXTURE_MAX_LEVEL)     ? (1000)
1301                                                                 : (-1);
1302
1303         if (!isPureCase)
1304         {
1305                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1306                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, initialValue, m_type);
1307         }
1308
1309         if (m_target == GL_TEXTURE_2D_MULTISAMPLE               ||
1310                 m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
1311         {
1312                 // only 0 allowed
1313                 {
1314                         const tcu::ScopedLogSection section(m_testCtx.getLog(), "Set", "Set");
1315
1316                         gl.glTexParameteri(m_target, m_pname, 0);
1317                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1318                         verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1319
1320                         gl.glTexParameterf(m_target, m_pname, 0.0f);
1321                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1322                         verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1323                 }
1324         }
1325         else
1326         {
1327                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
1328                 const int                                       numIterations   = 20;
1329                 de::Random                                      rnd                             (0xabcdef);
1330
1331                 if (isPureCase)
1332                 {
1333                         for (int ndx = 0; ndx < numIterations; ++ndx)
1334                         {
1335                                 const GLint             ref             = rnd.getInt(0, 64000);
1336                                 const GLuint    uRef    = (glw::GLuint)ref;
1337
1338                                 if (isPureIntTester(m_tester))
1339                                 {
1340                                         gl.glTexParameterIiv(m_target, m_pname, &ref);
1341                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1342                                 }
1343                                 else
1344                                 {
1345                                         DE_ASSERT(isPureUintTester(m_tester));
1346                                         gl.glTexParameterIuiv(m_target, m_pname, &uRef);
1347                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1348                                 }
1349
1350                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, ref, m_type);
1351                         }
1352                 }
1353                 else
1354                 {
1355                         for (int ndx = 0; ndx < numIterations; ++ndx)
1356                         {
1357                                 const GLint ref = rnd.getInt(0, 64000);
1358
1359                                 gl.glTexParameteri(m_target, m_pname, ref);
1360                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1361
1362                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, ref, m_type);
1363                         }
1364
1365                         // check unit conversions with float
1366
1367                         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
1368
1369                         const int numConversionIterations = 30;
1370                         for (int ndx = 0; ndx < numConversionIterations; ++ndx)
1371                         {
1372                                 const GLint ref = rnd.getInt(1, 64000);
1373
1374                                 for (int offsetNdx = 0; offsetNdx < DE_LENGTH_OF_ARRAY(nonSignificantOffsets); ++offsetNdx)
1375                                 {
1376                                         gl.glTexParameterf(m_target, m_pname, ((GLfloat)ref) + nonSignificantOffsets[offsetNdx]);
1377                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1378
1379                                         verifyStateTextureParamInteger(result, gl, m_target, m_pname, ref, m_type);
1380                                 }
1381                         }
1382                 }
1383         }
1384 }
1385
1386 class TextureCompareModeCase : public TextureTest
1387 {
1388 public:
1389                         TextureCompareModeCase  (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1390         void    test                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1391 };
1392
1393 TextureCompareModeCase::TextureCompareModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1394         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1395 {
1396 }
1397
1398 void TextureCompareModeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1399 {
1400         const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1401
1402         if (!isPureCase)
1403         {
1404                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1405                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_NONE, m_type);
1406         }
1407
1408         {
1409                 const tcu::ScopedLogSection     section         (m_testCtx.getLog(), "Set", "Set");
1410                 const GLenum                            modes[]         = {GL_COMPARE_REF_TO_TEXTURE, GL_NONE};
1411
1412                 if (isPureCase)
1413                 {
1414                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
1415                         {
1416                                 if (isPureIntTester(m_tester))
1417                                 {
1418                                         const glw::GLint value = (glw::GLint)modes[ndx];
1419                                         gl.glTexParameterIiv(m_target, m_pname, &value);
1420                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1421                                 }
1422                                 else
1423                                 {
1424                                         DE_ASSERT(isPureUintTester(m_tester));
1425
1426                                         const glw::GLuint value = modes[ndx];
1427                                         gl.glTexParameterIuiv(m_target, m_pname, &value);
1428                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1429                                 }
1430
1431                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
1432                         }
1433                 }
1434                 else
1435                 {
1436                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
1437                         {
1438                                 gl.glTexParameteri(m_target, m_pname, modes[ndx]);
1439                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1440
1441                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
1442                         }
1443
1444                         //check unit conversions with float
1445
1446                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
1447                         {
1448                                 gl.glTexParameterf(m_target, m_pname, (GLfloat)modes[ndx]);
1449                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1450
1451                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
1452                         }
1453                 }
1454         }
1455 }
1456
1457 class TextureCompareFuncCase : public TextureTest
1458 {
1459 public:
1460                         TextureCompareFuncCase  (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1461         void    test                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1462 };
1463
1464 TextureCompareFuncCase::TextureCompareFuncCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1465         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1466 {
1467 }
1468
1469 void TextureCompareFuncCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1470 {
1471         const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1472
1473         if (!isPureCase)
1474         {
1475                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1476                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_LEQUAL, m_type);
1477         }
1478
1479         {
1480                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
1481                 const GLenum                            compareFuncs[]  = {GL_LEQUAL, GL_GEQUAL, GL_LESS, GL_GREATER, GL_EQUAL, GL_NOTEQUAL, GL_ALWAYS, GL_NEVER};
1482
1483                 if (isPureCase)
1484                 {
1485                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
1486                         {
1487                                 if (isPureIntTester(m_tester))
1488                                 {
1489                                         const glw::GLint value = (glw::GLint)compareFuncs[ndx];
1490                                         gl.glTexParameterIiv(m_target, m_pname, &value);
1491                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1492                                 }
1493                                 else
1494                                 {
1495                                         DE_ASSERT(isPureUintTester(m_tester));
1496
1497                                         const glw::GLuint value = compareFuncs[ndx];
1498                                         gl.glTexParameterIuiv(m_target, m_pname, &value);
1499                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1500                                 }
1501
1502                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
1503                         }
1504                 }
1505                 else
1506                 {
1507                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
1508                         {
1509                                 gl.glTexParameteri(m_target, m_pname, compareFuncs[ndx]);
1510                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1511
1512                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
1513                         }
1514
1515                         //check unit conversions with float
1516
1517                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
1518                         {
1519                                 gl.glTexParameterf(m_target, m_pname, (GLfloat)compareFuncs[ndx]);
1520                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1521
1522                                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
1523                         }
1524                 }
1525         }
1526 }
1527
1528 class TextureImmutableLevelsCase : public TextureTest
1529 {
1530 public:
1531                         TextureImmutableLevelsCase      (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, QueryType type);
1532         void    test                                            (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1533 };
1534
1535 TextureImmutableLevelsCase::TextureImmutableLevelsCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1536         : TextureTest(testCtx, renderCtx, name, desc, target, TESTER_TEXTURE_IMMUTABLE_LEVELS, type)
1537 {
1538 }
1539
1540 void TextureImmutableLevelsCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1541 {
1542         {
1543                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1544                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1545         }
1546
1547         if (m_target == GL_TEXTURE_2D_MULTISAMPLE               ||
1548                 m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
1549         {
1550                 // no levels
1551                 const tcu::ScopedLogSection     section         (m_testCtx.getLog(), "Level", "Level");
1552                 GLuint                                          textureID       = 0;
1553
1554                 gl.glGenTextures(1, &textureID);
1555                 gl.glBindTexture(m_target, textureID);
1556                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
1557
1558                 if (m_target == GL_TEXTURE_2D_MULTISAMPLE)
1559                         gl.glTexStorage2DMultisample(m_target, 2, GL_RGB8, 64, 64, GL_FALSE);
1560                 else if (m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
1561                         gl.glTexStorage3DMultisample(m_target, 2, GL_RGB8, 64, 64, 2, GL_FALSE);
1562                 else
1563                         DE_ASSERT(false);
1564                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexStorage");
1565
1566                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 1, m_type);
1567
1568                 gl.glDeleteTextures(1, &textureID);
1569                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
1570         }
1571         else
1572         {
1573                 for (int level = 1; level <= 7; ++level)
1574                 {
1575                         const tcu::ScopedLogSection     section         (m_testCtx.getLog(), "Levels", "Levels = " + de::toString(level));
1576                         GLuint                                          textureID       = 0;
1577
1578                         gl.glGenTextures(1, &textureID);
1579                         gl.glBindTexture(m_target, textureID);
1580                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
1581
1582                         if (m_target == GL_TEXTURE_2D || m_target == GL_TEXTURE_CUBE_MAP)
1583                                 gl.glTexStorage2D(m_target, level, GL_RGB8, 64, 64);
1584                         else if (m_target == GL_TEXTURE_2D_ARRAY || m_target == GL_TEXTURE_3D)
1585                                 gl.glTexStorage3D(m_target, level, GL_RGB8, 64, 64, 64);
1586                         else if (m_target == GL_TEXTURE_CUBE_MAP_ARRAY)
1587                                 gl.glTexStorage3D(m_target, level, GL_RGB8, 64, 64, 6 * 2);
1588                         else
1589                                 DE_ASSERT(false);
1590                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexStorage");
1591
1592                         verifyStateTextureParamInteger(result, gl, m_target, m_pname, level, m_type);
1593
1594                         gl.glDeleteTextures(1, &textureID);
1595                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
1596                 }
1597         }
1598 }
1599
1600 class TextureImmutableFormatCase : public TextureTest
1601 {
1602 public:
1603                         TextureImmutableFormatCase      (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, QueryType type);
1604         void    test                                            (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1605 };
1606
1607 TextureImmutableFormatCase::TextureImmutableFormatCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1608         : TextureTest(testCtx, renderCtx, name, desc, target, TESTER_TEXTURE_IMMUTABLE_FORMAT, type)
1609 {
1610 }
1611
1612 void TextureImmutableFormatCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1613 {
1614         {
1615                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1616                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1617         }
1618
1619         {
1620                 const tcu::ScopedLogSection     subsection      (m_testCtx.getLog(), "Immutable", "Immutable");
1621                 GLuint                                          textureID       = 0;
1622
1623                 gl.glGenTextures(1, &textureID);
1624                 gl.glBindTexture(m_target, textureID);
1625                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
1626
1627                 switch (m_target)
1628                 {
1629                         case GL_TEXTURE_2D:
1630                         case GL_TEXTURE_CUBE_MAP:
1631                         {
1632                                 gl.glTexStorage2D(m_target, 1, GL_RGBA8, 32, 32);
1633                                 break;
1634                         }
1635                         case GL_TEXTURE_2D_ARRAY:
1636                         case GL_TEXTURE_3D:
1637                         {
1638                                 gl.glTexStorage3D(m_target, 1, GL_RGBA8, 32, 32, 8);
1639                                 break;
1640                         }
1641                         case GL_TEXTURE_2D_MULTISAMPLE:
1642                         {
1643                                 gl.glTexStorage2DMultisample(m_target, 2, GL_RGB8, 64, 64, GL_FALSE);
1644                                 break;
1645                         }
1646                         case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
1647                         {
1648                                 gl.glTexStorage3DMultisample(m_target, 2, GL_RGB8, 64, 64, 2, GL_FALSE);
1649                                 break;
1650                         }
1651                         case GL_TEXTURE_CUBE_MAP_ARRAY:
1652                         {
1653                                 gl.glTexStorage3D(m_target, 1, GL_RGBA8, 32, 32, 6 * 2);
1654                                 break;
1655                         }
1656                         default:
1657                                 DE_ASSERT(false);
1658                 }
1659                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup texture");
1660
1661                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 1, m_type);
1662
1663                 gl.glDeleteTextures(1, &textureID);
1664                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
1665         }
1666
1667         // no mutable
1668         if (m_target == GL_TEXTURE_2D_MULTISAMPLE ||
1669                 m_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
1670                 return;
1671
1672         // test mutable
1673         {
1674                 const tcu::ScopedLogSection     subsection              (m_testCtx.getLog(), "Mutable", "Mutable");
1675                 GLuint                                          textureID               = 0;
1676
1677                 gl.glGenTextures(1, &textureID);
1678                 gl.glBindTexture(m_target, textureID);
1679                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindTexture");
1680
1681                 switch (m_target)
1682                 {
1683                         case GL_TEXTURE_2D:
1684                         {
1685                                 gl.glTexImage2D(m_target, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1686                                 break;
1687                         }
1688                         case GL_TEXTURE_CUBE_MAP:
1689                         {
1690                                 gl.glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1691                                 break;
1692                         }
1693                         case GL_TEXTURE_2D_ARRAY:
1694                         case GL_TEXTURE_3D:
1695                         {
1696                                 gl.glTexImage3D(m_target, 0, GL_RGBA8, 32, 32, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1697                                 break;
1698                         }
1699                         case GL_TEXTURE_CUBE_MAP_ARRAY:
1700                         {
1701                                 gl.glTexImage3D(m_target, 0, GL_RGBA8, 32, 32, 6 * 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
1702                                 break;
1703                         }
1704                         default:
1705                                 DE_ASSERT(false);
1706                 }
1707                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup texture");
1708
1709                 verifyStateTextureParamInteger(result, gl, m_target, m_pname, 0, m_type);
1710
1711                 gl.glDeleteTextures(1, &textureID);
1712                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glDeleteTextures");
1713         }
1714 }
1715
1716 class TextureWrapClampToBorderCase : public TextureTest
1717 {
1718 public:
1719                         TextureWrapClampToBorderCase    (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type);
1720         void    test                                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1721 };
1722
1723 TextureWrapClampToBorderCase::TextureWrapClampToBorderCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, TesterType tester, QueryType type)
1724         : TextureTest(testCtx, renderCtx, name, desc, target, tester, type)
1725 {
1726 }
1727
1728 void TextureWrapClampToBorderCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1729 {
1730         gl.glTexParameteri(m_target, m_pname, GL_CLAMP_TO_BORDER_EXT);
1731         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1732         verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type);
1733
1734         gl.glTexParameteri(m_target, m_pname, GL_REPEAT);
1735         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteri");
1736
1737         gl.glTexParameterf(m_target, m_pname, (GLfloat)GL_CLAMP_TO_BORDER_EXT);
1738         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterf");
1739
1740         verifyStateTextureParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type);
1741 }
1742
1743 class TextureBorderColorCase : public TextureTest
1744 {
1745 public:
1746                         TextureBorderColorCase  (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, glw::GLenum target, QueryType type);
1747         void    test                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1748 };
1749
1750 TextureBorderColorCase::TextureBorderColorCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1751         : TextureTest(testCtx, renderCtx, name, desc, target, TESTER_TEXTURE_BORDER_COLOR, type)
1752 {
1753 }
1754
1755 void TextureBorderColorCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1756 {
1757         // border color is undefined if queried with pure type and was not set to pure value
1758         if (m_type == QUERY_TEXTURE_PARAM_INTEGER_VEC4 || m_type == QUERY_TEXTURE_PARAM_FLOAT_VEC4)
1759         {
1760                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1761                 verifyStateTextureParamFloatVec4(result, gl, m_target, m_pname, tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), m_type);
1762         }
1763
1764         if (m_type == QUERY_TEXTURE_PARAM_PURE_INTEGER_VEC4)
1765         {
1766                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
1767                 const tcu::IVec4                        color                   (0x7FFFFFFF, -2, 3, -128);
1768
1769                 gl.glTexParameterIiv(m_target, m_pname, color.getPtr());
1770                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIiv");
1771
1772                 verifyStateTextureParamIntegerVec4(result, gl, m_target, m_pname, color, m_type);
1773         }
1774         else if (m_type == QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER_VEC4)
1775         {
1776                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
1777                 const tcu::UVec4                        color                   (0x8000000ul, 2, 3, 128);
1778
1779                 gl.glTexParameterIuiv(m_target, m_pname, color.getPtr());
1780                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterIuiv");
1781
1782                 verifyStateTextureParamUnsignedIntegerVec4(result, gl, m_target, m_pname, color, m_type);
1783         }
1784         else
1785         {
1786                 DE_ASSERT(m_type == QUERY_TEXTURE_PARAM_INTEGER_VEC4 || m_type == QUERY_TEXTURE_PARAM_FLOAT_VEC4);
1787
1788                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
1789                 const tcu::Vec4                         color                   (0.25f, 1.0f, 0.0f, 0.77f);
1790                 const tcu::IVec4                        icolor                  (0x8000000ul, 0x7FFFFFFF, 0, 0x0FFFFFFF);
1791
1792                 gl.glTexParameterfv(m_target, m_pname, color.getPtr());
1793                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameterfv");
1794
1795                 verifyStateTextureParamFloatVec4(result, gl, m_target, m_pname, color, m_type);
1796
1797                 gl.glTexParameteriv(m_target, m_pname, icolor.getPtr());
1798                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glTexParameteriv");
1799
1800                 verifyStateTextureParamNormalizedI32Vec4(result, gl, m_target, m_pname, icolor, m_type);
1801         }
1802 }
1803
1804 class SamplerTest : public tcu::TestCase
1805 {
1806 public:
1807                                                 SamplerTest     (tcu::TestContext&                      testCtx,
1808                                                                          const glu::RenderContext&      renderCtx,
1809                                                                          const char*                            name,
1810                                                                          const char*                            desc,
1811                                                                          TesterType                                     tester,
1812                                                                          QueryType                                      type);
1813
1814         void                            init            (void);
1815         IterateResult           iterate         (void);
1816
1817         virtual void            test            (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const = 0;
1818
1819 protected:
1820         const glu::RenderContext&       m_renderCtx;
1821         const glw::GLenum                       m_pname;
1822         const TesterType                        m_tester;
1823         const QueryType                         m_type;
1824         glw::GLuint                                     m_target;
1825 };
1826
1827 SamplerTest::SamplerTest (tcu::TestContext&                     testCtx,
1828                                                   const glu::RenderContext&     renderCtx,
1829                                                   const char*                           name,
1830                                                   const char*                           desc,
1831                                                   TesterType                            tester,
1832                                                   QueryType                                     type)
1833         : TestCase              (testCtx, name, desc)
1834         , m_renderCtx   (renderCtx)
1835         , m_pname               (mapTesterToPname(tester))
1836         , m_tester              (tester)
1837         , m_type                (type)
1838         , m_target              (0)
1839 {
1840 }
1841
1842 void SamplerTest::init (void)
1843 {
1844         const de::UniquePtr<glu::ContextInfo>   ctxInfo         (glu::ContextInfo::create(m_renderCtx));
1845         RequiredExtensions                                              extensions;
1846
1847         // param
1848         if (!isCoreTextureParam(m_renderCtx.getType(), m_pname))
1849                 extensions.add(getTextureParamExtension(m_renderCtx.getType(), m_pname));
1850
1851         // query
1852         if (!isCoreQuery(m_renderCtx.getType(), m_type))
1853                 extensions.add(getQueryExtension(m_renderCtx.getType(), m_type));
1854
1855         // test type
1856         if (!isCoreTester(m_renderCtx.getType(), m_tester))
1857                 extensions.add(getTesterExtension(m_renderCtx.getType(), m_tester));
1858
1859         extensions.check(*ctxInfo);
1860 }
1861
1862 SamplerTest::IterateResult SamplerTest::iterate (void)
1863 {
1864         glu::CallLogWrapper             gl              (m_renderCtx.getFunctions(), m_testCtx.getLog());
1865         tcu::ResultCollector    result  (m_testCtx.getLog(), " // ERROR: ");
1866         glu::Sampler                    sampler (m_renderCtx);
1867
1868         gl.enableLogging(true);
1869
1870         m_target = *sampler;
1871         test(gl, result);
1872         m_target = 0;
1873
1874         result.setTestContextResult(m_testCtx);
1875         return STOP;
1876 }
1877
1878 class SamplerWrapCase : public SamplerTest
1879 {
1880 public:
1881                         SamplerWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
1882         void    test                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1883 };
1884
1885 SamplerWrapCase::SamplerWrapCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
1886         : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
1887 {
1888 }
1889
1890 void SamplerWrapCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1891 {
1892         const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1893
1894         if (!isPureCase)
1895         {
1896                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1897                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_REPEAT, m_type);
1898         }
1899
1900         {
1901                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
1902                 const GLenum                            wrapValues[]    = {GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT};
1903
1904                 if (isPureCase)
1905                 {
1906                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
1907                         {
1908                                 if (isPureIntTester(m_tester))
1909                                 {
1910                                         const glw::GLint value = (glw::GLint)wrapValues[ndx];
1911                                         gl.glSamplerParameterIiv(m_target, m_pname, &value);
1912                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
1913                                 }
1914                                 else
1915                                 {
1916                                         DE_ASSERT(isPureUintTester(m_tester));
1917
1918                                         const glw::GLuint value = wrapValues[ndx];
1919                                         gl.glSamplerParameterIuiv(m_target, m_pname, &value);
1920                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
1921                                 }
1922
1923                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
1924                         }
1925                 }
1926                 else
1927                 {
1928                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
1929                         {
1930                                 gl.glSamplerParameteri(m_target, m_pname, wrapValues[ndx]);
1931                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
1932
1933                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
1934                         }
1935
1936                         //check unit conversions with float
1937
1938                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
1939                         {
1940                                 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)wrapValues[ndx]);
1941                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
1942
1943                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, wrapValues[ndx], m_type);
1944                         }
1945                 }
1946         }
1947 }
1948
1949 class SamplerFilterCase : public SamplerTest
1950 {
1951 public:
1952                         SamplerFilterCase       (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
1953         void    test                            (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
1954 };
1955
1956 SamplerFilterCase::SamplerFilterCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
1957         : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
1958 {
1959 }
1960
1961 void SamplerFilterCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
1962 {
1963         const bool                      isPureCase      = isPureIntTester(m_tester) || isPureUintTester(m_tester);
1964         const glw::GLenum       initial         = (m_pname == GL_TEXTURE_MAG_FILTER) ? (GL_LINEAR)
1965                                                                         : (m_pname == GL_TEXTURE_MIN_FILTER) ? (GL_NEAREST_MIPMAP_LINEAR)
1966                                                                         : (0);
1967
1968         if (!isPureCase)
1969         {
1970                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
1971                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, initial, m_type);
1972         }
1973
1974         {
1975                 const tcu::ScopedLogSection     section         (m_testCtx.getLog(), "Set", "Set");
1976                 std::vector<GLenum>                     values;
1977
1978                 values.push_back(GL_NEAREST);
1979                 values.push_back(GL_LINEAR);
1980                 if (m_pname == GL_TEXTURE_MIN_FILTER)
1981                 {
1982                         values.push_back(GL_NEAREST_MIPMAP_NEAREST);
1983                         values.push_back(GL_NEAREST_MIPMAP_LINEAR);
1984                         values.push_back(GL_LINEAR_MIPMAP_NEAREST);
1985                         values.push_back(GL_LINEAR_MIPMAP_LINEAR);
1986                 }
1987
1988                 if (isPureCase)
1989                 {
1990                         for (int ndx = 0; ndx < (int)values.size(); ++ndx)
1991                         {
1992                                 if (isPureIntTester(m_tester))
1993                                 {
1994                                         const glw::GLint value = (glw::GLint)values[ndx];
1995                                         gl.glSamplerParameterIiv(m_target, m_pname, &value);
1996                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
1997                                 }
1998                                 else
1999                                 {
2000                                         DE_ASSERT(isPureUintTester(m_tester));
2001
2002                                         const glw::GLuint value = values[ndx];
2003                                         gl.glSamplerParameterIuiv(m_target, m_pname, &value);
2004                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2005                                 }
2006
2007                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
2008                         }
2009                 }
2010                 else
2011                 {
2012                         for (int ndx = 0; ndx < (int)values.size(); ++ndx)
2013                         {
2014                                 gl.glSamplerParameteri(m_target, m_pname, values[ndx]);
2015                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2016
2017                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
2018                         }
2019
2020                         //check unit conversions with float
2021
2022                         for (int ndx = 0; ndx < (int)values.size(); ++ndx)
2023                         {
2024                                 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)values[ndx]);
2025                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
2026
2027                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, values[ndx], m_type);
2028                         }
2029                 }
2030         }
2031 }
2032
2033 class SamplerLODCase : public SamplerTest
2034 {
2035 public:
2036                         SamplerLODCase  (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
2037         void    test                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2038 };
2039
2040 SamplerLODCase::SamplerLODCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
2041         : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
2042 {
2043 }
2044
2045 void SamplerLODCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2046 {
2047         const bool      isPureCase              = isPureIntTester(m_tester) || isPureUintTester(m_tester);
2048         const int       initialValue    = (m_pname == GL_TEXTURE_MIN_LOD) ? (-1000)
2049                                                                 : (m_pname == GL_TEXTURE_MAX_LOD) ? (1000)
2050                                                                 : (-1);
2051
2052         if ((querySupportsSigned(m_type) || initialValue >= 0) && !isPureCase)
2053         {
2054                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
2055                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, initialValue, m_type);
2056         }
2057
2058         {
2059                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
2060                 const int                                       numIterations   = 20;
2061                 de::Random                                      rnd                             (0xabcdef);
2062
2063                 if (isPureCase)
2064                 {
2065                         if (isPureIntTester(m_tester))
2066                         {
2067                                 for (int ndx = 0; ndx < numIterations; ++ndx)
2068                                 {
2069                                         const GLint ref = rnd.getInt(-1000, 1000);
2070
2071                                         gl.glSamplerParameterIiv(m_target, m_pname, &ref);
2072                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2073
2074                                         verifyStateSamplerParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
2075                                 }
2076                         }
2077                         else
2078                         {
2079                                 DE_ASSERT(isPureUintTester(m_tester));
2080
2081                                 for (int ndx = 0; ndx < numIterations; ++ndx)
2082                                 {
2083                                         const GLuint ref = (glw::GLuint)rnd.getInt(0, 1000);
2084
2085                                         gl.glSamplerParameterIuiv(m_target, m_pname, &ref);
2086                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2087
2088                                         verifyStateSamplerParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
2089                                 }
2090                         }
2091                 }
2092                 else
2093                 {
2094                         const int minLimit = (querySupportsSigned(m_type)) ? (-1000) : (0);
2095
2096                         for (int ndx = 0; ndx < numIterations; ++ndx)
2097                         {
2098                                 const GLfloat ref = rnd.getFloat((float)minLimit, 1000.f);
2099
2100                                 gl.glSamplerParameterf(m_target, m_pname, ref);
2101                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
2102
2103                                 verifyStateSamplerParamFloat(result, gl, m_target, m_pname, ref, m_type);
2104                         }
2105
2106                         // check unit conversions with int
2107
2108                         for (int ndx = 0; ndx < numIterations; ++ndx)
2109                         {
2110                                 const GLint ref = rnd.getInt(minLimit, 1000);
2111
2112                                 gl.glSamplerParameteri(m_target, m_pname, ref);
2113                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2114
2115                                 verifyStateSamplerParamFloat(result, gl, m_target, m_pname, (float)ref, m_type);
2116                         }
2117                 }
2118         }
2119 }
2120
2121 class SamplerCompareModeCase : public SamplerTest
2122 {
2123 public:
2124                         SamplerCompareModeCase  (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
2125         void    test                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2126 };
2127
2128 SamplerCompareModeCase::SamplerCompareModeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
2129         : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
2130 {
2131 }
2132
2133 void SamplerCompareModeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2134 {
2135         const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
2136
2137         if (!isPureCase)
2138         {
2139                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
2140                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_NONE, m_type);
2141         }
2142
2143         {
2144                 const tcu::ScopedLogSection     section         (m_testCtx.getLog(), "Set", "Set");
2145                 const GLenum                            modes[]         = {GL_COMPARE_REF_TO_TEXTURE, GL_NONE};
2146
2147                 if (isPureCase)
2148                 {
2149                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
2150                         {
2151                                 if (isPureIntTester(m_tester))
2152                                 {
2153                                         const glw::GLint value = (glw::GLint)modes[ndx];
2154                                         gl.glSamplerParameterIiv(m_target, m_pname, &value);
2155                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2156                                 }
2157                                 else
2158                                 {
2159                                         DE_ASSERT(isPureUintTester(m_tester));
2160
2161                                         const glw::GLuint value = modes[ndx];
2162                                         gl.glSamplerParameterIuiv(m_target, m_pname, &value);
2163                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2164                                 }
2165
2166                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
2167                         }
2168                 }
2169                 else
2170                 {
2171                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
2172                         {
2173                                 gl.glSamplerParameteri(m_target, m_pname, modes[ndx]);
2174                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2175
2176                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
2177                         }
2178
2179                         //check unit conversions with float
2180
2181                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(modes); ++ndx)
2182                         {
2183                                 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)modes[ndx]);
2184                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
2185
2186                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, modes[ndx], m_type);
2187                         }
2188                 }
2189         }
2190 }
2191
2192 class SamplerCompareFuncCase : public SamplerTest
2193 {
2194 public:
2195                         SamplerCompareFuncCase  (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
2196         void    test                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2197 };
2198
2199 SamplerCompareFuncCase::SamplerCompareFuncCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
2200         : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
2201 {
2202 }
2203
2204 void SamplerCompareFuncCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2205 {
2206         const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
2207
2208         if (!isPureCase)
2209         {
2210                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
2211                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_LEQUAL, m_type);
2212         }
2213
2214         {
2215                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
2216                 const GLenum                            compareFuncs[]  = {GL_LEQUAL, GL_GEQUAL, GL_LESS, GL_GREATER, GL_EQUAL, GL_NOTEQUAL, GL_ALWAYS, GL_NEVER};
2217
2218                 if (isPureCase)
2219                 {
2220                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
2221                         {
2222                                 if (isPureIntTester(m_tester))
2223                                 {
2224                                         const glw::GLint value = (glw::GLint)compareFuncs[ndx];
2225                                         gl.glSamplerParameterIiv(m_target, m_pname, &value);
2226                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2227                                 }
2228                                 else
2229                                 {
2230                                         DE_ASSERT(isPureUintTester(m_tester));
2231
2232                                         const glw::GLuint value = compareFuncs[ndx];
2233                                         gl.glSamplerParameterIuiv(m_target, m_pname, &value);
2234                                         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2235                                 }
2236
2237                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
2238                         }
2239                 }
2240                 else
2241                 {
2242                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
2243                         {
2244                                 gl.glSamplerParameteri(m_target, m_pname, compareFuncs[ndx]);
2245                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2246
2247                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
2248                         }
2249
2250                         //check unit conversions with float
2251
2252                         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(compareFuncs); ++ndx)
2253                         {
2254                                 gl.glSamplerParameterf(m_target, m_pname, (GLfloat)compareFuncs[ndx]);
2255                                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
2256
2257                                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, compareFuncs[ndx], m_type);
2258                         }
2259                 }
2260         }
2261 }
2262
2263 class SamplerWrapClampToBorderCase : public SamplerTest
2264 {
2265 public:
2266                         SamplerWrapClampToBorderCase    (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
2267         void    test                                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2268 };
2269
2270 SamplerWrapClampToBorderCase::SamplerWrapClampToBorderCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
2271         : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
2272 {
2273 }
2274
2275 void SamplerWrapClampToBorderCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2276 {
2277         gl.glSamplerParameteri(m_target, m_pname, GL_CLAMP_TO_BORDER_EXT);
2278         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2279         verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type);
2280
2281         gl.glSamplerParameteri(m_target, m_pname, GL_REPEAT);
2282         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteri");
2283
2284         gl.glSamplerParameterf(m_target, m_pname, (GLfloat)GL_CLAMP_TO_BORDER_EXT);
2285         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterf");
2286
2287         verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_CLAMP_TO_BORDER_EXT, m_type);
2288 }
2289
2290 class SamplerSRGBDecodeCase : public SamplerTest
2291 {
2292 public:
2293                         SamplerSRGBDecodeCase   (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, TesterType tester, QueryType type);
2294         void    test                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2295 };
2296
2297 SamplerSRGBDecodeCase::SamplerSRGBDecodeCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, TesterType tester, QueryType type)
2298         : SamplerTest(testCtx, renderCtx, name, desc, tester, type)
2299 {
2300 }
2301
2302 void SamplerSRGBDecodeCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2303 {
2304         const bool isPureCase = isPureIntTester(m_tester) || isPureUintTester(m_tester);
2305
2306         if (!isPureCase)
2307         {
2308                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
2309                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2310         }
2311
2312         {
2313                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Toggle", "Toggle");
2314                 const glw::GLint                        decodeInt               = GL_DECODE_EXT;
2315                 const glw::GLfloat                      decodeFloat             = (glw::GLfloat)GL_DECODE_EXT;
2316
2317                 gl.glSamplerParameteri(m_target, m_pname, GL_SKIP_DECODE_EXT);
2318                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
2319                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
2320
2321                 gl.glSamplerParameteriv(m_target, m_pname, &decodeInt);
2322                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
2323                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2324
2325                 gl.glSamplerParameterf(m_target, m_pname, GL_SKIP_DECODE_EXT);
2326                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
2327                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
2328
2329                 gl.glSamplerParameterfv(m_target, m_pname, &decodeFloat);
2330                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "set state");
2331                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2332         }
2333
2334         if (isPureIntTester(m_tester))
2335         {
2336                 const glw::GLint skipDecode     = GL_SKIP_DECODE_EXT;
2337                 const glw::GLint decode         = GL_DECODE_EXT;
2338
2339                 gl.glSamplerParameterIiv(m_target, m_pname, &skipDecode);
2340                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2341                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
2342
2343                 gl.glSamplerParameterIiv(m_target, m_pname, &decode);
2344                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2345                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2346         }
2347
2348         if (isPureUintTester(m_tester))
2349         {
2350                 const glw::GLuint skipDecode    = GL_SKIP_DECODE_EXT;
2351                 const glw::GLuint decode                = GL_DECODE_EXT;
2352
2353                 gl.glSamplerParameterIuiv(m_target, m_pname, &skipDecode);
2354                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2355                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_SKIP_DECODE_EXT, m_type);
2356
2357                 gl.glSamplerParameterIuiv(m_target, m_pname, &decode);
2358                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2359                 verifyStateSamplerParamInteger(result, gl, m_target, m_pname, GL_DECODE_EXT, m_type);
2360         }
2361 }
2362
2363 class SamplerBorderColorCase : public SamplerTest
2364 {
2365 public:
2366                         SamplerBorderColorCase  (tcu::TestContext& testCtx, const glu::RenderContext& renderContext, const char* name, const char* desc, QueryType type);
2367         void    test                                    (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const;
2368 };
2369
2370 SamplerBorderColorCase::SamplerBorderColorCase (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const char* name, const char* desc, QueryType type)
2371         : SamplerTest(testCtx, renderCtx, name, desc, TESTER_TEXTURE_BORDER_COLOR, type)
2372 {
2373         DE_ASSERT(m_type == QUERY_SAMPLER_PARAM_INTEGER_VEC4                                    ||
2374                           m_type == QUERY_SAMPLER_PARAM_FLOAT_VEC4                                              ||
2375                           m_type == QUERY_SAMPLER_PARAM_PURE_INTEGER_VEC4                               ||
2376                           m_type == QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER_VEC4);
2377 }
2378
2379 void SamplerBorderColorCase::test (glu::CallLogWrapper& gl, tcu::ResultCollector& result) const
2380 {
2381         // border color is undefined if queried with pure type and was not set to pure value
2382         if (m_type == QUERY_SAMPLER_PARAM_INTEGER_VEC4 || m_type == QUERY_SAMPLER_PARAM_FLOAT_VEC4)
2383         {
2384                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial");
2385                 verifyStateSamplerParamFloatVec4(result, gl, m_target, m_pname, tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), m_type);
2386         }
2387
2388         if (m_type == QUERY_SAMPLER_PARAM_PURE_INTEGER_VEC4)
2389         {
2390                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
2391                 const tcu::IVec4                        color                   (0x7FFFFFFF, -2, 3, -128);
2392
2393                 gl.glSamplerParameterIiv(m_target, m_pname, color.getPtr());
2394                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIiv");
2395
2396                 verifyStateSamplerParamIntegerVec4(result, gl, m_target, m_pname, color, m_type);
2397         }
2398         else if (m_type == QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER_VEC4)
2399         {
2400                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
2401                 const tcu::UVec4                        color                   (0x8000000ul, 2, 3, 128);
2402
2403                 gl.glSamplerParameterIuiv(m_target, m_pname, color.getPtr());
2404                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterIuiv");
2405
2406                 verifyStateSamplerParamUnsignedIntegerVec4(result, gl, m_target, m_pname, color, m_type);
2407         }
2408         else
2409         {
2410                 DE_ASSERT(m_type == QUERY_SAMPLER_PARAM_INTEGER_VEC4 || m_type == QUERY_SAMPLER_PARAM_FLOAT_VEC4);
2411
2412                 const tcu::ScopedLogSection     section                 (m_testCtx.getLog(), "Set", "Set");
2413                 const tcu::Vec4                         color                   (0.25f, 1.0f, 0.0f, 0.77f);
2414                 const tcu::IVec4                        icolor                  (0x8000000ul, 0x7FFFFFFF, 0, 0x0FFFFFFF);
2415
2416                 gl.glSamplerParameterfv(m_target, m_pname, color.getPtr());
2417                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameterfv");
2418
2419                 verifyStateSamplerParamFloatVec4(result, gl, m_target, m_pname, color, m_type);
2420
2421                 gl.glSamplerParameteriv(m_target, m_pname, icolor.getPtr());
2422                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glSamplerParameteriv");
2423
2424                 verifyStateSamplerParamNormalizedI32Vec4(result, gl, m_target, m_pname, icolor, m_type);
2425         }
2426 }
2427
2428 } // anonymous
2429
2430 bool isLegalTesterForTarget (glw::GLenum target, TesterType tester)
2431 {
2432         // no 3d filtering on 2d targets
2433         if ((tester == TESTER_TEXTURE_WRAP_R || tester == TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER) &&  target != GL_TEXTURE_3D)
2434                 return false;
2435
2436         // no sampling on multisample
2437         if (isMultisampleTarget(target) && isSamplerStateTester(tester))
2438                 return false;
2439
2440         // no states in buffer
2441         if (target == GL_TEXTURE_BUFFER)
2442                 return false;
2443
2444         return true;
2445 }
2446
2447 bool isMultisampleTarget (glw::GLenum target)
2448 {
2449         return  target == GL_TEXTURE_2D_MULTISAMPLE                     ||
2450                         target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY;
2451 }
2452
2453 bool isSamplerStateTester (TesterType tester)
2454 {
2455         return  tester == TESTER_TEXTURE_WRAP_S                                 ||
2456                         tester == TESTER_TEXTURE_WRAP_T                                 ||
2457                         tester == TESTER_TEXTURE_WRAP_R                                 ||
2458                         tester == TESTER_TEXTURE_MAG_FILTER                             ||
2459                         tester == TESTER_TEXTURE_MIN_FILTER                             ||
2460                         tester == TESTER_TEXTURE_MIN_LOD                                ||
2461                         tester == TESTER_TEXTURE_MAX_LOD                                ||
2462                         tester == TESTER_TEXTURE_COMPARE_MODE                   ||
2463                         tester == TESTER_TEXTURE_COMPARE_FUNC                   ||
2464                         tester == TESTER_TEXTURE_SRGB_DECODE_EXT                ||
2465                         tester == TESTER_TEXTURE_BORDER_COLOR                   ||
2466                         tester == TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER ||
2467                         tester == TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER ||
2468                         tester == TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER;
2469 }
2470
2471 tcu::TestCase* createIsTextureTest (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const std::string& name, const std::string& description, glw::GLenum target)
2472 {
2473         return new IsTextureCase(testCtx, renderCtx, name.c_str(), description.c_str(), target);
2474 }
2475
2476 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)
2477 {
2478         if (isMultisampleTarget(target) && isSamplerStateTester(tester))
2479         {
2480                 DE_FATAL("Multisample textures have no sampler state");
2481                 return DE_NULL;
2482         }
2483         if (target == GL_TEXTURE_BUFFER)
2484         {
2485                 DE_FATAL("Buffer textures have no texture state");
2486                 return DE_NULL;
2487         }
2488         if (target != GL_TEXTURE_3D && mapTesterToPname(tester) == GL_TEXTURE_WRAP_R)
2489         {
2490                 DE_FATAL("Only 3D textures have wrap r filter");
2491                 return DE_NULL;
2492         }
2493
2494 #define CASE_ALL_SETTERS(X) case X: case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT
2495
2496         switch (tester)
2497         {
2498                 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_R):
2499                 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_G):
2500                 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_B):
2501                 CASE_ALL_SETTERS(TESTER_TEXTURE_SWIZZLE_A):
2502                         return new TextureSwizzleCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2503
2504                 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S):
2505                 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T):
2506                 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R):
2507                         return new TextureWrapCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2508
2509                 CASE_ALL_SETTERS(TESTER_TEXTURE_MAG_FILTER):
2510                 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_FILTER):
2511                         return new TextureFilterCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2512
2513                 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_LOD):
2514                 CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LOD):
2515                         return new TextureLODCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2516
2517                 CASE_ALL_SETTERS(TESTER_TEXTURE_BASE_LEVEL):
2518                 CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LEVEL):
2519                         return new TextureLevelCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2520
2521                 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE):
2522                         return new TextureCompareModeCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2523
2524                 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC):
2525                         return new TextureCompareFuncCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2526
2527                 case TESTER_TEXTURE_IMMUTABLE_LEVELS:
2528                         return new TextureImmutableLevelsCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, queryType);
2529
2530                 case TESTER_TEXTURE_IMMUTABLE_FORMAT:
2531                         return new TextureImmutableFormatCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, queryType);
2532
2533                 case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER:
2534                 case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER:
2535                 case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER:
2536                         return new TextureWrapClampToBorderCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2537
2538                 CASE_ALL_SETTERS(TESTER_DEPTH_STENCIL_TEXTURE_MODE):
2539                         return new DepthStencilModeCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2540
2541                 CASE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT):
2542                         return new TextureSRGBDecodeCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, tester, queryType);
2543
2544                 case TESTER_TEXTURE_BORDER_COLOR:
2545                         return new TextureBorderColorCase(testCtx, renderCtx, name.c_str(), description.c_str(), target, queryType);
2546
2547                 default:
2548                         break;
2549         }
2550
2551 #undef CASE_ALL_SETTERS
2552
2553         DE_ASSERT(false);
2554         return DE_NULL;
2555 }
2556
2557 tcu::TestCase* createSamplerParamTest (tcu::TestContext& testCtx, const glu::RenderContext& renderCtx, const std::string& name, const std::string& description, StateQueryUtil::QueryType queryType, TesterType tester)
2558 {
2559 #define CASE_ALL_SETTERS(X) case X: case X ## _SET_PURE_INT: case X ## _SET_PURE_UINT
2560
2561         switch (tester)
2562         {
2563                 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_S):
2564                 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_T):
2565                 CASE_ALL_SETTERS(TESTER_TEXTURE_WRAP_R):
2566                         return new SamplerWrapCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2567
2568                 CASE_ALL_SETTERS(TESTER_TEXTURE_MAG_FILTER):
2569                 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_FILTER):
2570                         return new SamplerFilterCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2571
2572                 CASE_ALL_SETTERS(TESTER_TEXTURE_MIN_LOD):
2573                 CASE_ALL_SETTERS(TESTER_TEXTURE_MAX_LOD):
2574                         return new SamplerLODCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2575
2576                 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_MODE):
2577                         return new SamplerCompareModeCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2578
2579                 CASE_ALL_SETTERS(TESTER_TEXTURE_COMPARE_FUNC):
2580                         return new SamplerCompareFuncCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2581
2582                 case TESTER_TEXTURE_WRAP_S_CLAMP_TO_BORDER:
2583                 case TESTER_TEXTURE_WRAP_T_CLAMP_TO_BORDER:
2584                 case TESTER_TEXTURE_WRAP_R_CLAMP_TO_BORDER:
2585                         return new SamplerWrapClampToBorderCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2586
2587                 CASE_ALL_SETTERS(TESTER_TEXTURE_SRGB_DECODE_EXT):
2588                         return new SamplerSRGBDecodeCase(testCtx, renderCtx, name.c_str(), description.c_str(), tester, queryType);
2589
2590                 case TESTER_TEXTURE_BORDER_COLOR:
2591                         return new SamplerBorderColorCase(testCtx, renderCtx, name.c_str(), description.c_str(), queryType);
2592
2593                 default:
2594                         break;
2595         }
2596
2597 #undef CASE_ALL_SETTERS
2598
2599         DE_ASSERT(false);
2600         return DE_NULL;
2601 }
2602
2603 } // TextureStateQueryTests
2604 } // gls
2605 } // deqp