/*-------------------------------------------------------------------------
 * OpenGL Conformance Test Suite
 * -----------------------------
 *
 * Copyright (c) 2015-2016 The Khronos Group Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */ /*!
 * \file
 * \brief
 */ /*-------------------------------------------------------------------*/

/**
 * \file  gl3cTextureSizePromotionTests.hpp
 * \brief Implements test classes for testing of texture internal format
 promotion mechanism.
 */ /*-------------------------------------------------------------------*/

#include "gl3cTextureSizePromotion.hpp"

#include "deMath.h"
#include "gluContextInfo.hpp"
#include "gluStrUtil.hpp"
#include "glwFunctions.hpp"
#include "tcuTestLog.hpp"

/* Stringify macro. */
#define _STR(s) STR(s)
#define STR(s) #s

namespace gl3cts
{
namespace TextureSizePromotion
{
Tests::Tests(deqp::Context& context)
	: TestCaseGroup(context, "texture_size_promotion", "Verifies texture internal format size promotion mechanism.")
{
	/* Left blank on purpose */
}

void Tests::init(void)
{
	addChild(new TextureSizePromotion::FunctionalTest(m_context));
}

/*===========================================================================================================*/

FunctionalTest::FunctionalTest(deqp::Context& context)
	: TestCase(context, "functional", "Verifies that texture internal format size promotion mechanism can be used.")
	, m_vao(0)
	, m_source_texture(0)
	, m_destination_texture(0)
	, m_framebuffer(0)
	, m_program(0)
	, m_max_samples(0)
{
	/* Left blank on purpose */
}

tcu::TestNode::IterateResult FunctionalTest::iterate()
{
	/* Get context setup. */
	glu::ContextType context_type = m_context.getRenderContext().getType();
	bool			 is_arb_texture_storage_multisample =
		m_context.getContextInfo().isExtensionSupported("GL_ARB_texture_storage_multisample");

	/* Prepare initial results. */
	bool is_ok	 = true;
	bool was_error = false;

	/* Iterate over test cases. */
	try
	{
		/* Only for OpenGL 3.1 context. */
		if (glu::contextSupports(context_type, glu::ApiType::core(3, 1)))
		{
			/* Generate and bind VAO. */
			prepareVertexArrayObject();

			/* For every required format */
			for (glw::GLuint i = 0; i < s_formats_size; ++i)
			{
				/* Test only if format is required by context. */
				if (glu::contextSupports(context_type, s_formats[i].required_by_context.getAPI()))
				{
					/* For every target. */
					for (glw::GLuint j = 0; j < s_source_texture_targets_count; ++j)
					{
						/* Test if it is supported by context or internal format. */
						if (isTargetMultisampled(s_source_texture_targets[j]))
						{
							if ((!is_arb_texture_storage_multisample) &&
								(!glu::contextSupports(context_type, glu::ApiType::core(4, 3))))
							{
								continue;
							}

							if (!s_formats[i]
									 .is_color_renderable) /* Multisampled textures need to be set using rendering. */
							{
								continue;
							}

							if (isDepthType(s_formats[i]) || isStencilType(s_formats[i]))
							{
								continue;
							}
						}

						if ((isDepthType(s_formats[i]) || isStencilType(s_formats[i])) &&
							(GL_TEXTURE_3D == s_source_texture_targets[j]))
						{
							continue;
						}

						/* Prepare source texture to be tested. */
						try
						{
							prepareSourceTexture(s_formats[i], s_source_texture_targets[j]);
						}
						catch (tcu::NotSupportedError& e)
						{
							continue;
						}

						/* Check basic API queries for source texture. */
						is_ok = is_ok & checkSourceTextureSizeAndType(s_formats[i], s_source_texture_targets[j]);

						/* For every [R, G, B, A] component. */
						for (glw::GLuint k = 0; k < COMPONENTS_COUNT; ++k)
						{
							/* Prepare destination texture. */
							prepareDestinationTextureAndFramebuffer(s_formats[i], GL_TEXTURE_2D);

							/* Building program (throws on failure). */
							m_program =
								prepareProgram(s_source_texture_targets[j], s_formats[i], ColorChannelSelector(k));

							/* Setup GL and draw. */
							makeProgramAndSourceTextureActive(s_source_texture_targets[j]);

							drawQuad();

							/* Check results. */
							is_ok = is_ok & checkDestinationTexture(s_formats[i], ColorChannelSelector(k),
																	s_source_texture_targets[j],
																	s_source_texture_targets_names[j]);

							/* Cleanup. */
							cleanDestinationTexture();
							cleanFramebuffer();
							cleanProgram();
						}

						cleanSourceTexture();
					}
				}
			}
		}
	}
	catch (...)
	{
		/* Error have occured. */
		is_ok	 = false;
		was_error = true;
	}

	/* Clean all. */

	cleanSourceTexture();
	cleanDestinationTexture();
	cleanFramebuffer();
	cleanProgram();
	cleanVertexArrayObject();

	/* Result's setup. */
	if (is_ok)
	{
		/* Log success. */
		m_context.getTestContext().getLog() << tcu::TestLog::Message << "Texture Size Promotion Test have passed."
											<< tcu::TestLog::EndMessage;

		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
	}
	else
	{
		if (was_error)
		{
			/* Log error. */
			m_context.getTestContext().getLog() << tcu::TestLog::Message
												<< "Texture Size Promotion Test have approached error."
												<< tcu::TestLog::EndMessage;

			m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
		}
		else
		{
			/* Log fail. */
			m_context.getTestContext().getLog() << tcu::TestLog::Message << "Texture Size Promotion Test have failed."
												<< tcu::TestLog::EndMessage;

			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
		}
	}

	/* End test. */
	return tcu::TestNode::STOP;
}

void FunctionalTest::prepareVertexArrayObject()
{
	/* GL functions object. */
	const glw::Functions& gl = m_context.getRenderContext().getFunctions();

	gl.genVertexArrays(1, &m_vao);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenVertexArrays have failed");

	gl.bindVertexArray(m_vao);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray have failed");
}

void FunctionalTest::prepareSourceTexture(TextureInternalFormatDescriptor descriptor, glw::GLenum target)
{
	/* GL functions object. */
	const glw::Functions& gl = m_context.getRenderContext().getFunctions();

	/* Create and bind texture object. */
	gl.genTextures(1, &m_source_texture);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetTexLevelParameteriv have failed");

	gl.bindTexture(target, m_source_texture);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetTexLevelParameteriv have failed");

	if (!isTargetMultisampled(target))
	{
		glu::ContextType context_type = m_context.getRenderContext().getType();
		if (isDepthType(descriptor) && glu::contextSupports(context_type, glu::ApiType::core(3, 1)))
		{
			/* 3.1 context may have GL_ARB_compatibility which has
			 * GL_DEPTH_TEXTURE_MODE set to GL_LUMINANCE by default.
			 * Set it to GL_RED since we expect depth texture sampling
			 * to return vec4(depth, 0, 0, 1).
			 */
			gl.texParameteri(target, 0x884B, GL_RED);
			gl.getError();
		}

		gl.texParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		gl.texParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

		GLU_EXPECT_NO_ERROR(gl.getError(), "glGetTexLevelParameteriv have failed");
	}

	/* Select proper data set. */
	glw::GLvoid* source_data   = DE_NULL;
	glw::GLenum  source_type   = GL_NONE;
	glw::GLenum  source_format = GL_RGBA;

	if (isFloatType(descriptor)) /* For floating type. */
	{
		source_data   = (glw::GLvoid*)s_source_texture_data_f;
		source_type   = GL_FLOAT;
		source_format = GL_RGBA;
	}
	else
	{
		if (isFixedSignedType(descriptor)) /* For fixed signed type. */
		{
			source_data   = (glw::GLvoid*)s_source_texture_data_sn;
			source_type   = GL_FLOAT;
			source_format = GL_RGBA;
		}
		else
		{
			if (isFixedUnsignedType(descriptor)) /* For fixed unsigned type. */
			{
				source_data   = (glw::GLvoid*)s_source_texture_data_n;
				source_type   = GL_FLOAT;
				source_format = GL_RGBA;
			}
			else
			{
				if (isIntegerSignedType(descriptor)) /* For integral signed type. */
				{
					source_data   = (glw::GLvoid*)s_source_texture_data_i;
					source_type   = GL_INT;
					source_format = GL_RGBA_INTEGER;
				}
				else
				{
					if (isIntegerUnsignedType(descriptor)) /* For integral unsigned type. */
					{
						source_data   = (glw::GLvoid*)s_source_texture_data_ui;
						source_type   = GL_UNSIGNED_INT;
						source_format = GL_RGBA_INTEGER;
					}
					else
					{
						if (isDepthType(descriptor)) /* For depth type. */
						{
							source_data   = (glw::GLvoid*)s_source_texture_data_f;
							source_type   = GL_FLOAT;
							source_format = GL_DEPTH_COMPONENT;
						}
						else
						{
							if (isStencilType(descriptor)) /* For stencil type. */
							{
								source_data   = (glw::GLvoid*)s_source_texture_data_ui;
								source_type   = GL_UNSIGNED_INT;
								source_format = GL_STENCIL_INDEX;
							}
						}
					}
				}
			}
		}
	}

	/* Prepare texture storage depending on the target. */
	switch (target)
	{
	case GL_TEXTURE_1D:
		gl.texImage1D(target, 0, descriptor.internal_format, s_source_texture_size, 0, source_format, source_type,
					  source_data);
		GLU_EXPECT_NO_ERROR(gl.getError(), "glGetTexLevelParameteriv have failed");
		break;
	case GL_TEXTURE_1D_ARRAY:
	case GL_TEXTURE_2D:
	case GL_TEXTURE_RECTANGLE:
		gl.texImage2D(target, 0, descriptor.internal_format, s_source_texture_size, s_source_texture_size, 0,
					  source_format, source_type, source_data);
		GLU_EXPECT_NO_ERROR(gl.getError(), "glGetTexLevelParameteriv have failed");
		break;
	case GL_TEXTURE_2D_ARRAY:
	case GL_TEXTURE_3D:
		gl.texImage3D(target, 0, descriptor.internal_format, s_source_texture_size, s_source_texture_size,
					  s_source_texture_size, 0, source_format, source_type, source_data);
		GLU_EXPECT_NO_ERROR(gl.getError(), "glGetTexLevelParameteriv have failed");
		break;
	case GL_TEXTURE_2D_MULTISAMPLE:
	case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
		renderDataIntoMultisampledTexture(descriptor, target);
		break;
	default:
		throw 0;
	}
}

void FunctionalTest::renderDataIntoMultisampledTexture(TextureInternalFormatDescriptor descriptor, glw::GLenum target)
{
	/* GL functions object. */
	const glw::Functions& gl = m_context.getRenderContext().getFunctions();

	/* Fetch limits. */
	gl.getIntegerv(GL_MAX_SAMPLES, &m_max_samples);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv have failed");

	if (m_max_samples == 0)
	{
		m_max_samples = 1;
	}

	/* Setup target. */
	glw::GLenum non_ms_target = (target == GL_TEXTURE_2D_MULTISAMPLE) ? GL_TEXTURE_2D : GL_TEXTURE_2D_ARRAY;

	/* Cleanup required by prepareSourceTexture(...). */
	cleanSourceTexture();

	/* Prepare textures and program. */
	prepareSourceTexture(descriptor, non_ms_target);

	prepareDestinationTextureAndFramebuffer(descriptor, target);

	m_program = prepareProgram(non_ms_target, descriptor, COMPONENTS_COUNT);

	/* Setup GL and render texture. */
	makeProgramAndSourceTextureActive(non_ms_target);

	drawQuad();

	/* Cleanup. */
	cleanFramebuffer();
	cleanSourceTexture();

	/* Swpaing destination texture to source texture. */
	m_source_texture = m_destination_texture;

	m_destination_texture = 0;

	/* Clean program. */
	cleanProgram();
}

void FunctionalTest::prepareDestinationTextureAndFramebuffer(TextureInternalFormatDescriptor descriptor,
															 glw::GLenum					 target)
{
	/* GL functions object. */
	const glw::Functions& gl = m_context.getRenderContext().getFunctions();

	/* Get internal format. */
	glw::GLenum internal_format = getDestinationFormatForChannel(descriptor);

	/* Create framebuffer object. */
	gl.genFramebuffers(1, &m_framebuffer);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenFramebuffers call failed.");

	gl.bindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer call failed.");

	/* Create framebuffer's destination texture. */
	gl.genTextures(1, &m_destination_texture);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetTexLevelParameteriv have failed");

	gl.bindTexture(target, m_destination_texture);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetTexLevelParameteriv have failed");

	/* Allocate texture storage and upload data for test rendering. */
	if (target == GL_TEXTURE_2D)
	{
		glw::GLenum  destination_format = GL_RED;
		glw::GLenum  destination_type   = GL_FLOAT;
		glw::GLvoid* destination_data   = (glw::GLvoid*)s_destination_texture_data_f;

		if (isIntegerSignedType(descriptor))
		{
			destination_format = GL_RED_INTEGER;
			destination_type   = GL_INT;
			destination_data   = (glw::GLvoid*)s_destination_texture_data_i;
		}

		if (isIntegerUnsignedType(descriptor))
		{
			destination_format = GL_RED_INTEGER;
			destination_type   = GL_UNSIGNED_INT;
			destination_data   = (glw::GLvoid*)s_destination_texture_data_ui;
		}

		gl.texImage2D(target, 0, internal_format, s_source_texture_size, s_source_texture_size, 0, destination_format,
					  destination_type, destination_data);
		GLU_EXPECT_NO_ERROR(gl.getError(), "glGetTexLevelParameteriv have failed");

		gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_destination_texture, 0);
		GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferTexture2D have failed");
	}
	else /* Allocate texture storage for uploading datat for multisampled targets (upload must be done via shader). */
	{
		if (target == GL_TEXTURE_2D_MULTISAMPLE)
		{
			gl.texImage2DMultisample(target, m_max_samples - 1, descriptor.internal_format, s_source_texture_size,
									 s_source_texture_size, GL_TRUE);
			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetTexLevelParameteriv have failed");

			gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, m_destination_texture, 0);
			GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferTexture2D have failed");
		}
		else
		{
			gl.texImage3DMultisample(target, m_max_samples - 1, descriptor.internal_format, s_source_texture_size,
									 s_source_texture_size, s_source_texture_size, GL_TRUE);
			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetTexLevelParameteriv have failed");

			gl.framebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_destination_texture, 0, 0);
			GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferTexture2D have failed");
		}
	}

	/* Check framebuffer completness. */
	if (gl.checkFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
	{
		if (gl.checkFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_UNSUPPORTED)
			throw tcu::NotSupportedError("unsupported framebuffer configuration");
		else
			throw 0;
	}

	/* Setup viewport. */
	gl.viewport(0, 0, s_source_texture_size, s_source_texture_size);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport call failed.");
}

