es31fTextureLevelStateQueryTests.cpp revision 18c393c846c48638f20da70b4c97dffb9e9f8992
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 Texture level state query tests
22 *//*--------------------------------------------------------------------*/
23
24#include "es31fTextureLevelStateQueryTests.hpp"
25#include "glsStateQueryUtil.hpp"
26#include "tcuTestLog.hpp"
27#include "gluRenderContext.hpp"
28#include "gluCallLogWrapper.hpp"
29#include "gluTextureUtil.hpp"
30#include "gluStrUtil.hpp"
31#include "gluContextInfo.hpp"
32#include "glwFunctions.hpp"
33#include "glwEnums.hpp"
34#include "tcuTextureUtil.hpp"
35#include "tcuFormatUtil.hpp"
36#include "deStringUtil.hpp"
37#include "deUniquePtr.hpp"
38
39namespace deqp
40{
41namespace gles31
42{
43namespace Functional
44{
45namespace
46{
47
48using namespace gls::StateQueryUtil;
49
50
51static bool textureTypeHasDepth (glw::GLenum textureBindTarget)
52{
53	switch (textureBindTarget)
54	{
55		case GL_TEXTURE_2D:						return false;
56		case GL_TEXTURE_3D:						return true;
57		case GL_TEXTURE_2D_ARRAY:				return true;
58		case GL_TEXTURE_CUBE_MAP:				return false;
59		case GL_TEXTURE_2D_MULTISAMPLE:			return false;
60		case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:	return true;
61		case GL_TEXTURE_BUFFER:					return false;
62		case GL_TEXTURE_CUBE_MAP_ARRAY:			return true;
63		default:
64			DE_ASSERT(DE_FALSE);
65			return false;
66	}
67}
68
69static bool textureTypeHasHeight (glw::GLenum textureBindTarget)
70{
71	switch (textureBindTarget)
72	{
73		case GL_TEXTURE_2D:						return true;
74		case GL_TEXTURE_3D:						return true;
75		case GL_TEXTURE_2D_ARRAY:				return true;
76		case GL_TEXTURE_CUBE_MAP:				return true;
77		case GL_TEXTURE_2D_MULTISAMPLE:			return true;
78		case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:	return true;
79		case GL_TEXTURE_BUFFER:					return false;
80		case GL_TEXTURE_CUBE_MAP_ARRAY:			return true;
81		default:
82			DE_ASSERT(DE_FALSE);
83			return false;
84	}
85}
86
87static const char* getTextureTargetExtension (glw::GLenum target)
88{
89	switch (target)
90	{
91		case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:	return "GL_OES_texture_storage_multisample_2d_array";
92		case GL_TEXTURE_BUFFER:					return "GL_EXT_texture_buffer";
93		case GL_TEXTURE_CUBE_MAP_ARRAY:			return "GL_EXT_texture_cube_map_array";
94		default:
95			DE_ASSERT(DE_FALSE);
96			return DE_NULL;
97	}
98}
99
100static bool isCoreTextureTarget (glw::GLenum target)
101{
102	switch (target)
103	{
104		case GL_TEXTURE_2D:
105		case GL_TEXTURE_3D:
106		case GL_TEXTURE_2D_ARRAY:
107		case GL_TEXTURE_CUBE_MAP:
108		case GL_TEXTURE_2D_MULTISAMPLE:
109			return true;
110
111		default:
112			return false;
113	}
114}
115
116struct TextureGenerationSpec
117{
118	struct TextureLevelSpec
119	{
120		int			width;
121		int			height;
122		int			depth;
123		int			level;
124		glw::GLenum internalFormat;
125		bool		compressed;
126
127		TextureLevelSpec (void)
128			: width				(0)
129			, height			(0)
130			, depth				(0)
131			, level				(0)
132			, internalFormat	(GL_RGBA)
133			, compressed		(false)
134		{
135		}
136	};
137
138	glw::GLenum						bindTarget;
139	glw::GLenum						queryTarget;
140	bool							immutable;
141	bool							fixedSamplePos;	// !< fixed sample pos argument for multisample textures
142	int								sampleCount;
143	int								texBufferDataOffset;
144	int								texBufferDataSize;
145	bool							bindWholeArray;
146	std::vector<TextureLevelSpec>	levels;
147	std::string						description;
148
149	TextureGenerationSpec (void)
150		: immutable				(true)
151		, fixedSamplePos		(true)
152		, sampleCount			(0)
153		, texBufferDataOffset	(0)
154		, texBufferDataSize		(256)
155		, bindWholeArray		(false)
156	{
157	}
158};
159struct IntegerPrinter
160{
161	static std::string	getIntegerName	(int v)		{ return de::toString(v); }
162	static std::string	getFloatName	(float v)	{ return de::toString(v); }
163};
164
165struct PixelFormatPrinter
166{
167	static std::string	getIntegerName	(int v)		{ return de::toString(glu::getTextureFormatStr(v));		}
168	static std::string	getFloatName	(float v)	{ return de::toString(glu::getTextureFormatStr((int)v));	}
169};
170
171template <typename Printer>
172static bool verifyTextureLevelParameterEqualWithPrinter (glu::CallLogWrapper& gl, glw::GLenum target, int level, glw::GLenum pname, int refValue, QueryType type)
173{
174	QueriedState			state;
175	tcu::ResultCollector	result	(gl.getLog(), " // ERROR: ");
176
177	gl.getLog() << tcu::TestLog::Message << "Verifying " << glu::getTextureLevelParameterStr(pname) << ", expecting " << Printer::getIntegerName(refValue) << tcu::TestLog::EndMessage;
178	queryTextureLevelState(result, gl, type, target, level, pname, state);
179
180	if (state.isUndefined())
181		return false;
182
183	verifyInteger(result, state, refValue);
184
185	return result.getResult() == QP_TEST_RESULT_PASS;
186}
187
188static bool verifyTextureLevelParameterEqual (glu::CallLogWrapper& gl, glw::GLenum target, int level, glw::GLenum pname, int refValue, QueryType type)
189{
190	return verifyTextureLevelParameterEqualWithPrinter<IntegerPrinter>(gl, target, level, pname, refValue, type);
191}
192
193static bool verifyTextureLevelParameterInternalFormatEqual (glu::CallLogWrapper& gl, glw::GLenum target, int level, glw::GLenum pname, int refValue, QueryType type)
194{
195	return verifyTextureLevelParameterEqualWithPrinter<PixelFormatPrinter>(gl, target, level, pname, refValue, type);
196}
197
198static bool verifyTextureLevelParameterGreaterOrEqual (glu::CallLogWrapper& gl, glw::GLenum target, int level, glw::GLenum pname, int refValue, QueryType type)
199{
200	QueriedState			state;
201	tcu::ResultCollector	result	(gl.getLog(), " // ERROR: ");
202
203	gl.getLog() << tcu::TestLog::Message << "Verifying " << glu::getTextureLevelParameterStr(pname) << ", expecting " << refValue << " or greater" << tcu::TestLog::EndMessage;
204	queryTextureLevelState(result, gl, type, target, level, pname, state);
205
206	if (state.isUndefined())
207		return false;
208
209	verifyIntegerMin(result, state, refValue);
210
211	return result.getResult() == QP_TEST_RESULT_PASS;
212}
213
214static bool verifyTextureLevelParameterInternalFormatAnyOf (glu::CallLogWrapper& gl, glw::GLenum target, int level, glw::GLenum pname, const int* refValues, int numRefValues, QueryType type)
215{
216	QueriedState			state;
217	tcu::ResultCollector	result	(gl.getLog(), " // ERROR: ");
218
219	// Log what we try to do
220	{
221		tcu::MessageBuilder msg(&gl.getLog());
222
223		msg << "Verifying " << glu::getTextureLevelParameterStr(pname) << ", expecting any of {";
224		for (int ndx = 0; ndx < numRefValues; ++ndx)
225		{
226			if (ndx != 0)
227				msg << ", ";
228			msg << glu::getTextureFormatStr(refValues[ndx]);
229		}
230		msg << "}";
231		msg << tcu::TestLog::EndMessage;
232	}
233
234	queryTextureLevelState(result, gl, type, target, level, pname, state);
235	if (state.isUndefined())
236		return false;
237
238	// verify
239	switch (state.getType())
240	{
241		case DATATYPE_INTEGER:
242		{
243			for (int ndx = 0; ndx < numRefValues; ++ndx)
244				if (state.getIntAccess() == refValues[ndx])
245					return true;
246
247			gl.getLog() << tcu::TestLog::Message << "Error: got " << state.getIntAccess() << ", (" << glu::getTextureFormatStr(state.getIntAccess()) << ")" << tcu::TestLog::EndMessage;
248			return false;
249		}
250		case DATATYPE_FLOAT:
251		{
252			for (int ndx = 0; ndx < numRefValues; ++ndx)
253				if (state.getFloatAccess() == (float)refValues[ndx])
254					return true;
255
256			gl.getLog() << tcu::TestLog::Message << "Error: got " << state.getFloatAccess() << ", (" << glu::getTextureFormatStr((int)state.getFloatAccess()) << ")" << tcu::TestLog::EndMessage;
257			return false;
258		}
259		default:
260			DE_ASSERT(DE_FALSE);
261			return false;
262	}
263}
264
265static bool isDepthFormat (const tcu::TextureFormat& fmt)
266{
267	return fmt.order == tcu::TextureFormat::D || fmt.order == tcu::TextureFormat::DS;
268}
269
270static bool isColorRenderableFormat (glw::GLenum internalFormat)
271{
272	return	internalFormat == GL_RGB565			||
273			internalFormat == GL_RGBA4			||
274			internalFormat == GL_RGB5_A1		||
275			internalFormat == GL_RGB10_A2		||
276			internalFormat == GL_RGB10_A2UI		||
277			internalFormat == GL_SRGB8_ALPHA8	||
278			internalFormat == GL_R8				||
279			internalFormat == GL_RG8			||
280			internalFormat == GL_RGB8			||
281			internalFormat == GL_RGBA8			||
282			internalFormat == GL_R8I			||
283			internalFormat == GL_RG8I			||
284			internalFormat == GL_RGBA8I			||
285			internalFormat == GL_R8UI			||
286			internalFormat == GL_RG8UI			||
287			internalFormat == GL_RGBA8UI		||
288			internalFormat == GL_R16I			||
289			internalFormat == GL_RG16I			||
290			internalFormat == GL_RGBA16I		||
291			internalFormat == GL_R16UI			||
292			internalFormat == GL_RG16UI			||
293			internalFormat == GL_RGBA16UI		||
294			internalFormat == GL_R32I			||
295			internalFormat == GL_RG32I			||
296			internalFormat == GL_RGBA32I		||
297			internalFormat == GL_R32UI			||
298			internalFormat == GL_RG32UI			||
299			internalFormat == GL_RGBA32UI;
300}
301
302static bool isRenderableFormat (glw::GLenum internalFormat)
303{
304	return	isColorRenderableFormat(internalFormat)	||
305			internalFormat == GL_DEPTH_COMPONENT16	||
306			internalFormat == GL_DEPTH_COMPONENT24	||
307			internalFormat == GL_DEPTH_COMPONENT32F	||
308			internalFormat == GL_DEPTH24_STENCIL8	||
309			internalFormat == GL_DEPTH32F_STENCIL8;
310}
311
312static bool isTextureBufferFormat (glw::GLenum internalFormat)
313{
314	return	internalFormat == GL_R8			||
315			internalFormat == GL_R16F		||
316			internalFormat == GL_R32F		||
317			internalFormat == GL_R8I		||
318			internalFormat == GL_R16I		||
319			internalFormat == GL_R32I		||
320			internalFormat == GL_R8UI		||
321			internalFormat == GL_R16UI		||
322			internalFormat == GL_R32UI		||
323			internalFormat == GL_RG8		||
324			internalFormat == GL_RG16F		||
325			internalFormat == GL_RG32F		||
326			internalFormat == GL_RG8I		||
327			internalFormat == GL_RG16I		||
328			internalFormat == GL_RG32I		||
329			internalFormat == GL_RG8UI		||
330			internalFormat == GL_RG16UI		||
331			internalFormat == GL_RG32UI		||
332			internalFormat == GL_RGB32F		||
333			internalFormat == GL_RGB32I		||
334			internalFormat == GL_RGB32UI	||
335			internalFormat == GL_RGBA8		||
336			internalFormat == GL_RGBA16F	||
337			internalFormat == GL_RGBA32F	||
338			internalFormat == GL_RGBA8I		||
339			internalFormat == GL_RGBA16I	||
340			internalFormat == GL_RGBA32I	||
341			internalFormat == GL_RGBA8UI	||
342			internalFormat == GL_RGBA16UI	||
343			internalFormat == GL_RGBA32UI;
344}
345
346static bool isLegalFormatForTarget (glw::GLenum target, glw::GLenum format)
347{
348	const tcu::TextureFormat fmt = glu::mapGLInternalFormat(format);
349
350	if (target == GL_TEXTURE_3D && isDepthFormat(fmt))
351		return false;
352	if ((target == GL_TEXTURE_2D_MULTISAMPLE || target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY) && !isRenderableFormat(format))
353		return false;
354	if (target == GL_TEXTURE_BUFFER || !isTextureBufferFormat(format))
355		return false;
356	return true;
357}
358
359static bool isCompressionSupportedForTarget (glw::GLenum target)
360{
361	return target == GL_TEXTURE_2D || target == GL_TEXTURE_2D_ARRAY;
362}
363
364static bool isMultisampleTarget (glw::GLenum target)
365{
366	return target == GL_TEXTURE_2D_MULTISAMPLE || target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY;
367}
368
369static bool targetSupportsMipLevels (glw::GLenum target)
370{
371	return	target != GL_TEXTURE_2D_MULTISAMPLE &&
372			target != GL_TEXTURE_2D_MULTISAMPLE_ARRAY &&
373			target != GL_TEXTURE_BUFFER;
374}
375
376static int getPixelSize (glw::GLenum internalFormat)
377{
378	const tcu::TextureFormat fmt = glu::mapGLInternalFormat(internalFormat);
379	return fmt.getPixelSize();
380}
381
382static void generateColorTextureGenerationGroup (std::vector<TextureGenerationSpec>& group, glw::GLenum target, int maxSamples, glw::GLenum internalFormat)
383{
384	const glw::GLenum queryTarget = (target == GL_TEXTURE_CUBE_MAP) ? (GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) : (target);
385
386	// initial
387	{
388		TextureGenerationSpec texGen;
389		texGen.bindTarget		= target;
390		texGen.queryTarget		= queryTarget;
391		texGen.immutable		= true;
392		texGen.sampleCount		= 0;
393		texGen.description		= glu::getTextureTargetStr(target).toString() + ", initial values";
394
395		group.push_back(texGen);
396	}
397
398	// ms targets
399	if (isMultisampleTarget(target))
400	{
401		{
402			TextureGenerationSpec					texGen;
403			TextureGenerationSpec::TextureLevelSpec	level;
404
405			texGen.bindTarget		= target;
406			texGen.queryTarget		= queryTarget;
407			texGen.immutable		= true;
408			texGen.sampleCount		= 1;
409			texGen.fixedSamplePos	= false;
410			texGen.description		= glu::getTextureTargetStr(target).toString() + ", low sample count";
411
412			level.width				= 16;
413			level.height			= 16;
414			level.depth				= (textureTypeHasDepth(texGen.bindTarget)) ? (6) : (1);
415			level.level				= 0;
416			level.internalFormat	= internalFormat;
417			level.compressed		= false;
418
419			texGen.levels.push_back(level);
420			group.push_back(texGen);
421		}
422		{
423			TextureGenerationSpec					texGen;
424			TextureGenerationSpec::TextureLevelSpec	level;
425
426			texGen.bindTarget		= target;
427			texGen.queryTarget		= queryTarget;
428			texGen.immutable		= true;
429			texGen.sampleCount		= maxSamples;
430			texGen.fixedSamplePos	= false;
431			texGen.description		= glu::getTextureTargetStr(target).toString() + ", high sample count";
432
433			level.width				= 32;
434			level.height			= 32;
435			level.depth				= (textureTypeHasDepth(texGen.bindTarget)) ? (6) : (1);
436			level.level				= 0;
437			level.internalFormat	= internalFormat;
438			level.compressed		= false;
439
440			texGen.levels.push_back(level);
441			group.push_back(texGen);
442		}
443		{
444			TextureGenerationSpec					texGen;
445			TextureGenerationSpec::TextureLevelSpec	level;
446
447			texGen.bindTarget		= target;
448			texGen.queryTarget		= queryTarget;
449			texGen.immutable		= true;
450			texGen.sampleCount		= maxSamples;
451			texGen.fixedSamplePos	= true;
452			texGen.description		= glu::getTextureTargetStr(target).toString() + ", fixed sample positions";
453
454			level.width				= 32;
455			level.height			= 32;
456			level.depth				= (textureTypeHasDepth(texGen.bindTarget)) ? (6) : (1);
457			level.level				= 0;
458			level.internalFormat	= internalFormat;
459			level.compressed		= false;
460
461			texGen.levels.push_back(level);
462			group.push_back(texGen);
463		}
464	}
465	else if (target == GL_TEXTURE_BUFFER)
466	{
467		// whole buffer
468		{
469			TextureGenerationSpec					texGen;
470			TextureGenerationSpec::TextureLevelSpec	level;
471			const int								baseSize = getPixelSize(internalFormat);
472
473			texGen.bindTarget			= target;
474			texGen.queryTarget			= queryTarget;
475			texGen.immutable			= true;
476			texGen.description			= glu::getTextureTargetStr(target).toString() + ", whole buffer";
477			texGen.texBufferDataOffset	= 0;
478			texGen.texBufferDataSize	= 32 * baseSize + (baseSize - 1);
479			texGen.bindWholeArray		= true;
480
481			level.width				= 32;
482			level.height			= 1;
483			level.depth				= 1;
484			level.level				= 0;
485			level.internalFormat	= internalFormat;
486			level.compressed		= false;
487
488			texGen.levels.push_back(level);
489			group.push_back(texGen);
490		}
491		// partial buffer
492		{
493			TextureGenerationSpec					texGen;
494			TextureGenerationSpec::TextureLevelSpec	level;
495			const int								baseSize = getPixelSize(internalFormat);
496
497			texGen.bindTarget			= target;
498			texGen.queryTarget			= queryTarget;
499			texGen.immutable			= true;
500			texGen.description			= glu::getTextureTargetStr(target).toString() + ", partial buffer";
501			texGen.texBufferDataOffset	= 256;
502			texGen.texBufferDataSize	= 16 * baseSize + (baseSize - 1);
503			texGen.bindWholeArray		= false;
504
505			level.width				= 16;
506			level.height			= 1;
507			level.depth				= 1;
508			level.level				= 0;
509			level.internalFormat	= internalFormat;
510			level.compressed		= false;
511
512			texGen.levels.push_back(level);
513			group.push_back(texGen);
514		}
515	}
516	else
517	{
518		// immutable
519		{
520			TextureGenerationSpec					texGen;
521			TextureGenerationSpec::TextureLevelSpec	level;
522
523			texGen.bindTarget		= target;
524			texGen.queryTarget		= queryTarget;
525			texGen.immutable		= true;
526			texGen.description		= glu::getTextureTargetStr(target).toString() + ", immutable";
527
528			level.width				= 32;
529			level.height			= 32;
530			level.depth				= (textureTypeHasDepth(texGen.bindTarget)) ? (6) : (1);
531			level.level				= 0;
532			level.internalFormat	= internalFormat;
533			level.compressed		= false;
534
535			texGen.levels.push_back(level);
536			group.push_back(texGen);
537		}
538		// mutable
539		{
540			TextureGenerationSpec					texGen;
541			TextureGenerationSpec::TextureLevelSpec	level;
542
543			texGen.bindTarget		= target;
544			texGen.queryTarget		= queryTarget;
545			texGen.immutable		= false;
546			texGen.description		= glu::getTextureTargetStr(target).toString() + ", mutable";
547
548			level.width				= 16;
549			level.height			= (target == GL_TEXTURE_CUBE_MAP || target == GL_TEXTURE_CUBE_MAP_ARRAY) ? (16) : (64);
550			level.depth				= (textureTypeHasDepth(texGen.bindTarget)) ? (6) : (1);
551			level.level				= 0;
552			level.internalFormat	= internalFormat;
553			level.compressed		= false;
554
555			texGen.levels.push_back(level);
556			group.push_back(texGen);
557		}
558		// mip3
559		{
560			TextureGenerationSpec					texGen;
561			TextureGenerationSpec::TextureLevelSpec	level;
562
563			texGen.bindTarget		= target;
564			texGen.queryTarget		= queryTarget;
565			texGen.immutable		= false;
566			texGen.description		= glu::getTextureTargetStr(target).toString() + ", mip level 3";
567
568			level.width				= 4;
569			level.height			= (target == GL_TEXTURE_CUBE_MAP || target == GL_TEXTURE_CUBE_MAP_ARRAY) ? (4) : (8);
570			level.depth				= (textureTypeHasDepth(texGen.bindTarget)) ? (6) : (1);
571			level.level				= 3;
572			level.internalFormat	= internalFormat;
573			level.compressed		= false;
574
575			texGen.levels.push_back(level);
576			group.push_back(texGen);
577		}
578	}
579}
580
581static void generateInternalFormatTextureGenerationGroup (std::vector<TextureGenerationSpec>& group, glw::GLenum target)
582{
583	const glw::GLenum queryTarget = (target == GL_TEXTURE_CUBE_MAP) ? (GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) : (target);
584
585	// Internal formats
586	static const glw::GLenum internalFormats[] =
587	{
588		GL_R8, GL_R8_SNORM, GL_RG8, GL_RG8_SNORM, GL_RGB8, GL_RGB8_SNORM, GL_RGB565, GL_RGBA4, GL_RGB5_A1,
589		GL_RGBA8, GL_RGBA8_SNORM, GL_RGB10_A2, GL_RGB10_A2UI, GL_SRGB8, GL_SRGB8_ALPHA8, GL_R16F, GL_RG16F,
590		GL_RGB16F, GL_RGBA16F, GL_R32F, GL_RG32F, GL_RGB32F, GL_RGBA32F, GL_R11F_G11F_B10F, GL_RGB9_E5, GL_R8I,
591		GL_R8UI, GL_R16I, GL_R16UI, GL_R32I, GL_R32UI, GL_RG8I, GL_RG8UI, GL_RG16I, GL_RG16UI, GL_RG32I, GL_RG32UI,
592		GL_RGB8I, GL_RGB8UI, GL_RGB16I, GL_RGB16UI, GL_RGB32I, GL_RGB32UI, GL_RGBA8I, GL_RGBA8UI, GL_RGBA16I,
593		GL_RGBA16UI, GL_RGBA32I, GL_RGBA32UI,
594
595		GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT16,
596		GL_DEPTH32F_STENCIL8, GL_DEPTH24_STENCIL8
597	};
598
599	// initial
600	{
601		TextureGenerationSpec texGen;
602		texGen.bindTarget		= target;
603		texGen.queryTarget		= queryTarget;
604		texGen.immutable		= true;
605		texGen.sampleCount		= 0;
606		texGen.fixedSamplePos	= true;
607		texGen.description		= glu::getTextureTargetStr(target).toString() + ", initial values";
608
609		group.push_back(texGen);
610	}
611
612	// test all formats
613	for (int internalFormatNdx = 0; internalFormatNdx < DE_LENGTH_OF_ARRAY(internalFormats); ++internalFormatNdx)
614	{
615		if (!isLegalFormatForTarget(target, internalFormats[internalFormatNdx]))
616			continue;
617
618		const int								baseSize = getPixelSize(internalFormats[internalFormatNdx]);
619		TextureGenerationSpec					texGen;
620		TextureGenerationSpec::TextureLevelSpec	level;
621
622		texGen.bindTarget		= target;
623		texGen.queryTarget		= queryTarget;
624		texGen.immutable		= true;
625		texGen.sampleCount		= (isMultisampleTarget(target) ? (1) : (0));
626		texGen.description		= glu::getTextureTargetStr(target).toString() + ", internal format " + glu::getTextureFormatName(internalFormats[internalFormatNdx]);
627
628		if (target == GL_TEXTURE_BUFFER)
629		{
630			texGen.texBufferDataOffset	= 0;
631			texGen.texBufferDataSize	= 32 * baseSize + (baseSize - 1);
632			texGen.bindWholeArray		= true;
633		}
634
635		level.width				= 32;
636		level.height			= (textureTypeHasHeight(target)) ? (32) : (1);
637		level.depth				= (textureTypeHasDepth(target)) ? (6) : (1);
638		level.level				= 0;
639		level.internalFormat	= internalFormats[internalFormatNdx];
640		level.compressed		= false;
641
642		texGen.levels.push_back(level);
643		group.push_back(texGen);
644	}
645
646	// test mutable rgba8 with mip level 3
647	if (targetSupportsMipLevels(target))
648	{
649		TextureGenerationSpec					texGen;
650		TextureGenerationSpec::TextureLevelSpec	level;
651
652		texGen.bindTarget		= target;
653		texGen.queryTarget		= queryTarget;
654		texGen.immutable		= false;
655		texGen.description		= glu::getTextureTargetStr(target).toString() + ", internal format GL_RGBA8, mip level 3";
656
657		level.width				= 32;
658		level.height			= 32;
659		level.depth				= (textureTypeHasDepth(target)) ? (6) : (1);
660		level.level				= 3;
661		level.internalFormat	= GL_RGBA8;
662		level.compressed		= false;
663
664		texGen.levels.push_back(level);
665		group.push_back(texGen);
666	}
667}
668
669static void generateCompressedTextureGenerationGroup (std::vector<TextureGenerationSpec>& group, glw::GLenum target)
670{
671	const glw::GLenum queryTarget = (target == GL_TEXTURE_CUBE_MAP) ? (GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) : (target);
672
673	// initial
674	{
675		TextureGenerationSpec texGen;
676		texGen.bindTarget	= target;
677		texGen.queryTarget	= queryTarget;
678		texGen.immutable	= true;
679		texGen.description	= glu::getTextureTargetStr(target).toString() + ", initial values";
680
681		group.push_back(texGen);
682	}
683
684	// compressed
685	if (isCompressionSupportedForTarget(target))
686	{
687		TextureGenerationSpec					texGen;
688		TextureGenerationSpec::TextureLevelSpec	level;
689
690		texGen.bindTarget		= target;
691		texGen.queryTarget		= queryTarget;
692		texGen.immutable		= false;
693		texGen.description		= glu::getTextureTargetStr(target).toString() + ", compressed";
694
695		level.width				= 32;
696		level.height			= 32;
697		level.depth				= (target == GL_TEXTURE_2D_ARRAY) ? (2) : (1);
698		level.level				= 0;
699		level.internalFormat	= GL_COMPRESSED_RGB8_ETC2;
700		level.compressed		= true;
701
702		texGen.levels.push_back(level);
703		group.push_back(texGen);
704	}
705}
706
707static void generateTextureBufferGenerationGroup (std::vector<TextureGenerationSpec>& group, glw::GLenum target)
708{
709	const glw::GLenum queryTarget = (target == GL_TEXTURE_CUBE_MAP) ? (GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) : (target);
710
711	// initial
712	{
713		TextureGenerationSpec texGen;
714		texGen.bindTarget		= target;
715		texGen.queryTarget		= queryTarget;
716		texGen.immutable		= true;
717		texGen.sampleCount		= 0;
718		texGen.description		= glu::getTextureTargetStr(target).toString() + ", initial values";
719
720		group.push_back(texGen);
721	}
722
723	// actual specification tests are in texture_buffer tests, no need to do them here too
724}
725
726bool applyTextureGenerationSpec (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec, glw::GLuint& texBuffer)
727{
728	bool allOk = true;
729
730	DE_ASSERT(!(spec.immutable && spec.levels.size() > 1));		// !< immutable textures have only one level
731
732	for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
733	{
734		const glu::TransferFormat transferFormat = (spec.levels[levelNdx].compressed) ? (glu::TransferFormat()) : (glu::getTransferFormat(glu::mapGLInternalFormat(spec.levels[levelNdx].internalFormat)));
735
736		if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D)
737			gl.glTexStorage2D(spec.bindTarget, 1, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height);
738		else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_3D)
739			gl.glTexStorage3D(spec.bindTarget, 1, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height, spec.levels[levelNdx].depth);
740		else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D_ARRAY)
741			gl.glTexStorage3D(spec.bindTarget, 1, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height, spec.levels[levelNdx].depth);
742		else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_CUBE_MAP)
743			gl.glTexStorage2D(spec.bindTarget, 1, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height);
744		else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D_MULTISAMPLE)
745			gl.glTexStorage2DMultisample(spec.bindTarget, spec.sampleCount, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height, (spec.fixedSamplePos) ? (GL_TRUE) : (GL_FALSE));
746		else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
747			gl.glTexStorage3DMultisample(spec.bindTarget, spec.sampleCount, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height, spec.levels[levelNdx].depth, (spec.fixedSamplePos) ? (GL_TRUE) : (GL_FALSE));
748		else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_CUBE_MAP_ARRAY)
749			gl.glTexStorage3D(spec.bindTarget, 1, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height, spec.levels[levelNdx].depth);
750		else if (!spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D)
751			gl.glTexImage2D(spec.bindTarget, spec.levels[levelNdx].level, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height, 0, transferFormat.format, transferFormat.dataType, DE_NULL);
752		else if (!spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_3D)
753			gl.glTexImage3D(spec.bindTarget, spec.levels[levelNdx].level, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height, spec.levels[levelNdx].depth, 0, transferFormat.format, transferFormat.dataType, DE_NULL);
754		else if (!spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D_ARRAY)
755			gl.glTexImage3D(spec.bindTarget, spec.levels[levelNdx].level, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height, spec.levels[levelNdx].depth, 0, transferFormat.format, transferFormat.dataType, DE_NULL);
756		else if (!spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_CUBE_MAP)
757			gl.glTexImage2D(spec.queryTarget, spec.levels[levelNdx].level, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height, 0, transferFormat.format, transferFormat.dataType, DE_NULL);
758		else if (!spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_CUBE_MAP_ARRAY)
759			gl.glTexImage3D(spec.bindTarget, spec.levels[levelNdx].level, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height, spec.levels[levelNdx].depth, 0, transferFormat.format, transferFormat.dataType, DE_NULL);
760		else if (!spec.immutable && spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D)
761		{
762			DE_ASSERT(spec.levels[levelNdx].width == 32);
763			DE_ASSERT(spec.levels[levelNdx].height == 32);
764			DE_ASSERT(spec.levels[levelNdx].internalFormat == GL_COMPRESSED_RGB8_ETC2);
765
766			static const deUint8 buffer[64 * 8] = { 0 };
767			gl.glCompressedTexImage2D(spec.bindTarget, spec.levels[levelNdx].level, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height, 0, sizeof(buffer), buffer);
768		}
769		else if (!spec.immutable && spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D_ARRAY)
770		{
771			DE_ASSERT(spec.levels[levelNdx].width == 32);
772			DE_ASSERT(spec.levels[levelNdx].height == 32);
773			DE_ASSERT(spec.levels[levelNdx].depth == 2);
774			DE_ASSERT(spec.levels[levelNdx].internalFormat == GL_COMPRESSED_RGB8_ETC2);
775
776			static const deUint8 buffer[64 * 8 * 2] = { 0 };
777			gl.glCompressedTexImage3D(spec.bindTarget, spec.levels[levelNdx].level, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height, spec.levels[levelNdx].depth, 0, sizeof(buffer), buffer);
778		}
779		else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_BUFFER)
780		{
781			gl.glGenBuffers(1, &texBuffer);
782			gl.glBindBuffer(GL_TEXTURE_BUFFER, texBuffer);
783
784			if (spec.bindWholeArray)
785			{
786				gl.glBufferData(GL_TEXTURE_BUFFER, spec.texBufferDataSize, DE_NULL, GL_STATIC_DRAW);
787				gl.glTexBuffer(GL_TEXTURE_BUFFER, spec.levels[levelNdx].internalFormat, texBuffer);
788			}
789			else
790			{
791				gl.glBufferData(GL_TEXTURE_BUFFER, spec.texBufferDataOffset + spec.texBufferDataSize, DE_NULL, GL_STATIC_DRAW);
792				gl.glTexBufferRange(GL_TEXTURE_BUFFER, spec.levels[levelNdx].internalFormat, texBuffer, spec.texBufferDataOffset, spec.texBufferDataSize);
793			}
794		}
795		else
796			DE_ASSERT(DE_FALSE);
797
798		{
799			const glw::GLenum err = gl.glGetError();
800			if (err != GL_NO_ERROR)
801			{
802				gl.getLog()	<< tcu::TestLog::Message
803							<< "Texture specification failed, got " + glu::getErrorStr(err).toString()
804							<< tcu::TestLog::EndMessage;
805				allOk = false;
806			}
807		}
808	}
809
810	return allOk;
811}
812
813class TextureLevelCase : public TestCase
814{
815public:
816										TextureLevelCase		(Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type);
817										~TextureLevelCase		(void);
818
819	void								init					(void);
820	void								deinit					(void);
821	IterateResult						iterate					(void);
822
823protected:
824	void								getFormatSamples		(glw::GLenum internalFormat, std::vector<int>& samples);
825	bool								testConfig				(const TextureGenerationSpec& spec);
826	virtual bool						checkTextureState		(glu::CallLogWrapper& gl, const TextureGenerationSpec& spec) = 0;
827	virtual void						generateTestIterations	(std::vector<TextureGenerationSpec>& iterations) = 0;
828
829	const QueryType						m_type;
830	const glw::GLenum					m_target;
831	glw::GLuint							m_texture;
832	glw::GLuint							m_texBuffer;
833
834private:
835	int									m_iteration;
836	std::vector<TextureGenerationSpec>	m_iterations;
837	bool								m_allIterationsOk;
838	std::vector<int>					m_failedIterations;
839};
840
841TextureLevelCase::TextureLevelCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
842	: TestCase			(ctx, name, desc)
843	, m_type			(type)
844	, m_target			(target)
845	, m_texture			(0)
846	, m_texBuffer		(0)
847	, m_iteration		(0)
848	, m_allIterationsOk	(true)
849{
850}
851
852TextureLevelCase::~TextureLevelCase (void)
853{
854	deinit();
855}
856
857void TextureLevelCase::init (void)
858{
859	if (!isCoreTextureTarget(m_target))
860	{
861		const char* const targetExtension = getTextureTargetExtension(m_target);
862
863		if (!m_context.getContextInfo().isExtensionSupported(targetExtension))
864			throw tcu::NotSupportedError("Test requires " + std::string(targetExtension) + " extension");
865	}
866
867	generateTestIterations(m_iterations);
868
869	for (int iterationNdx = 0; iterationNdx < (int)m_iterations.size(); ++iterationNdx)
870		DE_ASSERT(m_iterations[iterationNdx].bindTarget == m_target);
871}
872
873void TextureLevelCase::deinit (void)
874{
875	if (m_texture)
876	{
877		m_context.getRenderContext().getFunctions().deleteTextures(1, &m_texture);
878		m_texture = 0;
879	}
880	if (m_texBuffer)
881	{
882		m_context.getRenderContext().getFunctions().deleteTextures(1, &m_texBuffer);
883		m_texBuffer = 0;
884	}
885}
886
887void TextureLevelCase::getFormatSamples (glw::GLenum internalFormat, std::vector<int>& samples)
888{
889	const glw::Functions	gl			= m_context.getRenderContext().getFunctions();
890	int						sampleCount	= -1;
891
892	if (!isMultisampleTarget(m_target))
893		return;
894
895	gl.getInternalformativ(m_target, internalFormat, GL_NUM_SAMPLE_COUNTS, 1, &sampleCount);
896
897	if (sampleCount < 0)
898		throw tcu::TestError("internal format query failed");
899
900	samples.resize(sampleCount);
901
902	if (sampleCount > 0)
903	{
904		gl.getInternalformativ(m_target, internalFormat, GL_SAMPLES, sampleCount, &samples[0]);
905		GLU_EXPECT_NO_ERROR(gl.getError(), "get max samples");
906	}
907}
908
909TextureLevelCase::IterateResult TextureLevelCase::iterate (void)
910{
911	const bool result = testConfig(m_iterations[m_iteration]);
912
913	if (!result)
914	{
915		m_failedIterations.push_back(m_iteration);
916		m_allIterationsOk = false;
917	}
918
919	if (++m_iteration < (int)m_iterations.size())
920		return CONTINUE;
921
922	if (m_allIterationsOk)
923		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
924	else
925	{
926		tcu::MessageBuilder msg(&m_testCtx.getLog());
927
928		msg << "Following iteration(s) failed: ";
929		for (int ndx = 0; ndx < (int)m_failedIterations.size(); ++ndx)
930		{
931			if (ndx)
932				msg << ", ";
933			msg << (m_failedIterations[ndx] + 1);
934		}
935		msg << tcu::TestLog::EndMessage;
936
937		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "One or more iterations failed");
938	}
939	return STOP;
940}
941
942bool TextureLevelCase::testConfig (const TextureGenerationSpec& spec)
943{
944	const tcu::ScopedLogSection section(m_testCtx.getLog(), "Iteration", std::string() + "Iteration " + de::toString(m_iteration+1) + "/" + de::toString((int)m_iterations.size()) + " - " + spec.description);
945	glu::CallLogWrapper			gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
946	bool						result;
947
948	gl.enableLogging(true);
949
950	gl.glGenTextures(1, &m_texture);
951	gl.glBindTexture(spec.bindTarget, m_texture);
952	GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
953
954	// Set the state
955	applyTextureGenerationSpec(gl, spec, m_texBuffer);
956
957	// Verify the state
958	result = checkTextureState(gl, spec);
959
960	gl.glDeleteTextures(1, &m_texture);
961	m_texture = 0;
962
963	if (m_texBuffer)
964	{
965		gl.glDeleteBuffers(1, &m_texBuffer);
966		m_texture = 0;
967	}
968
969	return result;
970}
971
972/*--------------------------------------------------------------------*//*!
973 * \brief Test texture target
974 *//*--------------------------------------------------------------------*/
975class TextureLevelCommonCase : public TextureLevelCase
976{
977public:
978						TextureLevelCommonCase	(Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type);
979
980protected:
981	virtual void		generateTestIterations	(std::vector<TextureGenerationSpec>& iterations);
982};
983
984TextureLevelCommonCase::TextureLevelCommonCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
985	: TextureLevelCase(ctx, name, desc, target, type)
986{
987}
988
989void TextureLevelCommonCase::generateTestIterations (std::vector<TextureGenerationSpec>& iterations)
990{
991	const glw::GLenum	internalFormat = GL_RGBA8;
992	int					maxSamples;
993	std::vector<int>	samples;
994
995	getFormatSamples(internalFormat, samples);
996	if (samples.empty())
997		maxSamples = -1;
998	else
999		maxSamples = samples[0];
1000
1001	generateColorTextureGenerationGroup(iterations, m_target, maxSamples, internalFormat);
1002}
1003
1004class TextureLevelSampleCase : public TextureLevelCommonCase
1005{
1006public:
1007	TextureLevelSampleCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1008		: TextureLevelCommonCase(ctx, name, desc, target, type)
1009	{
1010	}
1011
1012private:
1013	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
1014	{
1015		const int queryLevel	= (spec.levels.empty()) ? (0) : (spec.levels[0].level);
1016		const int refValue		= (spec.levels.empty()) ? (0) : (spec.sampleCount);
1017
1018		return verifyTextureLevelParameterGreaterOrEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_SAMPLES, refValue, m_type);
1019	}
1020};
1021
1022class TextureLevelFixedSamplesCase : public TextureLevelCommonCase
1023{
1024public:
1025	TextureLevelFixedSamplesCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1026		: TextureLevelCommonCase(ctx, name, desc, target, type)
1027	{
1028	}
1029
1030private:
1031	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
1032	{
1033		const int queryLevel	= (spec.levels.empty()) ? (0) : (spec.levels[0].level);
1034		const int refValue		= (spec.levels.empty()) ? (1) : ((spec.fixedSamplePos) ? (1) : (0));
1035
1036		return verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_FIXED_SAMPLE_LOCATIONS, refValue, m_type);
1037	}
1038};
1039
1040class TextureLevelWidthCase : public TextureLevelCommonCase
1041{
1042public:
1043	TextureLevelWidthCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1044		: TextureLevelCommonCase(ctx, name, desc, target, type)
1045	{
1046	}
1047
1048private:
1049	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
1050	{
1051		const int	initialValue	= 0;
1052		bool		allOk			= true;
1053
1054		if (spec.levels.empty())
1055		{
1056			const int queryLevel	= 0;
1057			const int refValue		= initialValue;
1058
1059			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_WIDTH, refValue, m_type);
1060		}
1061		else
1062		{
1063			for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
1064			{
1065				const int queryLevel	= spec.levels[levelNdx].level;
1066				const int refValue		= spec.levels[levelNdx].width;
1067
1068				allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_WIDTH, refValue, m_type);
1069			}
1070		}
1071
1072		return allOk;
1073	}
1074};
1075
1076class TextureLevelHeightCase : public TextureLevelCommonCase
1077{
1078public:
1079	TextureLevelHeightCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1080		: TextureLevelCommonCase(ctx, name, desc, target, type)
1081	{
1082	}
1083
1084private:
1085	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
1086	{
1087		const int	initialValue	= 0;
1088		bool		allOk			= true;
1089
1090		if (spec.levels.empty())
1091		{
1092			const int queryLevel	= 0;
1093			const int refValue		= initialValue;
1094
1095			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_HEIGHT, refValue, m_type);
1096		}
1097		else
1098		{
1099			for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
1100			{
1101				const int queryLevel	= spec.levels[levelNdx].level;
1102				const int refValue		= spec.levels[levelNdx].height;
1103
1104				allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_HEIGHT, refValue, m_type);
1105			}
1106		}
1107
1108		return allOk;
1109	}
1110};
1111
1112class TextureLevelDepthCase : public TextureLevelCommonCase
1113{
1114public:
1115	TextureLevelDepthCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1116		: TextureLevelCommonCase(ctx, name, desc, target, type)
1117	{
1118	}
1119
1120private:
1121
1122	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
1123	{
1124		const int	initialValue	= 0;
1125		bool		allOk			= true;
1126
1127		if (spec.levels.empty())
1128		{
1129			const int queryLevel	= 0;
1130			const int refValue		= initialValue;
1131
1132			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_DEPTH, refValue, m_type);
1133		}
1134		else
1135		{
1136			for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
1137			{
1138				const int queryLevel	= spec.levels[levelNdx].level;
1139				const int refValue		= spec.levels[levelNdx].depth;
1140
1141				allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_DEPTH, refValue, m_type);
1142			}
1143		}
1144
1145		return allOk;
1146	}
1147};
1148
1149class TextureLevelInternalFormatCase : public TextureLevelCase
1150{
1151public:
1152	TextureLevelInternalFormatCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1153		: TextureLevelCase(ctx, name, desc, target, type)
1154	{
1155	}
1156
1157private:
1158	void generateTestIterations (std::vector<TextureGenerationSpec>& iterations)
1159	{
1160		generateInternalFormatTextureGenerationGroup(iterations, m_target);
1161	}
1162
1163	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
1164	{
1165		bool allOk = true;
1166
1167		if (spec.levels.empty())
1168		{
1169			const int queryLevel		= 0;
1170			const int initialValues[2]	= { GL_RGBA, GL_R8 };
1171
1172			allOk &= verifyTextureLevelParameterInternalFormatAnyOf(gl, spec.queryTarget, queryLevel, GL_TEXTURE_INTERNAL_FORMAT, initialValues, DE_LENGTH_OF_ARRAY(initialValues), m_type);
1173		}
1174		else
1175		{
1176			for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
1177			{
1178				const int queryLevel	= spec.levels[levelNdx].level;
1179				const int refValue		= spec.levels[levelNdx].internalFormat;
1180
1181				allOk &= verifyTextureLevelParameterInternalFormatEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_INTERNAL_FORMAT, refValue, m_type);
1182			}
1183		}
1184
1185		return allOk;
1186	}
1187};
1188
1189class TextureLevelSizeCase : public TextureLevelCase
1190{
1191public:
1192						TextureLevelSizeCase			(Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type, glw::GLenum pname);
1193
1194private:
1195	void				generateTestIterations			(std::vector<TextureGenerationSpec>& iterations);
1196	bool				checkTextureState				(glu::CallLogWrapper& gl, const TextureGenerationSpec& spec);
1197	int					getMinimumComponentResolution	(glw::GLenum internalFormat);
1198
1199	const glw::GLenum	m_pname;
1200};
1201
1202TextureLevelSizeCase::TextureLevelSizeCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type, glw::GLenum pname)
1203	: TextureLevelCase	(ctx, name, desc, target, type)
1204	, m_pname			(pname)
1205{
1206}
1207
1208void TextureLevelSizeCase::generateTestIterations (std::vector<TextureGenerationSpec>& iterations)
1209{
1210	generateInternalFormatTextureGenerationGroup(iterations, m_target);
1211}
1212
1213bool TextureLevelSizeCase::checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
1214{
1215	bool allOk = true;
1216
1217	if (spec.levels.empty())
1218	{
1219		allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, m_pname, 0, m_type);
1220	}
1221	else
1222	{
1223		for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
1224		{
1225			const int queryLevel	= spec.levels[levelNdx].level;
1226			const int refValue		= getMinimumComponentResolution(spec.levels[levelNdx].internalFormat);
1227
1228			allOk &= verifyTextureLevelParameterGreaterOrEqual(gl, spec.queryTarget, queryLevel, m_pname, refValue, m_type);
1229		}
1230	}
1231
1232	return allOk;
1233}
1234
1235int TextureLevelSizeCase::getMinimumComponentResolution (glw::GLenum internalFormat)
1236{
1237	const tcu::TextureFormat	format			= glu::mapGLInternalFormat(internalFormat);
1238	const tcu::IVec4			channelBitDepth	= tcu::getTextureFormatBitDepth(format);
1239
1240	switch (m_pname)
1241	{
1242		case GL_TEXTURE_RED_SIZE:
1243			if (format.order == tcu::TextureFormat::R		||
1244				format.order == tcu::TextureFormat::RG		||
1245				format.order == tcu::TextureFormat::RGB		||
1246				format.order == tcu::TextureFormat::RGBA	||
1247				format.order == tcu::TextureFormat::BGRA	||
1248				format.order == tcu::TextureFormat::ARGB	||
1249				format.order == tcu::TextureFormat::sRGB	||
1250				format.order == tcu::TextureFormat::sRGBA)
1251				return channelBitDepth[0];
1252			else
1253				return 0;
1254
1255		case GL_TEXTURE_GREEN_SIZE:
1256			if (format.order == tcu::TextureFormat::RG		||
1257				format.order == tcu::TextureFormat::RGB		||
1258				format.order == tcu::TextureFormat::RGBA	||
1259				format.order == tcu::TextureFormat::BGRA	||
1260				format.order == tcu::TextureFormat::ARGB	||
1261				format.order == tcu::TextureFormat::sRGB	||
1262				format.order == tcu::TextureFormat::sRGBA)
1263				return channelBitDepth[1];
1264			else
1265				return 0;
1266
1267		case GL_TEXTURE_BLUE_SIZE:
1268			if (format.order == tcu::TextureFormat::RGB		||
1269				format.order == tcu::TextureFormat::RGBA	||
1270				format.order == tcu::TextureFormat::BGRA	||
1271				format.order == tcu::TextureFormat::ARGB	||
1272				format.order == tcu::TextureFormat::sRGB	||
1273				format.order == tcu::TextureFormat::sRGBA)
1274				return channelBitDepth[2];
1275			else
1276				return 0;
1277
1278		case GL_TEXTURE_ALPHA_SIZE:
1279			if (format.order == tcu::TextureFormat::RGBA	||
1280				format.order == tcu::TextureFormat::BGRA	||
1281				format.order == tcu::TextureFormat::ARGB	||
1282				format.order == tcu::TextureFormat::sRGBA)
1283				return channelBitDepth[3];
1284			else
1285				return 0;
1286
1287		case GL_TEXTURE_DEPTH_SIZE:
1288			if (format.order == tcu::TextureFormat::D	||
1289				format.order == tcu::TextureFormat::DS)
1290				return channelBitDepth[0];
1291			else
1292				return 0;
1293
1294		case GL_TEXTURE_STENCIL_SIZE:
1295			if (format.order == tcu::TextureFormat::DS)
1296				return channelBitDepth[3];
1297			else
1298				return 0;
1299
1300		case GL_TEXTURE_SHARED_SIZE:
1301			if (internalFormat == GL_RGB9_E5)
1302				return 5;
1303			else
1304				return 0;
1305		default:
1306			DE_ASSERT(DE_FALSE);
1307			return 0;
1308	}
1309}
1310
1311class TextureLevelTypeCase : public TextureLevelCase
1312{
1313public:
1314						TextureLevelTypeCase			(Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type, glw::GLenum pname);
1315
1316private:
1317	void				generateTestIterations			(std::vector<TextureGenerationSpec>& iterations);
1318	bool				checkTextureState				(glu::CallLogWrapper& gl, const TextureGenerationSpec& spec);
1319	int					getComponentType				(glw::GLenum internalFormat);
1320
1321	const glw::GLenum	m_pname;
1322};
1323
1324TextureLevelTypeCase::TextureLevelTypeCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type, glw::GLenum pname)
1325	: TextureLevelCase	(ctx, name, desc, target, type)
1326	, m_pname			(pname)
1327{
1328}
1329
1330void TextureLevelTypeCase::generateTestIterations (std::vector<TextureGenerationSpec>& iterations)
1331{
1332	generateInternalFormatTextureGenerationGroup(iterations, m_target);
1333}
1334
1335bool TextureLevelTypeCase::checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
1336{
1337	bool allOk = true;
1338
1339	if (spec.levels.empty())
1340	{
1341		allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, m_pname, GL_NONE, m_type);
1342	}
1343	else
1344	{
1345		for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
1346		{
1347			const int queryLevel	= spec.levels[levelNdx].level;
1348			const int refValue		= getComponentType(spec.levels[levelNdx].internalFormat);
1349
1350			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, m_pname, refValue, m_type);
1351		}
1352	}
1353
1354	return allOk;
1355}
1356
1357int TextureLevelTypeCase::getComponentType (glw::GLenum internalFormat)
1358{
1359	const tcu::TextureFormat		format			= glu::mapGLInternalFormat(internalFormat);
1360	const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(format.type);
1361	glw::GLenum						channelType		= GL_NONE;
1362
1363	// depth-stencil special cases
1364	if (format.type == tcu::TextureFormat::UNSIGNED_INT_24_8)
1365	{
1366		if (m_pname == GL_TEXTURE_DEPTH_TYPE)
1367			return GL_UNSIGNED_NORMALIZED;
1368		else
1369			return GL_NONE;
1370	}
1371	else if (format.type == tcu::TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV)
1372	{
1373		if (m_pname == GL_TEXTURE_DEPTH_TYPE)
1374			return GL_FLOAT;
1375		else
1376			return GL_NONE;
1377	}
1378	else
1379	{
1380		switch (channelClass)
1381		{
1382			case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:		channelType = GL_SIGNED_NORMALIZED;		break;
1383			case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:		channelType = GL_UNSIGNED_NORMALIZED;	break;
1384			case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:			channelType = GL_INT;					break;
1385			case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:			channelType = GL_UNSIGNED_INT;			break;
1386			case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:			channelType = GL_FLOAT;					break;
1387			default:
1388				DE_ASSERT(DE_FALSE);
1389		}
1390	}
1391
1392	switch (m_pname)
1393	{
1394		case GL_TEXTURE_RED_TYPE:
1395			if (format.order == tcu::TextureFormat::R		||
1396				format.order == tcu::TextureFormat::RG		||
1397				format.order == tcu::TextureFormat::RGB		||
1398				format.order == tcu::TextureFormat::RGBA	||
1399				format.order == tcu::TextureFormat::BGRA	||
1400				format.order == tcu::TextureFormat::ARGB	||
1401				format.order == tcu::TextureFormat::sRGB	||
1402				format.order == tcu::TextureFormat::sRGBA)
1403				return channelType;
1404			else
1405				return GL_NONE;
1406
1407		case GL_TEXTURE_GREEN_TYPE:
1408			if (format.order == tcu::TextureFormat::RG		||
1409				format.order == tcu::TextureFormat::RGB		||
1410				format.order == tcu::TextureFormat::RGBA	||
1411				format.order == tcu::TextureFormat::BGRA	||
1412				format.order == tcu::TextureFormat::ARGB	||
1413				format.order == tcu::TextureFormat::sRGB	||
1414				format.order == tcu::TextureFormat::sRGBA)
1415				return channelType;
1416			else
1417				return GL_NONE;
1418
1419		case GL_TEXTURE_BLUE_TYPE:
1420			if (format.order == tcu::TextureFormat::RGB		||
1421				format.order == tcu::TextureFormat::RGBA	||
1422				format.order == tcu::TextureFormat::BGRA	||
1423				format.order == tcu::TextureFormat::ARGB	||
1424				format.order == tcu::TextureFormat::sRGB	||
1425				format.order == tcu::TextureFormat::sRGBA)
1426				return channelType;
1427			else
1428				return GL_NONE;
1429
1430		case GL_TEXTURE_ALPHA_TYPE:
1431			if (format.order == tcu::TextureFormat::RGBA	||
1432				format.order == tcu::TextureFormat::BGRA	||
1433				format.order == tcu::TextureFormat::ARGB	||
1434				format.order == tcu::TextureFormat::sRGBA)
1435				return channelType;
1436			else
1437				return GL_NONE;
1438
1439		case GL_TEXTURE_DEPTH_TYPE:
1440			if (format.order == tcu::TextureFormat::D	||
1441				format.order == tcu::TextureFormat::DS)
1442				return channelType;
1443			else
1444				return GL_NONE;
1445
1446		default:
1447			DE_ASSERT(DE_FALSE);
1448			return 0;
1449	}
1450}
1451
1452class TextureLevelCompressedCase : public TextureLevelCase
1453{
1454public:
1455	TextureLevelCompressedCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1456		: TextureLevelCase(ctx, name, desc, target, type)
1457	{
1458	}
1459
1460private:
1461	void generateTestIterations (std::vector<TextureGenerationSpec>& iterations)
1462	{
1463		generateCompressedTextureGenerationGroup(iterations, m_target);
1464	}
1465
1466	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
1467	{
1468		bool allOk = true;
1469
1470		if (spec.levels.empty())
1471		{
1472			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_COMPRESSED, 0, m_type);
1473		}
1474		else
1475		{
1476			for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
1477			{
1478				const int queryLevel	= spec.levels[levelNdx].level;
1479				const int refValue		= (spec.levels[levelNdx].compressed) ? (1) : (0);
1480
1481				allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_COMPRESSED, refValue, m_type);
1482			}
1483		}
1484
1485		return allOk;
1486	}
1487};
1488
1489class TextureLevelBufferDataStoreCase : public TextureLevelCase
1490{
1491public:
1492	TextureLevelBufferDataStoreCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1493		: TextureLevelCase(ctx, name, desc, target, type)
1494	{
1495	}
1496
1497private:
1498	void init (void)
1499	{
1500		if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"))
1501			throw tcu::NotSupportedError("Test requires GL_EXT_texture_buffer extension");
1502		TextureLevelCase::init();
1503	}
1504
1505	void generateTestIterations (std::vector<TextureGenerationSpec>& iterations)
1506	{
1507		generateTextureBufferGenerationGroup(iterations, m_target);
1508	}
1509
1510	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
1511	{
1512		bool allOk = true;
1513
1514		if (spec.levels.empty())
1515		{
1516			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_BUFFER_DATA_STORE_BINDING, 0, m_type);
1517		}
1518		else
1519		{
1520			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_BUFFER_DATA_STORE_BINDING, m_texBuffer, m_type);
1521		}
1522
1523		return allOk;
1524	}
1525};
1526
1527class TextureLevelBufferDataOffsetCase : public TextureLevelCase
1528{
1529public:
1530	TextureLevelBufferDataOffsetCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1531		: TextureLevelCase(ctx, name, desc, target, type)
1532	{
1533	}
1534
1535private:
1536	void init (void)
1537	{
1538		if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"))
1539			throw tcu::NotSupportedError("Test requires GL_EXT_texture_buffer extension");
1540		TextureLevelCase::init();
1541	}
1542
1543	void generateTestIterations (std::vector<TextureGenerationSpec>& iterations)
1544	{
1545		generateTextureBufferGenerationGroup(iterations, m_target);
1546	}
1547
1548	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
1549	{
1550		bool allOk = true;
1551
1552		if (spec.levels.empty())
1553		{
1554			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_BUFFER_OFFSET, 0, m_type);
1555		}
1556		else
1557		{
1558			const int refValue = spec.texBufferDataOffset;
1559
1560			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_BUFFER_OFFSET, refValue, m_type);
1561		}
1562
1563		return allOk;
1564	}
1565};
1566
1567class TextureLevelBufferDataSizeCase : public TextureLevelCase
1568{
1569public:
1570	TextureLevelBufferDataSizeCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1571		: TextureLevelCase(ctx, name, desc, target, type)
1572	{
1573	}
1574
1575private:
1576	void init (void)
1577	{
1578		if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"))
1579			throw tcu::NotSupportedError("Test requires GL_EXT_texture_buffer extension");
1580		TextureLevelCase::init();
1581	}
1582
1583	void generateTestIterations (std::vector<TextureGenerationSpec>& iterations)
1584	{
1585		generateTextureBufferGenerationGroup(iterations, m_target);
1586	}
1587
1588	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
1589	{
1590		bool allOk = true;
1591
1592		if (spec.levels.empty())
1593		{
1594			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_BUFFER_SIZE, 0, m_type);
1595		}
1596		else
1597		{
1598			const int refValue = spec.texBufferDataSize;
1599
1600			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_BUFFER_SIZE, refValue, m_type);
1601		}
1602
1603		return allOk;
1604	}
1605};
1606
1607} // anonymous
1608
1609static const char* getVerifierSuffix (QueryType type)
1610{
1611	switch (type)
1612	{
1613		case QUERY_TEXTURE_LEVEL_FLOAT:		return "_float";
1614		case QUERY_TEXTURE_LEVEL_INTEGER:	return "_integer";
1615		default:
1616			DE_ASSERT(DE_FALSE);
1617			return DE_NULL;
1618	}
1619}
1620
1621TextureLevelStateQueryTests::TextureLevelStateQueryTests (Context& context)
1622	: TestCaseGroup(context, "texture_level", "GetTexLevelParameter tests")
1623{
1624}
1625
1626TextureLevelStateQueryTests::~TextureLevelStateQueryTests (void)
1627{
1628}
1629
1630void TextureLevelStateQueryTests::init (void)
1631{
1632	static const QueryType verifiers[] =
1633	{
1634		QUERY_TEXTURE_LEVEL_INTEGER,
1635		QUERY_TEXTURE_LEVEL_FLOAT,
1636	};
1637
1638#define FOR_EACH_VERIFIER(X) \
1639	for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(verifiers); ++verifierNdx)	\
1640	{																						\
1641		const std::string verifierSuffix = getVerifierSuffix(verifiers[verifierNdx]);		\
1642		const QueryType verifier = verifiers[verifierNdx];									\
1643		targetGroup->addChild(X);															\
1644	}
1645	static const struct
1646	{
1647		const char*	name;
1648		glw::GLenum	target;
1649	} textureTargets[] =
1650	{
1651		{ "texture_2d",						GL_TEXTURE_2D,						},
1652		{ "texture_3d",						GL_TEXTURE_3D,						},
1653		{ "texture_2d_array",				GL_TEXTURE_2D_ARRAY,				},
1654		{ "texture_cube_map",				GL_TEXTURE_CUBE_MAP,				},
1655		{ "texture_2d_multisample",			GL_TEXTURE_2D_MULTISAMPLE,			},
1656		{ "texture_2d_multisample_array",	GL_TEXTURE_2D_MULTISAMPLE_ARRAY,	}, // GL_OES_texture_storage_multisample_2d_array
1657		{ "texture_buffer",					GL_TEXTURE_BUFFER,					}, // GL_EXT_texture_buffer
1658		{ "texture_cube_array",				GL_TEXTURE_CUBE_MAP_ARRAY,			}, // GL_EXT_texture_cube_map_array
1659	};
1660
1661	for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(textureTargets); ++targetNdx)
1662	{
1663		tcu::TestCaseGroup* const targetGroup = new tcu::TestCaseGroup(m_testCtx, textureTargets[targetNdx].name, textureTargets[targetNdx].name);
1664		addChild(targetGroup);
1665
1666		FOR_EACH_VERIFIER(new TextureLevelSampleCase			(m_context, ("samples" + verifierSuffix).c_str(),					"Verify TEXTURE_SAMPLES",					textureTargets[targetNdx].target,	verifier));
1667		FOR_EACH_VERIFIER(new TextureLevelFixedSamplesCase		(m_context, ("fixed_sample_locations" + verifierSuffix).c_str(),	"Verify TEXTURE_FIXED_SAMPLE_LOCATIONS",	textureTargets[targetNdx].target,	verifier));
1668		FOR_EACH_VERIFIER(new TextureLevelWidthCase				(m_context, ("width" + verifierSuffix).c_str(),						"Verify TEXTURE_WIDTH",						textureTargets[targetNdx].target,	verifier));
1669		FOR_EACH_VERIFIER(new TextureLevelHeightCase			(m_context, ("height" + verifierSuffix).c_str(),					"Verify TEXTURE_HEIGHT",					textureTargets[targetNdx].target,	verifier));
1670		FOR_EACH_VERIFIER(new TextureLevelDepthCase				(m_context, ("depth" + verifierSuffix).c_str(),						"Verify TEXTURE_DEPTH",						textureTargets[targetNdx].target,	verifier));
1671		FOR_EACH_VERIFIER(new TextureLevelInternalFormatCase	(m_context, ("internal_format" + verifierSuffix).c_str(),			"Verify TEXTURE_INTERNAL_FORMAT",			textureTargets[targetNdx].target,	verifier));
1672		FOR_EACH_VERIFIER(new TextureLevelSizeCase				(m_context, ("red_size" + verifierSuffix).c_str(),					"Verify TEXTURE_RED_SIZE",					textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_RED_SIZE));
1673		FOR_EACH_VERIFIER(new TextureLevelSizeCase				(m_context, ("green_size" + verifierSuffix).c_str(),				"Verify TEXTURE_GREEN_SIZE",				textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_GREEN_SIZE));
1674		FOR_EACH_VERIFIER(new TextureLevelSizeCase				(m_context, ("blue_size" + verifierSuffix).c_str(),					"Verify TEXTURE_BLUE_SIZE",					textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_BLUE_SIZE));
1675		FOR_EACH_VERIFIER(new TextureLevelSizeCase				(m_context, ("alpha_size" + verifierSuffix).c_str(),				"Verify TEXTURE_ALPHA_SIZE",				textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_ALPHA_SIZE));
1676		FOR_EACH_VERIFIER(new TextureLevelSizeCase				(m_context, ("depth_size" + verifierSuffix).c_str(),				"Verify TEXTURE_DEPTH_SIZE",				textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_DEPTH_SIZE));
1677		FOR_EACH_VERIFIER(new TextureLevelSizeCase				(m_context, ("stencil_size" + verifierSuffix).c_str(),				"Verify TEXTURE_STENCIL_SIZE",				textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_STENCIL_SIZE));
1678		FOR_EACH_VERIFIER(new TextureLevelSizeCase				(m_context, ("shared_size" + verifierSuffix).c_str(),				"Verify TEXTURE_SHARED_SIZE",				textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_SHARED_SIZE));
1679		FOR_EACH_VERIFIER(new TextureLevelTypeCase				(m_context, ("red_type" + verifierSuffix).c_str(),					"Verify TEXTURE_RED_TYPE",					textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_RED_TYPE));
1680		FOR_EACH_VERIFIER(new TextureLevelTypeCase				(m_context, ("green_type" + verifierSuffix).c_str(),				"Verify TEXTURE_GREEN_TYPE",				textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_GREEN_TYPE));
1681		FOR_EACH_VERIFIER(new TextureLevelTypeCase				(m_context, ("blue_type" + verifierSuffix).c_str(),					"Verify TEXTURE_BLUE_TYPE",					textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_BLUE_TYPE));
1682		FOR_EACH_VERIFIER(new TextureLevelTypeCase				(m_context, ("alpha_type" + verifierSuffix).c_str(),				"Verify TEXTURE_ALPHA_TYPE",				textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_ALPHA_TYPE));
1683		FOR_EACH_VERIFIER(new TextureLevelTypeCase				(m_context, ("depth_type" + verifierSuffix).c_str(),				"Verify TEXTURE_DEPTH_TYPE",				textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_DEPTH_TYPE));
1684		FOR_EACH_VERIFIER(new TextureLevelCompressedCase		(m_context, ("compressed" + verifierSuffix).c_str(),				"Verify TEXTURE_COMPRESSED",				textureTargets[targetNdx].target,	verifier));
1685		FOR_EACH_VERIFIER(new TextureLevelBufferDataStoreCase	(m_context, ("buffer_data_store_binding" + verifierSuffix).c_str(),	"Verify TEXTURE_BUFFER_DATA_STORE_BINDING",	textureTargets[targetNdx].target,	verifier));
1686		FOR_EACH_VERIFIER(new TextureLevelBufferDataOffsetCase	(m_context, ("buffer_offset" + verifierSuffix).c_str(),				"Verify TEXTURE_BUFFER_OFFSET",				textureTargets[targetNdx].target,	verifier));
1687		FOR_EACH_VERIFIER(new TextureLevelBufferDataSizeCase	(m_context, ("buffer_size" + verifierSuffix).c_str(),				"Verify TEXTURE_BUFFER_SIZE",				textureTargets[targetNdx].target,	verifier));
1688	}
1689
1690#undef FOR_EACH_VERIFIER
1691}
1692
1693} // Functional
1694} // gles31
1695} // deqp
1696