glsStateQueryUtil.cpp revision c423ce6164cdd88c8c3e47bec4ec34476743042a
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 State Query test utils.
22 *//*--------------------------------------------------------------------*/
23#include "glsStateQueryUtil.hpp"
24#include "tcuTestContext.hpp"
25#include "tcuFormatUtil.hpp"
26#include "gluCallLogWrapper.hpp"
27#include "gluStrUtil.hpp"
28#include "glwEnums.hpp"
29#include "deStringUtil.hpp"
30
31namespace deqp
32{
33namespace gls
34{
35namespace StateQueryUtil
36{
37
38static bool checkError (tcu::ResultCollector& result, glu::CallLogWrapper& gl, const char* msg)
39{
40	const glw::GLenum errorCode = gl.glGetError();
41
42	if (errorCode == GL_NO_ERROR)
43		return true;
44
45	result.fail(std::string(msg) + ": glGetError() returned " + glu::getErrorStr(errorCode).toString());
46	return false;
47}
48
49QueriedState::QueriedState (void)
50	: m_type(DATATYPE_LAST)
51{
52}
53
54QueriedState::QueriedState (glw::GLint v)
55	: m_type(DATATYPE_INTEGER)
56{
57	m_v.vInt = v;
58}
59
60QueriedState::QueriedState (glw::GLint64 v)
61	: m_type(DATATYPE_INTEGER64)
62{
63	m_v.vInt64 = v;
64}
65
66QueriedState::QueriedState (bool v)
67	: m_type(DATATYPE_BOOLEAN)
68{
69	m_v.vBool = v;
70}
71
72QueriedState::QueriedState (glw::GLfloat v)
73	: m_type(DATATYPE_FLOAT)
74{
75	m_v.vFloat = v;
76}
77
78QueriedState::QueriedState (glw::GLuint v)
79	: m_type(DATATYPE_UNSIGNED_INTEGER)
80{
81	m_v.vUint = v;
82}
83
84QueriedState::QueriedState (const GLIntVec3& v)
85	: m_type(DATATYPE_INTEGER_VEC3)
86{
87	m_v.vIntVec3[0] = v[0];
88	m_v.vIntVec3[1] = v[1];
89	m_v.vIntVec3[2] = v[2];
90}
91
92QueriedState::QueriedState (void* v)
93	: m_type(DATATYPE_POINTER)
94{
95	m_v.vPtr = v;
96}
97
98QueriedState::QueriedState (const GLIntVec4& v)
99	: m_type(DATATYPE_INTEGER_VEC4)
100{
101	m_v.vIntVec4[0] = v[0];
102	m_v.vIntVec4[1] = v[1];
103	m_v.vIntVec4[2] = v[2];
104	m_v.vIntVec4[3] = v[3];
105}
106
107QueriedState::QueriedState (const GLUintVec4& v)
108	: m_type(DATATYPE_UNSIGNED_INTEGER_VEC4)
109{
110	m_v.vUintVec4[0] = v[0];
111	m_v.vUintVec4[1] = v[1];
112	m_v.vUintVec4[2] = v[2];
113	m_v.vUintVec4[3] = v[3];
114}
115
116QueriedState::QueriedState (const GLFloatVec4& v)
117	: m_type(DATATYPE_FLOAT_VEC4)
118{
119	m_v.vFloatVec4[0] = v[0];
120	m_v.vFloatVec4[1] = v[1];
121	m_v.vFloatVec4[2] = v[2];
122	m_v.vFloatVec4[3] = v[3];
123}
124
125bool QueriedState::isUndefined (void) const
126{
127	return m_type == DATATYPE_LAST;
128}
129
130DataType QueriedState::getType (void) const
131{
132	return m_type;
133}
134
135glw::GLint& QueriedState::getIntAccess (void)
136{
137	DE_ASSERT(m_type == DATATYPE_INTEGER);
138	return m_v.vInt;
139}
140
141glw::GLint64& QueriedState::getInt64Access (void)
142{
143	DE_ASSERT(m_type == DATATYPE_INTEGER64);
144	return m_v.vInt64;
145}
146
147bool& QueriedState::getBoolAccess (void)
148{
149	DE_ASSERT(m_type == DATATYPE_BOOLEAN);
150	return m_v.vBool;
151}
152
153glw::GLfloat& QueriedState::getFloatAccess (void)
154{
155	DE_ASSERT(m_type == DATATYPE_FLOAT);
156	return m_v.vFloat;
157}
158
159glw::GLuint& QueriedState::getUintAccess (void)
160{
161	DE_ASSERT(m_type == DATATYPE_UNSIGNED_INTEGER);
162	return m_v.vUint;
163}
164
165QueriedState::GLIntVec3& QueriedState::getIntVec3Access (void)
166{
167	DE_ASSERT(m_type == DATATYPE_INTEGER_VEC3);
168	return m_v.vIntVec3;
169}
170
171void*& QueriedState::getPtrAccess (void)
172{
173	DE_ASSERT(m_type == DATATYPE_POINTER);
174	return m_v.vPtr;
175}
176
177QueriedState::GLIntVec4& QueriedState::getIntVec4Access (void)
178{
179	DE_ASSERT(m_type == DATATYPE_INTEGER_VEC4);
180	return m_v.vIntVec4;
181}
182
183QueriedState::GLUintVec4& QueriedState::getUintVec4Access (void)
184{
185	DE_ASSERT(m_type == DATATYPE_UNSIGNED_INTEGER_VEC4);
186	return m_v.vUintVec4;
187}
188
189QueriedState::GLFloatVec4& QueriedState::getFloatVec4Access (void)
190{
191	DE_ASSERT(m_type == DATATYPE_FLOAT_VEC4);
192	return m_v.vFloatVec4;
193}
194
195// query
196
197static bool verifyBooleanValidity (tcu::ResultCollector& result, glw::GLboolean v)
198{
199	if (v == GL_TRUE || v == GL_FALSE)
200		return true;
201	else
202	{
203		std::ostringstream buf;
204		buf << "Boolean value was not neither GL_TRUE nor GL_FALSE, got " << de::toString(tcu::Format::Hex<2>(v));
205		result.fail(buf.str());
206		return false;
207	}
208}
209
210void queryState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum target, QueriedState& state)
211{
212	switch (type)
213	{
214		case QUERY_ISENABLED:
215		{
216			const glw::GLboolean value = gl.glIsEnabled(target);
217
218			if (!checkError(result, gl, "glIsEnabled"))
219				return;
220
221			if (!verifyBooleanValidity(result, value))
222				return;
223
224			state = QueriedState(value == GL_TRUE);
225			break;
226		}
227
228		case QUERY_BOOLEAN:
229		{
230			StateQueryMemoryWriteGuard<glw::GLboolean> value;
231			gl.glGetBooleanv(target, &value);
232
233			if (!checkError(result, gl, "glGetBooleanv"))
234				return;
235
236			if (!value.verifyValidity(result))
237				return;
238			if (!verifyBooleanValidity(result, value))
239				return;
240
241			state = QueriedState(value == GL_TRUE);
242			break;
243		}
244
245		case QUERY_INTEGER:
246		{
247			StateQueryMemoryWriteGuard<glw::GLint> value;
248			gl.glGetIntegerv(target, &value);
249
250			if (!checkError(result, gl, "glGetIntegerv"))
251				return;
252
253			if (!value.verifyValidity(result))
254				return;
255
256			state = QueriedState(value);
257			break;
258		}
259
260		case QUERY_INTEGER64:
261		{
262			StateQueryMemoryWriteGuard<glw::GLint64> value;
263			gl.glGetInteger64v(target, &value);
264
265			if (!checkError(result, gl, "glGetInteger64v"))
266				return;
267
268			if (!value.verifyValidity(result))
269				return;
270
271			state = QueriedState(value);
272			break;
273		}
274
275		case QUERY_FLOAT:
276		{
277			StateQueryMemoryWriteGuard<glw::GLfloat> value;
278			gl.glGetFloatv(target, &value);
279
280			if (!checkError(result, gl, "glGetFloatv"))
281				return;
282
283			if (!value.verifyValidity(result))
284				return;
285
286			state = QueriedState(value);
287			break;
288		}
289
290		default:
291			DE_ASSERT(DE_FALSE);
292			break;
293	}
294}
295
296void queryIndexedState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum target, int index, QueriedState& state)
297{
298	switch (type)
299	{
300		case QUERY_INDEXED_BOOLEAN:
301		{
302			StateQueryMemoryWriteGuard<glw::GLboolean> value;
303			gl.glGetBooleani_v(target, index, &value);
304
305			if (!checkError(result, gl, "glGetBooleani_v"))
306				return;
307
308			if (!value.verifyValidity(result))
309				return;
310			if (!verifyBooleanValidity(result, value))
311				return;
312
313			state = QueriedState(value == GL_TRUE);
314			break;
315		}
316
317		case QUERY_INDEXED_INTEGER:
318		{
319			StateQueryMemoryWriteGuard<glw::GLint> value;
320			gl.glGetIntegeri_v(target, index, &value);
321
322			if (!checkError(result, gl, "glGetIntegeri_v"))
323				return;
324
325			if (!value.verifyValidity(result))
326				return;
327
328			state = QueriedState(value);
329			break;
330		}
331
332		case QUERY_INDEXED_INTEGER64:
333		{
334			StateQueryMemoryWriteGuard<glw::GLint64> value;
335			gl.glGetInteger64i_v(target, index, &value);
336
337			if (!checkError(result, gl, "glGetInteger64i_v"))
338				return;
339
340			if (!value.verifyValidity(result))
341				return;
342
343			state = QueriedState(value);
344			break;
345		}
346
347		default:
348			DE_ASSERT(DE_FALSE);
349			break;
350	}
351}
352
353void queryAttributeState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum target, int index, QueriedState& state)
354{
355	switch (type)
356	{
357		case QUERY_ATTRIBUTE_INTEGER:
358		{
359			StateQueryMemoryWriteGuard<glw::GLint> value;
360			gl.glGetVertexAttribiv(index, target, &value);
361
362			if (!checkError(result, gl, "glGetVertexAttribiv"))
363				return;
364
365			if (!value.verifyValidity(result))
366				return;
367
368			state = QueriedState(value);
369			break;
370		}
371		case QUERY_ATTRIBUTE_FLOAT:
372		{
373			StateQueryMemoryWriteGuard<glw::GLfloat> value;
374			gl.glGetVertexAttribfv(index, target, &value);
375
376			if (!checkError(result, gl, "glGetVertexAttribfv"))
377				return;
378
379			if (!value.verifyValidity(result))
380				return;
381
382			state = QueriedState(value);
383			break;
384		}
385		case QUERY_ATTRIBUTE_PURE_INTEGER:
386		{
387			StateQueryMemoryWriteGuard<glw::GLint> value;
388			gl.glGetVertexAttribIiv(index, target, &value);
389
390			if (!checkError(result, gl, "glGetVertexAttribIiv"))
391				return;
392
393			if (!value.verifyValidity(result))
394				return;
395
396			state = QueriedState(value);
397			break;
398		}
399		case QUERY_ATTRIBUTE_PURE_UNSIGNED_INTEGER:
400		{
401			StateQueryMemoryWriteGuard<glw::GLuint> value;
402			gl.glGetVertexAttribIuiv(index, target, &value);
403
404			if (!checkError(result, gl, "glGetVertexAttribIuiv"))
405				return;
406
407			if (!value.verifyValidity(result))
408				return;
409
410			state = QueriedState(value);
411			break;
412		}
413		default:
414			DE_ASSERT(false);
415	}
416}
417
418void queryFramebufferState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum target, glw::GLenum pname, QueriedState& state)
419{
420	switch (type)
421	{
422		case QUERY_FRAMEBUFFER_INTEGER:
423		{
424			StateQueryMemoryWriteGuard<glw::GLint> value;
425			gl.glGetFramebufferParameteriv(target, pname, &value);
426
427			if (!checkError(result, gl, "glGetVertexAttribiv"))
428				return;
429
430			if (!value.verifyValidity(result))
431				return;
432
433			state = QueriedState(value);
434			break;
435		}
436		default:
437			DE_ASSERT(false);
438	}
439}
440
441void queryProgramState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLuint program, glw::GLenum pname, QueriedState& state)
442{
443	switch (type)
444	{
445		case QUERY_PROGRAM_INTEGER:
446		{
447			StateQueryMemoryWriteGuard<glw::GLint> value;
448			gl.glGetProgramiv(program, pname, &value);
449
450			if (!checkError(result, gl, "glGetProgramiv"))
451				return;
452
453			if (!value.verifyValidity(result))
454				return;
455
456			state = QueriedState(value);
457			break;
458		}
459		case QUERY_PROGRAM_INTEGER_VEC3:
460		{
461			StateQueryMemoryWriteGuard<glw::GLint[3]> value;
462			gl.glGetProgramiv(program, pname, value);
463
464			if (!checkError(result, gl, "glGetProgramiv"))
465				return;
466
467			if (!value.verifyValidity(result))
468				return;
469
470			state = QueriedState(value);
471			break;
472		}
473		default:
474			DE_ASSERT(false);
475	}
476}
477
478void queryPipelineState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLuint pipeline, glw::GLenum pname, QueriedState& state)
479{
480	switch (type)
481	{
482		case QUERY_PIPELINE_INTEGER:
483		{
484			StateQueryMemoryWriteGuard<glw::GLint> value;
485			gl.glGetProgramPipelineiv(pipeline, pname, &value);
486
487			if (!checkError(result, gl, "glGetProgramiv"))
488				return;
489
490			if (!value.verifyValidity(result))
491				return;
492
493			state = QueriedState(value);
494			break;
495		}
496		default:
497			DE_ASSERT(false);
498	}
499}
500
501void queryTextureParamState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum target, glw::GLenum pname, QueriedState& state)
502{
503	switch (type)
504	{
505		case QUERY_TEXTURE_PARAM_INTEGER:
506		{
507			StateQueryMemoryWriteGuard<glw::GLint> value;
508			gl.glGetTexParameteriv(target, pname, &value);
509
510			if (!checkError(result, gl, "glGetTexParameteriv"))
511				return;
512
513			if (!value.verifyValidity(result))
514				return;
515
516			state = QueriedState(value);
517			break;
518		}
519		case QUERY_TEXTURE_PARAM_FLOAT:
520		{
521			StateQueryMemoryWriteGuard<glw::GLfloat> value;
522			gl.glGetTexParameterfv(target, pname, &value);
523
524			if (!checkError(result, gl, "glGetTexParameterfv"))
525				return;
526
527			if (!value.verifyValidity(result))
528				return;
529
530			state = QueriedState(value);
531			break;
532		}
533		case QUERY_TEXTURE_PARAM_PURE_INTEGER:
534		{
535			StateQueryMemoryWriteGuard<glw::GLint> value;
536			gl.glGetTexParameterIiv(target, pname, &value);
537
538			if (!checkError(result, gl, "GetTexParameterIiv"))
539				return;
540
541			if (!value.verifyValidity(result))
542				return;
543
544			state = QueriedState(value);
545			break;
546		}
547		case QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER:
548		{
549			StateQueryMemoryWriteGuard<glw::GLuint> value;
550			gl.glGetTexParameterIuiv(target, pname, &value);
551
552			if (!checkError(result, gl, "GetTexParameterIuiv"))
553				return;
554
555			if (!value.verifyValidity(result))
556				return;
557
558			state = QueriedState(value);
559			break;
560		}
561		case QUERY_TEXTURE_PARAM_INTEGER_VEC4:
562		{
563			StateQueryMemoryWriteGuard<glw::GLint[4]> value;
564			gl.glGetTexParameteriv(target, pname, value);
565
566			if (!checkError(result, gl, "glGetTexParameteriv"))
567				return;
568
569			if (!value.verifyValidity(result))
570				return;
571
572			state = QueriedState(value);
573			break;
574		}
575		case QUERY_TEXTURE_PARAM_FLOAT_VEC4:
576		{
577			StateQueryMemoryWriteGuard<glw::GLfloat[4]> value;
578			gl.glGetTexParameterfv(target, pname, value);
579
580			if (!checkError(result, gl, "glGetTexParameterfv"))
581				return;
582
583			if (!value.verifyValidity(result))
584				return;
585
586			state = QueriedState(value);
587			break;
588		}
589		case QUERY_TEXTURE_PARAM_PURE_INTEGER_VEC4:
590		{
591			StateQueryMemoryWriteGuard<glw::GLint[4]> value;
592			gl.glGetTexParameterIiv(target, pname, value);
593
594			if (!checkError(result, gl, "GetTexParameterIiv"))
595				return;
596
597			if (!value.verifyValidity(result))
598				return;
599
600			state = QueriedState(value);
601			break;
602		}
603		case QUERY_TEXTURE_PARAM_PURE_UNSIGNED_INTEGER_VEC4:
604		{
605			StateQueryMemoryWriteGuard<glw::GLuint[4]> value;
606			gl.glGetTexParameterIuiv(target, pname, value);
607
608			if (!checkError(result, gl, "GetTexParameterIuiv"))
609				return;
610
611			if (!value.verifyValidity(result))
612				return;
613
614			state = QueriedState(value);
615			break;
616		}
617		default:
618			DE_ASSERT(false);
619	}
620}
621
622void queryTextureLevelState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum target, int level, glw::GLenum pname, QueriedState& state)
623{
624	switch (type)
625	{
626		case QUERY_TEXTURE_LEVEL_INTEGER:
627		{
628			StateQueryMemoryWriteGuard<glw::GLint> value;
629			gl.glGetTexLevelParameteriv(target, level, pname, &value);
630
631			if (!checkError(result, gl, "glGetTexLevelParameteriv"))
632				return;
633
634			if (!value.verifyValidity(result))
635				return;
636
637			state = QueriedState(value);
638			break;
639		}
640		case QUERY_TEXTURE_LEVEL_FLOAT:
641		{
642			StateQueryMemoryWriteGuard<glw::GLfloat> value;
643			gl.glGetTexLevelParameterfv(target, level, pname, &value);
644
645			if (!checkError(result, gl, "glGetTexLevelParameterfv"))
646				return;
647
648			if (!value.verifyValidity(result))
649				return;
650
651			state = QueriedState(value);
652			break;
653		}
654		default:
655			DE_ASSERT(false);
656	}
657}
658
659void queryPointerState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum pname, QueriedState& state)
660{
661	switch (type)
662	{
663		case QUERY_POINTER:
664		{
665			StateQueryMemoryWriteGuard<void*> value;
666			gl.glGetPointerv(pname, &value);
667
668			if (!checkError(result, gl, "glGetPointerv"))
669				return;
670
671			if (!value.verifyValidity(result))
672				return;
673
674			state = QueriedState(value);
675			break;
676		}
677		default:
678			DE_ASSERT(false);
679	}
680}
681
682void queryObjectState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLuint handle, QueriedState& state)
683{
684	switch (type)
685	{
686		case QUERY_ISTEXTURE:
687		{
688			const glw::GLboolean value = gl.glIsTexture(handle);
689
690			if (!checkError(result, gl, "glIsTexture"))
691				return;
692
693			if (!verifyBooleanValidity(result, value))
694				return;
695
696			state = QueriedState(value == GL_TRUE);
697			break;
698		}
699		default:
700			DE_ASSERT(false);
701	}
702}
703
704void queryQueryState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLenum target, glw::GLenum pname, QueriedState& state)
705{
706	switch (type)
707	{
708		case QUERY_QUERY:
709		{
710			StateQueryMemoryWriteGuard<glw::GLint> value;
711			gl.glGetQueryiv(target, pname, &value);
712
713			if (!checkError(result, gl, "glGetQueryiv"))
714				return;
715
716			if (!value.verifyValidity(result))
717				return;
718
719			state = QueriedState(value);
720			break;
721		}
722		default:
723			DE_ASSERT(false);
724	}
725}
726
727void querySamplerState (tcu::ResultCollector& result, glu::CallLogWrapper& gl, QueryType type, glw::GLuint sampler, glw::GLenum pname, QueriedState& state)
728{
729	switch (type)
730	{
731		case QUERY_SAMPLER_PARAM_INTEGER:
732		{
733			StateQueryMemoryWriteGuard<glw::GLint> value;
734			gl.glGetSamplerParameteriv(sampler, pname, &value);
735
736			if (!checkError(result, gl, "glGetSamplerParameteriv"))
737				return;
738
739			if (!value.verifyValidity(result))
740				return;
741
742			state = QueriedState(value);
743			break;
744		}
745		case QUERY_SAMPLER_PARAM_FLOAT:
746		{
747			StateQueryMemoryWriteGuard<glw::GLfloat> value;
748			gl.glGetSamplerParameterfv(sampler, pname, &value);
749
750			if (!checkError(result, gl, "glGetSamplerParameteriv"))
751				return;
752
753			if (!value.verifyValidity(result))
754				return;
755
756			state = QueriedState(value);
757			break;
758		}
759		case QUERY_SAMPLER_PARAM_PURE_INTEGER:
760		{
761			StateQueryMemoryWriteGuard<glw::GLint> value;
762			gl.glGetSamplerParameterIiv(sampler, pname, &value);
763
764			if (!checkError(result, gl, "glGetSamplerParameterIiv"))
765				return;
766
767			if (!value.verifyValidity(result))
768				return;
769
770			state = QueriedState(value);
771			break;
772		}
773		case QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER:
774		{
775			StateQueryMemoryWriteGuard<glw::GLuint> value;
776			gl.glGetSamplerParameterIuiv(sampler, pname, &value);
777
778			if (!checkError(result, gl, "glGetSamplerParameterIuiv"))
779				return;
780
781			if (!value.verifyValidity(result))
782				return;
783
784			state = QueriedState(value);
785			break;
786		}
787		case QUERY_SAMPLER_PARAM_INTEGER_VEC4:
788		{
789			StateQueryMemoryWriteGuard<glw::GLint[4]> value;
790			gl.glGetSamplerParameteriv(sampler, pname, value);
791
792			if (!checkError(result, gl, "glGetSamplerParameteriv"))
793				return;
794
795			if (!value.verifyValidity(result))
796				return;
797
798			state = QueriedState(value);
799			break;
800		}
801		case QUERY_SAMPLER_PARAM_FLOAT_VEC4:
802		{
803			StateQueryMemoryWriteGuard<glw::GLfloat[4]> value;
804			gl.glGetSamplerParameterfv(sampler, pname, value);
805
806			if (!checkError(result, gl, "glGetSamplerParameteriv"))
807				return;
808
809			if (!value.verifyValidity(result))
810				return;
811
812			state = QueriedState(value);
813			break;
814		}
815		case QUERY_SAMPLER_PARAM_PURE_INTEGER_VEC4:
816		{
817			StateQueryMemoryWriteGuard<glw::GLint[4]> value;
818			gl.glGetSamplerParameterIiv(sampler, pname, value);
819
820			if (!checkError(result, gl, "glGetSamplerParameterIiv"))
821				return;
822
823			if (!value.verifyValidity(result))
824				return;
825
826			state = QueriedState(value);
827			break;
828		}
829		case QUERY_SAMPLER_PARAM_PURE_UNSIGNED_INTEGER_VEC4:
830		{
831			StateQueryMemoryWriteGuard<glw::GLuint[4]> value;
832			gl.glGetSamplerParameterIuiv(sampler, pname, value);
833
834			if (!checkError(result, gl, "glGetSamplerParameterIuiv"))
835				return;
836
837			if (!value.verifyValidity(result))
838				return;
839
840			state = QueriedState(value);
841			break;
842		}
843		default:
844			DE_ASSERT(false);
845	}
846}
847
848// verify
849
850static const char* getGLBooleanStr (bool v)
851{
852	return (v) ? ("GL_TRUE") : ("GL_FALSE");
853}
854
855void verifyBoolean (tcu::ResultCollector& result, QueriedState& state, bool expected)
856{
857	switch (state.getType())
858	{
859		case DATATYPE_BOOLEAN:
860		{
861			if (state.getBoolAccess() != expected)
862			{
863				std::ostringstream buf;
864				buf << "Expected " << getGLBooleanStr(expected) << ", got " << getGLBooleanStr(state.getBoolAccess());
865				result.fail(buf.str());
866			}
867			break;
868		}
869
870		case DATATYPE_INTEGER:
871		{
872			const glw::GLint reference = expected ? 1 : 0;
873			if (state.getIntAccess() != reference)
874			{
875				std::ostringstream buf;
876				buf << "Expected " << reference << ", got " << state.getIntAccess();
877				result.fail(buf.str());
878			}
879			break;
880		}
881
882		case DATATYPE_INTEGER64:
883		{
884			const glw::GLint64 reference = expected ? 1 : 0;
885			if (state.getInt64Access() != reference)
886			{
887				std::ostringstream buf;
888				buf << "Expected " << reference << ", got " << state.getInt64Access();
889				result.fail(buf.str());
890			}
891			break;
892		}
893
894		case DATATYPE_FLOAT:
895		{
896			const glw::GLfloat reference = expected ? 1.0f : 0.0f;
897			if (state.getFloatAccess() != reference)
898			{
899				std::ostringstream buf;
900				buf << "Expected " << reference << ", got " << state.getFloatAccess();
901				result.fail(buf.str());
902			}
903			break;
904		}
905
906		default:
907			DE_ASSERT(DE_FALSE);
908			break;
909	}
910}
911
912void verifyInteger (tcu::ResultCollector& result, QueriedState& state, int expected)
913{
914	switch (state.getType())
915	{
916		case DATATYPE_BOOLEAN:
917		{
918			const bool reference = (expected != 0);
919			if (state.getBoolAccess() != reference)
920			{
921				std::ostringstream buf;
922				buf << "Expected " << getGLBooleanStr(reference) << ", got " << getGLBooleanStr(state.getBoolAccess());
923				result.fail(buf.str());
924			}
925			break;
926		}
927
928		case DATATYPE_INTEGER:
929		{
930			const glw::GLint reference = expected;
931			if (state.getIntAccess() != reference)
932			{
933				std::ostringstream buf;
934				buf << "Expected " << reference << "(" << de::toString(tcu::Format::Hex<8>(reference))
935					<< ") , got " << state.getIntAccess() << "(" << de::toString(tcu::Format::Hex<8>(state.getIntAccess())) << ")";
936				result.fail(buf.str());
937			}
938			break;
939		}
940
941		case DATATYPE_INTEGER64:
942		{
943			const glw::GLint64 reference = (glw::GLint64)expected;
944			if (state.getInt64Access() != reference)
945			{
946				std::ostringstream buf;
947				buf << "Expected " << reference << "(" << de::toString(tcu::Format::Hex<8>(reference)) << "), got "
948					<< state.getInt64Access() << "(" << de::toString(tcu::Format::Hex<8>(state.getInt64Access())) << ")";
949				result.fail(buf.str());
950			}
951			break;
952		}
953
954		case DATATYPE_FLOAT:
955		{
956			const glw::GLint64 reference = (glw::GLfloat)expected;
957			if (state.getFloatAccess() != reference)
958			{
959				std::ostringstream buf;
960				buf << "Expected " << reference << ", got " << state.getFloatAccess();
961				result.fail(buf.str());
962			}
963			break;
964		}
965
966		case DATATYPE_UNSIGNED_INTEGER:
967		{
968			const glw::GLuint reference = (glw::GLuint)expected;
969			if (state.getUintAccess() != reference)
970			{
971				std::ostringstream buf;
972				buf << "Expected " << reference << "(" << de::toString(tcu::Format::Hex<8>(reference)) << "), got "
973					<< state.getInt64Access() << "(" << de::toString(tcu::Format::Hex<8>(state.getInt64Access())) << ")";
974				result.fail(buf.str());
975			}
976			break;
977		}
978
979		default:
980			DE_ASSERT(DE_FALSE);
981			break;
982	}
983}
984
985void verifyIntegerMin (tcu::ResultCollector& result, QueriedState& state, int minValue)
986{
987	switch (state.getType())
988	{
989		case DATATYPE_BOOLEAN:
990		{
991			if (minValue > 0 && state.getBoolAccess() != true)
992			{
993				std::ostringstream buf;
994				buf << "Expected GL_TRUE, got GL_FALSE";
995				result.fail(buf.str());
996			}
997			break;
998		}
999
1000		case DATATYPE_INTEGER:
1001		{
1002			if (state.getIntAccess() < minValue)
1003			{
1004				std::ostringstream buf;
1005				buf << "Expected greater or equal to " << minValue << ", got " << state.getIntAccess();
1006				result.fail(buf.str());
1007			}
1008			break;
1009		}
1010
1011		case DATATYPE_INTEGER64:
1012		{
1013			if (state.getInt64Access() < minValue)
1014			{
1015				std::ostringstream buf;
1016				buf << "Expected greater or equal to " << minValue << ", got " << state.getInt64Access();
1017				result.fail(buf.str());
1018			}
1019			break;
1020		}
1021
1022		case DATATYPE_FLOAT:
1023		{
1024			if (state.getFloatAccess() < minValue)
1025			{
1026				std::ostringstream buf;
1027				buf << "Expected greater or equal to " << minValue << ", got " << state.getFloatAccess();
1028				result.fail(buf.str());
1029			}
1030			break;
1031		}
1032
1033		default:
1034			DE_ASSERT(DE_FALSE);
1035			break;
1036	}
1037}
1038
1039void verifyIntegerMax (tcu::ResultCollector& result, QueriedState& state, int maxValue)
1040{
1041	switch (state.getType())
1042	{
1043		case DATATYPE_BOOLEAN:
1044		{
1045			if (maxValue < 0 && state.getBoolAccess() != true)
1046			{
1047				std::ostringstream buf;
1048				buf << "Expected GL_TRUE, got GL_FALSE";
1049				result.fail(buf.str());
1050			}
1051			break;
1052		}
1053
1054		case DATATYPE_INTEGER:
1055		{
1056			if (state.getIntAccess() > maxValue)
1057			{
1058				std::ostringstream buf;
1059				buf << "Expected less or equal to " << maxValue << ", got " << state.getIntAccess();
1060				result.fail(buf.str());
1061			}
1062			break;
1063		}
1064
1065		case DATATYPE_INTEGER64:
1066		{
1067			if (state.getInt64Access() > maxValue)
1068			{
1069				std::ostringstream buf;
1070				buf << "Expected less or equal to " << maxValue << ", got " << state.getInt64Access();
1071				result.fail(buf.str());
1072			}
1073			break;
1074		}
1075
1076		case DATATYPE_FLOAT:
1077		{
1078			if (state.getFloatAccess() > maxValue)
1079			{
1080				std::ostringstream buf;
1081				buf << "Expected less or equal to " << maxValue << ", got " << state.getFloatAccess();
1082				result.fail(buf.str());
1083			}
1084			break;
1085		}
1086
1087		default:
1088			DE_ASSERT(DE_FALSE);
1089			break;
1090	}
1091}
1092
1093void verifyFloat (tcu::ResultCollector& result, QueriedState& state, float expected)
1094{
1095	switch (state.getType())
1096	{
1097		case DATATYPE_BOOLEAN:
1098		{
1099			const bool reference = (expected != 0.0f);
1100			if (state.getBoolAccess() != reference)
1101			{
1102				std::ostringstream buf;
1103				buf << "Expected " << getGLBooleanStr(reference) << ", got " << getGLBooleanStr(state.getBoolAccess());
1104				result.fail(buf.str());
1105			}
1106			break;
1107		}
1108
1109		case DATATYPE_INTEGER:
1110		{
1111			const glw::GLint refValueMin = roundGLfloatToNearestIntegerHalfDown<glw::GLint>(expected);
1112			const glw::GLint refValueMax = roundGLfloatToNearestIntegerHalfUp<glw::GLint>(expected);
1113
1114			if (state.getIntAccess() < refValueMin ||
1115				state.getIntAccess() > refValueMax)
1116			{
1117				std::ostringstream buf;
1118
1119				if (refValueMin == refValueMax)
1120					buf << "Expected " << refValueMin << ", got " << state.getIntAccess();
1121				else
1122					buf << "Expected in range [" << refValueMin << ", " << refValueMax << "], got " << state.getIntAccess();
1123
1124				result.fail(buf.str());
1125			}
1126			break;
1127		}
1128
1129		case DATATYPE_FLOAT:
1130		{
1131			if (state.getFloatAccess() != expected)
1132			{
1133				std::ostringstream buf;
1134				buf << "Expected " << expected << ", got " << state.getFloatAccess();
1135				result.fail(buf.str());
1136			}
1137			break;
1138		}
1139
1140		case DATATYPE_INTEGER64:
1141		{
1142			const glw::GLint64 refValueMin = roundGLfloatToNearestIntegerHalfDown<glw::GLint64>(expected);
1143			const glw::GLint64 refValueMax = roundGLfloatToNearestIntegerHalfUp<glw::GLint64>(expected);
1144
1145			if (state.getInt64Access() < refValueMin ||
1146				state.getInt64Access() > refValueMax)
1147			{
1148				std::ostringstream buf;
1149
1150				if (refValueMin == refValueMax)
1151					buf << "Expected " << refValueMin << ", got " << state.getInt64Access();
1152				else
1153					buf << "Expected in range [" << refValueMin << ", " << refValueMax << "], got " << state.getInt64Access();
1154
1155				result.fail(buf.str());
1156			}
1157			break;
1158		}
1159
1160		case DATATYPE_UNSIGNED_INTEGER:
1161		{
1162			const glw::GLuint refValueMin = roundGLfloatToNearestIntegerHalfDown<glw::GLuint>(expected);
1163			const glw::GLuint refValueMax = roundGLfloatToNearestIntegerHalfUp<glw::GLuint>(expected);
1164
1165			if (state.getUintAccess() < refValueMin ||
1166				state.getUintAccess() > refValueMax)
1167			{
1168				std::ostringstream buf;
1169
1170				if (refValueMin == refValueMax)
1171					buf << "Expected " << refValueMin << ", got " << state.getUintAccess();
1172				else
1173					buf << "Expected in range [" << refValueMin << ", " << refValueMax << "], got " << state.getUintAccess();
1174
1175				result.fail(buf.str());
1176			}
1177			break;
1178		}
1179
1180		default:
1181			DE_ASSERT(DE_FALSE);
1182			break;
1183	}
1184}
1185
1186void verifyFloatMin (tcu::ResultCollector& result, QueriedState& state, float minValue)
1187{
1188	switch (state.getType())
1189	{
1190		case DATATYPE_BOOLEAN:
1191		{
1192			if (minValue > 0.0f && state.getBoolAccess() != true)
1193				result.fail("expected GL_TRUE, got GL_FALSE");
1194			break;
1195		}
1196
1197		case DATATYPE_INTEGER:
1198		{
1199			const glw::GLint refValue = roundGLfloatToNearestIntegerHalfDown<glw::GLint>(minValue);
1200
1201			if (state.getIntAccess() < refValue)
1202			{
1203				std::ostringstream buf;
1204				buf << "Expected greater or equal to " << refValue << ", got " << state.getIntAccess();
1205				result.fail(buf.str());
1206			}
1207			break;
1208		}
1209
1210		case DATATYPE_FLOAT:
1211		{
1212			if (state.getFloatAccess() < minValue)
1213			{
1214				std::ostringstream buf;
1215				buf << "Expected greater or equal to " << minValue << ", got " << state.getFloatAccess();
1216				result.fail(buf.str());
1217			}
1218			break;
1219		}
1220
1221		case DATATYPE_INTEGER64:
1222		{
1223			const glw::GLint64 refValue = roundGLfloatToNearestIntegerHalfDown<glw::GLint64>(minValue);
1224
1225			if (state.getInt64Access() < refValue)
1226			{
1227				std::ostringstream buf;
1228				buf << "Expected greater or equal to " << refValue << ", got " << state.getInt64Access();
1229				result.fail(buf.str());
1230			}
1231			break;
1232		}
1233
1234		default:
1235			DE_ASSERT(DE_FALSE);
1236			break;
1237	}
1238}
1239
1240void verifyFloatMax (tcu::ResultCollector& result, QueriedState& state, float maxValue)
1241{
1242	switch (state.getType())
1243	{
1244		case DATATYPE_BOOLEAN:
1245		{
1246			if (maxValue < 0.0f && state.getBoolAccess() != true)
1247				result.fail("expected GL_TRUE, got GL_FALSE");
1248			break;
1249		}
1250
1251		case DATATYPE_INTEGER:
1252		{
1253			const glw::GLint refValue = roundGLfloatToNearestIntegerHalfUp<glw::GLint>(maxValue);
1254
1255			if (state.getIntAccess() > refValue)
1256			{
1257				std::ostringstream buf;
1258				buf << "Expected less or equal to " << refValue << ", got " << state.getIntAccess();
1259				result.fail(buf.str());
1260			}
1261			break;
1262		}
1263
1264		case DATATYPE_FLOAT:
1265		{
1266			if (state.getFloatAccess() > maxValue)
1267			{
1268				std::ostringstream buf;
1269				buf << "Expected less or equal to " << maxValue << ", got " << state.getFloatAccess();
1270				result.fail(buf.str());
1271			}
1272			break;
1273		}
1274
1275		case DATATYPE_INTEGER64:
1276		{
1277			const glw::GLint64 refValue = roundGLfloatToNearestIntegerHalfUp<glw::GLint64>(maxValue);
1278
1279			if (state.getInt64Access() > refValue)
1280			{
1281				std::ostringstream buf;
1282				buf << "Expected less or equal to " << refValue << ", got " << state.getInt64Access();
1283				result.fail(buf.str());
1284			}
1285			break;
1286		}
1287
1288		default:
1289			DE_ASSERT(DE_FALSE);
1290			break;
1291	}
1292}
1293
1294void verifyIntegerVec3 (tcu::ResultCollector& result, QueriedState& state, const tcu::IVec3& expected)
1295{
1296	switch (state.getType())
1297	{
1298		case DATATYPE_INTEGER_VEC3:
1299		{
1300			if (state.getIntVec3Access()[0] != expected[0] ||
1301				state.getIntVec3Access()[1] != expected[1] ||
1302				state.getIntVec3Access()[2] != expected[2])
1303			{
1304				std::ostringstream buf;
1305				buf << "Expected " << expected << ", got " << tcu::formatArray(state.getIntVec3Access());
1306				result.fail(buf.str());
1307			}
1308			break;
1309		}
1310
1311		default:
1312			DE_ASSERT(DE_FALSE);
1313			break;
1314	}
1315}
1316
1317void verifyIntegerVec4 (tcu::ResultCollector& result, QueriedState& state, const tcu::IVec4& expected)
1318{
1319	switch (state.getType())
1320	{
1321		case DATATYPE_INTEGER_VEC4:
1322		{
1323			if (state.getIntVec4Access()[0] != expected[0] ||
1324				state.getIntVec4Access()[1] != expected[1] ||
1325				state.getIntVec4Access()[2] != expected[2] ||
1326				state.getIntVec4Access()[3] != expected[3])
1327			{
1328				std::ostringstream buf;
1329				buf << "Expected " << expected << ", got " << tcu::formatArray(state.getIntVec4Access());
1330				result.fail(buf.str());
1331			}
1332			break;
1333		}
1334
1335		default:
1336			DE_ASSERT(DE_FALSE);
1337			break;
1338	}
1339}
1340
1341void verifyUnsignedIntegerVec4 (tcu::ResultCollector& result, QueriedState& state, const tcu::UVec4& expected)
1342{
1343	switch (state.getType())
1344	{
1345		case DATATYPE_UNSIGNED_INTEGER_VEC4:
1346		{
1347			if (state.getUintVec4Access()[0] != expected[0] ||
1348				state.getUintVec4Access()[1] != expected[1] ||
1349				state.getUintVec4Access()[2] != expected[2] ||
1350				state.getUintVec4Access()[3] != expected[3])
1351			{
1352				std::ostringstream buf;
1353				buf << "Expected " << expected << ", got " << tcu::formatArray(state.getUintVec4Access());
1354				result.fail(buf.str());
1355			}
1356			break;
1357		}
1358
1359		default:
1360			DE_ASSERT(DE_FALSE);
1361			break;
1362	}
1363}
1364
1365void verifyFloatVec4 (tcu::ResultCollector& result, QueriedState& state, const tcu::Vec4& expected)
1366{
1367	switch (state.getType())
1368	{
1369		case DATATYPE_FLOAT_VEC4:
1370		{
1371			if (state.getFloatVec4Access()[0] != expected[0] ||
1372				state.getFloatVec4Access()[1] != expected[1] ||
1373				state.getFloatVec4Access()[2] != expected[2] ||
1374				state.getFloatVec4Access()[3] != expected[3])
1375			{
1376				std::ostringstream buf;
1377				buf << "Expected " << expected << ", got " << tcu::formatArray(state.getFloatVec4Access());
1378				result.fail(buf.str());
1379			}
1380			break;
1381		}
1382		case DATATYPE_INTEGER_VEC4:
1383		{
1384			bool				anyError = false;
1385			std::ostringstream	expectation;
1386
1387			for (int ndx = 0; ndx < 4; ++ndx)
1388			{
1389				const glw::GLint refValueMin = roundGLfloatToNearestIntegerHalfDown<glw::GLint>(expected[ndx]);
1390				const glw::GLint refValueMax = roundGLfloatToNearestIntegerHalfUp<glw::GLint>(expected[ndx]);
1391
1392				if (state.getIntVec4Access()[ndx] < refValueMin ||
1393					state.getIntVec4Access()[ndx] > refValueMax)
1394				{
1395					std::ostringstream buf;
1396
1397					if (ndx > 0)
1398						expectation << " ,";
1399
1400					if (refValueMin == refValueMax)
1401						buf << refValueMin;
1402					else
1403						buf << "[" << refValueMin << ", " << refValueMax << "]";
1404				}
1405			}
1406
1407			if (anyError)
1408			{
1409				std::ostringstream buf;
1410				buf << "Expected {" << expectation.str() << "}, got " << tcu::formatArray(state.getIntVec4Access());
1411				result.fail(buf.str());
1412			}
1413			break;
1414		}
1415		case DATATYPE_UNSIGNED_INTEGER_VEC4:
1416		{
1417			bool				anyError = false;
1418			std::ostringstream	expectation;
1419
1420			for (int ndx = 0; ndx < 4; ++ndx)
1421			{
1422				const glw::GLuint refValueMin = roundGLfloatToNearestIntegerHalfDown<glw::GLuint>(expected[ndx]);
1423				const glw::GLuint refValueMax = roundGLfloatToNearestIntegerHalfUp<glw::GLuint>(expected[ndx]);
1424
1425				if (state.getUintVec4Access()[ndx] < refValueMin ||
1426					state.getUintVec4Access()[ndx] > refValueMax)
1427				{
1428					std::ostringstream buf;
1429
1430					if (ndx > 0)
1431						expectation << " ,";
1432
1433					if (refValueMin == refValueMax)
1434						buf << refValueMin;
1435					else
1436						buf << "[" << refValueMin << ", " << refValueMax << "]";
1437				}
1438			}
1439
1440			if (anyError)
1441			{
1442				std::ostringstream buf;
1443				buf << "Expected {" << expectation.str() << "}, got " << tcu::formatArray(state.getUintVec4Access());
1444				result.fail(buf.str());
1445			}
1446			break;
1447		}
1448
1449		default:
1450			DE_ASSERT(DE_FALSE);
1451			break;
1452	}
1453}
1454
1455void verifyPointer (tcu::ResultCollector& result, QueriedState& state, const void* expected)
1456{
1457	switch (state.getType())
1458	{
1459		case DATATYPE_POINTER:
1460		{
1461			if (state.getPtrAccess() != expected)
1462			{
1463				std::ostringstream buf;
1464				buf << "Expected " << expected << ", got " << state.getPtrAccess();
1465				result.fail(buf.str());
1466			}
1467			break;
1468		}
1469
1470		default:
1471			DE_ASSERT(DE_FALSE);
1472			break;
1473	}
1474}
1475
1476static float normalizeI32Float (deInt32 c)
1477{
1478	return de::max(c / float((1ul << 31) - 1u), -1.0f);
1479}
1480
1481void verifyNormalizedI32Vec4 (tcu::ResultCollector& result, QueriedState& state, const tcu::IVec4& expected)
1482{
1483	// \note: normalization precision is irrelevant for these tests, we can use very large thresholds
1484	const float			normalizationError	= 0.1f;
1485	const tcu::Vec4		reference			(normalizeI32Float(expected[0]),
1486											 normalizeI32Float(expected[1]),
1487											 normalizeI32Float(expected[2]),
1488											 normalizeI32Float(expected[3]));
1489	const tcu::Vec4		validHigh			(de::min( 1.0f, reference[0] + normalizationError),
1490											 de::min( 1.0f, reference[1] + normalizationError),
1491											 de::min( 1.0f, reference[2] + normalizationError),
1492											 de::min( 1.0f, reference[3] + normalizationError));
1493	const tcu::Vec4		validLow			(de::max(-1.0f, reference[0] - normalizationError),
1494											 de::max(-1.0f, reference[1] - normalizationError),
1495											 de::max(-1.0f, reference[2] - normalizationError),
1496											 de::max(-1.0f, reference[3] - normalizationError));
1497
1498	switch (state.getType())
1499	{
1500		case DATATYPE_FLOAT_VEC4:
1501		{
1502			bool				anyError = false;
1503			std::ostringstream	expectation;
1504
1505			for (int ndx = 0; ndx < 4; ++ndx)
1506			{
1507				if (state.getFloatVec4Access()[ndx] < validLow[ndx] ||
1508					state.getFloatVec4Access()[ndx] > validHigh[ndx])
1509				{
1510					std::ostringstream buf;
1511
1512					if (ndx > 0)
1513						expectation << " ,";
1514					buf << "[" << validLow[ndx] << ", " << validHigh[ndx] << "]";
1515				}
1516			}
1517
1518			if (anyError)
1519			{
1520				std::ostringstream buf;
1521				buf << "Expected {" << expectation.str() << "}, got " << tcu::formatArray(state.getFloatVec4Access());
1522				result.fail(buf.str());
1523			}
1524			break;
1525		}
1526		case DATATYPE_INTEGER_VEC4:
1527		{
1528			bool				anyError = false;
1529			std::ostringstream	expectation;
1530
1531			for (int ndx = 0; ndx < 4; ++ndx)
1532			{
1533				const glw::GLint refValueMin = roundGLfloatToNearestIntegerHalfDown<glw::GLint>(validHigh[ndx]);
1534				const glw::GLint refValueMax = roundGLfloatToNearestIntegerHalfUp<glw::GLint>(validLow[ndx]);
1535
1536				if (state.getIntVec4Access()[ndx] < refValueMin ||
1537					state.getIntVec4Access()[ndx] > refValueMax)
1538				{
1539					std::ostringstream buf;
1540
1541					if (ndx > 0)
1542						expectation << " ,";
1543
1544					if (refValueMin == refValueMax)
1545						buf << refValueMin;
1546					else
1547						buf << "[" << refValueMin << ", " << refValueMax << "]";
1548				}
1549			}
1550
1551			if (anyError)
1552			{
1553				std::ostringstream buf;
1554				buf << "Expected {" << expectation.str() << "}, got " << tcu::formatArray(state.getIntVec4Access());
1555				result.fail(buf.str());
1556			}
1557			break;
1558		}
1559
1560		default:
1561			DE_ASSERT(DE_FALSE);
1562			break;
1563	}
1564}
1565
1566// helpers
1567
1568void verifyStateBoolean (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, bool refValue, QueryType type)
1569{
1570	QueriedState state;
1571
1572	queryState(result, gl, type, target, state);
1573
1574	if (!state.isUndefined())
1575		verifyBoolean(result, state, refValue);
1576}
1577
1578void verifyStateInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int refValue, QueryType type)
1579{
1580	QueriedState state;
1581
1582	queryState(result, gl, type, target, state);
1583
1584	if (!state.isUndefined())
1585		verifyInteger(result, state, refValue);
1586}
1587
1588void verifyStateIntegerMin (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int minValue, QueryType type)
1589{
1590	QueriedState state;
1591
1592	queryState(result, gl, type, target, state);
1593
1594	if (!state.isUndefined())
1595		verifyIntegerMin(result, state, minValue);
1596}
1597
1598void verifyStateIntegerMax (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int maxValue, QueryType type)
1599{
1600	QueriedState state;
1601
1602	queryState(result, gl, type, target, state);
1603
1604	if (!state.isUndefined())
1605		verifyIntegerMax(result, state, maxValue);
1606}
1607
1608void verifyStateIntegerEqualToOther (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, glw::GLenum other, QueryType type)
1609{
1610	QueriedState stateA;
1611	QueriedState stateB;
1612
1613	queryState(result, gl, type, target, stateA);
1614	queryState(result, gl, type, other, stateB);
1615
1616	if (stateA.isUndefined() || stateB.isUndefined())
1617		return;
1618
1619	switch (type)
1620	{
1621		case QUERY_BOOLEAN:
1622		{
1623			if (stateA.getBoolAccess() != stateB.getBoolAccess())
1624				result.fail("expected equal results");
1625			break;
1626		}
1627
1628		case QUERY_INTEGER:
1629		{
1630			if (stateA.getIntAccess() != stateB.getIntAccess())
1631				result.fail("expected equal results");
1632			break;
1633		}
1634
1635		case QUERY_INTEGER64:
1636		{
1637			if (stateA.getInt64Access() != stateB.getInt64Access())
1638				result.fail("expected equal results");
1639			break;
1640		}
1641
1642		case QUERY_FLOAT:
1643		{
1644			if (stateA.getFloatAccess() != stateB.getFloatAccess())
1645				result.fail("expected equal results");
1646			break;
1647		}
1648
1649		default:
1650			DE_ASSERT(DE_FALSE);
1651			break;
1652	}
1653}
1654
1655void verifyStateFloat (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, float reference, QueryType type)
1656{
1657	QueriedState state;
1658
1659	queryState(result, gl, type, target, state);
1660
1661	if (!state.isUndefined())
1662		verifyFloat(result, state, reference);
1663}
1664
1665void verifyStateFloatMin (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, float minValue, QueryType type)
1666{
1667	QueriedState state;
1668
1669	queryState(result, gl, type, target, state);
1670
1671	if (!state.isUndefined())
1672		verifyFloatMin(result, state, minValue);
1673}
1674
1675void verifyStateFloatMax (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, float maxValue, QueryType type)
1676{
1677	QueriedState state;
1678
1679	queryState(result, gl, type, target, state);
1680
1681	if (!state.isUndefined())
1682		verifyFloatMax(result, state, maxValue);
1683}
1684
1685void verifyStatePointer (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, const void* expected, QueryType type)
1686{
1687	QueriedState state;
1688
1689	queryPointerState(result, gl, type, target, state);
1690
1691	if (!state.isUndefined())
1692		verifyPointer(result, state, expected);
1693}
1694
1695void verifyStateIndexedBoolean (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int index, bool expected, QueryType type)
1696{
1697	QueriedState state;
1698
1699	queryIndexedState(result, gl, type, target, index, state);
1700
1701	if (!state.isUndefined())
1702		verifyBoolean(result, state, expected);
1703}
1704
1705void verifyStateIndexedInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int index, int expected, QueryType type)
1706{
1707	QueriedState state;
1708
1709	queryIndexedState(result, gl, type, target, index, state);
1710
1711	if (!state.isUndefined())
1712		verifyInteger(result, state, expected);
1713}
1714
1715void verifyStateIndexedIntegerMin (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int index, int minValue, QueryType type)
1716{
1717	QueriedState state;
1718
1719	queryIndexedState(result, gl, type, target, index, state);
1720
1721	if (!state.isUndefined())
1722		verifyIntegerMin(result, state, minValue);
1723}
1724
1725void verifyStateAttributeInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int index, int expected, QueryType type)
1726{
1727	QueriedState state;
1728
1729	queryAttributeState(result, gl, type, target, index, state);
1730
1731	if (!state.isUndefined())
1732		verifyInteger(result, state, expected);
1733}
1734
1735void verifyStateFramebufferInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, glw::GLenum pname, int expected, QueryType type)
1736{
1737	QueriedState state;
1738
1739	queryFramebufferState(result, gl, type, target, pname, state);
1740
1741	if (!state.isUndefined())
1742		verifyInteger(result, state, expected);
1743}
1744
1745void verifyStateFramebufferIntegerMin (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, glw::GLenum pname, int minValue, QueryType type)
1746{
1747	QueriedState state;
1748
1749	queryFramebufferState(result, gl, type, target, pname, state);
1750
1751	if (!state.isUndefined())
1752		verifyIntegerMin(result, state, minValue);
1753}
1754
1755void verifyStateProgramInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLuint program, glw::GLenum pname, int expected, QueryType type)
1756{
1757	QueriedState state;
1758
1759	queryProgramState(result, gl, type, program, pname, state);
1760
1761	if (!state.isUndefined())
1762		verifyInteger(result, state, expected);
1763}
1764
1765void verifyStateProgramIntegerVec3 (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLuint program, glw::GLenum pname, const tcu::IVec3& expected, QueryType type)
1766{
1767	QueriedState state;
1768
1769	queryProgramState(result, gl, type, program, pname, state);
1770
1771	if (!state.isUndefined())
1772		verifyIntegerVec3(result, state, expected);
1773}
1774
1775void verifyStatePipelineInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLuint pipeline, glw::GLenum pname, int expected, QueryType type)
1776{
1777	QueriedState state;
1778
1779	queryPipelineState(result, gl, type, pipeline, pname, state);
1780
1781	if (!state.isUndefined())
1782		verifyInteger(result, state, expected);
1783}
1784
1785void verifyStateTextureParamInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, glw::GLenum pname, int expected, QueryType type)
1786{
1787	QueriedState state;
1788
1789	queryTextureParamState(result, gl, type, target, pname, state);
1790
1791	if (!state.isUndefined())
1792		verifyInteger(result, state, expected);
1793}
1794
1795void verifyStateTextureParamFloat (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, glw::GLenum pname, float expected, QueryType type)
1796{
1797	QueriedState state;
1798
1799	queryTextureParamState(result, gl, type, target, pname, state);
1800
1801	if (!state.isUndefined())
1802		verifyFloat(result, state, expected);
1803}
1804
1805void verifyStateTextureParamFloatVec4 (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, glw::GLenum pname, const tcu::Vec4& expected, QueryType type)
1806{
1807	QueriedState state;
1808
1809	queryTextureParamState(result, gl, type, target, pname, state);
1810
1811	if (!state.isUndefined())
1812		verifyFloatVec4(result, state, expected);
1813}
1814
1815void verifyStateTextureParamNormalizedI32Vec4 (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, glw::GLenum pname, const tcu::IVec4& expected, QueryType type)
1816{
1817	QueriedState state;
1818
1819	queryTextureParamState(result, gl, type, target, pname, state);
1820
1821	if (!state.isUndefined())
1822		verifyNormalizedI32Vec4(result, state, expected);
1823}
1824
1825void verifyStateTextureParamIntegerVec4 (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, glw::GLenum pname, const tcu::IVec4& expected, QueryType type)
1826{
1827	QueriedState state;
1828
1829	queryTextureParamState(result, gl, type, target, pname, state);
1830
1831	if (!state.isUndefined())
1832		verifyIntegerVec4(result, state, expected);
1833}
1834
1835void verifyStateTextureParamUnsignedIntegerVec4 (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, glw::GLenum pname, const tcu::UVec4& expected, QueryType type)
1836{
1837	QueriedState state;
1838
1839	queryTextureParamState(result, gl, type, target, pname, state);
1840
1841	if (!state.isUndefined())
1842		verifyUnsignedIntegerVec4(result, state, expected);
1843}
1844
1845void verifyStateTextureLevelInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, int level, glw::GLenum pname, int expected, QueryType type)
1846{
1847	QueriedState state;
1848
1849	queryTextureLevelState(result, gl, type, target, level, pname, state);
1850
1851	if (!state.isUndefined())
1852		verifyInteger(result, state, expected);
1853}
1854
1855void verifyStateObjectBoolean (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLuint handle, bool expected, QueryType type)
1856{
1857	QueriedState state;
1858
1859	queryObjectState(result, gl, type, handle, state);
1860
1861	if (!state.isUndefined())
1862		verifyBoolean(result, state, expected);
1863}
1864
1865void verifyStateQueryInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLenum target, glw::GLenum pname, int expected, QueryType type)
1866{
1867	QueriedState state;
1868
1869	queryQueryState(result, gl, type, target, pname, state);
1870
1871	if (!state.isUndefined())
1872		verifyInteger(result, state, expected);
1873}
1874
1875void verifyStateSamplerParamInteger (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLuint sampler, glw::GLenum pname, int expected, QueryType type)
1876{
1877	QueriedState state;
1878
1879	querySamplerState(result, gl, type, sampler, pname, state);
1880
1881	if (!state.isUndefined())
1882		verifyInteger(result, state, expected);
1883}
1884
1885void verifyStateSamplerParamFloat (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLuint sampler, glw::GLenum pname, float expected, QueryType type)
1886{
1887	QueriedState state;
1888
1889	querySamplerState(result, gl, type, sampler, pname, state);
1890
1891	if (!state.isUndefined())
1892		verifyFloat(result, state, expected);
1893}
1894
1895void verifyStateSamplerParamFloatVec4 (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLuint sampler, glw::GLenum pname, const tcu::Vec4& expected, QueryType type)
1896{
1897	QueriedState state;
1898
1899	querySamplerState(result, gl, type, sampler, pname, state);
1900
1901	if (!state.isUndefined())
1902		verifyFloatVec4(result, state, expected);
1903}
1904
1905void verifyStateSamplerParamNormalizedI32Vec4 (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLuint sampler, glw::GLenum pname, const tcu::IVec4& expected, QueryType type)
1906{
1907	QueriedState state;
1908
1909	querySamplerState(result, gl, type, sampler, pname, state);
1910
1911	if (!state.isUndefined())
1912		verifyNormalizedI32Vec4(result, state, expected);
1913}
1914
1915void verifyStateSamplerParamIntegerVec4 (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLuint sampler, glw::GLenum pname, const tcu::IVec4& expected, QueryType type)
1916{
1917	QueriedState state;
1918
1919	querySamplerState(result, gl, type, sampler, pname, state);
1920
1921	if (!state.isUndefined())
1922		verifyIntegerVec4(result, state, expected);
1923}
1924
1925void verifyStateSamplerParamUnsignedIntegerVec4 (tcu::ResultCollector& result, glu::CallLogWrapper& gl, glw::GLuint sampler, glw::GLenum pname, const tcu::UVec4& expected, QueryType type)
1926{
1927	QueriedState state;
1928
1929	querySamplerState(result, gl, type, sampler, pname, state);
1930
1931	if (!state.isUndefined())
1932		verifyUnsignedIntegerVec4(result, state, expected);
1933}
1934
1935} // StateQueryUtil
1936} // gls
1937} // deqp
1938