void FunctionalTest::makeProgramAndSourceTextureActive(glw::GLenum target)
{
	/* GL functions object. */
	const glw::Functions& gl = m_context.getRenderContext().getFunctions();

	/* Use GLSL program. */
	gl.useProgram(m_program);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram have failed");

	/* Setup source texture. */
	gl.activeTexture(GL_TEXTURE0);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glActiveTexture have failed");

	gl.bindTexture(target, m_source_texture);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetTexLevelParameteriv have failed");

	glw::GLint location = gl.getUniformLocation(m_program, "data");
	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation have failed");

	gl.uniform1i(location, 0);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i have failed");
}

bool FunctionalTest::checkSourceTextureSizeAndType(TextureInternalFormatDescriptor descriptor, glw::GLenum target)
{
	/* GL functions object. */
	const glw::Functions& gl = m_context.getRenderContext().getFunctions();

	/* query result storage */
	glw::GLint red_size		= 0;
	glw::GLint blue_size	= 0;
	glw::GLint green_size   = 0;
	glw::GLint alpha_size   = 0;
	glw::GLint depth_size   = 0;
	glw::GLint stencil_size = 0;

	glw::GLint red_type   = 0;
	glw::GLint green_type = 0;
	glw::GLint blue_type  = 0;
	glw::GLint alpha_type = 0;
	glw::GLint depth_type = 0;

	/* Bind texture */
	gl.bindTexture(target, m_source_texture);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetTexLevelParameteriv have failed");

	/* queries */
	gl.getTexLevelParameteriv(target, 0, GL_TEXTURE_RED_SIZE, &red_size);
	gl.getTexLevelParameteriv(target, 0, GL_TEXTURE_GREEN_SIZE, &green_size);
	gl.getTexLevelParameteriv(target, 0, GL_TEXTURE_BLUE_SIZE, &blue_size);
	gl.getTexLevelParameteriv(target, 0, GL_TEXTURE_ALPHA_SIZE, &alpha_size);
	gl.getTexLevelParameteriv(target, 0, GL_TEXTURE_DEPTH_SIZE, &depth_size);
	gl.getTexLevelParameteriv(target, 0, GL_TEXTURE_STENCIL_SIZE, &stencil_size);

	gl.getTexLevelParameteriv(target, 0, GL_TEXTURE_RED_TYPE, &red_type);
	gl.getTexLevelParameteriv(target, 0, GL_TEXTURE_GREEN_TYPE, &green_type);
	gl.getTexLevelParameteriv(target, 0, GL_TEXTURE_BLUE_TYPE, &blue_type);
	gl.getTexLevelParameteriv(target, 0, GL_TEXTURE_ALPHA_TYPE, &alpha_type);
	gl.getTexLevelParameteriv(target, 0, GL_TEXTURE_DEPTH_TYPE, &depth_type);

	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetTexLevelParameteriv have failed");

	/* check expected values */
	bool is_ok = true;

	is_ok = is_ok && (red_size >= descriptor.min_red_size);
	is_ok = is_ok && (green_size >= descriptor.min_green_size);
	is_ok = is_ok && (blue_size >= descriptor.min_blue_size);
	is_ok = is_ok && (alpha_size >= descriptor.min_alpha_size);
	is_ok = is_ok && (depth_size >= descriptor.min_depth_size);
	is_ok = is_ok && (stencil_size >= descriptor.min_stencil_size);

	is_ok = is_ok && ((glw::GLenum)red_type == descriptor.expected_red_type);
	is_ok = is_ok && ((glw::GLenum)green_type == descriptor.expected_green_type);
	is_ok = is_ok && ((glw::GLenum)blue_type == descriptor.expected_blue_type);
	is_ok = is_ok && ((glw::GLenum)alpha_type == descriptor.expected_alpha_type);
	is_ok = is_ok && ((glw::GLenum)depth_type == descriptor.expected_depth_type);

	/* Log on failure. */
	if (!is_ok)
	{
		m_context.getTestContext().getLog()
			<< tcu::TestLog::Message << "Promotion from internal format " << descriptor.internal_format_name
			<< " have failed during glGetTexLevelParameteriv query. "
			<< "Expected red size = " << descriptor.min_red_size
			<< ", expected green size = " << descriptor.min_green_size
			<< ", expected blue size = " << descriptor.min_blue_size
			<< ", expected alpha size = " << descriptor.min_alpha_size
			<< ", expected depth size = " << descriptor.min_depth_size
			<< ", expected stencil size = " << descriptor.min_stencil_size << ". Queried red size = " << red_size
			<< ", queried green size = " << green_size << ", queried blue size = " << blue_size
			<< ", queried alpha size = " << alpha_size << ", queried depth size = " << depth_size
			<< ", queried stencil size = " << stencil_size << ". "
			<< "Expected red type = " << glu::getTypeStr(descriptor.expected_red_type)
			<< ", expected green type = " << glu::getTypeStr(descriptor.expected_green_type)
			<< ", expected blue type = " << glu::getTypeStr(descriptor.expected_blue_type)
			<< ", expected alpha type = " << glu::getTypeStr(descriptor.expected_alpha_type)
			<< ", expected depth type = " << glu::getTypeStr(descriptor.expected_depth_type)
			<< ". Queried red type = " << glu::getTypeStr(red_type)
			<< ", queried green type = " << glu::getTypeStr(green_type)
			<< ", queried blue type = " << glu::getTypeStr(blue_type)
			<< ", queried alpha type = " << glu::getTypeStr(alpha_type)
			<< ", queried depth type = " << glu::getTypeStr(depth_type) << "." << tcu::TestLog::EndMessage;
	}

	/* return results. */
	return is_ok;
}

