es31fIntegerStateQueryTests.cpp revision d2246f12e33c86e2db0eb09cdda77737243c674a
1/*-------------------------------------------------------------------------
2 * drawElements Quality Program OpenGL ES 3.1 Module
3 * -------------------------------------------------
4 *
5 * Copyright 2014 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 Integer state query tests
22 *//*--------------------------------------------------------------------*/
23
24#include "es31fIntegerStateQueryTests.hpp"
25#include "tcuTestLog.hpp"
26#include "gluRenderContext.hpp"
27#include "gluCallLogWrapper.hpp"
28#include "gluContextInfo.hpp"
29#include "gluObjectWrapper.hpp"
30#include "gluShaderProgram.hpp"
31#include "gluStrUtil.hpp"
32#include "glwFunctions.hpp"
33#include "glwEnums.hpp"
34#include "glsStateQueryUtil.hpp"
35#include "deRandom.hpp"
36#include "deStringUtil.hpp"
37
38namespace deqp
39{
40namespace gles31
41{
42namespace Functional
43{
44namespace
45{
46
47using namespace gls::StateQueryUtil;
48
49static const char* getVerifierSuffix (QueryType type)
50{
51	switch (type)
52	{
53		case QUERY_BOOLEAN:		return "getboolean";
54		case QUERY_INTEGER:		return "getinteger";
55		case QUERY_INTEGER64:	return "getinteger64";
56		case QUERY_FLOAT:		return "getfloat";
57		default:
58			DE_ASSERT(DE_FALSE);
59			return DE_NULL;
60	}
61}
62
63class MaxSamplesCase : public TestCase
64{
65public:
66						MaxSamplesCase	(Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType);
67private:
68	IterateResult		iterate			(void);
69
70	const glw::GLenum	m_target;
71	const int			m_minValue;
72	const QueryType		m_verifierType;
73};
74
75MaxSamplesCase::MaxSamplesCase (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType)
76	: TestCase			(context, name, desc)
77	, m_target			(target)
78	, m_minValue		(minValue)
79	, m_verifierType	(verifierType)
80{
81}
82
83MaxSamplesCase::IterateResult MaxSamplesCase::iterate (void)
84{
85	glu::CallLogWrapper 	gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
86	tcu::ResultCollector	result	(m_testCtx.getLog(), " // ERROR: ");
87
88	gl.enableLogging(true);
89	verifyStateIntegerMin(result, gl, m_target, m_minValue, m_verifierType);
90
91	result.setTestContextResult(m_testCtx);
92	return STOP;
93}
94
95class TexBindingCase : public TestCase
96{
97public:
98						TexBindingCase	(Context& context, const char* name, const char* desc, glw::GLenum texTarget, glw::GLenum bindTarget, QueryType verifierType);
99private:
100	void				init			(void);
101	IterateResult		iterate			(void);
102
103	const glw::GLenum	m_texTarget;
104	const glw::GLenum	m_bindTarget;
105	const QueryType		m_verifierType;
106};
107
108TexBindingCase::TexBindingCase (Context& context, const char* name, const char* desc, glw::GLenum texTarget, glw::GLenum bindTarget, QueryType verifierType)
109	: TestCase			(context, name, desc)
110	, m_texTarget		(texTarget)
111	, m_bindTarget		(bindTarget)
112	, m_verifierType	(verifierType)
113{
114}
115
116void TexBindingCase::init (void)
117{
118	if (m_texTarget == GL_TEXTURE_2D_MULTISAMPLE_ARRAY && !m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
119		throw tcu::NotSupportedError("Test requires OES_texture_storage_multisample_2d_array extension");
120	if (m_texTarget == GL_TEXTURE_CUBE_MAP_ARRAY && !m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_cube_map_array"))
121		throw tcu::NotSupportedError("Test requires GL_EXT_texture_cube_map_array extension");
122}
123
124TexBindingCase::IterateResult TexBindingCase::iterate (void)
125{
126	glu::CallLogWrapper 	gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
127	tcu::ResultCollector	result	(m_testCtx.getLog(), " // ERROR: ");
128
129	gl.enableLogging(true);
130
131	// initial
132	{
133		const tcu::ScopedLogSection section(m_testCtx.getLog(), "initial", "Initial value");
134
135		verifyStateInteger(result, gl, m_bindTarget, 0, m_verifierType);
136	}
137
138	// bind
139	{
140		const tcu::ScopedLogSection section(m_testCtx.getLog(), "bind", "After bind");
141
142		glw::GLuint texture;
143
144		gl.glGenTextures(1, &texture);
145		gl.glBindTexture(m_texTarget, texture);
146		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind texture");
147
148		verifyStateInteger(result, gl, m_bindTarget, texture, m_verifierType);
149
150		gl.glDeleteTextures(1, &texture);
151	}
152
153	// after delete
154	{
155		const tcu::ScopedLogSection section(m_testCtx.getLog(), "bind", "After delete");
156
157		verifyStateInteger(result, gl, m_bindTarget, 0, m_verifierType);
158	}
159
160	result.setTestContextResult(m_testCtx);
161	return STOP;
162}
163
164class MinimumValueCase : public TestCase
165{
166public:
167						MinimumValueCase	(Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType);
168private:
169	IterateResult		iterate				(void);
170
171	const glw::GLenum	m_target;
172	const int			m_minValue;
173	const QueryType		m_verifierType;
174};
175
176MinimumValueCase::MinimumValueCase (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType)
177	: TestCase			(context, name, desc)
178	, m_target			(target)
179	, m_minValue		(minValue)
180	, m_verifierType	(verifierType)
181{
182}
183
184MinimumValueCase::IterateResult MinimumValueCase::iterate (void)
185{
186	glu::CallLogWrapper		gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
187	tcu::ResultCollector	result	(m_testCtx.getLog(), " // ERROR: ");
188
189	gl.enableLogging(true);
190	verifyStateIntegerMin(result, gl, m_target, m_minValue, m_verifierType);
191
192	result.setTestContextResult(m_testCtx);
193	return STOP;
194}
195
196class AlignmentCase : public TestCase
197{
198public:
199						AlignmentCase	(Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType);
200private:
201	IterateResult		iterate			(void);
202
203	const glw::GLenum	m_target;
204	const int			m_minValue;
205	const QueryType		m_verifierType;
206};
207
208AlignmentCase::AlignmentCase (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType)
209	: TestCase			(context, name, desc)
210	, m_target			(target)
211	, m_minValue		(minValue)
212	, m_verifierType	(verifierType)
213{
214}
215
216AlignmentCase::IterateResult AlignmentCase::iterate (void)
217{
218	glu::CallLogWrapper		gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
219	tcu::ResultCollector	result	(m_testCtx.getLog(), " // ERROR: ");
220
221	gl.enableLogging(true);
222	verifyStateIntegerMax(result, gl, m_target, m_minValue, m_verifierType);
223
224	result.setTestContextResult(m_testCtx);
225	return STOP;
226}
227
228class BufferBindingCase : public TestCase
229{
230public:
231						BufferBindingCase	(Context& context, const char* name, const char* desc, glw::GLenum queryTarget, glw::GLenum bindingPoint, QueryType verifierType);
232private:
233	IterateResult		iterate				(void);
234
235	const glw::GLenum	m_queryTarget;
236	const glw::GLenum	m_bindingPoint;
237	const QueryType		m_verifierType;
238};
239
240BufferBindingCase::BufferBindingCase (Context& context, const char* name, const char* desc, glw::GLenum queryTarget, glw::GLenum bindingPoint, QueryType verifierType)
241	: TestCase			(context, name, desc)
242	, m_queryTarget		(queryTarget)
243	, m_bindingPoint	(bindingPoint)
244	, m_verifierType	(verifierType)
245{
246}
247
248BufferBindingCase::IterateResult BufferBindingCase::iterate (void)
249{
250	glu::CallLogWrapper		gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
251	tcu::ResultCollector	result	(m_testCtx.getLog(), " // ERROR: ");
252
253	gl.enableLogging(true);
254
255	{
256		const tcu::ScopedLogSection	section(m_testCtx.getLog(), "Initial", "Initial value");
257
258		verifyStateInteger(result, gl, m_queryTarget, 0, m_verifierType);
259	}
260
261	{
262		const tcu::ScopedLogSection	section	(m_testCtx.getLog(), "AfterBinding", "After binding");
263		glu::Buffer					buf		(m_context.getRenderContext());
264
265		gl.glBindBuffer(m_bindingPoint, *buf);
266		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup");
267
268		verifyStateInteger(result, gl, m_queryTarget, *buf, m_verifierType);
269	}
270
271	{
272		const tcu::ScopedLogSection	section	(m_testCtx.getLog(), "AfterDelete", "After deleting");
273		glw::GLuint					buf		= 0;
274
275		gl.glGenBuffers(1, &buf);
276		gl.glBindBuffer(m_bindingPoint, buf);
277		gl.glDeleteBuffers(1, &buf);
278		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup");
279
280		verifyStateInteger(result, gl, m_queryTarget, 0, m_verifierType);
281	}
282
283	result.setTestContextResult(m_testCtx);
284	return STOP;
285}
286
287class ProgramPipelineBindingCase : public TestCase
288{
289public:
290						ProgramPipelineBindingCase	(Context& context, const char* name, const char* desc, QueryType verifierType);
291private:
292	IterateResult		iterate						(void);
293
294	const QueryType		m_verifierType;
295};
296
297ProgramPipelineBindingCase::ProgramPipelineBindingCase (Context& context, const char* name, const char* desc, QueryType verifierType)
298	: TestCase			(context, name, desc)
299	, m_verifierType	(verifierType)
300{
301}
302
303ProgramPipelineBindingCase::IterateResult ProgramPipelineBindingCase::iterate (void)
304{
305	glu::CallLogWrapper		gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
306	tcu::ResultCollector	result	(m_testCtx.getLog(), " // ERROR: ");
307
308	gl.enableLogging(true);
309
310	{
311		const tcu::ScopedLogSection	section(m_testCtx.getLog(), "Initial", "Initial value");
312
313		verifyStateInteger(result, gl, GL_PROGRAM_PIPELINE_BINDING, 0, m_verifierType);
314	}
315
316	{
317		const tcu::ScopedLogSection	section		(m_testCtx.getLog(), "AfterBinding", "After binding");
318		glu::ProgramPipeline		pipeline	(m_context.getRenderContext());
319
320		gl.glBindProgramPipeline(pipeline.getPipeline());
321		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup");
322
323		verifyStateInteger(result, gl, GL_PROGRAM_PIPELINE_BINDING, pipeline.getPipeline(), m_verifierType);
324	}
325
326	{
327		const tcu::ScopedLogSection	section		(m_testCtx.getLog(), "AfterDelete", "After deleting");
328		glw::GLuint					pipeline	= 0;
329
330		gl.glGenProgramPipelines(1, &pipeline);
331		gl.glBindProgramPipeline(pipeline);
332		gl.glDeleteProgramPipelines(1, &pipeline);
333		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup");
334
335		verifyStateInteger(result, gl, GL_PROGRAM_PIPELINE_BINDING, 0, m_verifierType);
336	}
337
338	result.setTestContextResult(m_testCtx);
339	return STOP;
340}
341
342class FramebufferMinimumValueCase : public TestCase
343{
344public:
345						FramebufferMinimumValueCase	(Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, glw::GLenum tiedTo, QueryType verifierType);
346private:
347	IterateResult		iterate						(void);
348
349	const glw::GLenum	m_target;
350	const glw::GLenum	m_tiedTo;
351	const int			m_minValue;
352	const QueryType		m_verifierType;
353};
354
355FramebufferMinimumValueCase::FramebufferMinimumValueCase (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, glw::GLenum tiedTo, QueryType verifierType)
356	: TestCase			(context, name, desc)
357	, m_target			(target)
358	, m_tiedTo			(tiedTo)
359	, m_minValue		(minValue)
360	, m_verifierType	(verifierType)
361{
362}
363
364FramebufferMinimumValueCase::IterateResult FramebufferMinimumValueCase::iterate (void)
365{
366	glu::CallLogWrapper		gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
367	tcu::ResultCollector	result	(m_testCtx.getLog(), " // ERROR: ");
368
369	gl.enableLogging(true);
370
371	{
372		const tcu::ScopedLogSection	section(m_testCtx.getLog(), "Minimum", "Specified minimum is " + de::toString(m_minValue));
373
374		verifyStateIntegerMin(result, gl, m_target, m_minValue, m_verifierType);
375	}
376	{
377		const tcu::ScopedLogSection				section		(m_testCtx.getLog(), "Ties", "The limit is tied to the value of " + de::toString(glu::getGettableStateStr(m_tiedTo)));
378		StateQueryMemoryWriteGuard<glw::GLint>	tiedToValue;
379
380		gl.glGetIntegerv(m_tiedTo, &tiedToValue);
381		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv");
382
383		if (tiedToValue.verifyValidity(result))
384			verifyStateIntegerMin(result, gl, m_target, tiedToValue, m_verifierType);
385	}
386
387	result.setTestContextResult(m_testCtx);
388	return STOP;
389}
390
391class LegacyVectorLimitCase : public TestCase
392{
393public:
394						LegacyVectorLimitCase	(Context& context, const char* name, const char* desc, glw::GLenum legacyTarget, glw::GLenum componentTarget, QueryType verifierType);
395private:
396	IterateResult		iterate					(void);
397
398	const glw::GLenum	m_legacyTarget;
399	const glw::GLenum	m_componentTarget;
400	const QueryType		m_verifierType;
401};
402
403LegacyVectorLimitCase::LegacyVectorLimitCase (Context& context, const char* name, const char* desc, glw::GLenum legacyTarget, glw::GLenum componentTarget, QueryType verifierType)
404	: TestCase			(context, name, desc)
405	, m_legacyTarget	(legacyTarget)
406	, m_componentTarget	(componentTarget)
407	, m_verifierType	(verifierType)
408{
409}
410
411LegacyVectorLimitCase::IterateResult LegacyVectorLimitCase::iterate (void)
412{
413	glu::CallLogWrapper		gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
414	tcu::ResultCollector	result	(m_testCtx.getLog(), " // ERROR: ");
415
416	gl.enableLogging(true);
417
418	{
419		const tcu::ScopedLogSection	section(m_testCtx.getLog(), "TiedTo", de::toString(glu::getGettableStateStr(m_legacyTarget)) +
420																			" is " +
421																			de::toString(glu::getGettableStateStr(m_componentTarget)) +
422																			" divided by four");
423
424		StateQueryMemoryWriteGuard<glw::GLint> value;
425		gl.glGetIntegerv(m_componentTarget, &value);
426		GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv");
427
428		if (value.verifyValidity(result))
429			verifyStateInteger(result, gl, m_legacyTarget, ((int)value) / 4, m_verifierType);
430	}
431
432	result.setTestContextResult(m_testCtx);
433	return STOP;
434}
435
436class CombinedComputeUniformComponentsCase : public TestCase
437{
438public:
439						CombinedComputeUniformComponentsCase	(Context& context, const char* name, const char* desc, QueryType verifierType);
440private:
441	IterateResult		iterate									(void);
442
443	const QueryType		m_verifierType;
444};
445
446CombinedComputeUniformComponentsCase::CombinedComputeUniformComponentsCase (Context& context, const char* name, const char* desc, QueryType verifierType)
447	: TestCase			(context, name, desc)
448	, m_verifierType	(verifierType)
449{
450}
451
452CombinedComputeUniformComponentsCase::IterateResult CombinedComputeUniformComponentsCase::iterate (void)
453{
454	glu::CallLogWrapper		gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
455	tcu::ResultCollector	result	(m_testCtx.getLog(), " // ERROR: ");
456
457	gl.enableLogging(true);
458
459	m_testCtx.getLog()	<< tcu::TestLog::Message
460						<< "The minimum value of MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS is MAX_COMPUTE_UNIFORM_BLOCKS x MAX_UNIFORM_BLOCK_SIZE / 4 + MAX_COMPUTE_UNIFORM_COMPONENTS"
461						<< tcu::TestLog::EndMessage;
462
463	StateQueryMemoryWriteGuard<glw::GLint> maxUniformBlocks;
464	gl.glGetIntegerv(GL_MAX_COMPUTE_UNIFORM_BLOCKS, &maxUniformBlocks);
465	GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv");
466
467	StateQueryMemoryWriteGuard<glw::GLint> maxUniformBlockSize;
468	gl.glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &maxUniformBlockSize);
469	GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv");
470
471	StateQueryMemoryWriteGuard<glw::GLint> maxUniformComponents;
472	gl.glGetIntegerv(GL_MAX_COMPUTE_UNIFORM_COMPONENTS, &maxUniformComponents);
473	GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv");
474
475	if (maxUniformBlocks.verifyValidity(result) && maxUniformBlockSize.verifyValidity(result) && maxUniformComponents.verifyValidity(result))
476		verifyStateIntegerMin(result, gl, GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS, ((int)maxUniformBlocks) * ((int)maxUniformBlockSize) / 4 + (int)maxUniformComponents, m_verifierType);
477
478	result.setTestContextResult(m_testCtx);
479	return STOP;
480}
481
482class TextureGatherLimitCase : public TestCase
483{
484public:
485						TextureGatherLimitCase	(Context& context, const char* name, const char* desc, bool isMaxCase, QueryType verifierType);
486private:
487	IterateResult		iterate					(void);
488
489	const bool			m_isMaxCase;
490	const QueryType		m_verifierType;
491};
492
493TextureGatherLimitCase::TextureGatherLimitCase (Context& context, const char* name, const char* desc, bool isMaxCase, QueryType verifierType)
494	: TestCase			(context, name, desc)
495	, m_isMaxCase		(isMaxCase)
496	, m_verifierType	(verifierType)
497{
498}
499
500TextureGatherLimitCase::IterateResult TextureGatherLimitCase::iterate (void)
501{
502	glu::CallLogWrapper		gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
503	tcu::ResultCollector	result	(m_testCtx.getLog(), " // ERROR: ");
504
505	gl.enableLogging(true);
506
507	if (m_isMaxCase)
508	{
509		// range [0, inf)
510		verifyStateIntegerMin(result, gl, GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET, 0, m_verifierType);
511	}
512	else
513	{
514		// range (-inf, 0]
515		verifyStateIntegerMax(result, gl, GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET, 0, m_verifierType);
516	}
517
518	result.setTestContextResult(m_testCtx);
519	return STOP;
520}
521
522class MaxUniformBufferBindingsCase : public TestCase
523{
524public:
525						MaxUniformBufferBindingsCase	(Context& context, const char* name, const char* desc, QueryType verifierType);
526private:
527	IterateResult		iterate							(void);
528
529	const QueryType		m_verifierType;
530};
531
532MaxUniformBufferBindingsCase::MaxUniformBufferBindingsCase (Context& context, const char* name, const char* desc, QueryType verifierType)
533	: TestCase			(context, name, desc)
534	, m_verifierType	(verifierType)
535{
536}
537
538MaxUniformBufferBindingsCase::IterateResult MaxUniformBufferBindingsCase::iterate (void)
539{
540	glu::CallLogWrapper		gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
541	tcu::ResultCollector	result	(m_testCtx.getLog(), " // ERROR: ");
542	int						minMax;
543
544	gl.enableLogging(true);
545
546	if (m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader"))
547	{
548		m_testCtx.getLog()	<< tcu::TestLog::Message
549							<< "GL_EXT_tessellation_shader increases the minimum value of GL_MAX_UNIFORM_BUFFER_BINDINGS to 72"
550							<< tcu::TestLog::EndMessage;
551		minMax = 72;
552	}
553	else if (m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader"))
554	{
555		m_testCtx.getLog()	<< tcu::TestLog::Message
556							<< "GL_EXT_geometry_shader increases the minimum value of GL_MAX_UNIFORM_BUFFER_BINDINGS to 48"
557							<< tcu::TestLog::EndMessage;
558		minMax = 48;
559	}
560	else
561	{
562		minMax = 36;
563	}
564
565	// range [0, inf)
566	verifyStateIntegerMin(result, gl, GL_MAX_UNIFORM_BUFFER_BINDINGS, minMax, m_verifierType);
567
568	result.setTestContextResult(m_testCtx);
569	return STOP;
570}
571
572class MaxCombinedUniformBlocksCase : public TestCase
573{
574public:
575						MaxCombinedUniformBlocksCase	(Context& context, const char* name, const char* desc, QueryType verifierType);
576private:
577	IterateResult		iterate							(void);
578
579	const QueryType		m_verifierType;
580};
581
582MaxCombinedUniformBlocksCase::MaxCombinedUniformBlocksCase (Context& context, const char* name, const char* desc, QueryType verifierType)
583	: TestCase			(context, name, desc)
584	, m_verifierType	(verifierType)
585{
586}
587
588MaxCombinedUniformBlocksCase::IterateResult MaxCombinedUniformBlocksCase::iterate (void)
589{
590	glu::CallLogWrapper		gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
591	tcu::ResultCollector	result	(m_testCtx.getLog(), " // ERROR: ");
592	int						minMax;
593
594	gl.enableLogging(true);
595
596	if (m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader"))
597	{
598		m_testCtx.getLog()	<< tcu::TestLog::Message
599							<< "GL_EXT_tessellation_shader increases the minimum value of GL_MAX_COMBINED_UNIFORM_BLOCKS to 60"
600							<< tcu::TestLog::EndMessage;
601		minMax = 60;
602	}
603	else if (m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader"))
604	{
605		m_testCtx.getLog()	<< tcu::TestLog::Message
606							<< "GL_EXT_geometry_shader increases the minimum value of GL_MAX_COMBINED_UNIFORM_BLOCKS to 36"
607							<< tcu::TestLog::EndMessage;
608		minMax = 36;
609	}
610	else
611	{
612		minMax = 24;
613	}
614
615	// range [0, inf)
616	verifyStateIntegerMin(result, gl, GL_MAX_COMBINED_UNIFORM_BLOCKS, minMax, m_verifierType);
617
618	result.setTestContextResult(m_testCtx);
619	return STOP;
620}
621
622class MaxCombinedTexImageUnitsCase : public TestCase
623{
624public:
625						MaxCombinedTexImageUnitsCase	(Context& context, const char* name, const char* desc, QueryType verifierType);
626private:
627	IterateResult		iterate							(void);
628
629	const QueryType		m_verifierType;
630};
631
632MaxCombinedTexImageUnitsCase::MaxCombinedTexImageUnitsCase (Context& context, const char* name, const char* desc, QueryType verifierType)
633	: TestCase			(context, name, desc)
634	, m_verifierType	(verifierType)
635{
636}
637
638MaxCombinedTexImageUnitsCase::IterateResult MaxCombinedTexImageUnitsCase::iterate (void)
639{
640	glu::CallLogWrapper		gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
641	tcu::ResultCollector	result	(m_testCtx.getLog(), " // ERROR: ");
642	int						minMax;
643
644	gl.enableLogging(true);
645
646	if (m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader"))
647	{
648		m_testCtx.getLog()	<< tcu::TestLog::Message
649							<< "GL_EXT_tessellation_shader increases the minimum value of GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS to 96"
650							<< tcu::TestLog::EndMessage;
651		minMax = 96;
652	}
653	else if (m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader"))
654	{
655		m_testCtx.getLog()	<< tcu::TestLog::Message
656							<< "GL_EXT_geometry_shader increases the minimum value of GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS to 36"
657							<< tcu::TestLog::EndMessage;
658		minMax = 64;
659	}
660	else
661	{
662		minMax = 48;
663	}
664
665	// range [0, inf)
666	verifyStateIntegerMin(result, gl, GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, minMax, m_verifierType);
667
668	result.setTestContextResult(m_testCtx);
669	return STOP;
670}
671
672} // anonymous
673
674IntegerStateQueryTests::IntegerStateQueryTests (Context& context)
675	: TestCaseGroup(context, "integer", "Integer state query tests")
676{
677}
678
679IntegerStateQueryTests::~IntegerStateQueryTests (void)
680{
681}
682
683void IntegerStateQueryTests::init (void)
684{
685	// Verifiers
686	const QueryType verifiers[] = { QUERY_BOOLEAN, QUERY_INTEGER, QUERY_INTEGER64, QUERY_FLOAT };
687
688#define FOR_EACH_VERIFIER(X) \
689	for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(verifiers); ++verifierNdx)	\
690	{																						\
691		const char* verifierSuffix = getVerifierSuffix(verifiers[verifierNdx]);				\
692		const QueryType verifier = verifiers[verifierNdx];									\
693		this->addChild(X);																	\
694	}
695
696	FOR_EACH_VERIFIER(new MaxSamplesCase(m_context,		(std::string() + "max_color_texture_samples_" + verifierSuffix).c_str(),				"Test GL_MAX_COLOR_TEXTURE_SAMPLES",			GL_MAX_COLOR_TEXTURE_SAMPLES,		1,	verifier))
697	FOR_EACH_VERIFIER(new MaxSamplesCase(m_context,		(std::string() + "max_depth_texture_samples_" + verifierSuffix).c_str(),				"Test GL_MAX_DEPTH_TEXTURE_SAMPLES",			GL_MAX_DEPTH_TEXTURE_SAMPLES,		1,	verifier))
698	FOR_EACH_VERIFIER(new MaxSamplesCase(m_context,		(std::string() + "max_integer_samples_" + verifierSuffix).c_str(),						"Test GL_MAX_INTEGER_SAMPLES",					GL_MAX_INTEGER_SAMPLES,				1,	verifier))
699
700	FOR_EACH_VERIFIER(new TexBindingCase(m_context,		(std::string() + "texture_binding_2d_multisample_" + verifierSuffix).c_str(),			"Test TEXTURE_BINDING_2D_MULTISAMPLE",			GL_TEXTURE_2D_MULTISAMPLE,			GL_TEXTURE_BINDING_2D_MULTISAMPLE,			verifier))
701	FOR_EACH_VERIFIER(new TexBindingCase(m_context,		(std::string() + "texture_binding_2d_multisample_array_" + verifierSuffix).c_str(),		"Test TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY",	GL_TEXTURE_2D_MULTISAMPLE_ARRAY,	GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY,	verifier))
702	FOR_EACH_VERIFIER(new TexBindingCase(m_context,		(std::string() + "texture_binding_cube_map_array_" + verifierSuffix).c_str(),			"Test TEXTURE_BINDING_CUBE_MAP_ARRAY",			GL_TEXTURE_CUBE_MAP_ARRAY,			GL_TEXTURE_BINDING_CUBE_MAP_ARRAY,			verifier))
703
704	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_vertex_attrib_relative_offset_" + verifierSuffix).c_str(),		"Test MAX_VERTEX_ATTRIB_RELATIVE_OFFSET",		GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET,	2047,	verifier))
705	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_vertex_attrib_bindings_" + verifierSuffix).c_str(),				"Test MAX_VERTEX_ATTRIB_BINDINGS",				GL_MAX_VERTEX_ATTRIB_BINDINGS,			16,		verifier))
706	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_vertex_attrib_stride_" + verifierSuffix).c_str(),					"Test MAX_VERTEX_ATTRIB_STRIDE",				GL_MAX_VERTEX_ATTRIB_STRIDE,			2048,	verifier))
707	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_sample_mask_words_" + verifierSuffix).c_str(),					"Test MAX_SAMPLE_MASK_WORDS",					GL_MAX_SAMPLE_MASK_WORDS,				1,		verifier))
708
709	FOR_EACH_VERIFIER(new AlignmentCase(m_context,		(std::string() + "shader_storage_buffer_offset_alignment_" + verifierSuffix).c_str(),	"Test SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT",	GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT,	256,	verifier))
710
711	FOR_EACH_VERIFIER(new BufferBindingCase(m_context,	(std::string() + "draw_indirect_buffer_binding_" + verifierSuffix).c_str(),				"Test DRAW_INDIRECT_BUFFER_BINDING",			GL_DRAW_INDIRECT_BUFFER_BINDING,		GL_DRAW_INDIRECT_BUFFER,		verifier))
712	FOR_EACH_VERIFIER(new BufferBindingCase(m_context,	(std::string() + "atomic_counter_buffer_binding_" + verifierSuffix).c_str(),			"Test ATOMIC_COUNTER_BUFFER_BINDING",			GL_ATOMIC_COUNTER_BUFFER_BINDING,		GL_ATOMIC_COUNTER_BUFFER,		verifier))
713	FOR_EACH_VERIFIER(new BufferBindingCase(m_context,	(std::string() + "shader_storage_buffer_binding_" + verifierSuffix).c_str(),			"Test SHADER_STORAGE_BUFFER_BINDING",			GL_SHADER_STORAGE_BUFFER_BINDING,		GL_SHADER_STORAGE_BUFFER,		verifier))
714	FOR_EACH_VERIFIER(new BufferBindingCase(m_context,	(std::string() + "dispatch_indirect_buffer_binding_" + verifierSuffix).c_str(),			"Test DISPATCH_INDIRECT_BUFFER_BINDING",		GL_DISPATCH_INDIRECT_BUFFER_BINDING,	GL_DISPATCH_INDIRECT_BUFFER,	verifier))
715
716	FOR_EACH_VERIFIER(new FramebufferMinimumValueCase(m_context,	(std::string() + "max_framebuffer_width_" + verifierSuffix).c_str(),		"Test MAX_FRAMEBUFFER_WIDTH",					GL_MAX_FRAMEBUFFER_WIDTH,				2048,	GL_MAX_TEXTURE_SIZE,	verifier))
717	FOR_EACH_VERIFIER(new FramebufferMinimumValueCase(m_context,	(std::string() + "max_framebuffer_height_" + verifierSuffix).c_str(),		"Test MAX_FRAMEBUFFER_HEIGHT",					GL_MAX_FRAMEBUFFER_HEIGHT,				2048,	GL_MAX_TEXTURE_SIZE,	verifier))
718	FOR_EACH_VERIFIER(new FramebufferMinimumValueCase(m_context,	(std::string() + "max_framebuffer_samples_" + verifierSuffix).c_str(),		"Test MAX_FRAMEBUFFER_SAMPLES",					GL_MAX_FRAMEBUFFER_SAMPLES,				4,		GL_MAX_SAMPLES,			verifier))
719
720	FOR_EACH_VERIFIER(new ProgramPipelineBindingCase(m_context,	(std::string() + "program_pipeline_binding_" + verifierSuffix).c_str(),			"Test PROGRAM_PIPELINE_BINDING",	verifier))
721
722	// vertex
723	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_vertex_atomic_counter_buffers_" + verifierSuffix).c_str(),		"Test MAX_VERTEX_ATOMIC_COUNTER_BUFFERS",		GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS,	0,		verifier))
724	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_vertex_atomic_counters_" + verifierSuffix).c_str(),				"Test MAX_VERTEX_ATOMIC_COUNTERS",				GL_MAX_VERTEX_ATOMIC_COUNTERS,			0,		verifier))
725	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_vertex_image_uniforms_" + verifierSuffix).c_str(),				"Test MAX_VERTEX_IMAGE_UNIFORMS",				GL_MAX_VERTEX_IMAGE_UNIFORMS,			0,		verifier))
726	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_vertex_shader_storage_blocks_" + verifierSuffix).c_str(),			"Test MAX_VERTEX_SHADER_STORAGE_BLOCKS",		GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS,	0,		verifier))
727	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_vertex_uniform_components_" + verifierSuffix).c_str(),			"Test MAX_VERTEX_UNIFORM_COMPONENTS",			GL_MAX_VERTEX_UNIFORM_COMPONENTS,		1024,	verifier))
728
729	// fragment
730	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_fragment_atomic_counter_buffers_" + verifierSuffix).c_str(),		"Test MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS",		GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS,	0,		verifier))
731	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_fragment_atomic_counters_" + verifierSuffix).c_str(),				"Test MAX_FRAGMENT_ATOMIC_COUNTERS",			GL_MAX_FRAGMENT_ATOMIC_COUNTERS,		0,		verifier))
732	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_fragment_image_uniforms_" + verifierSuffix).c_str(),				"Test MAX_FRAGMENT_IMAGE_UNIFORMS",				GL_MAX_FRAGMENT_IMAGE_UNIFORMS,			0,		verifier))
733	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_fragment_shader_storage_blocks_" + verifierSuffix).c_str(),		"Test MAX_FRAGMENT_SHADER_STORAGE_BLOCKS",		GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS,	0,		verifier))
734	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_fragment_uniform_components_" + verifierSuffix).c_str(),			"Test MAX_FRAGMENT_UNIFORM_COMPONENTS",			GL_MAX_FRAGMENT_UNIFORM_COMPONENTS,		1024,	verifier))
735
736	// compute
737	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_compute_work_group_invocations_" + verifierSuffix).c_str(),		"Test MAX_COMPUTE_WORK_GROUP_INVOCATIONS",		GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS,		128,	verifier))
738	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_compute_uniform_blocks_" + verifierSuffix).c_str(),				"Test MAX_COMPUTE_UNIFORM_BLOCKS",				GL_MAX_COMPUTE_UNIFORM_BLOCKS,				12,		verifier))
739	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_compute_texture_image_units_" + verifierSuffix).c_str(),			"Test MAX_COMPUTE_TEXTURE_IMAGE_UNITS",			GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS,			16,		verifier))
740	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_compute_shared_memory_size_" + verifierSuffix).c_str(),			"Test MAX_COMPUTE_SHARED_MEMORY_SIZE",			GL_MAX_COMPUTE_SHARED_MEMORY_SIZE,			16384,	verifier))
741	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_compute_uniform_components_" + verifierSuffix).c_str(),			"Test MAX_COMPUTE_UNIFORM_COMPONENTS",			GL_MAX_COMPUTE_UNIFORM_COMPONENTS,			1024,	verifier))
742	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_compute_atomic_counter_buffers_" + verifierSuffix).c_str(),		"Test MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS",		GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS,		1,		verifier))
743	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_compute_atomic_counters_" + verifierSuffix).c_str(),				"Test MAX_COMPUTE_ATOMIC_COUNTERS",				GL_MAX_COMPUTE_ATOMIC_COUNTERS,				8,		verifier))
744	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_compute_image_uniforms_" + verifierSuffix).c_str(),				"Test MAX_COMPUTE_IMAGE_UNIFORMS",				GL_MAX_COMPUTE_IMAGE_UNIFORMS,				4,		verifier))
745	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_compute_shader_storage_blocks_" + verifierSuffix).c_str(),		"Test MAX_COMPUTE_SHADER_STORAGE_BLOCKS",		GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS,		4,		verifier))
746
747	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_uniform_locations_" + verifierSuffix).c_str(),					"Test MAX_UNIFORM_LOCATIONS",					GL_MAX_UNIFORM_LOCATIONS,					1024,	verifier))
748	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_atomic_counter_buffer_bindings_" + verifierSuffix).c_str(),		"Test MAX_ATOMIC_COUNTER_BUFFER_BINDINGS",		GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS,		1,		verifier))
749	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_atomic_counter_buffer_size_" + verifierSuffix).c_str(),			"Test MAX_ATOMIC_COUNTER_BUFFER_SIZE",			GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE,			32,		verifier))
750	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_combined_atomic_counter_buffers_" + verifierSuffix).c_str(),		"Test MAX_COMBINED_ATOMIC_COUNTER_BUFFERS",		GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS,		1,		verifier))
751	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_combined_atomic_counters_" + verifierSuffix).c_str(),				"Test MAX_COMBINED_ATOMIC_COUNTERS",			GL_MAX_COMBINED_ATOMIC_COUNTERS,			8,		verifier))
752	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_image_units_" + verifierSuffix).c_str(),							"Test MAX_IMAGE_UNITS",							GL_MAX_IMAGE_UNITS,							4,		verifier))
753	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_combined_image_uniforms_" + verifierSuffix).c_str(),				"Test MAX_COMBINED_IMAGE_UNIFORMS",				GL_MAX_COMBINED_IMAGE_UNIFORMS,				4,		verifier))
754	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_shader_storage_buffer_bindings_" + verifierSuffix).c_str(),		"Test MAX_SHADER_STORAGE_BUFFER_BINDINGS",		GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS,		4,		verifier))
755	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_shader_storage_block_size_" + verifierSuffix).c_str(),			"Test MAX_SHADER_STORAGE_BLOCK_SIZE",			GL_MAX_SHADER_STORAGE_BLOCK_SIZE,			1<<27,	verifier))
756	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_combined_shader_storage_blocks_" + verifierSuffix).c_str(),		"Test MAX_COMBINED_SHADER_STORAGE_BLOCKS",		GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS,		4,		verifier))
757	FOR_EACH_VERIFIER(new MinimumValueCase(m_context,	(std::string() + "max_combined_shader_output_resources_" + verifierSuffix).c_str(),		"Test MAX_COMBINED_SHADER_OUTPUT_RESOURCES",	GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES,	4,		verifier))
758
759	FOR_EACH_VERIFIER(new MaxUniformBufferBindingsCase			(m_context,	(std::string() + "max_uniform_buffer_bindings_" + verifierSuffix).c_str(),				"Test MAX_UNIFORM_BUFFER_BINDINGS",				verifier))
760	FOR_EACH_VERIFIER(new MaxCombinedUniformBlocksCase			(m_context,	(std::string() + "max_combined_uniform_blocks_" + verifierSuffix).c_str(),				"Test MAX_COMBINED_UNIFORM_BLOCKS",				verifier))
761	FOR_EACH_VERIFIER(new MaxCombinedTexImageUnitsCase			(m_context,	(std::string() + "max_combined_texture_image_units_" + verifierSuffix).c_str(),			"Test MAX_COMBINED_TEXTURE_IMAGE_UNITS",		verifier))
762	FOR_EACH_VERIFIER(new CombinedComputeUniformComponentsCase	(m_context,	(std::string() + "max_combined_compute_uniform_components_" + verifierSuffix).c_str(), "Test MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS",	verifier))
763
764	FOR_EACH_VERIFIER(new LegacyVectorLimitCase(m_context,	(std::string() + "max_vertex_uniform_vectors_" + verifierSuffix).c_str(),			"Test MAX_VERTEX_UNIFORM_VECTORS",				GL_MAX_VERTEX_UNIFORM_VECTORS,			GL_MAX_VERTEX_UNIFORM_COMPONENTS,	verifier))
765	FOR_EACH_VERIFIER(new LegacyVectorLimitCase(m_context,	(std::string() + "max_fragment_uniform_vectors_" + verifierSuffix).c_str(),			"Test MAX_FRAGMENT_UNIFORM_VECTORS",			GL_MAX_FRAGMENT_UNIFORM_VECTORS,		GL_MAX_FRAGMENT_UNIFORM_COMPONENTS,	verifier))
766
767	FOR_EACH_VERIFIER(new TextureGatherLimitCase(m_context,	(std::string() + "min_program_texture_gather_offset_" + verifierSuffix).c_str(),	"Test MIN_PROGRAM_TEXTURE_GATHER_OFFSET",		false,		verifier))
768	FOR_EACH_VERIFIER(new TextureGatherLimitCase(m_context,	(std::string() + "max_program_texture_gather_offset_" + verifierSuffix).c_str(),	"Test MAX_PROGRAM_TEXTURE_GATHER_OFFSET",		true,		verifier))
769
770#undef FOR_EACH_VERIFIER
771}
772
773} // Functional
774} // gles31
775} // deqp
776