Home | History | Annotate | Download | only in functional
      1 /*-------------------------------------------------------------------------
      2  * drawElements Quality Program OpenGL ES 3.0 Module
      3  * -------------------------------------------------
      4  *
      5  * Copyright 2014 The Android Open Source Project
      6  *
      7  * Licensed under the Apache License, Version 2.0 (the "License");
      8  * you may not use this file except in compliance with the License.
      9  * You may obtain a copy of the License at
     10  *
     11  *      http://www.apache.org/licenses/LICENSE-2.0
     12  *
     13  * Unless required by applicable law or agreed to in writing, software
     14  * distributed under the License is distributed on an "AS IS" BASIS,
     15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16  * See the License for the specific language governing permissions and
     17  * limitations under the License.
     18  *
     19  *//*!
     20  * \file
     21  * \brief Texture format tests.
     22  *
     23  * Constants:
     24  *  + nearest-neighbor filtering
     25  *  + no mipmaps
     26  *  + full texture coordinate range (but not outside) tested
     27  *  + accessed from fragment shader
     28  *  + texture unit 0
     29  *  + named texture object
     30  *
     31  * Variables:
     32  *  + texture format
     33  *  + texture type: 2D or cubemap
     34  *//*--------------------------------------------------------------------*/
     35 
     36 #include "es3fTextureFormatTests.hpp"
     37 #include "gluPixelTransfer.hpp"
     38 #include "gluStrUtil.hpp"
     39 #include "gluTexture.hpp"
     40 #include "gluTextureUtil.hpp"
     41 #include "glsTextureTestUtil.hpp"
     42 #include "tcuTextureUtil.hpp"
     43 #include "deStringUtil.hpp"
     44 #include "deRandom.hpp"
     45 #include "glwEnums.hpp"
     46 #include "glwFunctions.hpp"
     47 
     48 using std::vector;
     49 using std::string;
     50 using tcu::TestLog;
     51 
     52 namespace deqp
     53 {
     54 namespace gles3
     55 {
     56 namespace Functional
     57 {
     58 
     59 using namespace deqp::gls;
     60 using namespace deqp::gls::TextureTestUtil;
     61 using tcu::Sampler;
     62 
     63 // Texture2DFormatCase
     64 
     65 class Texture2DFormatCase : public tcu::TestCase
     66 {
     67 public:
     68 							Texture2DFormatCase		(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 format, deUint32 dataType, int width, int height);
     69 							Texture2DFormatCase		(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 internalFormat, int width, int height);
     70 							~Texture2DFormatCase	(void);
     71 
     72 	void					init					(void);
     73 	void					deinit					(void);
     74 	IterateResult			iterate					(void);
     75 
     76 private:
     77 							Texture2DFormatCase		(const Texture2DFormatCase& other);
     78 	Texture2DFormatCase&	operator=				(const Texture2DFormatCase& other);
     79 
     80 	glu::RenderContext&		m_renderCtx;
     81 
     82 	deUint32				m_format;
     83 	deUint32				m_dataType;
     84 	int						m_width;
     85 	int						m_height;
     86 
     87 	glu::Texture2D*			m_texture;
     88 	TextureRenderer			m_renderer;
     89 };
     90 
     91 Texture2DFormatCase::Texture2DFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 format, deUint32 dataType, int width, int height)
     92 	: TestCase		(testCtx, name, description)
     93 	, m_renderCtx	(renderCtx)
     94 	, m_format		(format)
     95 	, m_dataType	(dataType)
     96 	, m_width		(width)
     97 	, m_height		(height)
     98 	, m_texture		(DE_NULL)
     99 	, m_renderer	(renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP)
    100 {
    101 }
    102 
    103 Texture2DFormatCase::Texture2DFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 internalFormat, int width, int height)
    104 	: TestCase		(testCtx, name, description)
    105 	, m_renderCtx	(renderCtx)
    106 	, m_format		(internalFormat)
    107 	, m_dataType	(GL_NONE)
    108 	, m_width		(width)
    109 	, m_height		(height)
    110 	, m_texture		(DE_NULL)
    111 	, m_renderer	(renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP)
    112 {
    113 }
    114 
    115 Texture2DFormatCase::~Texture2DFormatCase (void)
    116 {
    117 	deinit();
    118 }
    119 
    120 void Texture2DFormatCase::init (void)
    121 {
    122 	TestLog&				log		= m_testCtx.getLog();
    123 	tcu::TextureFormat		fmt		= m_dataType ? glu::mapGLTransferFormat(m_format, m_dataType) : glu::mapGLInternalFormat(m_format);
    124 	tcu::TextureFormatInfo	spec	= tcu::getTextureFormatInfo(fmt);
    125 	std::ostringstream		fmtName;
    126 
    127 	if (m_dataType)
    128 		fmtName << glu::getTextureFormatStr(m_format) << ", " << glu::getTypeStr(m_dataType);
    129 	else
    130 		fmtName << glu::getTextureFormatStr(m_format);
    131 
    132 	log << TestLog::Message << "2D texture, " << fmtName.str() << ", " << m_width << "x" << m_height
    133 							<< ",\n  fill with " << formatGradient(&spec.valueMin, &spec.valueMax) << " gradient"
    134 		<< TestLog::EndMessage;
    135 
    136 	m_texture = m_dataType != GL_NONE
    137 			  ? new glu::Texture2D(m_renderCtx, m_format, m_dataType, m_width, m_height)	// Implicit internal format.
    138 			  : new glu::Texture2D(m_renderCtx, m_format, m_width, m_height);				// Explicit internal format.
    139 
    140 	// Fill level 0.
    141 	m_texture->getRefTexture().allocLevel(0);
    142 	tcu::fillWithComponentGradients(m_texture->getRefTexture().getLevel(0), spec.valueMin, spec.valueMax);
    143 }
    144 
    145 void Texture2DFormatCase::deinit (void)
    146 {
    147 	delete m_texture;
    148 	m_texture = DE_NULL;
    149 
    150 	m_renderer.clear();
    151 }
    152 
    153 Texture2DFormatCase::IterateResult Texture2DFormatCase::iterate (void)
    154 {
    155 	TestLog&				log					= m_testCtx.getLog();
    156 	const glw::Functions&	gl					= m_renderCtx.getFunctions();
    157 	RandomViewport			viewport			(m_renderCtx.getRenderTarget(), m_width, m_height, deStringHash(getName()));
    158 	tcu::Surface			renderedFrame		(viewport.width, viewport.height);
    159 	tcu::Surface			referenceFrame		(viewport.width, viewport.height);
    160 	tcu::RGBA				threshold			= m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1);
    161 	vector<float>			texCoord;
    162 	ReferenceParams			renderParams		(TEXTURETYPE_2D);
    163 	tcu::TextureFormatInfo	spec				= tcu::getTextureFormatInfo(m_texture->getRefTexture().getFormat());
    164 	const deUint32			wrapS				= GL_CLAMP_TO_EDGE;
    165 	const deUint32			wrapT				= GL_CLAMP_TO_EDGE;
    166 	const deUint32			minFilter			= GL_NEAREST;
    167 	const deUint32			magFilter			= GL_NEAREST;
    168 
    169 	renderParams.flags			|= RenderParams::LOG_ALL;
    170 	renderParams.samplerType	= getSamplerType(m_texture->getRefTexture().getFormat());
    171 	renderParams.sampler		= Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST, Sampler::NEAREST);
    172 	renderParams.colorScale		= spec.lookupScale;
    173 	renderParams.colorBias		= spec.lookupBias;
    174 
    175 	computeQuadTexCoord2D(texCoord, tcu::Vec2(0.0f, 0.0f), tcu::Vec2(1.0f, 1.0f));
    176 
    177 	log << TestLog::Message << "Texture parameters:"
    178 							<< "\n  WRAP_S = " << glu::getTextureParameterValueStr(GL_TEXTURE_WRAP_S, wrapS)
    179 							<< "\n  WRAP_T = " << glu::getTextureParameterValueStr(GL_TEXTURE_WRAP_T, wrapT)
    180 							<< "\n  MIN_FILTER = " << glu::getTextureParameterValueStr(GL_TEXTURE_MIN_FILTER, minFilter)
    181 							<< "\n  MAG_FILTER = " << glu::getTextureParameterValueStr(GL_TEXTURE_MAG_FILTER, magFilter)
    182 		<< TestLog::EndMessage;
    183 
    184 	// Setup base viewport.
    185 	gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
    186 
    187 	// Upload texture data to GL.
    188 	m_texture->upload();
    189 
    190 	// Bind to unit 0.
    191 	gl.activeTexture(GL_TEXTURE0);
    192 	gl.bindTexture(GL_TEXTURE_2D, m_texture->getGLTexture());
    193 
    194 	// Setup nearest neighbor filtering and clamp-to-edge.
    195 	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapS);
    196 	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapT);
    197 	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
    198 	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);
    199 
    200 	GLU_EXPECT_NO_ERROR(gl.getError(), "Set texturing state");
    201 
    202 	// Draw.
    203 	m_renderer.renderQuad(0, &texCoord[0], renderParams);
    204 	glu::readPixels(m_renderCtx, viewport.x, viewport.y, renderedFrame.getAccess());
    205 	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels()");
    206 
    207 	// Compute reference.
    208 	sampleTexture(SurfaceAccess(referenceFrame, m_renderCtx.getRenderTarget().getPixelFormat()), m_texture->getRefTexture(), &texCoord[0], renderParams);
    209 
    210 	// Compare and log.
    211 	bool isOk = compareImages(log, referenceFrame, renderedFrame, threshold);
    212 
    213 	m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS	: QP_TEST_RESULT_FAIL,
    214 							isOk ? "Pass"				: "Image comparison failed");
    215 
    216 	return STOP;
    217 }
    218 
    219 // TextureCubeFormatCase
    220 
    221 class TextureCubeFormatCase : public tcu::TestCase
    222 {
    223 public:
    224 							TextureCubeFormatCase	(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 format, deUint32 dataType, int width, int height);
    225 							TextureCubeFormatCase	(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 internalFormat, int width, int height);
    226 							~TextureCubeFormatCase	(void);
    227 
    228 	void					init					(void);
    229 	void					deinit					(void);
    230 	IterateResult			iterate					(void);
    231 
    232 private:
    233 							TextureCubeFormatCase	(const TextureCubeFormatCase& other);
    234 	TextureCubeFormatCase&	operator=				(const TextureCubeFormatCase& other);
    235 
    236 	bool					testFace				(tcu::CubeFace face);
    237 
    238 	glu::RenderContext&		m_renderCtx;
    239 
    240 	deUint32				m_format;
    241 	deUint32				m_dataType;
    242 	int						m_width;
    243 	int						m_height;
    244 
    245 	glu::TextureCube*		m_texture;
    246 	TextureRenderer			m_renderer;
    247 
    248 	int						m_curFace;
    249 	bool					m_isOk;
    250 };
    251 
    252 TextureCubeFormatCase::TextureCubeFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 format, deUint32 dataType, int width, int height)
    253 	: TestCase		(testCtx, name, description)
    254 	, m_renderCtx	(renderCtx)
    255 	, m_format		(format)
    256 	, m_dataType	(dataType)
    257 	, m_width		(width)
    258 	, m_height		(height)
    259 	, m_texture		(DE_NULL)
    260 	, m_renderer	(renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP)
    261 	, m_curFace		(0)
    262 	, m_isOk		(false)
    263 {
    264 }
    265 
    266 TextureCubeFormatCase::TextureCubeFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 internalFormat, int width, int height)
    267 	: TestCase		(testCtx, name, description)
    268 	, m_renderCtx	(renderCtx)
    269 	, m_format		(internalFormat)
    270 	, m_dataType	(GL_NONE)
    271 	, m_width		(width)
    272 	, m_height		(height)
    273 	, m_texture		(DE_NULL)
    274 	, m_renderer	(renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP)
    275 	, m_curFace		(0)
    276 	, m_isOk		(false)
    277 {
    278 }
    279 
    280 TextureCubeFormatCase::~TextureCubeFormatCase (void)
    281 {
    282 	deinit();
    283 }
    284 
    285 void TextureCubeFormatCase::init (void)
    286 {
    287 	TestLog&				log		= m_testCtx.getLog();
    288 	tcu::TextureFormat		fmt		= m_dataType ? glu::mapGLTransferFormat(m_format, m_dataType) : glu::mapGLInternalFormat(m_format);
    289 	tcu::TextureFormatInfo	spec	= tcu::getTextureFormatInfo(fmt);
    290 	std::ostringstream		fmtName;
    291 
    292 	if (m_dataType)
    293 		fmtName << glu::getTextureFormatStr(m_format) << ", " << glu::getTypeStr(m_dataType);
    294 	else
    295 		fmtName << glu::getTextureFormatStr(m_format);
    296 
    297 	log << TestLog::Message << "Cube map texture, " << fmtName.str() << ", " << m_width << "x" << m_height
    298 							<< ",\n  fill with " << formatGradient(&spec.valueMin, &spec.valueMax) << " gradient"
    299 		<< TestLog::EndMessage;
    300 
    301 	DE_ASSERT(m_width == m_height);
    302 	m_texture = m_dataType != GL_NONE
    303 			  ? new glu::TextureCube(m_renderCtx, m_format, m_dataType, m_width)	// Implicit internal format.
    304 		      : new glu::TextureCube(m_renderCtx, m_format, m_width);				// Explicit internal format.
    305 
    306 	// Fill level 0.
    307 	for (int face = 0; face < tcu::CUBEFACE_LAST; face++)
    308 	{
    309 		tcu::Vec4 gMin, gMax;
    310 
    311 		switch (face)
    312 		{
    313 			case 0: gMin = spec.valueMin.swizzle(0, 1, 2, 3); gMax = spec.valueMax.swizzle(0, 1, 2, 3); break;
    314 			case 1: gMin = spec.valueMin.swizzle(2, 1, 0, 3); gMax = spec.valueMax.swizzle(2, 1, 0, 3); break;
    315 			case 2: gMin = spec.valueMin.swizzle(1, 2, 0, 3); gMax = spec.valueMax.swizzle(1, 2, 0, 3); break;
    316 			case 3: gMin = spec.valueMax.swizzle(0, 1, 2, 3); gMax = spec.valueMin.swizzle(0, 1, 2, 3); break;
    317 			case 4: gMin = spec.valueMax.swizzle(2, 1, 0, 3); gMax = spec.valueMin.swizzle(2, 1, 0, 3); break;
    318 			case 5: gMin = spec.valueMax.swizzle(1, 2, 0, 3); gMax = spec.valueMin.swizzle(1, 2, 0, 3); break;
    319 			default:
    320 				DE_ASSERT(false);
    321 		}
    322 
    323 		m_texture->getRefTexture().allocLevel((tcu::CubeFace)face, 0);
    324 		tcu::fillWithComponentGradients(m_texture->getRefTexture().getLevelFace(0, (tcu::CubeFace)face), gMin, gMax);
    325 	}
    326 
    327 	// Upload texture data to GL.
    328 	m_texture->upload();
    329 
    330 	// Initialize iteration state.
    331 	m_curFace	= 0;
    332 	m_isOk		= true;
    333 }
    334 
    335 void TextureCubeFormatCase::deinit (void)
    336 {
    337 	delete m_texture;
    338 	m_texture = DE_NULL;
    339 
    340 	m_renderer.clear();
    341 }
    342 
    343 bool TextureCubeFormatCase::testFace (tcu::CubeFace face)
    344 {
    345 	TestLog&				log					= m_testCtx.getLog();
    346 	const glw::Functions&	gl					= m_renderCtx.getFunctions();
    347 	RandomViewport			viewport			(m_renderCtx.getRenderTarget(), m_width, m_height, deStringHash(getName())+(deUint32)face);
    348 	tcu::Surface			renderedFrame		(viewport.width, viewport.height);
    349 	tcu::Surface			referenceFrame		(viewport.width, viewport.height);
    350 	tcu::RGBA				threshold			= m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1);
    351 	vector<float>			texCoord;
    352 	ReferenceParams			renderParams		(TEXTURETYPE_CUBE);
    353 	tcu::TextureFormatInfo	spec				= tcu::getTextureFormatInfo(m_texture->getRefTexture().getFormat());
    354 
    355 	renderParams.samplerType				= getSamplerType(m_texture->getRefTexture().getFormat());
    356 	renderParams.sampler					= Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST, Sampler::NEAREST);
    357 	renderParams.sampler.seamlessCubeMap	= true;
    358 	renderParams.colorScale					= spec.lookupScale;
    359 	renderParams.colorBias					= spec.lookupBias;
    360 
    361 	// Log render info on first face.
    362 	if (face == tcu::CUBEFACE_NEGATIVE_X)
    363 		renderParams.flags |= RenderParams::LOG_ALL;
    364 
    365 	computeQuadTexCoordCube(texCoord, face);
    366 
    367 	// \todo [2011-10-28 pyry] Image set name / section?
    368 	log << TestLog::Message << face << TestLog::EndMessage;
    369 
    370 	// Setup base viewport.
    371 	gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
    372 
    373 	// Bind to unit 0.
    374 	gl.activeTexture(GL_TEXTURE0);
    375 	gl.bindTexture(GL_TEXTURE_CUBE_MAP, m_texture->getGLTexture());
    376 
    377 	// Setup nearest neighbor filtering and clamp-to-edge.
    378 	gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    379 	gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    380 	gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    381 	gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    382 
    383 	GLU_EXPECT_NO_ERROR(gl.getError(), "Set texturing state");
    384 
    385 	m_renderer.renderQuad(0, &texCoord[0], renderParams);
    386 	glu::readPixels(m_renderCtx, viewport.x, viewport.y, renderedFrame.getAccess());
    387 	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels()");
    388 
    389 	// Compute reference.
    390 	sampleTexture(SurfaceAccess(referenceFrame, m_renderCtx.getRenderTarget().getPixelFormat()), m_texture->getRefTexture(), &texCoord[0], renderParams);
    391 
    392 	// Compare and log.
    393 	return compareImages(log, referenceFrame, renderedFrame, threshold);
    394 }
    395 
    396 TextureCubeFormatCase::IterateResult TextureCubeFormatCase::iterate (void)
    397 {
    398 	// Execute test for all faces.
    399 	if (!testFace((tcu::CubeFace)m_curFace))
    400 		m_isOk = false;
    401 
    402 	m_curFace += 1;
    403 
    404 	if (m_curFace == tcu::CUBEFACE_LAST)
    405 	{
    406 		m_testCtx.setTestResult(m_isOk ? QP_TEST_RESULT_PASS	: QP_TEST_RESULT_FAIL,
    407 								m_isOk ? "Pass"					: "Image comparison failed");
    408 		return STOP;
    409 	}
    410 	else
    411 		return CONTINUE;
    412 }
    413 
    414 // Texture2DArrayFormatCase
    415 
    416 class Texture2DArrayFormatCase : public tcu::TestCase
    417 {
    418 public:
    419 										Texture2DArrayFormatCase	(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 format, deUint32 dataType, int width, int height, int numLayers);
    420 										Texture2DArrayFormatCase	(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 internalFormat, int width, int height, int numLayers);
    421 										~Texture2DArrayFormatCase	(void);
    422 
    423 	void								init						(void);
    424 	void								deinit						(void);
    425 	IterateResult						iterate						(void);
    426 
    427 private:
    428 										Texture2DArrayFormatCase	(const Texture2DArrayFormatCase& other);
    429 	Texture2DArrayFormatCase&			operator=					(const Texture2DArrayFormatCase& other);
    430 
    431 	bool								testLayer					(int layerNdx);
    432 
    433 	glu::RenderContext&					m_renderCtx;
    434 
    435 	deUint32							m_format;
    436 	deUint32							m_dataType;
    437 	int									m_width;
    438 	int									m_height;
    439 	int									m_numLayers;
    440 
    441 	glu::Texture2DArray*				m_texture;
    442 	TextureTestUtil::TextureRenderer	m_renderer;
    443 
    444 	int									m_curLayer;
    445 };
    446 
    447 Texture2DArrayFormatCase::Texture2DArrayFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 format, deUint32 dataType, int width, int height, int numLayers)
    448 	: TestCase		(testCtx, name, description)
    449 	, m_renderCtx	(renderCtx)
    450 	, m_format		(format)
    451 	, m_dataType	(dataType)
    452 	, m_width		(width)
    453 	, m_height		(height)
    454 	, m_numLayers	(numLayers)
    455 	, m_texture		(DE_NULL)
    456 	, m_renderer	(renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP)
    457 	, m_curLayer	(0)
    458 {
    459 }
    460 
    461 Texture2DArrayFormatCase::Texture2DArrayFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 internalFormat, int width, int height, int numLayers)
    462 	: TestCase		(testCtx, name, description)
    463 	, m_renderCtx	(renderCtx)
    464 	, m_format		(internalFormat)
    465 	, m_dataType	(GL_NONE)
    466 	, m_width		(width)
    467 	, m_height		(height)
    468 	, m_numLayers	(numLayers)
    469 	, m_texture		(DE_NULL)
    470 	, m_renderer	(renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP)
    471 	, m_curLayer	(0)
    472 {
    473 }
    474 
    475 Texture2DArrayFormatCase::~Texture2DArrayFormatCase (void)
    476 {
    477 	deinit();
    478 }
    479 
    480 void Texture2DArrayFormatCase::init (void)
    481 {
    482 	m_texture = m_dataType != GL_NONE
    483 			  ? new glu::Texture2DArray(m_renderCtx, m_format, m_dataType, m_width, m_height, m_numLayers)	// Implicit internal format.
    484 			  : new glu::Texture2DArray(m_renderCtx, m_format, m_width, m_height, m_numLayers);				// Explicit internal format.
    485 
    486 	tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(m_texture->getRefTexture().getFormat());
    487 
    488 	// Fill level 0.
    489 	m_texture->getRefTexture().allocLevel(0);
    490 	tcu::fillWithComponentGradients(m_texture->getRefTexture().getLevel(0), spec.valueMin, spec.valueMax);
    491 
    492 	// Initialize state.
    493 	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    494 	m_curLayer = 0;
    495 }
    496 
    497 void Texture2DArrayFormatCase::deinit (void)
    498 {
    499 	delete m_texture;
    500 	m_texture = DE_NULL;
    501 
    502 	m_renderer.clear();
    503 }
    504 
    505 bool Texture2DArrayFormatCase::testLayer (int layerNdx)
    506 {
    507 	const glw::Functions&	gl					= m_renderCtx.getFunctions();
    508 	TestLog&				log					= m_testCtx.getLog();
    509 	RandomViewport			viewport			(m_renderCtx.getRenderTarget(), m_width, m_height, deStringHash(getName()));
    510 	tcu::Surface			renderedFrame		(viewport.width, viewport.height);
    511 	tcu::Surface			referenceFrame		(viewport.width, viewport.height);
    512 	tcu::RGBA				threshold			= m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1);
    513 	vector<float>			texCoord;
    514 	ReferenceParams			renderParams		(TEXTURETYPE_2D_ARRAY);
    515 	tcu::TextureFormatInfo	spec				= tcu::getTextureFormatInfo(m_texture->getRefTexture().getFormat());
    516 
    517 	renderParams.samplerType	= getSamplerType(m_texture->getRefTexture().getFormat());
    518 	renderParams.sampler		= Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST, Sampler::NEAREST);
    519 	renderParams.colorScale		= spec.lookupScale;
    520 	renderParams.colorBias		= spec.lookupBias;
    521 
    522 	computeQuadTexCoord2DArray(texCoord, layerNdx, tcu::Vec2(0.0f, 0.0f), tcu::Vec2(1.0f, 1.0f));
    523 
    524 	// Setup base viewport.
    525 	gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
    526 
    527 	// Upload texture data to GL.
    528 	m_texture->upload();
    529 
    530 	// Bind to unit 0.
    531 	gl.activeTexture(GL_TEXTURE0);
    532 	gl.bindTexture(GL_TEXTURE_2D_ARRAY, m_texture->getGLTexture());
    533 
    534 	// Setup nearest neighbor filtering and clamp-to-edge.
    535 	gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    536 	gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    537 	gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    538 	gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    539 
    540 	GLU_EXPECT_NO_ERROR(gl.getError(), "Set texturing state");
    541 
    542 	// Draw.
    543 	m_renderer.renderQuad(0, &texCoord[0], renderParams);
    544 	glu::readPixels(m_renderCtx, viewport.x, viewport.y, renderedFrame.getAccess());
    545 
    546 	// Compute reference.
    547 	sampleTexture(SurfaceAccess(referenceFrame, m_renderCtx.getRenderTarget().getPixelFormat()), m_texture->getRefTexture(), &texCoord[0], renderParams);
    548 
    549 	// Compare and log.
    550 	return compareImages(log, (string("Layer" + de::toString(layerNdx))).c_str(), (string("Layer " + de::toString(layerNdx))).c_str(), referenceFrame, renderedFrame, threshold);
    551 }
    552 
    553 Texture2DArrayFormatCase::IterateResult Texture2DArrayFormatCase::iterate (void)
    554 {
    555 	// Execute test for all layers.
    556 	bool isOk = testLayer(m_curLayer);
    557 
    558 	if (!isOk && m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    559 		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Image comparison failed");
    560 
    561 	m_curLayer += 1;
    562 
    563 	return m_curLayer < m_texture->getRefTexture().getNumLayers() ? CONTINUE : STOP;
    564 }
    565 
    566 // Texture2DFormatCase
    567 
    568 class Texture3DFormatCase : public tcu::TestCase
    569 {
    570 public:
    571 										Texture3DFormatCase		(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 format, deUint32 dataType, int width, int height, int depth);
    572 										Texture3DFormatCase		(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 internalFormat, int width, int height, int depth);
    573 										~Texture3DFormatCase	(void);
    574 
    575 	void								init					(void);
    576 	void								deinit					(void);
    577 	IterateResult						iterate					(void);
    578 
    579 private:
    580 										Texture3DFormatCase		(const Texture3DFormatCase& other);
    581 	Texture3DFormatCase&				operator=				(const Texture3DFormatCase& other);
    582 
    583 	bool								testSlice				(int sliceNdx);
    584 
    585 	glu::RenderContext&					m_renderCtx;
    586 
    587 	deUint32							m_format;
    588 	deUint32							m_dataType;
    589 	int									m_width;
    590 	int									m_height;
    591 	int									m_depth;
    592 
    593 	glu::Texture3D*						m_texture;
    594 	TextureTestUtil::TextureRenderer	m_renderer;
    595 
    596 	int									m_curSlice;
    597 };
    598 
    599 Texture3DFormatCase::Texture3DFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 format, deUint32 dataType, int width, int height, int depth)
    600 	: TestCase		(testCtx, name, description)
    601 	, m_renderCtx	(renderCtx)
    602 	, m_format		(format)
    603 	, m_dataType	(dataType)
    604 	, m_width		(width)
    605 	, m_height		(height)
    606 	, m_depth		(depth)
    607 	, m_texture		(DE_NULL)
    608 	, m_renderer	(renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP)
    609 	, m_curSlice	(0)
    610 {
    611 }
    612 
    613 Texture3DFormatCase::Texture3DFormatCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* description, deUint32 internalFormat, int width, int height, int depth)
    614 	: TestCase		(testCtx, name, description)
    615 	, m_renderCtx	(renderCtx)
    616 	, m_format		(internalFormat)
    617 	, m_dataType	(GL_NONE)
    618 	, m_width		(width)
    619 	, m_height		(height)
    620 	, m_depth		(depth)
    621 	, m_texture		(DE_NULL)
    622 	, m_renderer	(renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP)
    623 	, m_curSlice	(0)
    624 {
    625 }
    626 
    627 Texture3DFormatCase::~Texture3DFormatCase (void)
    628 {
    629 	deinit();
    630 }
    631 
    632 void Texture3DFormatCase::init (void)
    633 {
    634 	m_texture = m_dataType != GL_NONE
    635 			  ? new glu::Texture3D(m_renderCtx, m_format, m_dataType, m_width, m_height, m_depth)	// Implicit internal format.
    636 			  : new glu::Texture3D(m_renderCtx, m_format, m_width, m_height, m_depth);				// Explicit internal format.
    637 
    638 	tcu::TextureFormatInfo spec = tcu::getTextureFormatInfo(m_texture->getRefTexture().getFormat());
    639 
    640 	// Fill level 0.
    641 	m_texture->getRefTexture().allocLevel(0);
    642 	tcu::fillWithComponentGradients(m_texture->getRefTexture().getLevel(0), spec.valueMin, spec.valueMax);
    643 
    644 	// Initialize state.
    645 	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    646 	m_curSlice = 0;
    647 }
    648 
    649 void Texture3DFormatCase::deinit (void)
    650 {
    651 	delete m_texture;
    652 	m_texture = DE_NULL;
    653 
    654 	m_renderer.clear();
    655 }
    656 
    657 bool Texture3DFormatCase::testSlice (int sliceNdx)
    658 {
    659 	TestLog&				log					= m_testCtx.getLog();
    660 	const glw::Functions&	gl					= m_renderCtx.getFunctions();
    661 	RandomViewport			viewport			(m_renderCtx.getRenderTarget(), m_width, m_height, deStringHash(getName()));
    662 	tcu::Surface			renderedFrame		(viewport.width, viewport.height);
    663 	tcu::Surface			referenceFrame		(viewport.width, viewport.height);
    664 	tcu::RGBA				threshold			= m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1);
    665 	vector<float>			texCoord;
    666 	ReferenceParams			renderParams		(TEXTURETYPE_3D);
    667 	tcu::TextureFormatInfo	spec				= tcu::getTextureFormatInfo(m_texture->getRefTexture().getFormat());
    668 	float					r					= ((float)sliceNdx + 0.5f) / (float)m_depth;
    669 
    670 	renderParams.samplerType	= getSamplerType(m_texture->getRefTexture().getFormat());
    671 	renderParams.sampler		= Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST, Sampler::NEAREST);
    672 	renderParams.colorScale		= spec.lookupScale;
    673 	renderParams.colorBias		= spec.lookupBias;
    674 
    675 	computeQuadTexCoord3D(texCoord, tcu::Vec3(0.0f, 0.0f, r), tcu::Vec3(1.0f, 1.0f, r), tcu::IVec3(0,1,2));
    676 
    677 	// Setup base viewport.
    678 	gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
    679 
    680 	// Upload texture data to GL.
    681 	m_texture->upload();
    682 
    683 	// Bind to unit 0.
    684 	gl.activeTexture(GL_TEXTURE0);
    685 	gl.bindTexture(GL_TEXTURE_3D, m_texture->getGLTexture());
    686 
    687 	// Setup nearest neighbor filtering and clamp-to-edge.
    688 	gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    689 	gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    690 	gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    691 	gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    692 
    693 	GLU_EXPECT_NO_ERROR(gl.getError(), "Set texturing state");
    694 
    695 	// Draw.
    696 	m_renderer.renderQuad(0, &texCoord[0], renderParams);
    697 	glu::readPixels(m_renderCtx, viewport.x, viewport.y, renderedFrame.getAccess());
    698 
    699 	// Compute reference.
    700 	sampleTexture(SurfaceAccess(referenceFrame, m_renderCtx.getRenderTarget().getPixelFormat()), m_texture->getRefTexture(), &texCoord[0], renderParams);
    701 
    702 	// Compare and log.
    703 	return compareImages(log, (string("Slice" + de::toString(sliceNdx))).c_str(), (string("Slice " + de::toString(sliceNdx))).c_str(), referenceFrame, renderedFrame, threshold);
    704 }
    705 
    706 Texture3DFormatCase::IterateResult Texture3DFormatCase::iterate (void)
    707 {
    708 	// Execute test for all slices.
    709 	bool isOk = testSlice(m_curSlice);
    710 
    711 	if (!isOk && m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    712 		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Image comparison failed");
    713 
    714 	m_curSlice += 1;
    715 
    716 	return m_curSlice < m_texture->getRefTexture().getDepth() ? CONTINUE : STOP;
    717 }
    718 
    719 // Compressed2FormatCase
    720 
    721 class Compressed2DFormatCase : public tcu::TestCase
    722 {
    723 public:
    724 										Compressed2DFormatCase		(tcu::TestContext&				testCtx,
    725 																	 glu::RenderContext&			renderCtx,
    726 																	 const glu::ContextInfo&		renderCtxInfo,
    727 																	 const char*					name,
    728 																	 const char*					description,
    729 																	 tcu::CompressedTexFormat		format,
    730 																	 deUint32						randomSeed,
    731 																	 int							width,
    732 																	 int							height);
    733 										~Compressed2DFormatCase		(void);
    734 
    735 	void								init						(void);
    736 	void								deinit						(void);
    737 	IterateResult						iterate						(void);
    738 
    739 private:
    740 										Compressed2DFormatCase		(const Compressed2DFormatCase& other);
    741 	Compressed2DFormatCase&				operator=					(const Compressed2DFormatCase& other);
    742 
    743 	glu::RenderContext&					m_renderCtx;
    744 	const glu::ContextInfo&				m_renderCtxInfo;
    745 
    746 	tcu::CompressedTexFormat			m_format;
    747 
    748 	deUint32							m_randomSeed;
    749 	int									m_width;
    750 	int									m_height;
    751 
    752 	glu::Texture2D*						m_texture;
    753 	TextureTestUtil::TextureRenderer	m_renderer;
    754 };
    755 
    756 Compressed2DFormatCase::Compressed2DFormatCase (tcu::TestContext&			testCtx,
    757 												glu::RenderContext&			renderCtx,
    758 												const glu::ContextInfo&		renderCtxInfo,
    759 												const char*					name,
    760 												const char*					description,
    761 												tcu::CompressedTexFormat	format,
    762 												deUint32					randomSeed,
    763 												int							width,
    764 												int							height)
    765 	: TestCase			(testCtx, name, description)
    766 	, m_renderCtx		(renderCtx)
    767 	, m_renderCtxInfo	(renderCtxInfo)
    768 	, m_format			(format)
    769 	, m_randomSeed		(randomSeed)
    770 	, m_width			(width)
    771 	, m_height			(height)
    772 	, m_texture			(DE_NULL)
    773 	, m_renderer		(renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP)
    774 {
    775 }
    776 
    777 Compressed2DFormatCase::~Compressed2DFormatCase (void)
    778 {
    779 	deinit();
    780 }
    781 
    782 void Compressed2DFormatCase::init (void)
    783 {
    784 	// Create texture.
    785 	tcu::CompressedTexture	compressedTexture	(m_format, m_width, m_height);
    786 	int						dataSize			= compressedTexture.getDataSize();
    787 	deUint8*				data				= (deUint8*)compressedTexture.getData();
    788 	de::Random				rnd					(m_randomSeed);
    789 
    790 	for (int i = 0; i < dataSize; i++)
    791 		data[i] = rnd.getUint32() & 0xff;
    792 
    793 	m_texture = new glu::Texture2D(m_renderCtx, m_renderCtxInfo, 1, &compressedTexture);
    794 }
    795 
    796 void Compressed2DFormatCase::deinit (void)
    797 {
    798 	delete m_texture;
    799 	m_texture = DE_NULL;
    800 
    801 	m_renderer.clear();
    802 }
    803 
    804 Compressed2DFormatCase::IterateResult Compressed2DFormatCase::iterate (void)
    805 {
    806 	const glw::Functions&	gl					= m_renderCtx.getFunctions();
    807 	TestLog&				log					= m_testCtx.getLog();
    808 	RandomViewport			viewport			(m_renderCtx.getRenderTarget(), m_texture->getRefTexture().getWidth(), m_texture->getRefTexture().getHeight(), deStringHash(getName()));
    809 	tcu::Surface			renderedFrame		(viewport.width, viewport.height);
    810 	tcu::Surface			referenceFrame		(viewport.width, viewport.height);
    811 	tcu::RGBA				threshold			= m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1);
    812 	vector<float>			texCoord;
    813 	ReferenceParams			renderParams		(TEXTURETYPE_2D);
    814 	tcu::TextureFormatInfo	spec				= tcu::getTextureFormatInfo(m_texture->getRefTexture().getFormat());
    815 
    816 	renderParams.samplerType	= getSamplerType(m_texture->getRefTexture().getFormat());
    817 	renderParams.sampler		= Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST, Sampler::NEAREST);
    818 	renderParams.colorScale		= spec.lookupScale;
    819 	renderParams.colorBias		= spec.lookupBias;
    820 
    821 	computeQuadTexCoord2D(texCoord, tcu::Vec2(0.0f, 0.0f), tcu::Vec2(1.0f, 1.0f));
    822 
    823 	// Setup base viewport.
    824 	gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
    825 
    826 	// Bind to unit 0.
    827 	gl.activeTexture(GL_TEXTURE0);
    828 	gl.bindTexture(GL_TEXTURE_2D, m_texture->getGLTexture());
    829 
    830 	// Setup nearest neighbor filtering and clamp-to-edge.
    831 	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,		GL_CLAMP_TO_EDGE);
    832 	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,		GL_CLAMP_TO_EDGE);
    833 	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,	GL_NEAREST);
    834 	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,	GL_NEAREST);
    835 
    836 	GLU_EXPECT_NO_ERROR(gl.getError(), "Set texturing state");
    837 
    838 	// Draw.
    839 	m_renderer.renderQuad(0, &texCoord[0], renderParams);
    840 	glu::readPixels(m_renderCtx, viewport.x, viewport.y, renderedFrame.getAccess());
    841 
    842 	// Compute reference.
    843 	sampleTexture(SurfaceAccess(referenceFrame, m_renderCtx.getRenderTarget().getPixelFormat()), m_texture->getRefTexture(), &texCoord[0], renderParams);
    844 
    845 	// Compare and log.
    846 	bool isOk = compareImages(log, referenceFrame, renderedFrame, threshold);
    847 
    848 	m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS	: QP_TEST_RESULT_FAIL,
    849 							isOk ? "Pass"				: "Image comparison failed");
    850 
    851 	return STOP;
    852 }
    853 
    854 // CompressedCubeFormatCase
    855 
    856 class CompressedCubeFormatCase : public tcu::TestCase
    857 {
    858 public:
    859 										CompressedCubeFormatCase	(tcu::TestContext&			testCtx,
    860 																	 glu::RenderContext&		renderCtx,
    861 																	 const glu::ContextInfo&	renderCtxInfo,
    862 																	 const char*				name,
    863 																	 const char*				description,
    864 																	 tcu::CompressedTexFormat	format,
    865 																	 deUint32					randomSeed,
    866 																	 int						width,
    867 																	 int						height);
    868 
    869 										~CompressedCubeFormatCase	(void);
    870 
    871 	void								init						(void);
    872 	void								deinit						(void);
    873 	IterateResult						iterate						(void);
    874 
    875 private:
    876 										CompressedCubeFormatCase	(const CompressedCubeFormatCase& other);
    877 	CompressedCubeFormatCase&			operator=					(const CompressedCubeFormatCase& other);
    878 
    879 	bool								testFace					(tcu::CubeFace face);
    880 
    881 	glu::RenderContext&					m_renderCtx;
    882 	const glu::ContextInfo&				m_renderCtxInfo;
    883 
    884 	tcu::CompressedTexFormat			m_format;
    885 
    886 	deUint32							m_randomSeed;
    887 	int									m_width;
    888 	int									m_height;
    889 
    890 	glu::TextureCube*					m_texture;
    891 	TextureTestUtil::TextureRenderer	m_renderer;
    892 
    893 	int									m_curFace;
    894 	bool								m_isOk;
    895 };
    896 
    897 CompressedCubeFormatCase::CompressedCubeFormatCase (tcu::TestContext&			testCtx,
    898 													glu::RenderContext&			renderCtx,
    899 													const glu::ContextInfo&		renderCtxInfo,
    900 													const char*					name,
    901 													const char*					description,
    902 													tcu::CompressedTexFormat	format,
    903 													deUint32					randomSeed,
    904 													int							width,
    905 													int							height)
    906 	: TestCase			(testCtx, name, description)
    907 	, m_renderCtx		(renderCtx)
    908 	, m_renderCtxInfo	(renderCtxInfo)
    909 	, m_format			(format)
    910 	, m_randomSeed		(randomSeed)
    911 	, m_width			(width)
    912 	, m_height			(height)
    913 	, m_texture			(DE_NULL)
    914 	, m_renderer		(renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP)
    915 	, m_curFace			(0)
    916 	, m_isOk			(false)
    917 {
    918 }
    919 
    920 CompressedCubeFormatCase::~CompressedCubeFormatCase (void)
    921 {
    922 	deinit();
    923 }
    924 
    925 void CompressedCubeFormatCase::init (void)
    926 {
    927 	vector<tcu::CompressedTexture>	levels	(tcu::CUBEFACE_LAST);
    928 	de::Random						rnd		(m_randomSeed);
    929 
    930 	for (int face = 0; face < tcu::CUBEFACE_LAST; face++)
    931 	{
    932 		levels[face].setStorage(m_format, m_width, m_height);
    933 
    934 		int			dataSize	= levels[face].getDataSize();
    935 		deUint8*	data		= (deUint8*)levels[face].getData();
    936 
    937 		for (int i = 0; i < dataSize; i++)
    938 			data[i] = rnd.getUint32() & 0xff;
    939 	}
    940 
    941 	m_texture = new glu::TextureCube(m_renderCtx, m_renderCtxInfo, 1, &levels[0]);
    942 
    943 	m_curFace	= 0;
    944 	m_isOk		= true;
    945 }
    946 
    947 void CompressedCubeFormatCase::deinit (void)
    948 {
    949 	delete m_texture;
    950 	m_texture = DE_NULL;
    951 
    952 	m_renderer.clear();
    953 }
    954 
    955 bool CompressedCubeFormatCase::testFace (tcu::CubeFace face)
    956 {
    957 	const glw::Functions&	gl					= m_renderCtx.getFunctions();
    958 	TestLog&				log					= m_testCtx.getLog();
    959 	RandomViewport			viewport			(m_renderCtx.getRenderTarget(), m_texture->getRefTexture().getSize(), m_texture->getRefTexture().getSize(), deStringHash(getName())+(deUint32)face);
    960 	tcu::Surface			renderedFrame		(viewport.width, viewport.height);
    961 	tcu::Surface			referenceFrame		(viewport.width, viewport.height);
    962 	tcu::RGBA				threshold			= m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1);
    963 	vector<float>			texCoord;
    964 	ReferenceParams			renderParams		(TEXTURETYPE_CUBE);
    965 	tcu::TextureFormatInfo	spec				= tcu::getTextureFormatInfo(m_texture->getRefTexture().getFormat());
    966 
    967 	renderParams.samplerType				= getSamplerType(m_texture->getRefTexture().getFormat());
    968 	renderParams.sampler					= Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST, Sampler::NEAREST);
    969 	renderParams.sampler.seamlessCubeMap	= true;
    970 	renderParams.colorScale					= spec.lookupScale;
    971 	renderParams.colorBias					= spec.lookupBias;
    972 
    973 	computeQuadTexCoordCube(texCoord, face);
    974 
    975 	log << TestLog::Message << face << TestLog::EndMessage;
    976 
    977 	// Setup base viewport.
    978 	gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
    979 
    980 	// Bind to unit 0.
    981 	gl.activeTexture(GL_TEXTURE0);
    982 	gl.bindTexture(GL_TEXTURE_CUBE_MAP, m_texture->getGLTexture());
    983 
    984 	// Setup nearest neighbor filtering and clamp-to-edge.
    985 	gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    986 	gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    987 	gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    988 	gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    989 
    990 	GLU_EXPECT_NO_ERROR(gl.getError(), "Set texturing state");
    991 
    992 	m_renderer.renderQuad(0, &texCoord[0], renderParams);
    993 	glu::readPixels(m_renderCtx, viewport.x, viewport.y, renderedFrame.getAccess());
    994 
    995 	// Compute reference.
    996 	sampleTexture(SurfaceAccess(referenceFrame, m_renderCtx.getRenderTarget().getPixelFormat()), m_texture->getRefTexture(), &texCoord[0], renderParams);
    997 
    998 	// Compare and log.
    999 	return compareImages(log, referenceFrame, renderedFrame, threshold);
   1000 }
   1001 
   1002 CompressedCubeFormatCase::IterateResult CompressedCubeFormatCase::iterate (void)
   1003 {
   1004 	// Execute test for all faces.
   1005 	if (!testFace((tcu::CubeFace)m_curFace))
   1006 		m_isOk = false;
   1007 
   1008 	m_curFace += 1;
   1009 
   1010 	if (m_curFace == tcu::CUBEFACE_LAST)
   1011 	{
   1012 		m_testCtx.setTestResult(m_isOk ? QP_TEST_RESULT_PASS	: QP_TEST_RESULT_FAIL,
   1013 								m_isOk ? "Pass"					: "Image comparison failed");
   1014 		return STOP;
   1015 	}
   1016 	else
   1017 		return CONTINUE;
   1018 }
   1019 
   1020 // Texture2DFileCase
   1021 
   1022 class Texture2DFileCase : public tcu::TestCase
   1023 {
   1024 public:
   1025 								Texture2DFileCase		(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const glu::ContextInfo& renderCtxInfo, const char* name, const char* description, const std::vector<std::string>& filenames);
   1026 								~Texture2DFileCase		(void);
   1027 
   1028 	void						init					(void);
   1029 	void						deinit					(void);
   1030 	IterateResult				iterate					(void);
   1031 
   1032 private:
   1033 								Texture2DFileCase		(const Texture2DFileCase& other);
   1034 	Texture2DFileCase&			operator=				(const Texture2DFileCase& other);
   1035 
   1036 	glu::RenderContext&			m_renderCtx;
   1037 	const glu::ContextInfo&		m_renderCtxInfo;
   1038 
   1039 	std::vector<std::string>	m_filenames;
   1040 
   1041 	glu::Texture2D*				m_texture;
   1042 	TextureRenderer				m_renderer;
   1043 };
   1044 
   1045 Texture2DFileCase::Texture2DFileCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const glu::ContextInfo& renderCtxInfo, const char* name, const char* description, const std::vector<std::string>& filenames)
   1046 	: TestCase			(testCtx, name, description)
   1047 	, m_renderCtx		(renderCtx)
   1048 	, m_renderCtxInfo	(renderCtxInfo)
   1049 	, m_filenames		(filenames)
   1050 	, m_texture			(DE_NULL)
   1051 	, m_renderer		(renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP)
   1052 {
   1053 }
   1054 
   1055 Texture2DFileCase::~Texture2DFileCase (void)
   1056 {
   1057 	deinit();
   1058 }
   1059 
   1060 void Texture2DFileCase::init (void)
   1061 {
   1062 	// Create texture.
   1063 	m_texture = glu::Texture2D::create(m_renderCtx, m_renderCtxInfo, m_testCtx.getArchive(), (int)m_filenames.size(), m_filenames);
   1064 }
   1065 
   1066 void Texture2DFileCase::deinit (void)
   1067 {
   1068 	delete m_texture;
   1069 	m_texture = DE_NULL;
   1070 
   1071 	m_renderer.clear();
   1072 }
   1073 
   1074 Texture2DFileCase::IterateResult Texture2DFileCase::iterate (void)
   1075 {
   1076 	const glw::Functions&	gl					= m_renderCtx.getFunctions();
   1077 	TestLog&				log					= m_testCtx.getLog();
   1078 	RandomViewport			viewport			(m_renderCtx.getRenderTarget(), m_texture->getRefTexture().getWidth(), m_texture->getRefTexture().getHeight(), deStringHash(getName()));
   1079 	tcu::Surface			renderedFrame		(viewport.width, viewport.height);
   1080 	tcu::Surface			referenceFrame		(viewport.width, viewport.height);
   1081 	tcu::RGBA				threshold			= m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1);
   1082 	vector<float>			texCoord;
   1083 
   1084 	computeQuadTexCoord2D(texCoord, tcu::Vec2(0.0f, 0.0f), tcu::Vec2(1.0f, 1.0f));
   1085 
   1086 	// Setup base viewport.
   1087 	gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
   1088 
   1089 	// Bind to unit 0.
   1090 	gl.activeTexture(GL_TEXTURE0);
   1091 	gl.bindTexture(GL_TEXTURE_2D, m_texture->getGLTexture());
   1092 
   1093 	// Setup nearest neighbor filtering and clamp-to-edge.
   1094 	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,		GL_CLAMP_TO_EDGE);
   1095 	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,		GL_CLAMP_TO_EDGE);
   1096 	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,	GL_NEAREST);
   1097 	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,	GL_NEAREST);
   1098 
   1099 	GLU_EXPECT_NO_ERROR(gl.getError(), "Set texturing state");
   1100 
   1101 	// Draw.
   1102 	m_renderer.renderQuad(0, &texCoord[0], TEXTURETYPE_2D);
   1103 	glu::readPixels(m_renderCtx, viewport.x, viewport.y, renderedFrame.getAccess());
   1104 	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels()");
   1105 
   1106 	// Compute reference.
   1107 	ReferenceParams refParams(TEXTURETYPE_2D);
   1108 	refParams.sampler = Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST, Sampler::NEAREST);
   1109 	sampleTexture(SurfaceAccess(referenceFrame, m_renderCtx.getRenderTarget().getPixelFormat()), m_texture->getRefTexture(), &texCoord[0], refParams);
   1110 
   1111 	// Compare and log.
   1112 	bool isOk = compareImages(log, referenceFrame, renderedFrame, threshold);
   1113 
   1114 	m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS	: QP_TEST_RESULT_FAIL,
   1115 							isOk ? "Pass"				: "Image comparison failed");
   1116 
   1117 	return STOP;
   1118 }
   1119 
   1120 // TextureCubeFileCase
   1121 
   1122 class TextureCubeFileCase : public tcu::TestCase
   1123 {
   1124 public:
   1125 								TextureCubeFileCase		(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const glu::ContextInfo& renderCtxInfo, const char* name, const char* description, const std::vector<std::string>& filenames);
   1126 								~TextureCubeFileCase	(void);
   1127 
   1128 	void						init					(void);
   1129 	void						deinit					(void);
   1130 	IterateResult				iterate					(void);
   1131 
   1132 private:
   1133 								TextureCubeFileCase		(const TextureCubeFileCase& other);
   1134 	TextureCubeFileCase&		operator=				(const TextureCubeFileCase& other);
   1135 
   1136 	bool						testFace				(tcu::CubeFace face);
   1137 
   1138 	glu::RenderContext&			m_renderCtx;
   1139 	const glu::ContextInfo&		m_renderCtxInfo;
   1140 
   1141 	std::vector<std::string>	m_filenames;
   1142 
   1143 	glu::TextureCube*			m_texture;
   1144 	TextureRenderer				m_renderer;
   1145 
   1146 	int							m_curFace;
   1147 	bool						m_isOk;
   1148 };
   1149 
   1150 TextureCubeFileCase::TextureCubeFileCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const glu::ContextInfo& renderCtxInfo, const char* name, const char* description, const std::vector<std::string>& filenames)
   1151 	: TestCase			(testCtx, name, description)
   1152 	, m_renderCtx		(renderCtx)
   1153 	, m_renderCtxInfo	(renderCtxInfo)
   1154 	, m_filenames		(filenames)
   1155 	, m_texture			(DE_NULL)
   1156 	, m_renderer		(renderCtx, testCtx.getLog(), glu::GLSL_VERSION_300_ES, glu::PRECISION_HIGHP)
   1157 	, m_curFace			(0)
   1158 	, m_isOk			(false)
   1159 {
   1160 }
   1161 
   1162 TextureCubeFileCase::~TextureCubeFileCase (void)
   1163 {
   1164 	deinit();
   1165 }
   1166 
   1167 void TextureCubeFileCase::init (void)
   1168 {
   1169 	// Create texture.
   1170 	DE_ASSERT(m_filenames.size() % 6 == 0);
   1171 	m_texture = glu::TextureCube::create(m_renderCtx, m_renderCtxInfo, m_testCtx.getArchive(), (int)m_filenames.size()/6, m_filenames);
   1172 
   1173 	m_curFace	= 0;
   1174 	m_isOk		= true;
   1175 }
   1176 
   1177 void TextureCubeFileCase::deinit (void)
   1178 {
   1179 	delete m_texture;
   1180 	m_texture = DE_NULL;
   1181 
   1182 	m_renderer.clear();
   1183 }
   1184 
   1185 bool TextureCubeFileCase::testFace (tcu::CubeFace face)
   1186 {
   1187 	const glw::Functions&	gl					= m_renderCtx.getFunctions();
   1188 	TestLog&				log					= m_testCtx.getLog();
   1189 	RandomViewport			viewport			(m_renderCtx.getRenderTarget(), m_texture->getRefTexture().getSize(), m_texture->getRefTexture().getSize(), deStringHash(getName())+(deUint32)face);
   1190 	tcu::Surface			renderedFrame		(viewport.width, viewport.height);
   1191 	tcu::Surface			referenceFrame		(viewport.width, viewport.height);
   1192 	Sampler					sampler				(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST, Sampler::NEAREST);
   1193 	tcu::RGBA				threshold			= m_renderCtx.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1);
   1194 	vector<float>			texCoord;
   1195 
   1196 	computeQuadTexCoordCube(texCoord, face);
   1197 
   1198 	// \todo [2011-10-28 pyry] Image set name / section?
   1199 	log << TestLog::Message << face << TestLog::EndMessage;
   1200 
   1201 	// Setup base viewport.
   1202 	gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
   1203 
   1204 	// Bind to unit 0.
   1205 	gl.activeTexture(GL_TEXTURE0);
   1206 	gl.bindTexture(GL_TEXTURE_CUBE_MAP, m_texture->getGLTexture());
   1207 
   1208 	// Setup nearest neighbor filtering and clamp-to-edge.
   1209 	gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
   1210 	gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
   1211 	gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
   1212 	gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
   1213 
   1214 	GLU_EXPECT_NO_ERROR(gl.getError(), "Set texturing state");
   1215 
   1216 	m_renderer.renderQuad(0, &texCoord[0], TEXTURETYPE_CUBE);
   1217 	glu::readPixels(m_renderCtx, viewport.x, viewport.y, renderedFrame.getAccess());
   1218 	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels()");
   1219 
   1220 	// Compute reference.
   1221 	sampleTexture(SurfaceAccess(referenceFrame, m_renderCtx.getRenderTarget().getPixelFormat()), m_texture->getRefTexture(), &texCoord[0], ReferenceParams(TEXTURETYPE_CUBE, sampler));
   1222 
   1223 	// Compare and log.
   1224 	return compareImages(log, referenceFrame, renderedFrame, threshold);
   1225 }
   1226 
   1227 TextureCubeFileCase::IterateResult TextureCubeFileCase::iterate (void)
   1228 {
   1229 	// Execute test for all faces.
   1230 	if (!testFace((tcu::CubeFace)m_curFace))
   1231 		m_isOk = false;
   1232 
   1233 	m_curFace += 1;
   1234 
   1235 	if (m_curFace == tcu::CUBEFACE_LAST)
   1236 	{
   1237 		m_testCtx.setTestResult(m_isOk ? QP_TEST_RESULT_PASS	: QP_TEST_RESULT_FAIL,
   1238 								m_isOk ? "Pass"					: "Image comparison failed");
   1239 		return STOP;
   1240 	}
   1241 	else
   1242 		return CONTINUE;
   1243 }
   1244 
   1245 // TextureFormatTests
   1246 
   1247 TextureFormatTests::TextureFormatTests (Context& context)
   1248 	: TestCaseGroup(context, "format", "Texture Format Tests")
   1249 {
   1250 }
   1251 
   1252 TextureFormatTests::~TextureFormatTests (void)
   1253 {
   1254 }
   1255 
   1256 vector<string> toStringVector (const char* const* str, int numStr)
   1257 {
   1258 	vector<string> v;
   1259 	v.resize(numStr);
   1260 	for (int i = 0; i < numStr; i++)
   1261 		v[i] = str[i];
   1262 	return v;
   1263 }
   1264 
   1265 void TextureFormatTests::init (void)
   1266 {
   1267 	tcu::TestCaseGroup* unsizedGroup	= DE_NULL;
   1268 	tcu::TestCaseGroup*	sizedGroup		= DE_NULL;
   1269 	tcu::TestCaseGroup* compressedGroup	= DE_NULL;
   1270 	addChild((unsizedGroup		= new tcu::TestCaseGroup(m_testCtx, "unsized",		"Unsized formats")));
   1271 	addChild((sizedGroup		= new tcu::TestCaseGroup(m_testCtx, "sized",		"Sized formats")));
   1272 	addChild((compressedGroup	= new tcu::TestCaseGroup(m_testCtx, "compressed",	"Compressed formats")));
   1273 
   1274 	tcu::TestCaseGroup*	sized2DGroup		= DE_NULL;
   1275 	tcu::TestCaseGroup*	sizedCubeGroup		= DE_NULL;
   1276 	tcu::TestCaseGroup*	sized2DArrayGroup	= DE_NULL;
   1277 	tcu::TestCaseGroup*	sized3DGroup		= DE_NULL;
   1278 	sizedGroup->addChild((sized2DGroup			= new tcu::TestCaseGroup(m_testCtx, "2d",			"Sized formats (2D)")));
   1279 	sizedGroup->addChild((sizedCubeGroup		= new tcu::TestCaseGroup(m_testCtx, "cube",			"Sized formats (Cubemap)")));
   1280 	sizedGroup->addChild((sized2DArrayGroup		= new tcu::TestCaseGroup(m_testCtx, "2d_array",		"Sized formats (2D Array)")));
   1281 	sizedGroup->addChild((sized3DGroup			= new tcu::TestCaseGroup(m_testCtx, "3d",			"Sized formats (3D)")));
   1282 
   1283 	struct
   1284 	{
   1285 		const char*	name;
   1286 		deUint32		format;
   1287 		deUint32		dataType;
   1288 	} texFormats[] =
   1289 	{
   1290 		{ "alpha",							GL_ALPHA,			GL_UNSIGNED_BYTE },
   1291 		{ "luminance",						GL_LUMINANCE,		GL_UNSIGNED_BYTE },
   1292 		{ "luminance_alpha",				GL_LUMINANCE_ALPHA,	GL_UNSIGNED_BYTE },
   1293 		{ "rgb_unsigned_short_5_6_5",		GL_RGB,				GL_UNSIGNED_SHORT_5_6_5 },
   1294 		{ "rgb_unsigned_byte",				GL_RGB,				GL_UNSIGNED_BYTE },
   1295 		{ "rgba_unsigned_short_4_4_4_4",	GL_RGBA,			GL_UNSIGNED_SHORT_4_4_4_4 },
   1296 		{ "rgba_unsigned_short_5_5_5_1",	GL_RGBA,			GL_UNSIGNED_SHORT_5_5_5_1 },
   1297 		{ "rgba_unsigned_byte",				GL_RGBA,			GL_UNSIGNED_BYTE }
   1298 	};
   1299 
   1300 	for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(texFormats); formatNdx++)
   1301 	{
   1302 		deUint32	format			= texFormats[formatNdx].format;
   1303 		deUint32	dataType		= texFormats[formatNdx].dataType;
   1304 		string	nameBase		= texFormats[formatNdx].name;
   1305 		string	descriptionBase	= string(glu::getTextureFormatName(format)) + ", " + glu::getTypeName(dataType);
   1306 
   1307 		unsizedGroup->addChild(new Texture2DFormatCase			(m_testCtx, m_context.getRenderContext(),	(nameBase + "_2d_pot").c_str(),			(descriptionBase + ", GL_TEXTURE_2D").c_str(),			format, dataType, 128, 128));
   1308 		unsizedGroup->addChild(new Texture2DFormatCase			(m_testCtx, m_context.getRenderContext(),	(nameBase + "_2d_npot").c_str(),		(descriptionBase + ", GL_TEXTURE_2D").c_str(),			format, dataType,  63, 112));
   1309 		unsizedGroup->addChild(new TextureCubeFormatCase		(m_testCtx, m_context.getRenderContext(),	(nameBase + "_cube_pot").c_str(),		(descriptionBase + ", GL_TEXTURE_CUBE_MAP").c_str(),	format, dataType,  64,  64));
   1310 		unsizedGroup->addChild(new TextureCubeFormatCase		(m_testCtx, m_context.getRenderContext(),	(nameBase + "_cube_npot").c_str(),		(descriptionBase + ", GL_TEXTURE_CUBE_MAP").c_str(),	format, dataType,  57,  57));
   1311 		unsizedGroup->addChild(new Texture2DArrayFormatCase		(m_testCtx, m_context.getRenderContext(),	(nameBase + "_2d_array_pot").c_str(),	(descriptionBase + ", GL_TEXTURE_2D_ARRAY").c_str(),	format, dataType,  64,  64,  8));
   1312 		unsizedGroup->addChild(new Texture2DArrayFormatCase		(m_testCtx, m_context.getRenderContext(),	(nameBase + "_2d_array_npot").c_str(),	(descriptionBase + ", GL_TEXTURE_2D_ARRAY").c_str(),	format, dataType,  63,  57,  7));
   1313 		unsizedGroup->addChild(new Texture3DFormatCase			(m_testCtx, m_context.getRenderContext(),	(nameBase + "_3d_pot").c_str(),			(descriptionBase + ", GL_TEXTURE_3D").c_str(),			format, dataType,   8,  32, 16));
   1314 		unsizedGroup->addChild(new Texture3DFormatCase			(m_testCtx, m_context.getRenderContext(),	(nameBase + "_3d_npot").c_str(),		(descriptionBase + ", GL_TEXTURE_3D").c_str(),			format, dataType,  11,  31,  7));
   1315 	}
   1316 
   1317 	struct
   1318 	{
   1319 		const char*	name;
   1320 		deUint32		internalFormat;
   1321 	} sizedColorFormats[] =
   1322 	{
   1323 		{ "rgba32f",			GL_RGBA32F,			},
   1324 		{ "rgba32i",			GL_RGBA32I,			},
   1325 		{ "rgba32ui",			GL_RGBA32UI,		},
   1326 		{ "rgba16f",			GL_RGBA16F,			},
   1327 		{ "rgba16i",			GL_RGBA16I,			},
   1328 		{ "rgba16ui",			GL_RGBA16UI,		},
   1329 		{ "rgba8",				GL_RGBA8,			},
   1330 		{ "rgba8i",				GL_RGBA8I,			},
   1331 		{ "rgba8ui",			GL_RGBA8UI,			},
   1332 		{ "srgb8_alpha8",		GL_SRGB8_ALPHA8,	},
   1333 		{ "rgb10_a2",			GL_RGB10_A2,		},
   1334 		{ "rgb10_a2ui",			GL_RGB10_A2UI,		},
   1335 		{ "rgba4",				GL_RGBA4,			},
   1336 		{ "rgb5_a1",			GL_RGB5_A1,			},
   1337 		{ "rgba8_snorm",		GL_RGBA8_SNORM,		},
   1338 		{ "rgb8",				GL_RGB8,			},
   1339 		{ "rgb565",				GL_RGB565,			},
   1340 		{ "r11f_g11f_b10f",		GL_R11F_G11F_B10F,	},
   1341 		{ "rgb32f",				GL_RGB32F,			},
   1342 		{ "rgb32i",				GL_RGB32I,			},
   1343 		{ "rgb32ui",			GL_RGB32UI,			},
   1344 		{ "rgb16f",				GL_RGB16F,			},
   1345 		{ "rgb16i",				GL_RGB16I,			},
   1346 		{ "rgb16ui",			GL_RGB16UI,			},
   1347 		{ "rgb8_snorm",			GL_RGB8_SNORM,		},
   1348 		{ "rgb8i",				GL_RGB8I,			},
   1349 		{ "rgb8ui",				GL_RGB8UI,			},
   1350 		{ "srgb8",				GL_SRGB8,			},
   1351 		{ "rgb9_e5",			GL_RGB9_E5,			},
   1352 		{ "rg32f",				GL_RG32F,			},
   1353 		{ "rg32i",				GL_RG32I,			},
   1354 		{ "rg32ui",				GL_RG32UI,			},
   1355 		{ "rg16f",				GL_RG16F,			},
   1356 		{ "rg16i",				GL_RG16I,			},
   1357 		{ "rg16ui",				GL_RG16UI,			},
   1358 		{ "rg8",				GL_RG8,				},
   1359 		{ "rg8i",				GL_RG8I,			},
   1360 		{ "rg8ui",				GL_RG8UI,			},
   1361 		{ "rg8_snorm",			GL_RG8_SNORM,		},
   1362 		{ "r32f",				GL_R32F,			},
   1363 		{ "r32i",				GL_R32I,			},
   1364 		{ "r32ui",				GL_R32UI,			},
   1365 		{ "r16f",				GL_R16F,			},
   1366 		{ "r16i",				GL_R16I,			},
   1367 		{ "r16ui",				GL_R16UI,			},
   1368 		{ "r8",					GL_R8,				},
   1369 		{ "r8i",				GL_R8I,				},
   1370 		{ "r8ui",				GL_R8UI,			},
   1371 		{ "r8_snorm",			GL_R8_SNORM,		}
   1372 	};
   1373 
   1374 	struct
   1375 	{
   1376 		const char*	name;
   1377 		deUint32		internalFormat;
   1378 	} sizedDepthStencilFormats[] =
   1379 	{
   1380 		// Depth and stencil formats
   1381 		{ "depth_component32f",	GL_DEPTH_COMPONENT32F	},
   1382 		{ "depth_component24",	GL_DEPTH_COMPONENT24	},
   1383 		{ "depth_component16",	GL_DEPTH_COMPONENT16	},
   1384 		{ "depth32f_stencil8",	GL_DEPTH32F_STENCIL8	},
   1385 		{ "depth24_stencil8",	GL_DEPTH24_STENCIL8		}
   1386 	};
   1387 
   1388 	for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(sizedColorFormats); formatNdx++)
   1389 	{
   1390 		deUint32	internalFormat	= sizedColorFormats[formatNdx].internalFormat;
   1391 		string	nameBase		= sizedColorFormats[formatNdx].name;
   1392 		string	descriptionBase	= glu::getTextureFormatName(internalFormat);
   1393 
   1394 		sized2DGroup->addChild		(new Texture2DFormatCase		(m_testCtx, m_context.getRenderContext(),	(nameBase + "_pot").c_str(),	(descriptionBase + ", GL_TEXTURE_2D").c_str(),			internalFormat, 128, 128));
   1395 		sized2DGroup->addChild		(new Texture2DFormatCase		(m_testCtx, m_context.getRenderContext(),	(nameBase + "_npot").c_str(),	(descriptionBase + ", GL_TEXTURE_2D").c_str(),			internalFormat,  63, 112));
   1396 		sizedCubeGroup->addChild	(new TextureCubeFormatCase		(m_testCtx, m_context.getRenderContext(),	(nameBase + "_pot").c_str(),	(descriptionBase + ", GL_TEXTURE_CUBE_MAP").c_str(),	internalFormat,  64,  64));
   1397 		sizedCubeGroup->addChild	(new TextureCubeFormatCase		(m_testCtx, m_context.getRenderContext(),	(nameBase + "_npot").c_str(),	(descriptionBase + ", GL_TEXTURE_CUBE_MAP").c_str(),	internalFormat,  57,  57));
   1398 		sized2DArrayGroup->addChild	(new Texture2DArrayFormatCase	(m_testCtx, m_context.getRenderContext(),	(nameBase + "_pot").c_str(),	(descriptionBase + ", GL_TEXTURE_2D_ARRAY").c_str(),	internalFormat,  64,  64,  8));
   1399 		sized2DArrayGroup->addChild	(new Texture2DArrayFormatCase	(m_testCtx, m_context.getRenderContext(),	(nameBase + "_npot").c_str(),	(descriptionBase + ", GL_TEXTURE_2D_ARRAY").c_str(),	internalFormat,  63,  57,  7));
   1400 		sized3DGroup->addChild		(new Texture3DFormatCase		(m_testCtx, m_context.getRenderContext(),	(nameBase + "_pot").c_str(),	(descriptionBase + ", GL_TEXTURE_3D").c_str(),			internalFormat,   8,  32, 16));
   1401 		sized3DGroup->addChild		(new Texture3DFormatCase		(m_testCtx, m_context.getRenderContext(),	(nameBase + "_npot").c_str(),	(descriptionBase + ", GL_TEXTURE_3D").c_str(),			internalFormat,  11,  31,  7));
   1402 	}
   1403 
   1404 	for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(sizedDepthStencilFormats); formatNdx++)
   1405 	{
   1406 		deUint32	internalFormat	= sizedDepthStencilFormats[formatNdx].internalFormat;
   1407 		string	nameBase		= sizedDepthStencilFormats[formatNdx].name;
   1408 		string	descriptionBase	= glu::getTextureFormatName(internalFormat);
   1409 
   1410 		sized2DGroup->addChild		(new Texture2DFormatCase		(m_testCtx, m_context.getRenderContext(),	(nameBase + "_pot").c_str(),	(descriptionBase + ", GL_TEXTURE_2D").c_str(),			internalFormat, 128, 128));
   1411 		sized2DGroup->addChild		(new Texture2DFormatCase		(m_testCtx, m_context.getRenderContext(),	(nameBase + "_npot").c_str(),	(descriptionBase + ", GL_TEXTURE_2D").c_str(),			internalFormat,  63, 112));
   1412 		sizedCubeGroup->addChild	(new TextureCubeFormatCase		(m_testCtx, m_context.getRenderContext(),	(nameBase + "_pot").c_str(),	(descriptionBase + ", GL_TEXTURE_CUBE_MAP").c_str(),	internalFormat,  64,  64));
   1413 		sizedCubeGroup->addChild	(new TextureCubeFormatCase		(m_testCtx, m_context.getRenderContext(),	(nameBase + "_npot").c_str(),	(descriptionBase + ", GL_TEXTURE_CUBE_MAP").c_str(),	internalFormat,  57,  57));
   1414 		sized2DArrayGroup->addChild	(new Texture2DArrayFormatCase	(m_testCtx, m_context.getRenderContext(),	(nameBase + "_pot").c_str(),	(descriptionBase + ", GL_TEXTURE_2D_ARRAY").c_str(),	internalFormat,  64,  64,  8));
   1415 		sized2DArrayGroup->addChild	(new Texture2DArrayFormatCase	(m_testCtx, m_context.getRenderContext(),	(nameBase + "_npot").c_str(),	(descriptionBase + ", GL_TEXTURE_2D_ARRAY").c_str(),	internalFormat,  63,  57,  7));
   1416 	}
   1417 
   1418 	// ETC-1 compressed formats.
   1419 	{
   1420 		static const char* filenames[] =
   1421 		{
   1422 			"data/etc1/photo_helsinki_mip_0.pkm",
   1423 			"data/etc1/photo_helsinki_mip_1.pkm",
   1424 			"data/etc1/photo_helsinki_mip_2.pkm",
   1425 			"data/etc1/photo_helsinki_mip_3.pkm",
   1426 			"data/etc1/photo_helsinki_mip_4.pkm",
   1427 			"data/etc1/photo_helsinki_mip_5.pkm",
   1428 			"data/etc1/photo_helsinki_mip_6.pkm",
   1429 			"data/etc1/photo_helsinki_mip_7.pkm"
   1430 		};
   1431 		compressedGroup->addChild(new Texture2DFileCase(m_testCtx, m_context.getRenderContext(), m_context.getContextInfo(), "etc1_2d_pot", "GL_ETC1_RGB8_OES, GL_TEXTURE_2D", toStringVector(filenames, DE_LENGTH_OF_ARRAY(filenames))));
   1432 	}
   1433 
   1434 	{
   1435 		vector<string> filenames;
   1436 		filenames.push_back("data/etc1/photo_helsinki_113x89.pkm");
   1437 		compressedGroup->addChild(new Texture2DFileCase(m_testCtx, m_context.getRenderContext(), m_context.getContextInfo(), "etc1_2d_npot", "GL_ETC1_RGB8_OES, GL_TEXTURE_2D", filenames));
   1438 	}
   1439 
   1440 	{
   1441 		static const char* faceExt[] = { "neg_x", "pos_x", "neg_y", "pos_y", "neg_z", "pos_z" };
   1442 
   1443 		const int		potNumLevels	= 7;
   1444 		vector<string>	potFilenames;
   1445 		for (int level = 0; level < potNumLevels; level++)
   1446 			for (int face = 0; face < tcu::CUBEFACE_LAST; face++)
   1447 				potFilenames.push_back(string("data/etc1/skybox_") + faceExt[face] + "_mip_" + de::toString(level) + ".pkm");
   1448 
   1449 		compressedGroup->addChild(new TextureCubeFileCase(m_testCtx, m_context.getRenderContext(), m_context.getContextInfo(), "etc1_cube_pot", "GL_ETC1_RGB8_OES, GL_TEXTURE_CUBE_MAP", potFilenames));
   1450 
   1451 		vector<string> npotFilenames;
   1452 		for (int face = 0; face < tcu::CUBEFACE_LAST; face++)
   1453 			npotFilenames.push_back(string("data/etc1/skybox_61x61_") + faceExt[face] + ".pkm");
   1454 
   1455 		compressedGroup->addChild(new TextureCubeFileCase(m_testCtx, m_context.getRenderContext(), m_context.getContextInfo(), "etc1_cube_npot", "GL_ETC_RGB8_OES, GL_TEXTURE_CUBE_MAP", npotFilenames));
   1456 	}
   1457 
   1458 	// ETC-2 and EAC compressed formats.
   1459 	struct {
   1460 		const char*					descriptionBase;
   1461 		const char*					nameBase;
   1462 		tcu::CompressedTexFormat	format;
   1463 	} etc2Formats[] =
   1464 	{
   1465 		{ "GL_COMPRESSED_R11_EAC",							"eac_r11",							tcu::COMPRESSEDTEXFORMAT_EAC_R11,							},
   1466 		{ "GL_COMPRESSED_SIGNED_R11_EAC",					"eac_signed_r11",					tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_R11,					},
   1467 		{ "GL_COMPRESSED_RG11_EAC",							"eac_rg11",							tcu::COMPRESSEDTEXFORMAT_EAC_RG11,							},
   1468 		{ "GL_COMPRESSED_SIGNED_RG11_EAC",					"eac_signed_rg11",					tcu::COMPRESSEDTEXFORMAT_EAC_SIGNED_RG11,					},
   1469 		{ "GL_COMPRESSED_RGB8_ETC2",						"etc2_rgb8",						tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8,							},
   1470 		{ "GL_COMPRESSED_SRGB8_ETC2",						"etc2_srgb8",						tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8,						},
   1471 		{ "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2",	"etc2_rgb8_punchthrough_alpha1",	tcu::COMPRESSEDTEXFORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1,		},
   1472 		{ "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2",	"etc2_srgb8_punchthrough_alpha1",	tcu::COMPRESSEDTEXFORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1,	},
   1473 		{ "GL_COMPRESSED_RGBA8_ETC2_EAC",					"etc2_eac_rgba8",					tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_RGBA8,					},
   1474 		{ "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC",			"etc2_eac_srgb8_alpha8",			tcu::COMPRESSEDTEXFORMAT_ETC2_EAC_SRGB8_ALPHA8,				}
   1475 	};
   1476 
   1477 	for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(etc2Formats); formatNdx++)
   1478 	{
   1479 		string descriptionBase	= etc2Formats[formatNdx].descriptionBase;
   1480 		string nameBase			= etc2Formats[formatNdx].nameBase;
   1481 
   1482 		compressedGroup->addChild(new Compressed2DFormatCase	(m_testCtx, m_context.getRenderContext(), m_context.getContextInfo(), (nameBase + "_2d_pot").c_str(),		(descriptionBase + ", GL_TEXTURE_2D").c_str(),			etc2Formats[formatNdx].format,	1,	128,	64));
   1483 		compressedGroup->addChild(new CompressedCubeFormatCase	(m_testCtx, m_context.getRenderContext(), m_context.getContextInfo(), (nameBase + "_cube_pot").c_str(),		(descriptionBase + ", GL_TEXTURE_CUBE_MAP").c_str(),	etc2Formats[formatNdx].format,	1,	64,		64));
   1484 		compressedGroup->addChild(new Compressed2DFormatCase	(m_testCtx, m_context.getRenderContext(), m_context.getContextInfo(), (nameBase + "_2d_npot").c_str(),		(descriptionBase + ", GL_TEXTURE_2D").c_str(),			etc2Formats[formatNdx].format,	1,	51,		65));
   1485 		compressedGroup->addChild(new CompressedCubeFormatCase	(m_testCtx, m_context.getRenderContext(), m_context.getContextInfo(), (nameBase + "_cube_npot").c_str(),	(descriptionBase + ", GL_TEXTURE_CUBE_MAP").c_str(),	etc2Formats[formatNdx].format,	1,	51,		51));
   1486 	}
   1487 
   1488 
   1489 }
   1490 
   1491 } // Functional
   1492 } // gles3
   1493 } // deqp
   1494