glw::GLenum FunctionalTest::getDestinationFormatForChannel(TextureInternalFormatDescriptor descriptor)
{
	if (isFloatType(descriptor))
	{
		return GL_R32F;
	}

	if (isFixedUnsignedType(descriptor))
	{
		return GL_R16;
	}

	if (isFixedSignedType(descriptor))
	{
		return GL_R16_SNORM;
	}

	if (isIntegerUnsignedType(descriptor))
	{
		return GL_R32UI;
	}

	if (isIntegerSignedType(descriptor))
	{
		return GL_R32I;
	}

	return GL_R32F;
}

glw::GLuint FunctionalTest::prepareProgram(glw::GLenum target, TextureInternalFormatDescriptor descriptor,
										   ColorChannelSelector channel)
{
	/* GL functions object. */
	const glw::Functions& gl = m_context.getRenderContext().getFunctions();

	/* Preparing sampler name and textelFetch arguments */
	std::string sampler_name			   = "";
	std::string texel_fetch_arguments_tail = "";

	switch (target)
	{
	case GL_TEXTURE_1D:
		sampler_name			   = "sampler1D";
		texel_fetch_arguments_tail = "0, 0";
		break;
	case GL_TEXTURE_2D:
		sampler_name			   = "sampler2D";
		texel_fetch_arguments_tail = "ivec2(0), 0";
		break;
	case GL_TEXTURE_1D_ARRAY:
		sampler_name			   = "sampler1DArray";
		texel_fetch_arguments_tail = "ivec2(0), 0";
		break;
	case GL_TEXTURE_RECTANGLE:
		sampler_name			   = "sampler2DRect";
		texel_fetch_arguments_tail = "ivec2(0)";
		break;
	case GL_TEXTURE_2D_ARRAY:
		sampler_name			   = "sampler2DArray";
		texel_fetch_arguments_tail = "ivec3(0), 0";
		break;
	case GL_TEXTURE_3D:
		sampler_name			   = "sampler3D";
		texel_fetch_arguments_tail = "ivec3(0), 0";
		break;
	case GL_TEXTURE_2D_MULTISAMPLE:
		sampler_name			   = "sampler2DMS";
		texel_fetch_arguments_tail = "ivec2(0), ";
		texel_fetch_arguments_tail.append(Utilities::itoa(m_max_samples - 1));
		break;
	case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
		sampler_name			   = "sampler2DMSArray";
		texel_fetch_arguments_tail = "ivec3(0), ";
		texel_fetch_arguments_tail.append(Utilities::itoa(m_max_samples - 1));
		break;
	default:
		throw 0;
	}

	/* Preparing component selector name */
	std::string component_name = "";

	switch (channel)
	{
	case RED_COMPONENT:
		component_name = ".r";
		break;
	case GREEN_COMPONENT:
		component_name = ".g";
		break;
	case BLUE_COMPONENT:
		component_name = ".b";
		break;
	case ALPHA_COMPONENT:
		component_name = ".a";
		break;
	case COMPONENTS_COUNT:
		break;
	default:
		throw 0;
	}

	/* Preparing output type name and sampler prefix */
	std::string type_name	  = "";
	std::string sampler_prefix = "";

	if (isFloatType(descriptor) || isFixedSignedType(descriptor) || isFixedUnsignedType(descriptor) ||
		isDepthType(descriptor) || isStencilType(descriptor))
	{
		if (channel == COMPONENTS_COUNT)
		{
			type_name = "vec4";
		}
		else
		{
			type_name = "float";
		}
		sampler_prefix = "";
	}
	else
	{
		if (isIntegerSignedType(descriptor))
		{
			if (channel == COMPONENTS_COUNT)
			{
				type_name = "ivec4";
			}
			else
			{
				type_name = "int";
			}
			sampler_prefix = "i";
		}
		else
		{
			if (channel == COMPONENTS_COUNT)
			{
				type_name = "uvec4";
			}
			else
			{
				type_name = "uint";
			}
			sampler_prefix = "u";
		}
	}

	/* Preprocessing fragment shader source code. */
	std::string fragment_shader = s_fragment_shader_template;

	fragment_shader = Utilities::preprocessString(fragment_shader, "TEMPLATE_TYPE", type_name);
	fragment_shader =
		Utilities::preprocessString(fragment_shader, "TEMPLATE_SAMPLER", sampler_prefix.append(sampler_name));
	fragment_shader =
		Utilities::preprocessString(fragment_shader, "TEMPLATE_TEXEL_FETCH_ARGUMENTS", texel_fetch_arguments_tail);
	fragment_shader = Utilities::preprocessString(fragment_shader, "TEMPLATE_COMPONENT", component_name);

	/* Building program. */
	glw::GLuint program =
		Utilities::buildProgram(gl, m_context.getTestContext().getLog(), s_vertex_shader_code, fragment_shader.c_str());

	if (0 == program)
	{
		throw 0;
	}

	/* Return program name. */
	return program;
}

