13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 3.1 Module
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * -------------------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Texture level state query tests
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es31fTextureLevelStateQueryTests.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsStateQueryUtil.hpp"
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTestLog.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluRenderContext.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluCallLogWrapper.hpp"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluTextureUtil.hpp"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluStrUtil.hpp"
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluContextInfo.hpp"
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwFunctions.hpp"
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp"
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTextureUtil.hpp"
35cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry#include "tcuFormatUtil.hpp"
36c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry#include "deStringUtil.hpp"
37c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry#include "deUniquePtr.hpp"
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles31
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
48cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryusing namespace gls::StateQueryUtil;
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
50c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
51c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystatic bool textureTypeHasDepth (glw::GLenum textureBindTarget)
52c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
53c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	switch (textureBindTarget)
54c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
55c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_2D:						return false;
56c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_3D:						return true;
57c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_2D_ARRAY:				return true;
58c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_CUBE_MAP:				return false;
59c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_2D_MULTISAMPLE:			return false;
60c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:	return true;
61c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_BUFFER:					return false;
62c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_CUBE_MAP_ARRAY:			return true;
63c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		default:
64c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			DE_ASSERT(DE_FALSE);
65c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			return false;
66c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
67c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
68c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
69c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystatic bool textureTypeHasHeight (glw::GLenum textureBindTarget)
70c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
71c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	switch (textureBindTarget)
72c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
73c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_2D:						return true;
74c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_3D:						return true;
75c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_2D_ARRAY:				return true;
76c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_CUBE_MAP:				return true;
77c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_2D_MULTISAMPLE:			return true;
78c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:	return true;
79c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_BUFFER:					return false;
80c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_CUBE_MAP_ARRAY:			return true;
81c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		default:
82c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			DE_ASSERT(DE_FALSE);
83c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			return false;
84c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
85c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
86c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
87c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystatic const char* getTextureTargetExtension (glw::GLenum target)
88c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
89c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	switch (target)
90c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
91c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:	return "GL_OES_texture_storage_multisample_2d_array";
92c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_BUFFER:					return "GL_EXT_texture_buffer";
93c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_CUBE_MAP_ARRAY:			return "GL_EXT_texture_cube_map_array";
94c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		default:
95c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			DE_ASSERT(DE_FALSE);
96c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			return DE_NULL;
97c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
98c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
99c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
100c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystatic bool isCoreTextureTarget (glw::GLenum target)
101c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
102c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	switch (target)
103c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
104c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_2D:
105c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_3D:
106c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_2D_ARRAY:
107c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_CUBE_MAP:
108c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case GL_TEXTURE_2D_MULTISAMPLE:
109c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			return true;
110c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
111c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		default:
112c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			return false;
113c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
114c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
115c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct TextureGenerationSpec
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	struct TextureLevelSpec
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int			width;
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int			height;
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int			depth;
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int			level;
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glw::GLenum internalFormat;
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool		compressed;
126c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
127c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		TextureLevelSpec (void)
128c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			: width				(0)
129c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			, height			(0)
130c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			, depth				(0)
131c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			, level				(0)
132c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			, internalFormat	(GL_RGBA)
133c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			, compressed		(false)
134c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
135c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		}
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glw::GLenum						bindTarget;
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glw::GLenum						queryTarget;
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool							immutable;
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool							fixedSamplePos;	// !< fixed sample pos argument for multisample textures
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								sampleCount;
143c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	int								texBufferDataOffset;
144c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	int								texBufferDataSize;
145c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	bool							bindWholeArray;
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<TextureLevelSpec>	levels;
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::string						description;
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
149c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	TextureGenerationSpec (void)
150c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		: immutable				(true)
151c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		, fixedSamplePos		(true)
152c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		, sampleCount			(0)
153c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		, texBufferDataOffset	(0)
154c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		, texBufferDataSize		(256)
155c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		, bindWholeArray		(false)
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
158c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry};
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct IntegerPrinter
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static std::string	getIntegerName	(int v)		{ return de::toString(v); }
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static std::string	getFloatName	(float v)	{ return de::toString(v); }
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct PixelFormatPrinter
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static std::string	getIntegerName	(int v)		{ return de::toString(glu::getPixelFormatStr(v));		}
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static std::string	getFloatName	(float v)	{ return de::toString(glu::getPixelFormatStr((int)v));	}
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate <typename Printer>
172cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrystatic bool verifyTextureLevelParameterEqualWithPrinter (glu::CallLogWrapper& gl, glw::GLenum target, int level, glw::GLenum pname, int refValue, QueryType type)
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
174cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	QueriedState			state;
175cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	tcu::ResultCollector	result	(gl.getLog(), " // ERROR: ");
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
177cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.getLog() << tcu::TestLog::Message << "Verifying " << glu::getTextureLevelParameterStr(pname) << ", expecting " << Printer::getIntegerName(refValue) << tcu::TestLog::EndMessage;
178cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	queryTextureLevelState(result, gl, type, target, level, pname, state);
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
180cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	if (state.isUndefined())
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return false;
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
183cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	verifyInteger(result, state, refValue);
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
185cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	return result.getResult() == QP_TEST_RESULT_LAST;
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
188cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrystatic bool verifyTextureLevelParameterEqual (glu::CallLogWrapper& gl, glw::GLenum target, int level, glw::GLenum pname, int refValue, QueryType type)
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return verifyTextureLevelParameterEqualWithPrinter<IntegerPrinter>(gl, target, level, pname, refValue, type);
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
193cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrystatic bool verifyTextureLevelParameterInternalFormatEqual (glu::CallLogWrapper& gl, glw::GLenum target, int level, glw::GLenum pname, int refValue, QueryType type)
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return verifyTextureLevelParameterEqualWithPrinter<PixelFormatPrinter>(gl, target, level, pname, refValue, type);
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
198cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrystatic bool verifyTextureLevelParameterGreaterOrEqual (glu::CallLogWrapper& gl, glw::GLenum target, int level, glw::GLenum pname, int refValue, QueryType type)
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
200cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	QueriedState			state;
201cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	tcu::ResultCollector	result	(gl.getLog(), " // ERROR: ");
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
203cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.getLog() << tcu::TestLog::Message << "Verifying " << glu::getTextureLevelParameterStr(pname) << ", expecting " << refValue << " or greater" << tcu::TestLog::EndMessage;
204cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	queryTextureLevelState(result, gl, type, target, level, pname, state);
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
206cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	if (state.isUndefined())
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return false;
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
209cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	verifyIntegerMin(result, state, refValue);
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
211cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	return result.getResult() == QP_TEST_RESULT_LAST;
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
214cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrystatic bool verifyTextureLevelParameterInternalFormatAnyOf (glu::CallLogWrapper& gl, glw::GLenum target, int level, glw::GLenum pname, const int* refValues, int numRefValues, QueryType type)
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
216cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	QueriedState			state;
217cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	tcu::ResultCollector	result	(gl.getLog(), " // ERROR: ");
218cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Log what we try to do
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		tcu::MessageBuilder msg(&gl.getLog());
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		msg << "Verifying " << glu::getTextureLevelParameterStr(pname) << ", expecting any of {";
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int ndx = 0; ndx < numRefValues; ++ndx)
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (ndx != 0)
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				msg << ", ";
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			msg << glu::getPixelFormatStr(refValues[ndx]);
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		msg << "}";
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		msg << tcu::TestLog::EndMessage;
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
234cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	queryTextureLevelState(result, gl, type, target, level, pname, state);
235cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	if (state.isUndefined())
236cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		return false;
237cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// verify
239cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	switch (state.getType())
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
241cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		case DATATYPE_INTEGER:
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
243cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			for (int ndx = 0; ndx < numRefValues; ++ndx)
244cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry				if (state.getIntAccess() == refValues[ndx])
245cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry					return true;
246cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
247cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.getLog() << tcu::TestLog::Message << "Error: got " << state.getIntAccess() << ", (" << glu::getPixelFormatStr(state.getIntAccess()) << ")" << tcu::TestLog::EndMessage;
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return false;
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
250cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		case DATATYPE_FLOAT:
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
252cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			for (int ndx = 0; ndx < numRefValues; ++ndx)
253cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry				if (state.getFloatAccess() == (float)refValues[ndx])
254cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry					return true;
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
256cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.getLog() << tcu::TestLog::Message << "Error: got " << state.getFloatAccess() << ", (" << glu::getPixelFormatStr((int)state.getFloatAccess()) << ")" << tcu::TestLog::EndMessage;
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return false;
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
259cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		default:
260cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			DE_ASSERT(DE_FALSE);
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return false;
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
265c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystatic bool isDepthFormat (const tcu::TextureFormat& fmt)
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
267c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	return fmt.order == tcu::TextureFormat::D || fmt.order == tcu::TextureFormat::DS;
268c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
270c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystatic bool isColorRenderableFormat (glw::GLenum internalFormat)
271c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
272c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	return	internalFormat == GL_RGB565			||
273c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGBA4			||
274c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGB5_A1		||
275c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGB10_A2		||
276c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGB10_A2UI		||
277c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_SRGB8_ALPHA8	||
278c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_R8				||
279c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RG8			||
280c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGB8			||
281c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGBA8			||
282c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_R8I			||
283c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RG8I			||
284c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGBA8I			||
285c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_R8UI			||
286c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RG8UI			||
287c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGBA8UI		||
288c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_R16I			||
289c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RG16I			||
290c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGBA16I		||
291c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_R16UI			||
292c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RG16UI			||
293c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGBA16UI		||
294c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_R32I			||
295c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RG32I			||
296c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGBA32I		||
297c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_R32UI			||
298c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RG32UI			||
299c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGBA32UI;
300c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
302c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystatic bool isRenderableFormat (glw::GLenum internalFormat)
303c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
304c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	return	isColorRenderableFormat(internalFormat)	||
305c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_DEPTH_COMPONENT16	||
306c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_DEPTH_COMPONENT24	||
307c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_DEPTH_COMPONENT32F	||
308c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_DEPTH24_STENCIL8	||
309c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_DEPTH32F_STENCIL8;
310c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
311c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
312c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystatic bool isTextureBufferFormat (glw::GLenum internalFormat)
313c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
314c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	return	internalFormat == GL_R8			||
315c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_R16F		||
316c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_R32F		||
317c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_R8I		||
318c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_R16I		||
319c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_R32I		||
320c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_R8UI		||
321c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_R16UI		||
322c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_R32UI		||
323c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RG8		||
324c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RG16F		||
325c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RG32F		||
326c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RG8I		||
327c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RG16I		||
328c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RG32I		||
329c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RG8UI		||
330c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RG16UI		||
331c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RG32UI		||
332c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGB32F		||
333c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGB32I		||
334c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGB32UI	||
335c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGBA8		||
336c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGBA16F	||
337c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGBA32F	||
338c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGBA8I		||
339c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGBA16I	||
340c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGBA32I	||
341c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGBA8UI	||
342c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGBA16UI	||
343c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			internalFormat == GL_RGBA32UI;
344c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
345c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
346c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystatic bool isLegalFormatForTarget (glw::GLenum target, glw::GLenum format)
347c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
348c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	const tcu::TextureFormat fmt = glu::mapGLInternalFormat(format);
349c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
350c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	if (target == GL_TEXTURE_3D && isDepthFormat(fmt))
351c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		return false;
352c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	if ((target == GL_TEXTURE_2D_MULTISAMPLE || target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY) && !isRenderableFormat(format))
353c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		return false;
354c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	if (target == GL_TEXTURE_BUFFER || !isTextureBufferFormat(format))
355c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		return false;
356c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	return true;
357c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
358c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
359c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystatic bool isCompressionSupportedForTarget (glw::GLenum target)
360c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
361c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	return target == GL_TEXTURE_2D || target == GL_TEXTURE_2D_ARRAY;
362c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
363c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
364c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystatic bool isMultisampleTarget (glw::GLenum target)
365c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
366c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	return target == GL_TEXTURE_2D_MULTISAMPLE || target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY;
367c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
368c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
369c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystatic bool targetSupportsMipLevels (glw::GLenum target)
370c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
371c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	return	target != GL_TEXTURE_2D_MULTISAMPLE &&
372c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			target != GL_TEXTURE_2D_MULTISAMPLE_ARRAY &&
373c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			target != GL_TEXTURE_BUFFER;
374c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
376c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystatic int getPixelSize (glw::GLenum internalFormat)
377c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
378c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	const tcu::TextureFormat fmt = glu::mapGLInternalFormat(internalFormat);
379c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	return fmt.getPixelSize();
380c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
381c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
382c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystatic void generateColorTextureGenerationGroup (std::vector<TextureGenerationSpec>& group, glw::GLenum target, int maxSamples, glw::GLenum internalFormat)
383c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
384c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	const glw::GLenum queryTarget = (target == GL_TEXTURE_CUBE_MAP) ? (GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) : (target);
385c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
386c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	// initial
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TextureGenerationSpec texGen;
389c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.bindTarget		= target;
390c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.queryTarget		= queryTarget;
391c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.immutable		= true;
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		texGen.sampleCount		= 0;
393c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.description		= glu::getTextureTargetStr(target).toString() + ", initial values";
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group.push_back(texGen);
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
398c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	// ms targets
399c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	if (isMultisampleTarget(target))
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
401c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
402c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			TextureGenerationSpec					texGen;
403c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			TextureGenerationSpec::TextureLevelSpec	level;
4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
405c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.bindTarget		= target;
406c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.queryTarget		= queryTarget;
407c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.immutable		= true;
408c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.sampleCount		= 1;
409c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.fixedSamplePos	= false;
410c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.description		= glu::getTextureTargetStr(target).toString() + ", low sample count";
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
412c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.width				= 16;
413c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.height			= 16;
4143e4878e925a4ce7bc2052494f904f0ca49d4f2c4Jarkko Pöyry			level.depth				= (textureTypeHasDepth(texGen.bindTarget)) ? (6) : (1);
415c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.level				= 0;
416c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.internalFormat	= internalFormat;
417c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.compressed		= false;
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
419c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.levels.push_back(level);
420c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			group.push_back(texGen);
421c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		}
422c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
423c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			TextureGenerationSpec					texGen;
424c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			TextureGenerationSpec::TextureLevelSpec	level;
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
426c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.bindTarget		= target;
427c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.queryTarget		= queryTarget;
428c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.immutable		= true;
429c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.sampleCount		= maxSamples;
430c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.fixedSamplePos	= false;
431c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.description		= glu::getTextureTargetStr(target).toString() + ", high sample count";
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
433c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.width				= 32;
434c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.height			= 32;
4353e4878e925a4ce7bc2052494f904f0ca49d4f2c4Jarkko Pöyry			level.depth				= (textureTypeHasDepth(texGen.bindTarget)) ? (6) : (1);
436c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.level				= 0;
437c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.internalFormat	= internalFormat;
438c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.compressed		= false;
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
440c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.levels.push_back(level);
441c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			group.push_back(texGen);
442c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		}
443c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
444c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			TextureGenerationSpec					texGen;
445c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			TextureGenerationSpec::TextureLevelSpec	level;
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
447c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.bindTarget		= target;
448c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.queryTarget		= queryTarget;
449c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.immutable		= true;
450c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.sampleCount		= maxSamples;
451c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.fixedSamplePos	= true;
452c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.description		= glu::getTextureTargetStr(target).toString() + ", fixed sample positions";
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
454c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.width				= 32;
455c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.height			= 32;
4563e4878e925a4ce7bc2052494f904f0ca49d4f2c4Jarkko Pöyry			level.depth				= (textureTypeHasDepth(texGen.bindTarget)) ? (6) : (1);
457c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.level				= 0;
458c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.internalFormat	= internalFormat;
459c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.compressed		= false;
4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
461c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.levels.push_back(level);
462c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			group.push_back(texGen);
463c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		}
464c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
465c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	else if (target == GL_TEXTURE_BUFFER)
4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
467c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		// whole buffer
468c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
469c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			TextureGenerationSpec					texGen;
470c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			TextureGenerationSpec::TextureLevelSpec	level;
471c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			const int								baseSize = getPixelSize(internalFormat);
4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
473c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.bindTarget			= target;
474c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.queryTarget			= queryTarget;
475c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.immutable			= true;
476c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.description			= glu::getTextureTargetStr(target).toString() + ", whole buffer";
477c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.texBufferDataOffset	= 0;
478c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.texBufferDataSize	= 32 * baseSize + (baseSize - 1);
479c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.bindWholeArray		= true;
4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
481c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.width				= 32;
4823e4878e925a4ce7bc2052494f904f0ca49d4f2c4Jarkko Pöyry			level.height			= 1;
4833e4878e925a4ce7bc2052494f904f0ca49d4f2c4Jarkko Pöyry			level.depth				= 1;
484c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.level				= 0;
485c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.internalFormat	= internalFormat;
486c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.compressed		= false;
487c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
488c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.levels.push_back(level);
489c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			group.push_back(texGen);
490c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		}
491c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		// partial buffer
492c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
493c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			TextureGenerationSpec					texGen;
494c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			TextureGenerationSpec::TextureLevelSpec	level;
495c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			const int								baseSize = getPixelSize(internalFormat);
496c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
497c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.bindTarget			= target;
498c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.queryTarget			= queryTarget;
499c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.immutable			= true;
500c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.description			= glu::getTextureTargetStr(target).toString() + ", partial buffer";
501c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.texBufferDataOffset	= 256;
502c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.texBufferDataSize	= 16 * baseSize + (baseSize - 1);
503c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.bindWholeArray		= false;
504c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
505c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.width				= 16;
5063e4878e925a4ce7bc2052494f904f0ca49d4f2c4Jarkko Pöyry			level.height			= 1;
5073e4878e925a4ce7bc2052494f904f0ca49d4f2c4Jarkko Pöyry			level.depth				= 1;
508c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.level				= 0;
509c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.internalFormat	= internalFormat;
510c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.compressed		= false;
511c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
512c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.levels.push_back(level);
513c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			group.push_back(texGen);
514c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		}
515c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
516c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	else
517c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
518c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		// immutable
5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
520c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			TextureGenerationSpec					texGen;
5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TextureGenerationSpec::TextureLevelSpec	level;
522c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
523c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.bindTarget		= target;
524c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.queryTarget		= queryTarget;
525c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.immutable		= true;
526c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.description		= glu::getTextureTargetStr(target).toString() + ", immutable";
527c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			level.width				= 32;
5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			level.height			= 32;
5303e4878e925a4ce7bc2052494f904f0ca49d4f2c4Jarkko Pöyry			level.depth				= (textureTypeHasDepth(texGen.bindTarget)) ? (6) : (1);
5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			level.level				= 0;
5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			level.internalFormat	= internalFormat;
5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			level.compressed		= false;
5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			texGen.levels.push_back(level);
536c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			group.push_back(texGen);
5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
538c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		// mutable
539c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
540c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			TextureGenerationSpec					texGen;
541c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			TextureGenerationSpec::TextureLevelSpec	level;
5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
543c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.bindTarget		= target;
544c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.queryTarget		= queryTarget;
545c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.immutable		= false;
546c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.description		= glu::getTextureTargetStr(target).toString() + ", mutable";
547c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
548c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.width				= 16;
549c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.height			= (target == GL_TEXTURE_CUBE_MAP || target == GL_TEXTURE_CUBE_MAP_ARRAY) ? (16) : (64);
5503e4878e925a4ce7bc2052494f904f0ca49d4f2c4Jarkko Pöyry			level.depth				= (textureTypeHasDepth(texGen.bindTarget)) ? (6) : (1);
551c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.level				= 0;
552c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.internalFormat	= internalFormat;
553c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.compressed		= false;
554c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
555c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.levels.push_back(level);
556c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			group.push_back(texGen);
557c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		}
558c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		// mip3
559c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
560c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			TextureGenerationSpec					texGen;
561c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			TextureGenerationSpec::TextureLevelSpec	level;
562c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
563c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.bindTarget		= target;
564c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.queryTarget		= queryTarget;
565c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.immutable		= false;
566c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.description		= glu::getTextureTargetStr(target).toString() + ", mip level 3";
567c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
568c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.width				= 4;
569c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.height			= (target == GL_TEXTURE_CUBE_MAP || target == GL_TEXTURE_CUBE_MAP_ARRAY) ? (4) : (8);
5703e4878e925a4ce7bc2052494f904f0ca49d4f2c4Jarkko Pöyry			level.depth				= (textureTypeHasDepth(texGen.bindTarget)) ? (6) : (1);
571c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.level				= 3;
572c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.internalFormat	= internalFormat;
573c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			level.compressed		= false;
574c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
575c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.levels.push_back(level);
576c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			group.push_back(texGen);
577c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		}
5783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
581c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystatic void generateInternalFormatTextureGenerationGroup (std::vector<TextureGenerationSpec>& group, glw::GLenum target)
5823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
583c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	const glw::GLenum queryTarget = (target == GL_TEXTURE_CUBE_MAP) ? (GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) : (target);
5843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Internal formats
5863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const glw::GLenum internalFormats[] =
5873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_R8, GL_R8_SNORM, GL_RG8, GL_RG8_SNORM, GL_RGB8, GL_RGB8_SNORM, GL_RGB565, GL_RGBA4, GL_RGB5_A1,
5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_RGBA8, GL_RGBA8_SNORM, GL_RGB10_A2, GL_RGB10_A2UI, GL_SRGB8, GL_SRGB8_ALPHA8, GL_R16F, GL_RG16F,
5903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_RGB16F, GL_RGBA16F, GL_R32F, GL_RG32F, GL_RGB32F, GL_RGBA32F, GL_R11F_G11F_B10F, GL_RGB9_E5, GL_R8I,
5913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_R8UI, GL_R16I, GL_R16UI, GL_R32I, GL_R32UI, GL_RG8I, GL_RG8UI, GL_RG16I, GL_RG16UI, GL_RG32I, GL_RG32UI,
5923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_RGB8I, GL_RGB8UI, GL_RGB16I, GL_RGB16UI, GL_RGB32I, GL_RGB32UI, GL_RGBA8I, GL_RGBA8UI, GL_RGBA16I,
5933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_RGBA16UI, GL_RGBA32I, GL_RGBA32UI,
5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT16,
5963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_DEPTH32F_STENCIL8, GL_DEPTH24_STENCIL8
5973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
5983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
599c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	// initial
6003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TextureGenerationSpec texGen;
602c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.bindTarget		= target;
603c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.queryTarget		= queryTarget;
6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		texGen.immutable		= true;
605c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.sampleCount		= 0;
606c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.fixedSamplePos	= true;
607c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.description		= glu::getTextureTargetStr(target).toString() + ", initial values";
6083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group.push_back(texGen);
6103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
612c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	// test all formats
6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int internalFormatNdx = 0; internalFormatNdx < DE_LENGTH_OF_ARRAY(internalFormats); ++internalFormatNdx)
6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
615c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		if (!isLegalFormatForTarget(target, internalFormats[internalFormatNdx]))
616c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			continue;
617c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
618c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		const int								baseSize = getPixelSize(internalFormats[internalFormatNdx]);
6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TextureGenerationSpec					texGen;
6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TextureGenerationSpec::TextureLevelSpec	level;
6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
622c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.bindTarget		= target;
623c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.queryTarget		= queryTarget;
6243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		texGen.immutable		= true;
625c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.sampleCount		= (isMultisampleTarget(target) ? (1) : (0));
626c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.description		= glu::getTextureTargetStr(target).toString() + ", internal format " + glu::getPixelFormatName(internalFormats[internalFormatNdx]);
627c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
628c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		if (target == GL_TEXTURE_BUFFER)
629c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
630c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.texBufferDataOffset	= 0;
631c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.texBufferDataSize	= 32 * baseSize + (baseSize - 1);
632c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			texGen.bindWholeArray		= true;
633c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		}
6343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		level.width				= 32;
6363e4878e925a4ce7bc2052494f904f0ca49d4f2c4Jarkko Pöyry		level.height			= (textureTypeHasHeight(target)) ? (32) : (1);
6373e4878e925a4ce7bc2052494f904f0ca49d4f2c4Jarkko Pöyry		level.depth				= (textureTypeHasDepth(target)) ? (6) : (1);
6383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		level.level				= 0;
6393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		level.internalFormat	= internalFormats[internalFormatNdx];
6403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		level.compressed		= false;
6413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		texGen.levels.push_back(level);
6433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group.push_back(texGen);
6443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
646c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	// test mutable rgba8 with mip level 3
647c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	if (targetSupportsMipLevels(target))
6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TextureGenerationSpec					texGen;
6503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TextureGenerationSpec::TextureLevelSpec	level;
6513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
652c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.bindTarget		= target;
653c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.queryTarget		= queryTarget;
6543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		texGen.immutable		= false;
655c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.description		= glu::getTextureTargetStr(target).toString() + ", internal format GL_RGBA8, mip level 3";
6563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		level.width				= 32;
6583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		level.height			= 32;
6593e4878e925a4ce7bc2052494f904f0ca49d4f2c4Jarkko Pöyry		level.depth				= (textureTypeHasDepth(target)) ? (6) : (1);
6603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		level.level				= 3;
6613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		level.internalFormat	= GL_RGBA8;
6623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		level.compressed		= false;
6633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		texGen.levels.push_back(level);
6653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group.push_back(texGen);
6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
669c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystatic void generateCompressedTextureGenerationGroup (std::vector<TextureGenerationSpec>& group, glw::GLenum target)
6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
671c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	const glw::GLenum queryTarget = (target == GL_TEXTURE_CUBE_MAP) ? (GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) : (target);
6723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
673c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	// initial
6743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TextureGenerationSpec texGen;
676c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.bindTarget	= target;
677c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.queryTarget	= queryTarget;
6783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		texGen.immutable	= true;
679c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.description	= glu::getTextureTargetStr(target).toString() + ", initial values";
6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group.push_back(texGen);
6823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// compressed
685c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	if (isCompressionSupportedForTarget(target))
6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TextureGenerationSpec					texGen;
6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TextureGenerationSpec::TextureLevelSpec	level;
6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
690c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.bindTarget		= target;
691c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.queryTarget		= queryTarget;
6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		texGen.immutable		= false;
693c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.description		= glu::getTextureTargetStr(target).toString() + ", compressed";
6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		level.width				= 32;
6963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		level.height			= 32;
6973e4878e925a4ce7bc2052494f904f0ca49d4f2c4Jarkko Pöyry		level.depth				= (target == GL_TEXTURE_2D_ARRAY) ? (2) : (1);
6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		level.level				= 0;
6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		level.internalFormat	= GL_COMPRESSED_RGB8_ETC2;
7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		level.compressed		= true;
7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		texGen.levels.push_back(level);
7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		group.push_back(texGen);
7043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
707c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystatic void generateTextureBufferGenerationGroup (std::vector<TextureGenerationSpec>& group, glw::GLenum target)
708c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
709c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	const glw::GLenum queryTarget = (target == GL_TEXTURE_CUBE_MAP) ? (GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) : (target);
710c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
711c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	// initial
712c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
713c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		TextureGenerationSpec texGen;
714c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.bindTarget		= target;
715c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.queryTarget		= queryTarget;
716c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.immutable		= true;
717c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.sampleCount		= 0;
718c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		texGen.description		= glu::getTextureTargetStr(target).toString() + ", initial values";
719c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
720c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		group.push_back(texGen);
721c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
722c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
723c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	// actual specification tests are in texture_buffer tests, no need to do them here too
724c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
725c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
726c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrybool applyTextureGenerationSpec (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec, glw::GLuint& texBuffer)
7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
728c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	bool allOk = true;
729c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(!(spec.immutable && spec.levels.size() > 1));		// !< immutable textures have only one level
7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const glu::TransferFormat transferFormat = (spec.levels[levelNdx].compressed) ? (glu::TransferFormat()) : (glu::getTransferFormat(glu::mapGLInternalFormat(spec.levels[levelNdx].internalFormat)));
7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D)
7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			gl.glTexStorage2D(spec.bindTarget, 1, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height);
7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_3D)
7393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			gl.glTexStorage3D(spec.bindTarget, 1, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height, spec.levels[levelNdx].depth);
7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D_ARRAY)
7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			gl.glTexStorage3D(spec.bindTarget, 1, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height, spec.levels[levelNdx].depth);
7423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_CUBE_MAP)
7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			gl.glTexStorage2D(spec.bindTarget, 1, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height);
7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D_MULTISAMPLE)
7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			gl.glTexStorage2DMultisample(spec.bindTarget, spec.sampleCount, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height, (spec.fixedSamplePos) ? (GL_TRUE) : (GL_FALSE));
7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			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));
748c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_CUBE_MAP_ARRAY)
749c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			gl.glTexStorage3D(spec.bindTarget, 1, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height, spec.levels[levelNdx].depth);
7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (!spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D)
7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			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);
7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (!spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_3D)
7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			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);
7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (!spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D_ARRAY)
7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			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);
7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (!spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_CUBE_MAP)
7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			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);
758c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		else if (!spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_CUBE_MAP_ARRAY)
759c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			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);
7603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (!spec.immutable && spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D)
7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(spec.levels[levelNdx].width == 32);
7633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(spec.levels[levelNdx].height == 32);
7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(spec.levels[levelNdx].internalFormat == GL_COMPRESSED_RGB8_ETC2);
7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			static const deUint8 buffer[64 * 8] = { 0 };
7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			gl.glCompressedTexImage2D(spec.bindTarget, spec.levels[levelNdx].level, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width, spec.levels[levelNdx].height, 0, sizeof(buffer), buffer);
7683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
769c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		else if (!spec.immutable && spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D_ARRAY)
770c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
771c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			DE_ASSERT(spec.levels[levelNdx].width == 32);
772c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			DE_ASSERT(spec.levels[levelNdx].height == 32);
773c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			DE_ASSERT(spec.levels[levelNdx].depth == 2);
774c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			DE_ASSERT(spec.levels[levelNdx].internalFormat == GL_COMPRESSED_RGB8_ETC2);
775c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
776c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			static const deUint8 buffer[64 * 8 * 2] = { 0 };
777c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			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);
778c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		}
779c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_BUFFER)
780c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
781c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			gl.glGenBuffers(1, &texBuffer);
782c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			gl.glBindBuffer(GL_TEXTURE_BUFFER, texBuffer);
783c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
784c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			if (spec.bindWholeArray)
785c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			{
786c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry				gl.glBufferData(GL_TEXTURE_BUFFER, spec.texBufferDataSize, DE_NULL, GL_STATIC_DRAW);
787c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry				gl.glTexBuffer(GL_TEXTURE_BUFFER, spec.levels[levelNdx].internalFormat, texBuffer);
788c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			}
789c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			else
790c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			{
791c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry				gl.glBufferData(GL_TEXTURE_BUFFER, spec.texBufferDataOffset + spec.texBufferDataSize, DE_NULL, GL_STATIC_DRAW);
792c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry				gl.glTexBufferRange(GL_TEXTURE_BUFFER, spec.levels[levelNdx].internalFormat, texBuffer, spec.texBufferDataOffset, spec.texBufferDataSize);
793c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			}
794c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		}
7953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
7963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(DE_FALSE);
7973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
798c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
799c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			const glw::GLenum err = gl.glGetError();
800c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			if (err != GL_NO_ERROR)
801c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			{
802c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry				gl.getLog()	<< tcu::TestLog::Message
803c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry							<< "Texture specification failed, got " + glu::getErrorStr(err).toString()
804c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry							<< tcu::TestLog::EndMessage;
805c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry				allOk = false;
806c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			}
807c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		}
8083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
809c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
810c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	return allOk;
8113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8133c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureLevelCase : public TestCase
8143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8153c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
816c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry										TextureLevelCase		(Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type);
8173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry										~TextureLevelCase		(void);
8183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void								init					(void);
8203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void								deinit					(void);
8213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	IterateResult						iterate					(void);
8223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8233c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
824c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	void								getFormatSamples		(glw::GLenum internalFormat, std::vector<int>& samples);
8253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool								testConfig				(const TextureGenerationSpec& spec);
8263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual bool						checkTextureState		(glu::CallLogWrapper& gl, const TextureGenerationSpec& spec) = 0;
8273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void						generateTestIterations	(std::vector<TextureGenerationSpec>& iterations) = 0;
8283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
829cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const QueryType						m_type;
830c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	const glw::GLenum					m_target;
8313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glw::GLuint							m_texture;
832c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	glw::GLuint							m_texBuffer;
8333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8343c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
8353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int									m_iteration;
8363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<TextureGenerationSpec>	m_iterations;
8373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool								m_allIterationsOk;
8383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<int>					m_failedIterations;
8393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
8403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
841c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryTextureLevelCase::TextureLevelCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
8423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCase			(ctx, name, desc)
8433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_type			(type)
844c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	, m_target			(target)
8453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_texture			(0)
846c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	, m_texBuffer		(0)
8473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_iteration		(0)
8483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_allIterationsOk	(true)
8493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8523c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTextureLevelCase::~TextureLevelCase (void)
8533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deinit();
8553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8573c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureLevelCase::init (void)
8583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
859c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	if (!isCoreTextureTarget(m_target))
860c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
861c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		const char* const targetExtension = getTextureTargetExtension(m_target);
862c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
863c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		if (!m_context.getContextInfo().isExtensionSupported(targetExtension))
864c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			throw tcu::NotSupportedError("Test requires " + std::string(targetExtension) + " extension");
865c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
866c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
8673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	generateTestIterations(m_iterations);
868c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
869c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	for (int iterationNdx = 0; iterationNdx < (int)m_iterations.size(); ++iterationNdx)
870c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		DE_ASSERT(m_iterations[iterationNdx].bindTarget == m_target);
8713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureLevelCase::deinit (void)
8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_texture)
8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_context.getRenderContext().getFunctions().deleteTextures(1, &m_texture);
8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_texture = 0;
8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
880c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	if (m_texBuffer)
881c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
882c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		m_context.getRenderContext().getFunctions().deleteTextures(1, &m_texBuffer);
883c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		m_texBuffer = 0;
884c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
8853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
887c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryvoid TextureLevelCase::getFormatSamples (glw::GLenum internalFormat, std::vector<int>& samples)
8883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const glw::Functions	gl			= m_context.getRenderContext().getFunctions();
8903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						sampleCount	= -1;
8913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
892c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	if (!isMultisampleTarget(m_target))
8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
895c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	gl.getInternalformativ(m_target, internalFormat, GL_NUM_SAMPLE_COUNTS, 1, &sampleCount);
8963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (sampleCount < 0)
8983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		throw tcu::TestError("internal format query failed");
8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	samples.resize(sampleCount);
9013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (sampleCount > 0)
9033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
904c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		gl.getInternalformativ(m_target, internalFormat, GL_SAMPLES, sampleCount, &samples[0]);
9053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLU_EXPECT_NO_ERROR(gl.getError(), "get max samples");
9063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9093c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTextureLevelCase::IterateResult TextureLevelCase::iterate (void)
9103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const bool result = testConfig(m_iterations[m_iteration]);
9123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!result)
9143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
9153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_failedIterations.push_back(m_iteration);
9163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_allIterationsOk = false;
9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (++m_iteration < (int)m_iterations.size())
9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return CONTINUE;
9213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_allIterationsOk)
9233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
9243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
9253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
9263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		tcu::MessageBuilder msg(&m_testCtx.getLog());
9273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		msg << "Following iteration(s) failed: ";
9293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int ndx = 0; ndx < (int)m_failedIterations.size(); ++ndx)
9303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
9313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (ndx)
9323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				msg << ", ";
9333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			msg << (m_failedIterations[ndx] + 1);
9343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
9353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		msg << tcu::TestLog::EndMessage;
9363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "One or more iterations failed");
9383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return STOP;
9403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9423c827367444ee418f129b2c238299f49d3264554Jarkko Poyrybool TextureLevelCase::testConfig (const TextureGenerationSpec& spec)
9433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const tcu::ScopedLogSection section(m_testCtx.getLog(), "Iteration", std::string() + "Iteration " + de::toString(m_iteration+1) + "/" + de::toString((int)m_iterations.size()) + " - " + spec.description);
9453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::CallLogWrapper			gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
9463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool						result;
9473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	gl.enableLogging(true);
9493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	gl.glGenTextures(1, &m_texture);
9513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	gl.glBindTexture(spec.bindTarget, m_texture);
9523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
9533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Set the state
955c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	applyTextureGenerationSpec(gl, spec, m_texBuffer);
9563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Verify the state
9583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	result = checkTextureState(gl, spec);
9593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	gl.glDeleteTextures(1, &m_texture);
9613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_texture = 0;
9623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
963c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	if (m_texBuffer)
964c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
9653e4878e925a4ce7bc2052494f904f0ca49d4f2c4Jarkko Pöyry		gl.glDeleteBuffers(1, &m_texBuffer);
966c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		m_texture = 0;
967c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
968c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
9693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return result;
9703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
973c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * \brief Test texture target
9743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
9753c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureLevelCommonCase : public TextureLevelCase
9763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9773c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
978c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry						TextureLevelCommonCase	(Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type);
9793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9803c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
981c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	virtual void		generateTestIterations	(std::vector<TextureGenerationSpec>& iterations);
9823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
9833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
984c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryTextureLevelCommonCase::TextureLevelCommonCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
985c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	: TextureLevelCase(ctx, name, desc, target, type)
9863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9893c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureLevelCommonCase::generateTestIterations (std::vector<TextureGenerationSpec>& iterations)
9903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
991c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	const glw::GLenum	internalFormat = GL_RGBA8;
992c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	int					maxSamples;
993c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	std::vector<int>	samples;
9943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
995c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	getFormatSamples(internalFormat, samples);
996c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	if (samples.empty())
997c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		maxSamples = -1;
998c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	else
999c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		maxSamples = samples[0];
10003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1001c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	generateColorTextureGenerationGroup(iterations, m_target, maxSamples, internalFormat);
10023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1004c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryclass TextureLevelSampleCase : public TextureLevelCommonCase
10053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10063c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1007c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	TextureLevelSampleCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1008c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		: TextureLevelCommonCase(ctx, name, desc, target, type)
10093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10123c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
10133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
10143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int queryLevel	= (spec.levels.empty()) ? (0) : (spec.levels[0].level);
10163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int refValue		= (spec.levels.empty()) ? (0) : (spec.sampleCount);
10173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return verifyTextureLevelParameterGreaterOrEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_SAMPLES, refValue, m_type);
10193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
10213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1022c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryclass TextureLevelFixedSamplesCase : public TextureLevelCommonCase
10233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10243c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1025c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	TextureLevelFixedSamplesCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1026c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		: TextureLevelCommonCase(ctx, name, desc, target, type)
10273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10303c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
10313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
10323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1033a3ca3ec3be857645c3811984738ffe92941bf7d8Jarkko Pöyry		const int queryLevel	= (spec.levels.empty()) ? (0) : (spec.levels[0].level);
10343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int refValue		= (spec.levels.empty()) ? (1) : ((spec.fixedSamplePos) ? (1) : (0));
10353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_FIXED_SAMPLE_LOCATIONS, refValue, m_type);
10373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
10393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10403c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureLevelWidthCase : public TextureLevelCommonCase
10413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10423c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1043c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	TextureLevelWidthCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1044c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		: TextureLevelCommonCase(ctx, name, desc, target, type)
10453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10483c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
10493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
10503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int	initialValue	= 0;
10523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool		allOk			= true;
10533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (spec.levels.empty())
10553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
10563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int queryLevel	= 0;
10573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int refValue		= initialValue;
10583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_WIDTH, refValue, m_type);
10603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
10613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
10623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
10633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
10643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
10653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const int queryLevel	= spec.levels[levelNdx].level;
10663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const int refValue		= spec.levels[levelNdx].width;
10673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_WIDTH, refValue, m_type);
10693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
10703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
10713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return allOk;
10733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
10753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10763c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureLevelHeightCase : public TextureLevelCommonCase
10773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10783c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1079c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	TextureLevelHeightCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1080c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		: TextureLevelCommonCase(ctx, name, desc, target, type)
10813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10843c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
10853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
10863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int	initialValue	= 0;
10883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool		allOk			= true;
10893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (spec.levels.empty())
10913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
10923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int queryLevel	= 0;
10933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int refValue		= initialValue;
10943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_HEIGHT, refValue, m_type);
10963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
10973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
10983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
10993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
11003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
11013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const int queryLevel	= spec.levels[levelNdx].level;
11023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const int refValue		= spec.levels[levelNdx].height;
11033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_HEIGHT, refValue, m_type);
11053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
11063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
11073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return allOk;
11093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
11113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11123c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureLevelDepthCase : public TextureLevelCommonCase
11133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11143c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1115c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	TextureLevelDepthCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1116c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		: TextureLevelCommonCase(ctx, name, desc, target, type)
11173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11203c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
11213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
11233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const int	initialValue	= 0;
11253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool		allOk			= true;
11263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (spec.levels.empty())
11283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
11293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int queryLevel	= 0;
11303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int refValue		= initialValue;
11313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_DEPTH, refValue, m_type);
11333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
11343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
11353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
11363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
11373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
11383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const int queryLevel	= spec.levels[levelNdx].level;
11393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const int refValue		= spec.levels[levelNdx].depth;
11403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_DEPTH, refValue, m_type);
11423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
11433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
11443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return allOk;
11463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
11483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11493c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureLevelInternalFormatCase : public TextureLevelCase
11503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11513c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1152c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	TextureLevelInternalFormatCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1153c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		: TextureLevelCase(ctx, name, desc, target, type)
11543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11573c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
11583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void generateTestIterations (std::vector<TextureGenerationSpec>& iterations)
11593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1160c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		generateInternalFormatTextureGenerationGroup(iterations, m_target);
11613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
11643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool allOk = true;
11663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (spec.levels.empty())
11683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
11693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int queryLevel		= 0;
11703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int initialValues[2]	= { GL_RGBA, GL_R8 };
11713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			allOk &= verifyTextureLevelParameterInternalFormatAnyOf(gl, spec.queryTarget, queryLevel, GL_TEXTURE_INTERNAL_FORMAT, initialValues, DE_LENGTH_OF_ARRAY(initialValues), m_type);
11733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
11743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
11753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
11763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
11773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
11783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const int queryLevel	= spec.levels[levelNdx].level;
11793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const int refValue		= spec.levels[levelNdx].internalFormat;
11803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				allOk &= verifyTextureLevelParameterInternalFormatEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_INTERNAL_FORMAT, refValue, m_type);
11823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
11833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
11843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return allOk;
11863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
11883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11893c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureLevelSizeCase : public TextureLevelCase
11903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11913c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1192c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry						TextureLevelSizeCase			(Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type, glw::GLenum pname);
11933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11943c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
11953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				generateTestIterations			(std::vector<TextureGenerationSpec>& iterations);
11963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool				checkTextureState				(glu::CallLogWrapper& gl, const TextureGenerationSpec& spec);
11973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int					getMinimumComponentResolution	(glw::GLenum internalFormat);
11983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const glw::GLenum	m_pname;
12003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
12013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1202c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryTextureLevelSizeCase::TextureLevelSizeCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type, glw::GLenum pname)
1203c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	: TextureLevelCase	(ctx, name, desc, target, type)
12043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_pname			(pname)
12053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
12073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12083c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureLevelSizeCase::generateTestIterations (std::vector<TextureGenerationSpec>& iterations)
12093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1210c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	generateInternalFormatTextureGenerationGroup(iterations, m_target);
12113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
12123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12133c827367444ee418f129b2c238299f49d3264554Jarkko Poyrybool TextureLevelSizeCase::checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
12143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool allOk = true;
12163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (spec.levels.empty())
12183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
12193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, m_pname, 0, m_type);
12203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
12213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
12223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
12233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
12243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
12253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int queryLevel	= spec.levels[levelNdx].level;
12263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int refValue		= getMinimumComponentResolution(spec.levels[levelNdx].internalFormat);
12273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			allOk &= verifyTextureLevelParameterGreaterOrEqual(gl, spec.queryTarget, queryLevel, m_pname, refValue, m_type);
12293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
12303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
12313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return allOk;
12333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
12343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12353c827367444ee418f129b2c238299f49d3264554Jarkko Poyryint TextureLevelSizeCase::getMinimumComponentResolution (glw::GLenum internalFormat)
12363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const tcu::TextureFormat	format			= glu::mapGLInternalFormat(internalFormat);
12383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const tcu::IVec4			channelBitDepth	= tcu::getTextureFormatBitDepth(format);
12393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (m_pname)
12413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
12423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_RED_SIZE:
12433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (format.order == tcu::TextureFormat::R		||
12443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::RG		||
12453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::RGB		||
12463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::RGBA	||
12473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::BGRA	||
12483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::ARGB	||
12493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::sRGB	||
12503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::sRGBA)
12513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return channelBitDepth[0];
12523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
12533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return 0;
12543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_GREEN_SIZE:
12563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (format.order == tcu::TextureFormat::RG		||
12573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::RGB		||
12583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::RGBA	||
12593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::BGRA	||
12603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::ARGB	||
12613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::sRGB	||
12623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::sRGBA)
12633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return channelBitDepth[1];
12643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
12653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return 0;
12663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_BLUE_SIZE:
12683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (format.order == tcu::TextureFormat::RGB		||
12693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::RGBA	||
12703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::BGRA	||
12713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::ARGB	||
12723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::sRGB	||
12733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::sRGBA)
12743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return channelBitDepth[2];
12753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
12763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return 0;
12773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_ALPHA_SIZE:
12793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (format.order == tcu::TextureFormat::RGBA	||
12803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::BGRA	||
12813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::ARGB	||
12823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::sRGBA)
12833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return channelBitDepth[3];
12843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
12853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return 0;
12863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_DEPTH_SIZE:
12883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (format.order == tcu::TextureFormat::D	||
12893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::DS)
12903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return channelBitDepth[0];
12913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
12923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return 0;
12933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_STENCIL_SIZE:
12953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (format.order == tcu::TextureFormat::DS)
12963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return channelBitDepth[3];
12973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
12983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return 0;
12993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_SHARED_SIZE:
13013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (internalFormat == GL_RGB9_E5)
13023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return 5;
13033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
13043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return 0;
13053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
13063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(DE_FALSE);
13073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return 0;
13083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
13093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
13103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13113c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureLevelTypeCase : public TextureLevelCase
13123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
13133c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1314c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry						TextureLevelTypeCase			(Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type, glw::GLenum pname);
13153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13163c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
13173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				generateTestIterations			(std::vector<TextureGenerationSpec>& iterations);
13183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool				checkTextureState				(glu::CallLogWrapper& gl, const TextureGenerationSpec& spec);
13193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int					getComponentType				(glw::GLenum internalFormat);
13203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const glw::GLenum	m_pname;
13223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
13233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1324c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryTextureLevelTypeCase::TextureLevelTypeCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type, glw::GLenum pname)
1325c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	: TextureLevelCase	(ctx, name, desc, target, type)
13263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_pname			(pname)
13273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
13283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
13293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13303c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureLevelTypeCase::generateTestIterations (std::vector<TextureGenerationSpec>& iterations)
13313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1332c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	generateInternalFormatTextureGenerationGroup(iterations, m_target);
13333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
13343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13353c827367444ee418f129b2c238299f49d3264554Jarkko Poyrybool TextureLevelTypeCase::checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
13363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
13373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool allOk = true;
13383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (spec.levels.empty())
13403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
13413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, m_pname, GL_NONE, m_type);
13423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
13433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
13443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
13453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
13463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
13473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int queryLevel	= spec.levels[levelNdx].level;
13483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int refValue		= getComponentType(spec.levels[levelNdx].internalFormat);
13493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, m_pname, refValue, m_type);
13513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
13523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
13533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return allOk;
13553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
13563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13573c827367444ee418f129b2c238299f49d3264554Jarkko Poyryint TextureLevelTypeCase::getComponentType (glw::GLenum internalFormat)
13583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
13593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const tcu::TextureFormat		format			= glu::mapGLInternalFormat(internalFormat);
13603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const tcu::TextureChannelClass	channelClass	= tcu::getTextureChannelClass(format.type);
13613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glw::GLenum						channelType		= GL_NONE;
13623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// depth-stencil special cases
13643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (format.type == tcu::TextureFormat::UNSIGNED_INT_24_8)
13653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
13663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_pname == GL_TEXTURE_DEPTH_TYPE)
13673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return GL_UNSIGNED_NORMALIZED;
13683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
13693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return GL_NONE;
13703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
13713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (format.type == tcu::TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV)
13723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
13733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_pname == GL_TEXTURE_DEPTH_TYPE)
13743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return GL_FLOAT;
13753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
13763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return GL_NONE;
13773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
13783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
13793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
13803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		switch (channelClass)
13813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
13823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:		channelType = GL_SIGNED_NORMALIZED;		break;
13833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:		channelType = GL_UNSIGNED_NORMALIZED;	break;
13843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:			channelType = GL_INT;					break;
13853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:			channelType = GL_UNSIGNED_INT;			break;
13863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:			channelType = GL_FLOAT;					break;
13873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			default:
13883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				DE_ASSERT(DE_FALSE);
13893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
13903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
13913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (m_pname)
13933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
13943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_RED_TYPE:
13953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (format.order == tcu::TextureFormat::R		||
13963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::RG		||
13973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::RGB		||
13983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::RGBA	||
13993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::BGRA	||
14003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::ARGB	||
14013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::sRGB	||
14023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::sRGBA)
14033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return channelType;
14043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
14053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return GL_NONE;
14063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_GREEN_TYPE:
14083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (format.order == tcu::TextureFormat::RG		||
14093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::RGB		||
14103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::RGBA	||
14113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::BGRA	||
14123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::ARGB	||
14133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::sRGB	||
14143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::sRGBA)
14153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return channelType;
14163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
14173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return GL_NONE;
14183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_BLUE_TYPE:
14203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (format.order == tcu::TextureFormat::RGB		||
14213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::RGBA	||
14223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::BGRA	||
14233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::ARGB	||
14243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::sRGB	||
14253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::sRGBA)
14263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return channelType;
14273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
14283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return GL_NONE;
14293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_ALPHA_TYPE:
14313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (format.order == tcu::TextureFormat::RGBA	||
14323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::BGRA	||
14333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::ARGB	||
14343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::sRGBA)
14353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return channelType;
14363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
14373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return GL_NONE;
14383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_DEPTH_TYPE:
14403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (format.order == tcu::TextureFormat::D	||
14413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				format.order == tcu::TextureFormat::DS)
14423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return channelType;
14433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
14443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return GL_NONE;
14453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
14473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(DE_FALSE);
14483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return 0;
14493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
14503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
14513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14523c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureLevelCompressedCase : public TextureLevelCase
14533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
14543c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1455c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	TextureLevelCompressedCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1456c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		: TextureLevelCase(ctx, name, desc, target, type)
14573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
14583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
14593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14603c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
14613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void generateTestIterations (std::vector<TextureGenerationSpec>& iterations)
14623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1463c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		generateCompressedTextureGenerationGroup(iterations, m_target);
14643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
14653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
14673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
14683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool allOk = true;
14693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (spec.levels.empty())
14713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
14723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_COMPRESSED, 0, m_type);
14733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
14743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
14753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
14763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
14773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
14783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const int queryLevel	= spec.levels[levelNdx].level;
14793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				const int refValue		= (spec.levels[levelNdx].compressed) ? (1) : (0);
14803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_COMPRESSED, refValue, m_type);
14823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
14833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
14843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return allOk;
14863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
14873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
14883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1489c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryclass TextureLevelBufferDataStoreCase : public TextureLevelCase
1490c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
1491c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrypublic:
1492c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	TextureLevelBufferDataStoreCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1493c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		: TextureLevelCase(ctx, name, desc, target, type)
1494c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
1495c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
1496c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1497c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryprivate:
1498c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	void init (void)
1499c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
1500c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"))
1501c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			throw tcu::NotSupportedError("Test requires GL_EXT_texture_buffer extension");
1502c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		TextureLevelCase::init();
1503c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
1504c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1505c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	void generateTestIterations (std::vector<TextureGenerationSpec>& iterations)
1506c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
1507c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		generateTextureBufferGenerationGroup(iterations, m_target);
1508c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
1509c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1510c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
1511c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
1512c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		bool allOk = true;
1513c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1514c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		if (spec.levels.empty())
1515c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
1516c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_BUFFER_DATA_STORE_BINDING, 0, m_type);
1517c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		}
1518c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		else
1519c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
1520c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_BUFFER_DATA_STORE_BINDING, m_texBuffer, m_type);
1521c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		}
1522c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1523c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		return allOk;
1524c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
1525c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry};
1526c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1527c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryclass TextureLevelBufferDataOffsetCase : public TextureLevelCase
1528c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
1529c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrypublic:
1530c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	TextureLevelBufferDataOffsetCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1531c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		: TextureLevelCase(ctx, name, desc, target, type)
1532c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
1533c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
1534c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1535c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryprivate:
1536c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	void init (void)
1537c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
1538c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"))
1539c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			throw tcu::NotSupportedError("Test requires GL_EXT_texture_buffer extension");
1540c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		TextureLevelCase::init();
1541c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
1542c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1543c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	void generateTestIterations (std::vector<TextureGenerationSpec>& iterations)
1544c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
1545c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		generateTextureBufferGenerationGroup(iterations, m_target);
1546c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
1547c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1548c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
1549c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
1550c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		bool allOk = true;
1551c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1552c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		if (spec.levels.empty())
1553c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
1554c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_BUFFER_OFFSET, 0, m_type);
1555c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		}
1556c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		else
1557c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
1558c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			const int refValue = spec.texBufferDataOffset;
1559c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1560c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_BUFFER_OFFSET, refValue, m_type);
1561c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		}
1562c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1563c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		return allOk;
1564c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
1565c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry};
1566c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1567c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryclass TextureLevelBufferDataSizeCase : public TextureLevelCase
1568c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
1569c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrypublic:
1570c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	TextureLevelBufferDataSizeCase (Context& ctx, const char* name, const char* desc, glw::GLenum target, QueryType type)
1571c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		: TextureLevelCase(ctx, name, desc, target, type)
1572c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
1573c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
1574c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1575c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryprivate:
1576c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	void init (void)
1577c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
1578c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"))
1579c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			throw tcu::NotSupportedError("Test requires GL_EXT_texture_buffer extension");
1580c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		TextureLevelCase::init();
1581c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
1582c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1583c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	void generateTestIterations (std::vector<TextureGenerationSpec>& iterations)
1584c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
1585c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		generateTextureBufferGenerationGroup(iterations, m_target);
1586c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
1587c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1588c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	bool checkTextureState (glu::CallLogWrapper& gl, const TextureGenerationSpec& spec)
1589c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
1590c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		bool allOk = true;
1591c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1592c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		if (spec.levels.empty())
1593c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
1594c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_BUFFER_SIZE, 0, m_type);
1595c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		}
1596c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		else
1597c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{
1598c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			const int refValue = spec.texBufferDataSize;
1599c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1600c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_BUFFER_SIZE, refValue, m_type);
1601c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		}
1602c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1603c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		return allOk;
1604c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
1605c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry};
1606c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
16073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // anonymous
16083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1609c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystatic const char* getVerifierSuffix (QueryType type)
1610c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{
1611c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	switch (type)
1612c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
1613c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case QUERY_TEXTURE_LEVEL_FLOAT:		return "_float";
1614c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		case QUERY_TEXTURE_LEVEL_INTEGER:	return "_integer";
1615c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		default:
1616c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			DE_ASSERT(DE_FALSE);
1617c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry			return DE_NULL;
1618c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
1619c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}
1620c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
16213c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTextureLevelStateQueryTests::TextureLevelStateQueryTests (Context& context)
16223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCaseGroup(context, "texture_level", "GetTexLevelParameter tests")
16233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
16243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
16253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16263c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTextureLevelStateQueryTests::~TextureLevelStateQueryTests (void)
16273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
16283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
16293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16303c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureLevelStateQueryTests::init (void)
16313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1632c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	static const QueryType verifiers[] =
1633c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
1634c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		QUERY_TEXTURE_LEVEL_INTEGER,
1635c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		QUERY_TEXTURE_LEVEL_FLOAT,
1636c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	};
1637c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1638c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry#define FOR_EACH_VERIFIER(X) \
1639c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(verifiers); ++verifierNdx)	\
1640c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{																						\
1641c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		const std::string verifierSuffix = getVerifierSuffix(verifiers[verifierNdx]);		\
1642c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		const QueryType verifier = verifiers[verifierNdx];									\
1643c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		targetGroup->addChild(X);															\
1644c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	}
1645c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	static const struct
1646c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
1647c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		const char*	name;
1648c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		glw::GLenum	target;
1649c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	} textureTargets[] =
1650c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
1651c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ "texture_2d",						GL_TEXTURE_2D,						},
1652c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ "texture_3d",						GL_TEXTURE_3D,						},
1653c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ "texture_2d_array",				GL_TEXTURE_2D_ARRAY,				},
1654c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ "texture_cube_map",				GL_TEXTURE_CUBE_MAP,				},
1655c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ "texture_2d_multisample",			GL_TEXTURE_2D_MULTISAMPLE,			},
1656c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ "texture_2d_multisample_array",	GL_TEXTURE_2D_MULTISAMPLE_ARRAY,	}, // GL_OES_texture_storage_multisample_2d_array
1657c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ "texture_buffer",					GL_TEXTURE_BUFFER,					}, // GL_EXT_texture_buffer
1658c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		{ "texture_cube_array",				GL_TEXTURE_CUBE_MAP_ARRAY,			}, // GL_EXT_texture_cube_map_array
1659c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	};
1660c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1661c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(textureTargets); ++targetNdx)
1662c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry	{
1663c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		tcu::TestCaseGroup* const targetGroup = new tcu::TestCaseGroup(m_testCtx, textureTargets[targetNdx].name, textureTargets[targetNdx].name);
1664c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		addChild(targetGroup);
1665c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1666c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelSampleCase			(m_context, ("samples" + verifierSuffix).c_str(),					"Verify TEXTURE_SAMPLES",					textureTargets[targetNdx].target,	verifier));
1667c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelFixedSamplesCase		(m_context, ("fixed_sample_locations" + verifierSuffix).c_str(),	"Verify TEXTURE_FIXED_SAMPLE_LOCATIONS",	textureTargets[targetNdx].target,	verifier));
1668c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelWidthCase				(m_context, ("width" + verifierSuffix).c_str(),						"Verify TEXTURE_WIDTH",						textureTargets[targetNdx].target,	verifier));
1669c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelHeightCase			(m_context, ("height" + verifierSuffix).c_str(),					"Verify TEXTURE_HEIGHT",					textureTargets[targetNdx].target,	verifier));
1670c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelDepthCase				(m_context, ("depth" + verifierSuffix).c_str(),						"Verify TEXTURE_DEPTH",						textureTargets[targetNdx].target,	verifier));
1671c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelInternalFormatCase	(m_context, ("internal_format" + verifierSuffix).c_str(),			"Verify TEXTURE_INTERNAL_FORMAT",			textureTargets[targetNdx].target,	verifier));
1672c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelSizeCase				(m_context, ("red_size" + verifierSuffix).c_str(),					"Verify TEXTURE_RED_SIZE",					textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_RED_SIZE));
1673c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelSizeCase				(m_context, ("green_size" + verifierSuffix).c_str(),				"Verify TEXTURE_GREEN_SIZE",				textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_GREEN_SIZE));
1674c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelSizeCase				(m_context, ("blue_size" + verifierSuffix).c_str(),					"Verify TEXTURE_BLUE_SIZE",					textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_BLUE_SIZE));
1675c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelSizeCase				(m_context, ("alpha_size" + verifierSuffix).c_str(),				"Verify TEXTURE_ALPHA_SIZE",				textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_ALPHA_SIZE));
1676c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelSizeCase				(m_context, ("depth_size" + verifierSuffix).c_str(),				"Verify TEXTURE_DEPTH_SIZE",				textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_DEPTH_SIZE));
1677c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelSizeCase				(m_context, ("stencil_size" + verifierSuffix).c_str(),				"Verify TEXTURE_STENCIL_SIZE",				textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_STENCIL_SIZE));
1678c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelSizeCase				(m_context, ("shared_size" + verifierSuffix).c_str(),				"Verify TEXTURE_SHARED_SIZE",				textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_SHARED_SIZE));
1679c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelTypeCase				(m_context, ("red_type" + verifierSuffix).c_str(),					"Verify TEXTURE_RED_TYPE",					textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_RED_TYPE));
1680c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelTypeCase				(m_context, ("green_type" + verifierSuffix).c_str(),				"Verify TEXTURE_GREEN_TYPE",				textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_GREEN_TYPE));
1681c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelTypeCase				(m_context, ("blue_type" + verifierSuffix).c_str(),					"Verify TEXTURE_BLUE_TYPE",					textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_BLUE_TYPE));
1682c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelTypeCase				(m_context, ("alpha_type" + verifierSuffix).c_str(),				"Verify TEXTURE_ALPHA_TYPE",				textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_ALPHA_TYPE));
1683c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelTypeCase				(m_context, ("depth_type" + verifierSuffix).c_str(),				"Verify TEXTURE_DEPTH_TYPE",				textureTargets[targetNdx].target,	verifier,	GL_TEXTURE_DEPTH_TYPE));
1684c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelCompressedCase		(m_context, ("compressed" + verifierSuffix).c_str(),				"Verify TEXTURE_COMPRESSED",				textureTargets[targetNdx].target,	verifier));
1685c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelBufferDataStoreCase	(m_context, ("buffer_data_store_binding" + verifierSuffix).c_str(),	"Verify TEXTURE_BUFFER_DATA_STORE_BINDING",	textureTargets[targetNdx].target,	verifier));
1686c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelBufferDataOffsetCase	(m_context, ("buffer_offset" + verifierSuffix).c_str(),				"Verify TEXTURE_BUFFER_OFFSET",				textureTargets[targetNdx].target,	verifier));
1687c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry		FOR_EACH_VERIFIER(new TextureLevelBufferDataSizeCase	(m_context, ("buffer_size" + verifierSuffix).c_str(),				"Verify TEXTURE_BUFFER_SIZE",				textureTargets[targetNdx].target,	verifier));
16883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1689c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry
1690c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry#undef FOR_EACH_VERIFIER
16913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
16923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional
16943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles31
16953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
1696