void FunctionalTest::drawQuad()
{
	/* GL functions object. */
	const glw::Functions& gl = m_context.getRenderContext().getFunctions();

	/* Draw quad. */
	gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays have failed");
}

void FunctionalTest::cleanSourceTexture()
{
	/* GL functions object. */
	const glw::Functions& gl = m_context.getRenderContext().getFunctions();

	/* Delete object. */
	if (m_source_texture)
	{
		gl.deleteTextures(1, &m_source_texture);
		GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteTextures have failed");

		m_source_texture = 0;
	}
}

void FunctionalTest::cleanDestinationTexture()
{
	/* GL functions object. */
	const glw::Functions& gl = m_context.getRenderContext().getFunctions();

	/* Delete object. */
	if (m_destination_texture)
	{
		gl.deleteTextures(1, &m_destination_texture);

		m_destination_texture = 0;
	}
}

void FunctionalTest::cleanFramebuffer()
{
	/* GL functions object. */
	const glw::Functions& gl = m_context.getRenderContext().getFunctions();

	/* Delete object. */
	if (m_framebuffer)
	{
		gl.deleteFramebuffers(1, &m_framebuffer);

		m_framebuffer = 0;
	}
}

void FunctionalTest::cleanProgram()
{
	/* GL functions object. */
	const glw::Functions& gl = m_context.getRenderContext().getFunctions();

	/* Delete object. */
	if (m_program)
	{
		gl.useProgram(0);

		gl.deleteProgram(m_program);

		m_program = 0;
	}
}

void FunctionalTest::cleanVertexArrayObject()
{
	/* GL functions object. */
	const glw::Functions& gl = m_context.getRenderContext().getFunctions();

	/* Delete object. */
	if (m_vao)
	{
		gl.deleteVertexArrays(1, &m_vao);

		m_vao = 0;
	}
}

bool FunctionalTest::checkDestinationTexture(TextureInternalFormatDescriptor descriptor, ColorChannelSelector channel,
											 glw::GLenum target, const glw::GLchar* target_name)
{
	/* GL functions object. */
	const glw::Functions& gl = m_context.getRenderContext().getFunctions();

	/* Check depending on format. */
	if (isDepthType(descriptor) || isStencilType(descriptor))
	{
		/* Fetch results from destination texture (attached to current framebuffer). */
		glw::GLfloat pixel = 3.1415927f;
		gl.readPixels(0, 0, 1, 1, GL_RED, GL_FLOAT, &pixel);
		GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels have failed");

		/* Setup expected value. */
		glw::GLfloat expected_value = (channel == RED_COMPONENT) ?
			                                                 s_source_texture_data_f[0] :
			                                                 (channel == ALPHA_COMPONENT) ? 1.f : 0.f;

		/* Compare expected and fetched values. */
		if (fabs(pixel - expected_value) <= getMinPrecision(descriptor, channel))
		{
			/* Test succeeded*/
			return true;
		}
		else
		{
			/* Log failure. */
			m_context.getTestContext().getLog()
				<< tcu::TestLog::Message << "Promotion from internal format " << descriptor.internal_format_name
				<< " have failed during functional test of " << s_color_channel_names[channel]
				<< " channel with target " << target_name << ". Expected value = " << expected_value
				<< " read value = " << pixel << "." << tcu::TestLog::EndMessage;
		}
	}
	else
	{
		if (isFloatType(descriptor))
		{
			/* Fetch results from destination texture (attached to current framebuffer). */
			glw::GLfloat pixel = 3.1415927f;
			gl.readPixels(0, 0, 1, 1, GL_RED, GL_FLOAT, &pixel);
			GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels have failed");

			/* Setup expected value. */
			glw::GLfloat expected_value = isChannelTypeNone(descriptor, channel) ?
											  ((channel == ALPHA_COMPONENT) ? 1.f : 0.f) :
											  s_source_texture_data_f[channel];

			/* Compare expected and fetched values. */
			if (fabs(pixel - expected_value) <= getMinPrecision(descriptor, channel))
			{
				/* Test succeeded*/
				return true;
			}
			else
			{
				/* Log failure. */
				m_context.getTestContext().getLog()
					<< tcu::TestLog::Message << "Promotion from internal format " << descriptor.internal_format_name
					<< " have failed during functional test of " << s_color_channel_names[channel]
					<< " channel with target " << target_name << ". Expected value = " << expected_value
					<< " read value = " << pixel << "." << tcu::TestLog::EndMessage;
			}
		}
		else
		{
			if (isFixedSignedType(descriptor))
			{
				/* Fetch results from destination texture (attached to current framebuffer). */
				glw::GLfloat pixel = 3.1415927f;
				gl.readPixels(0, 0, 1, 1, GL_RED, GL_FLOAT, &pixel);
				GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels have failed");

				/* Setup expected value. */
				/* Signed fixed-point read color are clamped to [0, 1] by default */
				glw::GLfloat expected_value = isChannelTypeNone(descriptor, channel) ?
												  ((channel == ALPHA_COMPONENT) ? 1.f : 0.f) :
												  deFloatClamp(s_source_texture_data_sn[channel], 0, 1);

				/* Compare expected and fetched values. */
				if (fabs(pixel - expected_value) <= getMinPrecision(descriptor, channel))
				{
					/* Test succeeded*/
					return true;
				}
				else
				{
					/* Log failure. */
					m_context.getTestContext().getLog()
						<< tcu::TestLog::Message << "Promotion from internal format " << descriptor.internal_format_name
						<< " have failed during functional test of " << s_color_channel_names[channel]
						<< " channel with target " << target_name << ". Expected value = " << expected_value
						<< " read value = " << pixel << "." << tcu::TestLog::EndMessage;
				}
			}
			else
			{
				if (isFixedUnsignedType(descriptor))
				{
					/* Fetch results from destination texture (attached to current framebuffer). */
					glw::GLfloat pixel = 3.1415927f;
					gl.readPixels(0, 0, 1, 1, GL_RED, GL_FLOAT, &pixel);
					GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels have failed");

					/* Setup expected value. */
					glw::GLfloat expected_value = isChannelTypeNone(descriptor, channel) ?
													  ((channel == ALPHA_COMPONENT) ? 1.f : 0.f) :
													  s_source_texture_data_n[channel];

					/* For sRGB internal formats convert value to linear space. */
					if (descriptor.is_sRGB && (channel < ALPHA_COMPONENT))
					{
						expected_value = convert_from_sRGB(expected_value);

						if (isTargetMultisampled(
								target)) /* In multisampled targets two conversions are made (in upload and in shader) */
						{
							expected_value = convert_from_sRGB(expected_value);
						}
					}

					/* Compare expected and fetched values. */
					if (fabs(pixel - expected_value) <= getMinPrecision(descriptor, channel))
					{
						/* Test succeeded*/
						return true;
					}
					else
					{
						/* Log failure. */
						m_context.getTestContext().getLog()
							<< tcu::TestLog::Message << "Promotion from internal format " << descriptor.internal_format_name
							<< " have failed during functional test of " << s_color_channel_names[channel]
							<< " channel with target " << target_name << ". Expected value = " << expected_value
							<< " read value = " << pixel << "." << tcu::TestLog::EndMessage;
					}
				}
				else
				{
					if (isIntegerSignedType(descriptor))
					{
						/* Fetch results from destination texture (attached to current framebuffer). */
						glw::GLint pixel = 5;
						gl.readPixels(0, 0, 1, 1, GL_RED_INTEGER, GL_INT, &pixel);
						GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels have failed");

						/* Setup expected value. */
						glw::GLint expected_value = isChannelTypeNone(descriptor, channel) ?
														((channel == ALPHA_COMPONENT) ? 1 : 0) :
														s_source_texture_data_i[channel];

						/* Compare expected and fetched values. */
						if (pixel == expected_value)
						{
							/* Test succeeded*/
							return true;
						}
						else
						{
							/* Log failure. */
							m_context.getTestContext().getLog()
								<< tcu::TestLog::Message << "Promotion from internal format "
								<< descriptor.internal_format_name << " have failed during functional test of "
								<< s_color_channel_names[channel] << " channel with target " << target_name
								<< ". Expected value = " << expected_value << " read value = " << pixel << "."
								<< tcu::TestLog::EndMessage;
						}
					}
					else
					{
						if (isIntegerUnsignedType(descriptor))
						{
							/* Fetch results from destination texture (attached to current framebuffer). */
							glw::GLuint pixel = 5;
							gl.readPixels(0, 0, 1, 1, GL_RED_INTEGER, GL_UNSIGNED_INT, &pixel);
							GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels have failed");

							/* Setup expected value. */
							glw::GLuint expected_value = isChannelTypeNone(descriptor, channel) ?
															 ((channel == ALPHA_COMPONENT) ? 1 : 0) :
															 s_source_texture_data_ui[channel];

							/* Compare expected and fetched values. */
							if (pixel == expected_value)
							{
								/* Test succeeded*/
								return true;
							}
							else
							{
								/* Log failure. */
								m_context.getTestContext().getLog()
									<< tcu::TestLog::Message << "Promotion from internal format "
									<< descriptor.internal_format_name << " have failed during functional test of "
									<< s_color_channel_names[channel] << " channel with target " << target_name
									<< ". Expected value = " << expected_value << " read value = " << pixel << "."
									<< tcu::TestLog::EndMessage;
							}
						}
					}
				}
			}
		}
	}

	/* Test failed. */
	return false;
}

bool FunctionalTest::isFloatType(TextureInternalFormatDescriptor descriptor)
{
	return (GL_FLOAT == descriptor.expected_red_type) || (GL_FLOAT == descriptor.expected_green_type) ||
		   (GL_FLOAT == descriptor.expected_blue_type) || (GL_FLOAT == descriptor.expected_alpha_type);
}

bool FunctionalTest::isFixedSignedType(TextureInternalFormatDescriptor descriptor)
{
	return (GL_SIGNED_NORMALIZED == descriptor.expected_red_type) ||
		   (GL_SIGNED_NORMALIZED == descriptor.expected_green_type) ||
		   (GL_SIGNED_NORMALIZED == descriptor.expected_blue_type) ||
		   (GL_SIGNED_NORMALIZED == descriptor.expected_alpha_type);
}

bool FunctionalTest::isFixedUnsignedType(TextureInternalFormatDescriptor descriptor)
{
	return (GL_UNSIGNED_NORMALIZED == descriptor.expected_red_type) ||
		   (GL_UNSIGNED_NORMALIZED == descriptor.expected_green_type) ||
		   (GL_UNSIGNED_NORMALIZED == descriptor.expected_blue_type) ||
		   (GL_UNSIGNED_NORMALIZED == descriptor.expected_alpha_type);
}

bool FunctionalTest::isIntegerSignedType(TextureInternalFormatDescriptor descriptor)
{
	return (GL_INT == descriptor.expected_red_type) || (GL_INT == descriptor.expected_green_type) ||
		   (GL_INT == descriptor.expected_blue_type) || (GL_INT == descriptor.expected_alpha_type);
}

bool FunctionalTest::isIntegerUnsignedType(TextureInternalFormatDescriptor descriptor)
{
	return (GL_UNSIGNED_INT == descriptor.expected_red_type) || (GL_UNSIGNED_INT == descriptor.expected_green_type) ||
		   (GL_UNSIGNED_INT == descriptor.expected_blue_type) || (GL_UNSIGNED_INT == descriptor.expected_alpha_type);
}

bool FunctionalTest::isDepthType(TextureInternalFormatDescriptor descriptor)
{
	return (GL_NONE != descriptor.expected_depth_type);
}

bool FunctionalTest::isStencilType(TextureInternalFormatDescriptor descriptor)
{
	return (descriptor.min_stencil_size > 0);
}

bool FunctionalTest::isChannelTypeNone(TextureInternalFormatDescriptor descriptor, ColorChannelSelector channel)
{
	switch (channel)
	{
	case RED_COMPONENT:
		return (GL_NONE == descriptor.expected_red_type);
	case GREEN_COMPONENT:
		return (GL_NONE == descriptor.expected_green_type);
	case BLUE_COMPONENT:
		return (GL_NONE == descriptor.expected_blue_type);
	case ALPHA_COMPONENT:
		return (GL_NONE == descriptor.expected_alpha_type);
	default:
		throw 0;
	}

	return false;
}

glw::GLfloat FunctionalTest::getMinPrecision(TextureInternalFormatDescriptor descriptor, ColorChannelSelector channel)
{
	/* Select channel data. */
	glw::GLenum type = GL_NONE;
	glw::GLuint size = 0;

	switch (channel)
	{
	case RED_COMPONENT:
		type = descriptor.expected_red_type;
		size = descriptor.min_red_size;
		break;
	case GREEN_COMPONENT:
		type = descriptor.expected_green_type;
		size = descriptor.min_green_size;
		break;
	case BLUE_COMPONENT:
		type = descriptor.expected_blue_type;
		size = descriptor.min_blue_size;
		break;
	case ALPHA_COMPONENT:
		type = descriptor.expected_alpha_type;
		size = descriptor.min_alpha_size;
		break;
	default:
		throw 0;
	}

	/* If it is empty channel. */
	if ((type == GL_NONE) || (size == 0))
	{
		return 0.1f;
	}

	/* If float type. */
	if (isFloatType(descriptor))
	{
		switch (size)
		{
		case 32:
			return 0.00001f; /* specification GL4.5 core constant */
		case 16:
			return 1.f / 1024.f; /* specification GL4.5 core 10 bit mantisa constant */
		case 11:
			return 1.f / 64.f; /* specification GL4.5 core 6 bit mantisa constant */
		case 10:
			return 1.f / 32.f; /* specification GL4.5 core 5 bit mantisa constant */
		default:
			return 0.00001f;
		}
	}

	/* Fixed types precision */
	if (isFixedSignedType(descriptor))
	{
		return (float)(2.0 / pow(2.0, (double)(size - 1 /* sign bit */)));
	}

	if (isFixedUnsignedType(descriptor))
	{
		return (float)(2.0 / pow(2.0, (double)(size)));
	}

	/* other aka (unsigned) integer */
	return 1;
}

bool FunctionalTest::isTargetMultisampled(glw::GLenum target)
{
	return (GL_TEXTURE_2D_MULTISAMPLE == target) || (GL_TEXTURE_2D_MULTISAMPLE_ARRAY == target);
}

float FunctionalTest::convert_from_sRGB(float value)
{
	/* For reference check OpenGL specification (eg. OpenGL 4.5 core profile specification chapter 8.24 */
	if (value > 0.04045f)
	{
		return deFloatPow((value + 0.055f) / 1.055f, 2.4f);
	}

	return value / 12.92f;
}

const glw::GLfloat FunctionalTest::s_source_texture_data_f[] = { 0.125f, 0.25f, 0.5f, 0.75f };

const glw::GLfloat FunctionalTest::s_source_texture_data_n[] = { 0.125f, 0.25f, 0.5f, 0.75f };

const glw::GLfloat FunctionalTest::s_source_texture_data_sn[] = { -0.125f, 0.25f, -0.5f, 0.75f };

const glw::GLint FunctionalTest::s_source_texture_data_i[] = { -1, 2, -3, 4 };

const glw::GLuint FunctionalTest::s_source_texture_data_ui[] = { 4, 3, 2, 1 };

const glw::GLfloat FunctionalTest::s_destination_texture_data_f[] = {
	5.f
}; /* False data for destination texture to be overwriten. */

const glw::GLint FunctionalTest::s_destination_texture_data_i[] = {
	-5
}; /* False data for destination texture to be overwriten. */

const glw::GLuint FunctionalTest::s_destination_texture_data_ui[] = {
	5
}; /* False data for destination texture to be overwriten. */

const glw::GLenum FunctionalTest::s_source_texture_targets[] = {
	GL_TEXTURE_1D,		 GL_TEXTURE_2D, GL_TEXTURE_1D_ARRAY,	   GL_TEXTURE_RECTANGLE,
	GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D, GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_2D_MULTISAMPLE_ARRAY
};

const glw::GLchar* FunctionalTest::s_source_texture_targets_names[] = {
	STR(GL_TEXTURE_1D),		  STR(GL_TEXTURE_2D), STR(GL_TEXTURE_1D_ARRAY),		  STR(GL_TEXTURE_RECTANGLE),
	STR(GL_TEXTURE_2D_ARRAY), STR(GL_TEXTURE_3D), STR(GL_TEXTURE_2D_MULTISAMPLE), STR(GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
};

const glw::GLuint FunctionalTest::s_source_texture_targets_count =
	sizeof(s_source_texture_targets) / sizeof(s_source_texture_targets[0]);

const glw::GLuint FunctionalTest::s_source_texture_size = 1;

const glw::GLchar* FunctionalTest::s_color_channel_names[] = { "red", "green", "blue", "alpha", "all" };

const FunctionalTest::TextureInternalFormatDescriptor FunctionalTest::s_formats[] = {
	/*	context version,							internal format,		internal format name,	 is sRGB,	CR,size{R,	G,	B,	A,	D,	S},	type of R,				type of G,				type of B,				type of A,				type of depth			*/
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_R8, STR(GL_R8), false, true, 8, 0, 0, 0, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_NONE, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 1, glu::PROFILE_CORE), GL_R8_SNORM, STR(GL_R8_SNORM), false, true, 8, 0, 0, 0, 0, 0,
	  GL_SIGNED_NORMALIZED, GL_NONE, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_R16, STR(GL_R16), false, true, 16, 0, 0, 0, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_NONE, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 1, glu::PROFILE_CORE), GL_R16_SNORM, STR(GL_R16_SNORM), false, true, 16, 0, 0, 0, 0, 0,
	  GL_SIGNED_NORMALIZED, GL_NONE, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RG8, STR(GL_RG8), false, true, 8, 8, 0, 0, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 1, glu::PROFILE_CORE), GL_RG8_SNORM, STR(GL_RG8_SNORM), false, true, 8, 8, 0, 0, 0, 0,
	  GL_SIGNED_NORMALIZED, GL_SIGNED_NORMALIZED, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RG16, STR(GL_RG16), false, true, 16, 16, 0, 0, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 1, glu::PROFILE_CORE), GL_RG16_SNORM, STR(GL_RG16_SNORM), false, true, 16, 16, 0, 0, 0, 0,
	  GL_SIGNED_NORMALIZED, GL_SIGNED_NORMALIZED, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(4, 4, glu::PROFILE_CORE), GL_R3_G3_B2, STR(GL_R3_G3_B2), false, true, 3, 3, 2, 0, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_NONE, GL_NONE },
	{ glu::ContextType(4, 4, glu::PROFILE_CORE), GL_RGB4, STR(GL_RGB4), false, true, 4, 4, 4, 0, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_NONE, GL_NONE },
	{ glu::ContextType(4, 4, glu::PROFILE_CORE), GL_RGB5, STR(GL_RGB5), false, true, 5, 5, 5, 0, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGB8, STR(GL_RGB8), false, true, 8, 8, 8, 0, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 1, glu::PROFILE_CORE), GL_RGB8_SNORM, STR(GL_RGB8_SNORM), false, true, 8, 8, 8, 0, 0, 0,
	  GL_SIGNED_NORMALIZED, GL_SIGNED_NORMALIZED, GL_SIGNED_NORMALIZED, GL_NONE, GL_NONE },
	{ glu::ContextType(4, 4, glu::PROFILE_CORE), GL_RGB10, STR(GL_RGB10), false, true, 10, 10, 10, 0, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_NONE, GL_NONE },
	{ glu::ContextType(4, 4, glu::PROFILE_CORE), GL_RGB12, STR(GL_RGB12), false, true, 12, 12, 12, 0, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGB16, STR(GL_RGB16), false, true, 16, 16, 16, 0, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 1, glu::PROFILE_CORE), GL_RGB16_SNORM, STR(GL_RGB16_SNORM), false, true, 16, 16, 16, 0, 0, 0,
	  GL_SIGNED_NORMALIZED, GL_SIGNED_NORMALIZED, GL_SIGNED_NORMALIZED, GL_NONE, GL_NONE },
	{ glu::ContextType(4, 4, glu::PROFILE_CORE), GL_RGBA2, STR(GL_RGBA2), false, true, 2, 2, 2, 2, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_NONE },
	{ glu::ContextType(4, 2, glu::PROFILE_CORE), GL_RGBA4, STR(GL_RGBA4), false, true, 4, 4, 4, 4, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_NONE },
	{ glu::ContextType(4, 2, glu::PROFILE_CORE), GL_RGB5_A1, STR(GL_RGB5_A1), false, true, 5, 5, 5, 1, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGBA8, STR(GL_RGBA8), false, true, 8, 8, 8, 8, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_NONE },
	{ glu::ContextType(3, 1, glu::PROFILE_CORE), GL_RGBA8_SNORM, STR(GL_RGBA8_SNORM), false, true, 8, 8, 8, 8, 0, 0,
	  GL_SIGNED_NORMALIZED, GL_SIGNED_NORMALIZED, GL_SIGNED_NORMALIZED, GL_SIGNED_NORMALIZED, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGB10_A2, STR(GL_RGB10_A2), false, true, 10, 10, 10, 2, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_NONE },
	{ glu::ContextType(3, 3, glu::PROFILE_CORE), GL_RGB10_A2UI, STR(GL_RGB10_A2UI), false, true, 10, 10, 10, 2, 0, 0,
	  GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_NONE },
	{ glu::ContextType(4, 4, glu::PROFILE_CORE), GL_RGBA12, STR(GL_RGBA12), false, true, 12, 12, 12, 12, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGBA16, STR(GL_RGBA16), false, true, 16, 16, 16, 16, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_NONE },
	{ glu::ContextType(3, 1, glu::PROFILE_CORE), GL_RGBA16_SNORM, STR(GL_RGBA16_SNORM), false, true, 16, 16, 16, 16, 0,
	  0, GL_SIGNED_NORMALIZED, GL_SIGNED_NORMALIZED, GL_SIGNED_NORMALIZED, GL_SIGNED_NORMALIZED, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_SRGB8, STR(GL_SRGB8), true, true, 8, 8, 8, 0, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_SRGB8_ALPHA8, STR(GL_SRGB8_ALPHA8), true, true, 8, 8, 8, 8, 0, 0,
	  GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_R16F, STR(GL_R16F), false, true, 16, 0, 0, 0, 0, 0, GL_FLOAT,
	  GL_NONE, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RG16F, STR(GL_RG16F), false, true, 16, 16, 0, 0, 0, 0, GL_FLOAT,
	  GL_FLOAT, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGB16F, STR(GL_RGB16F), false, true, 16, 16, 16, 0, 0, 0, GL_FLOAT,
	  GL_FLOAT, GL_FLOAT, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGBA16F, STR(GL_RGBA16F), false, true, 16, 16, 16, 16, 0, 0,
	  GL_FLOAT, GL_FLOAT, GL_FLOAT, GL_FLOAT, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_R32F, STR(GL_R32F), false, true, 32, 0, 0, 0, 0, 0, GL_FLOAT,
	  GL_NONE, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RG32F, STR(GL_RG32F), false, true, 32, 32, 0, 0, 0, 0, GL_FLOAT,
	  GL_FLOAT, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGB32F, STR(GL_RGB32F), false, true, 32, 32, 32, 0, 0, 0, GL_FLOAT,
	  GL_FLOAT, GL_FLOAT, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGBA32F, STR(GL_RGBA32F), false, true, 32, 32, 32, 32, 0, 0,
	  GL_FLOAT, GL_FLOAT, GL_FLOAT, GL_FLOAT, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_R11F_G11F_B10F, STR(GL_R11F_G11F_B10F), false, true, 11, 11, 10, 0,
	  0, 0, GL_FLOAT, GL_FLOAT, GL_FLOAT, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGB9_E5, STR(GL_RGB9_E5), false, false, 9, 9, 9, 0, 0, 0, GL_FLOAT,
	  GL_FLOAT, GL_FLOAT, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_R8I, STR(GL_R8I), false, true, 8, 0, 0, 0, 0, 0, GL_INT, GL_NONE,
	  GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_R8UI, STR(GL_R8UI), false, true, 8, 0, 0, 0, 0, 0, GL_UNSIGNED_INT,
	  GL_NONE, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_R16I, STR(GL_R16I), false, true, 16, 0, 0, 0, 0, 0, GL_INT, GL_NONE,
	  GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_R16UI, STR(GL_R16UI), false, true, 16, 0, 0, 0, 0, 0,
	  GL_UNSIGNED_INT, GL_NONE, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_R32I, STR(GL_R32I), false, true, 32, 0, 0, 0, 0, 0, GL_INT, GL_NONE,
	  GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_R32UI, STR(GL_R32UI), false, true, 32, 0, 0, 0, 0, 0,
	  GL_UNSIGNED_INT, GL_NONE, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RG8I, STR(GL_RG8I), false, true, 8, 8, 0, 0, 0, 0, GL_INT, GL_INT,
	  GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RG8UI, STR(GL_RG8UI), false, true, 8, 8, 0, 0, 0, 0,
	  GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RG16I, STR(GL_RG16I), false, true, 16, 16, 0, 0, 0, 0, GL_INT,
	  GL_INT, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RG16UI, STR(GL_RG16UI), false, true, 16, 16, 0, 0, 0, 0,
	  GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RG32I, STR(GL_RG32I), false, true, 32, 32, 0, 0, 0, 0, GL_INT,
	  GL_INT, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RG32UI, STR(GL_RG32UI), false, true, 32, 32, 0, 0, 0, 0,
	  GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_NONE, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGB8I, STR(GL_RGB8I), false, true, 8, 8, 8, 0, 0, 0, GL_INT, GL_INT,
	  GL_INT, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGB8UI, STR(GL_RGB8UI), false, true, 8, 8, 8, 0, 0, 0,
	  GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGB16I, STR(GL_RGB16I), false, true, 16, 16, 16, 0, 0, 0, GL_INT,
	  GL_INT, GL_INT, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGB16UI, STR(GL_RGB16UI), false, true, 16, 16, 16, 0, 0, 0,
	  GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGB32I, STR(GL_RGB32I), false, true, 32, 32, 32, 0, 0, 0, GL_INT,
	  GL_INT, GL_INT, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGB32UI, STR(GL_RGB32UI), false, true, 32, 32, 32, 0, 0, 0,
	  GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_NONE, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGBA8I, STR(GL_RGBA8I), false, true, 8, 8, 8, 8, 0, 0, GL_INT,
	  GL_INT, GL_INT, GL_INT, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGBA8UI, STR(GL_RGBA8UI), false, true, 8, 8, 8, 8, 0, 0,
	  GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGBA16I, STR(GL_RGBA16I), false, true, 16, 16, 16, 16, 0, 0, GL_INT,
	  GL_INT, GL_INT, GL_INT, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGBA16UI, STR(GL_RGBA16UI), false, true, 16, 16, 16, 16, 0, 0,
	  GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGBA32I, STR(GL_RGBA32I), false, true, 32, 32, 32, 32, 0, 0, GL_INT,
	  GL_INT, GL_INT, GL_INT, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_RGBA32UI, STR(GL_RGBA32UI), false, true, 32, 32, 32, 32, 0, 0,
	  GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_UNSIGNED_INT, GL_NONE },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_DEPTH_COMPONENT16, STR(GL_DEPTH_COMPONENT16), false, true, 0, 0, 0,
	  0, 16, 0, GL_NONE, GL_NONE, GL_NONE, GL_NONE, GL_UNSIGNED_NORMALIZED },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_DEPTH_COMPONENT24, STR(GL_DEPTH_COMPONENT24), false, true, 0, 0, 0,
	  0, 24, 0, GL_NONE, GL_NONE, GL_NONE, GL_NONE, GL_UNSIGNED_NORMALIZED },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_DEPTH_COMPONENT32F, STR(GL_DEPTH_COMPONENT32F), false, true, 0, 0,
	  0, 0, 32, 0, GL_NONE, GL_NONE, GL_NONE, GL_NONE, GL_FLOAT },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_DEPTH24_STENCIL8, STR(GL_DEPTH24_STENCIL8), false, true, 0, 0, 0, 0,
	  24, 8, GL_NONE, GL_NONE, GL_NONE, GL_NONE, GL_UNSIGNED_NORMALIZED },
	{ glu::ContextType(3, 0, glu::PROFILE_CORE), GL_DEPTH32F_STENCIL8, STR(GL_DEPTH32F_STENCIL8), false, true, 0, 0, 0,
	  0, 32, 8, GL_NONE, GL_NONE, GL_NONE, GL_NONE, GL_FLOAT }
};

const glw::GLuint FunctionalTest::s_formats_size = sizeof(s_formats) / sizeof(s_formats[0]);

const glw::GLchar* FunctionalTest::s_vertex_shader_code = "#version 140\n"
														  "\n"
														  "void main()\n"
														  "{\n"
														  "    switch(gl_VertexID % 4)\n"
														  "    {\n"
														  "    case 0:\n"
														  "        gl_Position = vec4(-1.0, -1.0, 0.0, 1.0);\n"
														  "        break;\n"
														  "    case 1:\n"
														  "        gl_Position = vec4(-1.0,  1.0, 0.0, 1.0);\n"
														  "        break;\n"
														  "    case 2:\n"
														  "        gl_Position = vec4( 1.0, -1.0, 0.0, 1.0);\n"
														  "        break;\n"
														  "    case 3:\n"
														  "        gl_Position = vec4( 1.0,  1.0, 0.0, 1.0);\n"
														  "        break;\n"
														  "    }\n"
														  "}\n";

const glw::GLchar* FunctionalTest::s_fragment_shader_template =
	"#version 140\n"
	"#extension GL_ARB_texture_multisample : enable\n"
	"\n"
	"out TEMPLATE_TYPE result;\n"
	"\n"
	"uniform TEMPLATE_SAMPLER data;\n"
	"\n"
	"void main()\n"
	"{\n"
	"    result = texelFetch(data, TEMPLATE_TEXEL_FETCH_ARGUMENTS)TEMPLATE_COMPONENT;\n"
	"}\n";

/*===========================================================================================================*/

namespace Utilities
{

glw::GLuint buildProgram(glw::Functions const& gl, tcu::TestLog& log, glw::GLchar const* const vertex_shader_source,
						 glw::GLchar const* const fragment_shader_source)
{
	glw::GLuint program = 0;

	struct Shader
	{
		glw::GLchar const* const source;
		glw::GLenum const		 type;
		glw::GLuint				 id;
	} shader[] = { { vertex_shader_source, GL_VERTEX_SHADER, 0 }, { fragment_shader_source, GL_FRAGMENT_SHADER, 0 } };

	glw::GLuint const shader_count = sizeof(shader) / sizeof(shader[0]);

	try
	{
		/* Create program. */
		program = gl.createProgram();
		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateProgram call failed.");

		/* Shader compilation. */

		for (glw::GLuint i = 0; i < shader_count; ++i)
		{
			if (DE_NULL != shader[i].source)
			{
				shader[i].id = gl.createShader(shader[i].type);

				GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateShader call failed.");

				gl.attachShader(program, shader[i].id);

				GLU_EXPECT_NO_ERROR(gl.getError(), "glAttachShader call failed.");

				gl.shaderSource(shader[i].id, 1, &(shader[i].source), NULL);

				GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource call failed.");

				gl.compileShader(shader[i].id);

				GLU_EXPECT_NO_ERROR(gl.getError(), "glCompileShader call failed.");

				glw::GLint status = GL_FALSE;

				gl.getShaderiv(shader[i].id, GL_COMPILE_STATUS, &status);
				GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv call failed.");

				if (GL_FALSE == status)
				{
					glw::GLint log_size = 0;
					gl.getShaderiv(shader[i].id, GL_INFO_LOG_LENGTH, &log_size);
					GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv call failed.");

					glw::GLchar* log_text = new glw::GLchar[log_size];

					gl.getShaderInfoLog(shader[i].id, log_size, NULL, &log_text[0]);

					log << tcu::TestLog::Message << "Shader compilation has failed.\n"
						<< "Shader type: " << glu::getShaderTypeStr(shader[i].type) << "\n"
						<< "Shader compilation error log:\n"
						<< log_text << "\n"
						<< "Shader source code:\n"
						<< shader[i].source << "\n"
						<< tcu::TestLog::EndMessage;

					delete[] log_text;

					GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderInfoLog call failed.");

					throw 0;
				}
			}
		}

		/* Link. */
		gl.linkProgram(program);
		GLU_EXPECT_NO_ERROR(gl.getError(), "glTransformFeedbackVaryings call failed.");

		glw::GLint status = GL_FALSE;

		gl.getProgramiv(program, GL_LINK_STATUS, &status);

		if (GL_TRUE == status)
		{
			for (glw::GLuint i = 0; i < shader_count; ++i)
			{
				if (shader[i].id)
				{
					gl.detachShader(program, shader[i].id);

					GLU_EXPECT_NO_ERROR(gl.getError(), "glDetachShader call failed.");
				}
			}
		}
		else
		{
			glw::GLint log_size = 0;

			gl.getProgramiv(program, GL_INFO_LOG_LENGTH, &log_size);

			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramiv call failed.");

			glw::GLchar* log_text = new glw::GLchar[log_size];

			gl.getProgramInfoLog(program, log_size, NULL, &log_text[0]);

			log << tcu::TestLog::Message << "Program linkage has failed due to:\n"
				<< log_text << "\n"
				<< tcu::TestLog::EndMessage;

			delete[] log_text;

			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramInfoLog call failed.");

			throw 0;
		}
	}
	catch (...)
	{
		if (program)
		{
			gl.deleteProgram(program);

			program = 0;
		}
	}

	for (glw::GLuint i = 0; i < shader_count; ++i)
	{
		if (0 != shader[i].id)
		{
			gl.deleteShader(shader[i].id);

			shader[i].id = 0;
		}
	}

	return program;
}

std::string preprocessString(std::string source, std::string key, std::string value)
{
	std::string destination = source;

	while (true)
	{
		/* Find token in source code. */
		size_t position = destination.find(key, 0);

		/* No more occurences of this key. */
		if (position == std::string::npos)
		{
			break;
		}

		/* Replace token with sub_code. */
		destination.replace(position, key.size(), value);
	}

	return destination;
}

std::string itoa(glw::GLint i)
{
	std::stringstream stream;

	stream << i;

	return stream.str();
}

} // namespace Utilities
} // namespace TextureSizePromotion
} // namespace gl3cts
