/*-------------------------------------------------------------------------
 * OpenGL Conformance Test Suite
 * -----------------------------
 *
 * Copyright (c) 2018 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 es3cCopyTexImageConversionsTests.cpp
 * \brief Tests verifying glCopyTexImage2D..
 */ /*-------------------------------------------------------------------*/

#include "es3cCopyTexImageConversionsTests.hpp"
#include "deMath.h"
#include "deSharedPtr.hpp"
#include "gluContextInfo.hpp"
#include "gluDefs.hpp"
#include "gluStrUtil.hpp"
#include "glwEnums.hpp"
#include "glwFunctions.hpp"
#include "tcuStringTemplate.hpp"
#include "tcuTestLog.hpp"
#include <cstring>
#include <limits>
#include <map>

using namespace glw;

namespace es3cts
{

// Amount of entries database should allocate for its entries upon creation.
#define N_START_CONVERSION_DATABASE_ENTRIES (32)

// Should 3D textures be used as source attachments, this field defines
//  their depth. It MUST be at least 2, because the test implementation
//  also uses second array (counted from one) to store the data-set information.
#define TEXTURE_DEPTH (2)
// Data set height
#define TEXTURE_HEIGHT (2)
// Data set width
#define TEXTURE_WIDTH (2)

// Defines for non color-renderable textures support
#define NUMBER_OF_ELEMENTS_IN_VEC4 (4)
#define NUMBER_OF_POINTS_TO_DRAW (TEXTURE_WIDTH * TEXTURE_HEIGHT)
#define TEXTURE_COORDINATES_ARRAY_SIZE (TEXTURE_WIDTH * TEXTURE_HEIGHT * NUMBER_OF_ELEMENTS_IN_VEC4 * sizeof(float))
#define TEXTURE_2D_SAMPLER_TYPE (0)
#define TEXTURE_3D_SAMPLER_TYPE (1)
#define TEXTURE_2D_ARRAY_SAMPLER_TYPE (2)
#define TEXTURE_CUBE_SAMPLER_TYPE (3)
#define SRC_TEXTURE_COORDS_ATTRIB_INDEX (1)
#define DST_TEXTURE_COORDS_ATTRIB_INDEX (0)

// Buffer object indices used for non color-renderable textures support.
#define COMPARISON_RESULT_BUFFER_OBJECT_INDEX (0)
#define SOURCE_TEXTURE_PIXELS_BUFFER_OBJECT_INDEX (1)
#define DESTINATION_TEXTURE_PIXELS_BUFFER_OBJECT_INDEX (2)

// Stores detailed information about:
// 1) what FBO effective internalformats can be used for glCopyTexImage2D(), assuming
//	specific result texture's internalformat as passed by one of the arguments.
// 2) what internalformat the result texture object should use.
const GLenum conversionArray[] = {
	/*					 GL_RGBA		GL_RGB	   GL_LUMINANCE_ALPHA		 GL_LUMINANCE		GL_ALPHA	   GL_R8	GL_R8_SNORM  GL_RG8	   GL_RG8_SNORM  GL_RGB8  GL_RGB8_SNORM  GL_RGB565  GL_RGBA4  GL_RGB5_A1  GL_RGBA8  GL_RGBA8_SNORM  GL_RGB10_A2  GL_RGB10_A2UI  GL_SRGB8  GL_SRGB8_ALPHA8  GL_R16F  GL_RG16F  GL_RGB16F  GL_RGBA16F  GL_R32F   GL_RG32F  GL_RGB32F  GL_RGBA32F  GL_R11F_G11F_B10F  GL_RGB9_E5   GL_R8I	GL_R8UI   GL_R16I   GL_R16UI  GL_R32I   GL_R32UI  GL_RG8I   GL_RG8UI  GL_RG16I  GL_RG16UI  GL_RG32I   GL_RG32UI  GL_RGB8I  GL_RGB8UI  GL_RGB16I  GL_RGB16UI  GL_RGB32I  GL_RGB32UI  GL_RGBA8I  GL_RGBA8UI  GL_RGBA16I  GL_RGBA16UI  GL_RGBA32I  GL_RGBA32UI */
	/* GL_R8,			*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_LUMINANCE8_OES,	GL_NONE,	   GL_R8,   GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RG8,			*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_LUMINANCE8_OES,	GL_NONE,	   GL_R8,   GL_NONE,	 GL_RG8,   GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RGB8,			*/ GL_NONE,		GL_RGB8,   GL_NONE,					 GL_LUMINANCE8_OES,	GL_NONE,	   GL_R8,   GL_NONE,	 GL_RG8,   GL_NONE,		 GL_RGB8, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RGB565,		*/ GL_NONE,		GL_RGB565, GL_NONE,					 GL_LUMINANCE8_OES,	GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_RGB565, GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RGBA4,		*/ GL_RGBA4,	GL_RGB565, GL_LUMINANCE8_ALPHA8_OES, GL_LUMINANCE8_OES,	GL_ALPHA8_OES, GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_RGBA4, GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RGB5_A1,		*/ GL_RGB5_A1,	GL_RGB565, GL_LUMINANCE8_ALPHA8_OES, GL_LUMINANCE8_OES,	GL_ALPHA8_OES, GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_RGB5_A1, GL_NONE,  GL_NONE,	GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RGBA8,		*/ GL_RGBA8,	GL_RGB8,   GL_LUMINANCE8_ALPHA8_OES, GL_LUMINANCE8_OES,	GL_ALPHA8_OES, GL_R8,   GL_NONE,	 GL_RG8,   GL_NONE,		 GL_RGB8, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_RGBA8, GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RGB10_A2,		*/ GL_NONE,		GL_RGB8,   GL_NONE,					 GL_LUMINANCE8_OES,	GL_ALPHA8_OES, GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_RGB10_A2, GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RGB10_A2UI,	*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_RGB10_A2UI, GL_NONE, GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_SRGB8_ALPHA8,	*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_SRGB8, GL_SRGB8_ALPHA8, GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_R8I,			*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_R8I,   GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_R8UI,			*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_R8UI,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_R16I,			*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_R16I,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_R16UI,		*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_R16UI, GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_R32I,			*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_R32I,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_R32UI,		*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_R32UI, GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RG8I,			*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_R8I,   GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_RG8I,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RG8UI,		*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_R8UI,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_RG8UI, GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RG16I,		*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_R16I,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_RG16I, GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RG16UI,		*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_R16UI, GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_RG16UI, GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RG32I,		*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_R32I,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_RG32I,  GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RG32UI,		*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_R32UI, GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_RG32UI, GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RGBA8I,		*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_R8I,   GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_RG8I,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_RGB8I, GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_RGBA8I, GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RGBA8UI,		*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_R8UI,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_RG8UI, GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_RGB8UI, GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_RGBA8UI, GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RGBA16I,		*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_R16I,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_RG16I, GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_RGB16I, GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_RGBA16I, GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RGBA16UI,		*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_R16UI, GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_RG16UI, GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_RGB16UI, GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_RGBA16UI, GL_NONE,	GL_NONE,
	/* GL_RGBA32I,		*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_R32I,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_RG32I,  GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_RGB32I, GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_RGBA32I, GL_NONE,
	/* GL_RGBA32UI,		*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_R32UI, GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_RG32UI, GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_RGB32UI, GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_RGBA32UI,
	/* GL_R16F,			*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_R16F, GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RG16F,		*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_R16F, GL_RG16F, GL_NONE,   GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_R32F,			*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_R32F,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RG32F,		*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_R32F,  GL_RG32F, GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RGB16F,		*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_R16F, GL_RG16F, GL_RGB16F, GL_NONE,	GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RGBA16F,		*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_R16F, GL_RG16F, GL_RGB16F, GL_RGBA16F, GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RGB32F,		*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_R32F,  GL_RG32F, GL_RGB32F, GL_NONE,	GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
	/* GL_RGBA32F,		*/ GL_NONE,		GL_NONE,   GL_NONE,					 GL_NONE,			GL_NONE,	   GL_NONE, GL_NONE,	 GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,		  GL_NONE,   GL_NONE,  GL_NONE,	GL_NONE,  GL_NONE,		GL_NONE,	 GL_NONE,	   GL_NONE,  GL_NONE,		 GL_NONE, GL_NONE,  GL_NONE,   GL_NONE,	GL_R32F,  GL_RG32F, GL_RGB32F, GL_RGBA32F, GL_NONE,	   GL_NONE,	 GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,   GL_NONE,  GL_NONE,   GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,   GL_NONE,	GL_NONE,	GL_NONE,	 GL_NONE,	GL_NONE,
};

// Tells:
// 1) how many rows conversion_array uses.
// 2) what destination internalformat (NOT effective internalformat!)
//	corresponds to each entry.
// NOTE: If you need to modify this array, make sure conversion-array
//	   is updated accordingly!
const GLenum copyTexImage2DInternalFormatOrdering[] = { GL_RGBA,
														GL_RGB,
														GL_LUMINANCE_ALPHA,
														GL_LUMINANCE,
														GL_ALPHA,
														GL_R8,
														GL_R8_SNORM,
														GL_RG8,
														GL_RG8_SNORM,
														GL_RGB8,
														GL_RGB8_SNORM,
														GL_RGB565,
														GL_RGBA4,
														GL_RGB5_A1,
														GL_RGBA8,
														GL_RGBA8_SNORM,
														GL_RGB10_A2,
														GL_RGB10_A2UI,
														GL_SRGB8,
														GL_SRGB8_ALPHA8,
														GL_R16F,
														GL_RG16F,
														GL_RGB16F,
														GL_RGBA16F,
														GL_R32F,
														GL_RG32F,
														GL_RGB32F,
														GL_RGBA32F,
														GL_R11F_G11F_B10F,
														GL_RGB9_E5,
														GL_R8I,
														GL_R8UI,
														GL_R16I,
														GL_R16UI,
														GL_R32I,
														GL_R32UI,
														GL_RG8I,
														GL_RG8UI,
														GL_RG16I,
														GL_RG16UI,
														GL_RG32I,
														GL_RG32UI,
														GL_RGB8I,
														GL_RGB8UI,
														GL_RGB16I,
														GL_RGB16UI,
														GL_RGB32I,
														GL_RGB32UI,
														GL_RGBA8I,
														GL_RGBA8UI,
														GL_RGBA16I,
														GL_RGBA16UI,
														GL_RGBA32I,
														GL_RGBA32UI };

// Ordering as per Bug 9807 table for FBO effective internalformats
const GLenum fboEffectiveInternalFormatOrdering[] = {
	GL_R8,			 GL_RG8,	GL_RGB8,  GL_RGB565, GL_RGBA4,  GL_RGB5_A1, GL_RGBA8,   GL_RGB10_A2, GL_RGB10_A2UI,
	GL_SRGB8_ALPHA8, GL_R8I,	GL_R8UI,  GL_R16I,   GL_R16UI,  GL_R32I,	GL_R32UI,   GL_RG8I,	 GL_RG8UI,
	GL_RG16I,		 GL_RG16UI, GL_RG32I, GL_RG32UI, GL_RGBA8I, GL_RGBA8UI, GL_RGBA16I, GL_RGBA16UI, GL_RGBA32I,
	GL_RGBA32UI,	 GL_R16F,   GL_RG16F, GL_R32F,   GL_RG32F,  GL_RGB16F,  GL_RGBA16F, GL_RGB32F,   GL_RGBA32F,
};

// Tells how channels are ordered for a particular pixel.
enum ChannelOrder
{
	CHANNEL_ORDER_ABGR,
	CHANNEL_ORDER_BGR,
	CHANNEL_ORDER_BGRA,
	CHANNEL_ORDER_R,
	CHANNEL_ORDER_RG,
	CHANNEL_ORDER_RGB,
	CHANNEL_ORDER_RGBA,

	CHANNEL_ORDER_UNKNOWN
};

// Tells how many bits and what type is used for data representation
// for a single pixel channel.
enum ChannelDataType
{
	CHANNEL_DATA_TYPE_NONE = 0,
	CHANNEL_DATA_TYPE_SIGNED_BYTE_8BITS,
	CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS,
	CHANNEL_DATA_TYPE_SIGNED_SHORT_16BITS,
	CHANNEL_DATA_TYPE_UNSIGNED_BYTE_1BIT,
	CHANNEL_DATA_TYPE_UNSIGNED_BYTE_2BITS,
	CHANNEL_DATA_TYPE_UNSIGNED_BYTE_4BITS,
	CHANNEL_DATA_TYPE_UNSIGNED_BYTE_5BITS,
	CHANNEL_DATA_TYPE_UNSIGNED_BYTE_6BITS,
	CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS,
	CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS,
	CHANNEL_DATA_TYPE_UNSIGNED_SHORT_10BITS,
	CHANNEL_DATA_TYPE_UNSIGNED_SHORT_16BITS,
	CHANNEL_DATA_TYPE_FLOAT
};

// Structure holding uniform locations and object IDs.
// Those values are used to support non-color-renderable texture internalformat checks.
struct NonRenderableInternalformatSupportObjects
{
	GLuint comparison_result_buffer_object_id;
	GLuint dst_texture_pixels_buffer_object_id;
	GLint  dst_2D_texture_uniform_location;
	GLint  dst_Cube_texture_uniform_location;
	GLuint fragment_shader_object_id;
	GLuint program_object_id;
	GLuint src_texture_pixels_buffer_object_id;
	GLint  src_2D_texture_uniform_location;
	GLint  src_2DArray_texture_uniform_location;
	GLint  src_3D_texture_uniform_location;
	GLint  src_Cube_texture_uniform_location;
	GLuint transform_feedback_object_id;
	GLuint vertex_shader_object_id;
	GLint  channels_to_compare_uniform_location;
	GLint  samplers_to_use_uniform_location;
	GLuint src_texture_coordinates_buffer_object_id;
	GLuint dst_texture_coordinates_buffer_object_id;
};

// Structure describing contents of a channel of a single pixel.
struct ChannelData
{
	// Union that allows to access the data representation
	// in a data_type-friendly manner
	union {
		signed char	signed_byte_data;
		signed int	 signed_integer_data;
		signed short   signed_short_data;
		unsigned char  unsigned_byte_data;
		unsigned int   unsigned_integer_data;
		unsigned short unsigned_short_data;
		float		   float_data;
	};

	// Data type used for channel representation
	ChannelDataType data_type;
};

// Structure describing a single pixel.
struct PixelData
{
	// Alpha channel data descriptor
	ChannelData alpha;
	// Blue channel data descriptor
	ChannelData blue;
	// Green channel data descriptor
	ChannelData green;
	// Red channel data descriptor
	ChannelData red;

	// For source pixels:	  GL internal-format used by all channels.
	// For destination pixels: GL format to be used for gl.readPixels()
	//						 operation in order to retrieve result data
	//						 in a matching representation.
	GLenum data_internalformat;
	// For source pixels:	  GL type used by all channels.
	// For destination pixels: GL type to be used for gl.readPixels()
	//						 operation in order to retrieve result data
	//						 in a matching representation.
	GLenum data_type;
};

// To confirm contents of data stored in non-renderable internalformat, a special shader
// is used. This type definition tells which texture() function sampler should be used
// for sampling the texture data.
enum DataSamplerType
{
	DATA_SAMPLER_FLOAT,
	DATA_SAMPLER_INTEGER,
	DATA_SAMPLER_UNSIGNED_INTEGER,
};

// When a special shader is used to check whether the copy succeeded we need to know which
// channels will have to be compared
enum PixelCompareChannel
{
	PIXEL_COMPARE_CHANNEL_R	= 0x1,
	PIXEL_COMPARE_CHANNEL_G	= 0x2,
	PIXEL_COMPARE_CHANNEL_B	= 0x4,
	PIXEL_COMPARE_CHANNEL_A	= 0x8,
	PIXEL_COMPARE_CHANNEL_RG   = PIXEL_COMPARE_CHANNEL_R | PIXEL_COMPARE_CHANNEL_G,
	PIXEL_COMPARE_CHANNEL_RA   = PIXEL_COMPARE_CHANNEL_R | PIXEL_COMPARE_CHANNEL_A,
	PIXEL_COMPARE_CHANNEL_RGB  = PIXEL_COMPARE_CHANNEL_RG | PIXEL_COMPARE_CHANNEL_B,
	PIXEL_COMPARE_CHANNEL_RGBA = PIXEL_COMPARE_CHANNEL_RGB | PIXEL_COMPARE_CHANNEL_A,
};

// Structure describing a single conversion rule.
//
// For more details on meaning of these fields, please refer
// to doxygen of AddEntryToConversionDatabase() and similar.
struct ConversionDatabaseEntry
{
	// Reference destination data expected for bottom-left corner
	PixelData dst_bottomleft_corner;
	// Reference destination data expected for bottom-right corner
	PixelData dst_bottomright_corner;
	// Reference destination data expected for top-left corner
	PixelData dst_topleft_corner;
	// Reference destination data expected for top-right corner
	PixelData dst_topright_corner;

	// Input bottom-left corner data to be used for conversion
	PixelData src_bottomleft_corner;
	// Input bottom-right corner data to be used for conversion
	PixelData src_bottomright_corner;
	// Input top-left corner data to be used for conversion
	PixelData src_topleft_corner;
	// Input top-right corner data to be used for conversion
	PixelData src_topright_corner;

	// What are the channels that we need to compare if gl.readPixels
	// can't be used to read back the data
	PixelCompareChannel channels_to_compare;
};

// Structure describing contents of an opaque conversion database handle.
class ConversionDatabase
{
public:
	ConversionDatabase();
	~ConversionDatabase();

	void initializeDatabase();

	bool isTypeSupportedByGLReadPixels(GLenum type);
	bool isInternalFormatCompatibleWithType(GLenum type, GLenum internalformat);
	bool convertNormalizedUnsignedFixedPoint(int* src_input_rgba_bits, int* src_attachment_rgba_bits,
											 int* dst_attachment_rgba_bits, int* dst_output_rgba_bits, int* src_rgba,
											 int* dst_rgba);

	PixelData getAlpha8OESPixelData(GLenum type, unsigned char alpha);
	PixelData getLuminance8OESPixelData(GLenum type, unsigned char luminance);
	PixelData getLuminance8Alpha8OESPixelData(GLenum type, unsigned char luminance, unsigned char alpha);
	PixelData getR16IPixelData(int is_source_pixel, GLenum type, int red);
	PixelData getR16UIPixelData(int is_source_pixel, GLenum type, unsigned int red);
	PixelData getR32IPixelData(int is_source_pixel, GLenum type, int red);
	PixelData getR32UIPixelData(int is_source_pixel, GLenum type, unsigned int red);
	PixelData getR8IPixelData(int is_source_pixel, GLenum type, int red);
	PixelData getR8UIPixelData(int is_source_pixel, GLenum type, unsigned int red);
	PixelData getR8PixelData(int is_source_pixel, GLenum type, unsigned char red);
	PixelData getRG16IPixelData(int is_source_pixel, GLenum type, int red, int green);
	PixelData getRG16UIPixelData(int is_source_pixel, GLenum type, unsigned int red, unsigned int green);
	PixelData getRG32IPixelData(int is_source_pixel, GLenum type, int red, int green);
	PixelData getRG32UIPixelData(int is_source_pixel, GLenum type, unsigned int red, unsigned int green);
	PixelData getRG8IPixelData(int is_source_pixel, GLenum type, int red, int green);
	PixelData getRG8UIPixelData(int is_source_pixel, GLenum type, unsigned int red, unsigned int green);
	PixelData getRG8PixelData(int is_source_pixel, GLenum type, unsigned char red, unsigned char green);
	PixelData getRGB10A2PixelData(GLenum type, unsigned short red, unsigned short green, unsigned short blue,
								  unsigned char alpha);
	PixelData getRGB10A2UIPixelData(int is_source_pixel, GLenum type, unsigned int red, unsigned int green,
									unsigned int blue, unsigned int alpha);
	PixelData getRGB16IPixelData(int is_source_pixel, GLenum type, int red, int green, int blue);
	PixelData getRGB16UIPixelData(int is_source_pixel, GLenum type, unsigned int red, unsigned int green,
								  unsigned int blue);
	PixelData getRGB32IPixelData(int is_source_pixel, GLenum type, int red, int green, int blue);
	PixelData getRGB32UIPixelData(int is_source_pixel, GLenum type, unsigned int red, unsigned int green,
								  unsigned int blue);
	PixelData getRGB5A1PixelData(int is_source_pixel, GLenum type, unsigned int red, unsigned int green,
								 unsigned int blue, unsigned int alpha);
	PixelData getRGB565PixelData(int is_source_pixel, GLenum type, int red, int green, int blue);
	PixelData getRGB8PixelData(int is_source_pixel, GLenum type, unsigned char red, unsigned char green,
							   unsigned char blue);
	PixelData getRGB8IPixelData(int is_source_pixel, GLenum type, int red, int green, int blue);
	PixelData getRGB8UIPixelData(int is_source_pixel, GLenum type, unsigned int red, unsigned int green,
								 unsigned int blue);
	PixelData getRGBA16IPixelData(int is_source_pixel, GLenum type, int red, int green, int blue, int alpha);
	PixelData getRGBA16UIPixelData(int is_source_pixel, GLenum type, unsigned int red, unsigned int green,
								   unsigned int blue, unsigned int alpha);
	PixelData getRGBA32IPixelData(GLenum type, int red, int green, int blue, int alpha);

	PixelData getRGBA32UIPixelData(GLenum type, unsigned int red, unsigned int green, unsigned int blue,
								   unsigned int alpha);
	PixelData getRGBA8IPixelData(int is_source_pixel, GLenum type, int red, int green, int blue, int alpha);
	PixelData getRGBA8UIPixelData(int is_source_pixel, GLenum type, unsigned int red, unsigned int green,
								  unsigned int blue, unsigned int alpha);
	PixelData getRGBA4PixelData(int is_source_pixel, GLenum type, unsigned char red, unsigned char green,
								unsigned char blue, unsigned char alpha);
	PixelData getRGBA8PixelData(GLenum type, unsigned char red, unsigned char green, unsigned char blue,
								unsigned char alpha);
	PixelData getSRGB8Alpha8PixelData(GLenum type, unsigned char red, unsigned char green, unsigned char blue,
									  unsigned char alpha);
	PixelData getSRGB8PixelData(int is_source_pixel, GLenum type, unsigned char red, unsigned char green,
								unsigned char blue);
	PixelData getR16FPixelData(int is_source_pixel, GLenum type, float red);
	PixelData getR32FPixelData(int is_source_pixel, GLenum type, float red);
	PixelData getRG16FPixelData(int is_source_pixel, GLenum type, float red, float green);
	PixelData getRG32FPixelData(int is_source_pixel, GLenum type, float red, float green);
	PixelData getRGB16FPixelData(int is_source_pixel, GLenum type, float red, float green, float blue);
	PixelData getRGB32FPixelData(int is_source_pixel, GLenum type, float red, float green, float blue);
	PixelData getRGBA16FPixelData(GLenum type, float red, float green, float blue, float alpha);
	PixelData getRGBA32FPixelData(GLenum type, float red, float green, float blue, float alpha);

protected:
	void addEntryToConversionDatabase(PixelData src_topleft, PixelData dst_topleft, PixelData src_topright,
									  PixelData dst_topright, PixelData src_bottomleft, PixelData dst_bottomleft,
									  PixelData src_bottomright, PixelData dst_bottomright,
									  PixelCompareChannel channels_to_compare);
	void configureConversionDatabase();

public:
	// An array of _conversion_database_entry instances,
	// storing all known conversion rules.
	std::vector<ConversionDatabaseEntry> entries;

	// Amount of entries allocated in the "entries" array so far.
	unsigned int n_entries_allocated;

	// Amount of entries added to the "entries" array so far.
	unsigned int n_entries_added;
};

ConversionDatabase::ConversionDatabase() : n_entries_allocated(0), n_entries_added(0)
{
}

ConversionDatabase::~ConversionDatabase()
{
}

/** Initializes database instance. The database will be filled by the
 *  function with all available conversion rules, so it is a mistake to call
 *  ConfigureConversionDatabase() function for a handle reported by this function.
 *
 *  The handle should be released with ReleaseConversionDatabase() when no longer
 *  needed.
 *
 *  @return Handle to the newly created conversion database.
 **/
void ConversionDatabase::initializeDatabase()
{
	// Return when database was initialized earlier.
	if (!entries.empty())
		return;

	entries.resize(N_START_CONVERSION_DATABASE_ENTRIES);
	n_entries_allocated = N_START_CONVERSION_DATABASE_ENTRIES;
	n_entries_added		= 0;

	if (entries.empty())
		TCU_FAIL("Out of memory while pre-allocating space for conversion database entries");

	deMemset(&entries[0], DE_NULL, N_START_CONVERSION_DATABASE_ENTRIES * sizeof(ConversionDatabaseEntry));

	// Add all predefined entries that the test implementation is aware of
	configureConversionDatabase();
}

/** Tells whether @param type can be used for a gl.readPixels() call.
 *
 *  @param type GL type to consider.
 *
 *  @return true  if the type should be accepted by a gl.readPixels() call,
 *		  false otherwise.
 */
bool ConversionDatabase::isTypeSupportedByGLReadPixels(GLenum type)
{
	return (type == GL_INT) || (type == GL_UNSIGNED_BYTE) || (type == GL_UNSIGNED_INT) || (type == GL_FLOAT) ||
		   (type == GL_HALF_FLOAT) || (type == GL_UNSIGNED_INT_2_10_10_10_REV);
}

/** Tells whether @param type can be used with @param internalformat internal format.
 *
 *  @param type		   GLES type to consider.
 *  @param internalformat GLES internal format to consider.
 *
 *  @return true if the type is compatible with specific internal format, false otherwise.
 **/
bool ConversionDatabase::isInternalFormatCompatibleWithType(GLenum type, GLenum internalformat)
{
	bool result = false;

	switch (type)
	{
	case GL_INT:
	{
		result = (internalformat == GL_R8I) || (internalformat == GL_R16I) || (internalformat == GL_R32I) ||
				 (internalformat == GL_RG8I) || (internalformat == GL_RG16I) || (internalformat == GL_RG32I) ||
				 (internalformat == GL_RGB8I) || (internalformat == GL_RGB16I) || (internalformat == GL_RGB32I) ||
				 (internalformat == GL_RGBA8I) || (internalformat == GL_RGBA16I) || (internalformat == GL_RGBA32I);

		break;
	}

	case GL_UNSIGNED_BYTE:
	{
		result = (internalformat == GL_RGB) || (internalformat == GL_RGBA) || (internalformat == GL_LUMINANCE_ALPHA) ||
				 (internalformat == GL_LUMINANCE) || (internalformat == GL_LUMINANCE8_OES) ||
				 (internalformat == GL_LUMINANCE8_ALPHA8_OES) || (internalformat == GL_ALPHA) ||
				 (internalformat == GL_ALPHA8_OES) || (internalformat == GL_R8) || (internalformat == GL_R8_SNORM) ||
				 (internalformat == GL_RG8) || (internalformat == GL_RG8_SNORM) || (internalformat == GL_RGB8) ||
				 (internalformat == GL_SRGB8) || (internalformat == GL_RGB565) || (internalformat == GL_RGB8_SNORM) ||
				 (internalformat == GL_RGBA8) || (internalformat == GL_SRGB8_ALPHA8) ||
				 (internalformat == GL_RGBA8_SNORM) || (internalformat == GL_RGB5_A1) || (internalformat == GL_RGBA4);

		break;
	}

	case GL_UNSIGNED_INT:
	{
		result = (internalformat == GL_R8UI) || (internalformat == GL_R16UI) || (internalformat == GL_R32UI) ||
				 (internalformat == GL_RG8UI) || (internalformat == GL_RG16UI) || (internalformat == GL_RG32UI) ||
				 (internalformat == GL_RGB8UI) || (internalformat == GL_RGB10_A2UI) || (internalformat == GL_RGB16UI) ||
				 (internalformat == GL_RGB32UI) || (internalformat == GL_RGBA8UI) || (internalformat == GL_RGBA16UI) ||
				 (internalformat == GL_RGBA32UI);

		break;
	}

	case GL_UNSIGNED_INT_2_10_10_10_REV:
	{
		result = (internalformat == GL_RGB10_A2) || (internalformat == GL_RGB10_A2UI);

		break;
	}

	case GL_FLOAT:
	{
		result = (internalformat == GL_RGB) || (internalformat == GL_RGBA) || (internalformat == GL_R32F) ||
				 (internalformat == GL_RG32F) || (internalformat == GL_RGB32F) || (internalformat == GL_RGBA32F);

		break;
	}

	case GL_HALF_FLOAT:
	{
		result = (internalformat == GL_RGB) || (internalformat == GL_RGBA) || (internalformat == GL_R16F) ||
				 (internalformat == GL_RG16F) || (internalformat == GL_RGB16F) || (internalformat == GL_RGBA16F);

		break;
	}

	default:
	{
		TCU_FAIL("Unsupported type");
	}
	}

	return result;
}

/** Converts normalized unsigned fixed-point RGBA pixel representations
 *  from one resolution to another, simulating the result that one would
 *  get if glCopyTexImage2D() call was used for a single pixel, read
 *  afterward with a gl.readPixels() call.
 *
 *  @param src_input_rgba_bits	  Pointer to an array storing 4 integers, representing
 *								  amount of bits per channel, as used by input data,
 *								  that will be fed to a GL object using gl.texImage2D()
 *								  call or similar. Cannot be NULL.
 *  @param src_attachment_rgba_bits Pointer to an array storing 4 integers, representing
 *								  amount of bits per channel, as used by data storage
 *								  of an object attached to read buffer. Cannot be NULL.
 *  @param dst_attachment_rgba_bits Pointer to an array storing 4 integers, representing
 *								  amount of bits per channel, as used by data storage
 *								  of a texture object that glCopyTexImage2D() call will
 *								  initialize. Cannot be NULL.
 *  @param dst_output_rgba_bits	 Pointer to an array storing 4 integers, representing
 *								  amount of bits per channel, as requested by the user
 *								  using the gl.readPixels() call. Cannot be NULL.
 *  @param src_rgba				 Pointer to an array storing 4 values representing
 *								  RGBA channel. It is assumed the values do not exceed
 *								  allowed precision, described by @param src_input_rgba_bits.
 *								  Cannot be NULL.
 *  @param dst_rgba				 Deref will be used to store result of the conversion.
 *								  Cannot be NULL.
 *
 *  @return 1 if successful, 0 otherwise.
 *  */
bool ConversionDatabase::convertNormalizedUnsignedFixedPoint(int* src_input_rgba_bits, int* src_attachment_rgba_bits,
															 int* dst_attachment_rgba_bits, int* dst_output_rgba_bits,
															 int* src_rgba, int* dst_rgba)
{
	float a_f32					   = 0.0f;
	float b_f32					   = 0.0f;
	float dst_rgba_f[4]			   = { 0.0f };
	float g_f32					   = 0.0f;
	float r_f32					   = 0.0f;
	int   src_rgba_intermediate[4] = { src_rgba[0], src_rgba[1], src_rgba[2], src_rgba[3] };

	// Reduce or crank up precision before casting to floats
	int bit_diffs_src_intermediate[] = { abs(src_input_rgba_bits[0] - src_attachment_rgba_bits[0]),
										 abs(src_input_rgba_bits[1] - src_attachment_rgba_bits[1]),
										 abs(src_input_rgba_bits[2] - src_attachment_rgba_bits[2]),
										 abs(src_input_rgba_bits[3] - src_attachment_rgba_bits[3]) };

	for (unsigned int n = 0; n < sizeof(bit_diffs_src_intermediate) / sizeof(bit_diffs_src_intermediate[0]); ++n)
	{
		if (src_input_rgba_bits[n] != 0)
		{
			float tmp = ((float)src_rgba_intermediate[n]) / ((1 << src_input_rgba_bits[n]) - 1);
			if (tmp > 1.0f)
				tmp = 1.0f;
			tmp *= (float)((1 << src_attachment_rgba_bits[n]) - 1);
			src_rgba_intermediate[n] = (int)(0.5 + tmp);
		}
	}

	// The following equations correspond to equation 2.1 from ES spec 3.0.2
	if (src_attachment_rgba_bits[0] != 0) r_f32 = ((float)src_rgba_intermediate[0]) / (float)((1 << src_attachment_rgba_bits[0]) - 1);
	if (src_attachment_rgba_bits[1] != 0) g_f32 = ((float)src_rgba_intermediate[1]) / (float)((1 << src_attachment_rgba_bits[1]) - 1);
	if (src_attachment_rgba_bits[2] != 0) b_f32 = ((float)src_rgba_intermediate[2]) / (float)((1 << src_attachment_rgba_bits[2]) - 1);
	if (src_attachment_rgba_bits[3] != 0) a_f32 = ((float)src_rgba_intermediate[3]) / (float)((1 << src_attachment_rgba_bits[3]) - 1);

	// Clamp to <0, 1>. Since we're dealing with unsigned ints on input, there's
	// no way we could be lower than 0.
	if (r_f32 > 1.0f)
		r_f32 = 1.0f;
	if (g_f32 > 1.0f)
		g_f32 = 1.0f;
	if (b_f32 > 1.0f)
		b_f32 = 1.0f;
	if (a_f32 > 1.0f)
		a_f32 = 1.0f;

	// The following equations are taken from table 4.5 & equation 2.3,
	// ES spec 3.0.2
	dst_rgba_f[0] = (r_f32 * (float)((1 << dst_attachment_rgba_bits[0]) - 1));
	dst_rgba_f[1] = (g_f32 * (float)((1 << dst_attachment_rgba_bits[1]) - 1));
	dst_rgba_f[2] = (b_f32 * (float)((1 << dst_attachment_rgba_bits[2]) - 1));
	dst_rgba_f[3] = (a_f32 * (float)((1 << dst_attachment_rgba_bits[3]) - 1));

	// As per spec:
	//
	// The conversion from a floating-point value f to the corresponding
	// unsigned normalized fixed-point value c is defined by first clamping
	// f to the range [0,1], then computing
	//
	// f' = convert_float_uint(f * (2^b-1), b) [2.3]
	//
	// where convert_float_uint(r,b) returns one of the two unsigned binary
	// integer values with exactly b bits which are closest to the floating-point
	// value r (where *rounding to nearest is preferred*)
	//
	// C casting truncates the remainder, so if dst_rgba_f[x] is larger than or
	// equal to 0.5, we need to take a ceiling of the value.
	for (unsigned int n = 0; n < 4 /* channels */; ++n)
	{
		if (deFloatMod(dst_rgba_f[n], 1.0f) >= 0.5f)
			dst_rgba_f[n] = deFloatCeil(dst_rgba_f[n]);
	}

	// Expand the data or reduce its precision, depending on the type requested by the caller.
	dst_rgba[0] = ((unsigned int)dst_rgba_f[0]);
	dst_rgba[1] = ((unsigned int)dst_rgba_f[1]);
	dst_rgba[2] = ((unsigned int)dst_rgba_f[2]);
	dst_rgba[3] = ((unsigned int)dst_rgba_f[3]);

	for (unsigned int n = 0; n < 4 /* channels */; ++n)
	{
		if (dst_attachment_rgba_bits[n] != 0)
		{
			float tmp = ((float)dst_rgba[n]) / ((1 << dst_attachment_rgba_bits[n]) - 1);
			if (tmp > 1.0f)
				tmp = 1.0f;
			tmp *= (float)((1 << dst_output_rgba_bits[n]) - 1);
			dst_rgba[n] = (int)(0.5 + tmp);
		}
	}

	return true;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_ALPHA8 internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_UNSIGNED_BYTE.
 *  @param red			 Value for red channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getAlpha8OESPixelData(GLenum type, unsigned char alpha)
{
	PixelData result;

	// Sanity checks
	DE_ASSERT(type == GL_UNSIGNED_BYTE);

	// Carry on
	deMemset(&result, 0, sizeof(result));

	result.alpha.unsigned_byte_data = alpha;
	result.alpha.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	result.blue.data_type			= CHANNEL_DATA_TYPE_NONE;
	result.green.data_type			= CHANNEL_DATA_TYPE_NONE;
	result.red.data_type			= CHANNEL_DATA_TYPE_NONE;
	result.data_internalformat		= GL_ALPHA8_OES;
	result.data_type				= type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_LUMINANCE8 internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_UNSIGNED_BYTE.
 *  @param luminance	   Luminance value. Will get cloned to blue/green/red channels.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getLuminance8OESPixelData(GLenum type, unsigned char luminance)
{
	PixelData result;

	/* Sanity checks */
	DE_ASSERT(type == GL_UNSIGNED_BYTE);

	/* Carry on */
	deMemset(&result, 0, sizeof(result));

	result.alpha.unsigned_byte_data = 255;
	result.alpha.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	result.blue.unsigned_byte_data  = luminance;
	result.blue.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	result.green.unsigned_byte_data = luminance;
	result.green.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	result.red.unsigned_byte_data   = luminance;
	result.red.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	result.data_internalformat		= GL_LUMINANCE8_OES;
	result.data_type				= type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_LUMINANCE8_ALPHA8 internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_UNSIGNED_BYTE.
 *  @param luminance	   Luminance value. Will be cloned to blue/green/red channels.
 *  @param alpha		   Alpha channel value.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getLuminance8Alpha8OESPixelData(GLenum type, unsigned char luminance, unsigned char alpha)
{
	PixelData result;

	/* Sanity checks */
	DE_ASSERT(type == GL_UNSIGNED_BYTE);

	/* Carry on */
	deMemset(&result, 0, sizeof(result));

	result.alpha.unsigned_byte_data = alpha;
	result.alpha.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	result.blue.unsigned_byte_data  = luminance;
	result.blue.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	result.green.unsigned_byte_data = luminance;
	result.green.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	result.red.unsigned_byte_data   = luminance;
	result.red.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	result.data_internalformat		= GL_LUMINANCE8_ALPHA8_OES;
	result.data_type				= type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_R16I internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_SHORT for source pixels.
 *						 2) GL_INT for destination pixels.
 *  @param red			 Value for red channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getR16IPixelData(int is_source_pixel, GLenum type, int red)
{
	PixelData result;

	/* Sanity checks */
	if (is_source_pixel)
	{
		DE_ASSERT(type == GL_SHORT);
	} /* if (is_source_pixel) */
	else
	{
		DE_ASSERT(type == GL_INT);
	}

	/* Carry on */
	deMemset(&result, 0, sizeof(result));

	result.blue.data_type  = CHANNEL_DATA_TYPE_NONE;
	result.green.data_type = CHANNEL_DATA_TYPE_NONE;

	if (is_source_pixel)
	{
		result.red.signed_short_data = red;
		result.red.data_type		 = CHANNEL_DATA_TYPE_SIGNED_SHORT_16BITS;
	} /* if (is_source_pixel) */
	else
	{
		result.alpha.signed_integer_data = 1;
		result.alpha.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.red.signed_integer_data   = red;
		result.red.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
	}

	result.data_internalformat = GL_R16I;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_R16UI internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_UNSIGNED_SHORT for source pixels.
 *						 2) GL_UNSIGNED_INT for destination pixels.
 *  @param red			 Value for red channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getR16UIPixelData(int is_source_pixel, GLenum type, unsigned int red)
{
	PixelData result;

	/* Sanity checks */
	if (is_source_pixel)
	{
		DE_ASSERT(type == GL_UNSIGNED_SHORT);
	} /* if (is_source_pixels) */
	else
	{
		DE_ASSERT(type == GL_UNSIGNED_INT);
	}

	deMemset(&result, 0, sizeof(result));

	result.alpha.data_type = CHANNEL_DATA_TYPE_NONE;
	result.blue.data_type  = CHANNEL_DATA_TYPE_NONE;
	result.green.data_type = CHANNEL_DATA_TYPE_NONE;

	if (is_source_pixel)
	{
		result.red.unsigned_short_data = red;
		result.red.data_type		   = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_16BITS;
	} /* if (is_source_pixel) */
	else
	{
		result.alpha.unsigned_integer_data = 1;
		result.alpha.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.red.unsigned_integer_data   = red;
		result.red.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
	}

	result.data_internalformat = GL_R16UI;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_R32I internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_INT.
 *  @param red			 Value for red channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getR32IPixelData(int is_source_pixel, GLenum type, int red)
{
	PixelData result;

	DE_ASSERT(type == GL_INT);

	deMemset(&result, 0, sizeof(result));

	if (!is_source_pixel)
	{
		result.alpha.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.alpha.signed_integer_data = 1;
	}
	else
	{
		result.alpha.data_type = CHANNEL_DATA_TYPE_NONE;
	}

	result.blue.data_type		   = CHANNEL_DATA_TYPE_NONE;
	result.green.data_type		   = CHANNEL_DATA_TYPE_NONE;
	result.red.signed_integer_data = red;
	result.red.data_type		   = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
	result.data_internalformat	 = GL_R32I;
	result.data_type			   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_R32UI internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_UNSIGNED_INT.
 *  @param red			 Value for red channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getR32UIPixelData(int is_source_pixel, GLenum type, unsigned int red)
{
	PixelData result;

	DE_ASSERT(type == GL_UNSIGNED_INT);

	deMemset(&result, 0, sizeof(result));

	if (!is_source_pixel)
	{
		result.alpha.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.alpha.unsigned_integer_data = 1;
	} /* if (!is_source_pixel) */
	else
	{
		result.alpha.data_type = CHANNEL_DATA_TYPE_NONE;
	}

	result.blue.data_type			 = CHANNEL_DATA_TYPE_NONE;
	result.green.data_type			 = CHANNEL_DATA_TYPE_NONE;
	result.red.unsigned_integer_data = red;
	result.red.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
	result.data_internalformat		 = GL_R32UI;
	result.data_type				 = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_R8I internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_BYTE for source pixels.
 *						 2) GL_INT for destination pixels.
 *  @param red			 Value for red channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getR8IPixelData(int is_source_pixel, GLenum type, int red)
{
	PixelData result;

	// Sanity checks
	if (is_source_pixel)
		DE_ASSERT(type == GL_BYTE);
	else
		DE_ASSERT(type == GL_INT);

	// Carry on
	deMemset(&result, 0, sizeof(result));

	result.blue.data_type  = CHANNEL_DATA_TYPE_NONE;
	result.green.data_type = CHANNEL_DATA_TYPE_NONE;

	if (is_source_pixel)
	{
		result.alpha.data_type		= CHANNEL_DATA_TYPE_NONE;
		result.red.signed_byte_data = red;
		result.red.data_type		= CHANNEL_DATA_TYPE_SIGNED_BYTE_8BITS;
	}
	else
	{
		result.alpha.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.alpha.signed_integer_data = 1;
		result.red.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.red.signed_integer_data   = red;
	}

	result.data_internalformat = GL_R8I;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_R8UI internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_UNSIGNED_BYTE for source pixels.
 *						 2) GL_UNSIGNED_INT for destination pixels.
 *  @param red			 Value for red channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getR8UIPixelData(int is_source_pixel, GLenum type, unsigned int red)
{
	PixelData result;

	/* Sanity checks */
	if (is_source_pixel)
		DE_ASSERT(type == GL_UNSIGNED_BYTE);
	else
		DE_ASSERT(type == GL_UNSIGNED_INT);

	deMemset(&result, 0, sizeof(result));

	result.blue.data_type  = CHANNEL_DATA_TYPE_NONE;
	result.green.data_type = CHANNEL_DATA_TYPE_NONE;

	if (is_source_pixel)
	{
		result.alpha.data_type		  = CHANNEL_DATA_TYPE_NONE;
		result.red.unsigned_byte_data = red;
		result.red.data_type		  = CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	}
	else
	{
		result.alpha.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.alpha.unsigned_integer_data = 1;
		result.red.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.red.unsigned_integer_data   = red;
	}

	result.data_internalformat = GL_R8UI;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_R8 internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must beGL_UNSIGNED_BYTE.
 *  @param red			 Value for red channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getR8PixelData(int is_source_pixel, GLenum type, unsigned char red)
{
	PixelData result;

	DE_ASSERT(type == GL_UNSIGNED_BYTE);
	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.alpha.data_type = CHANNEL_DATA_TYPE_NONE;
	}
	else
	{
		result.alpha.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.alpha.unsigned_byte_data = 255;
	}

	result.blue.data_type		  = CHANNEL_DATA_TYPE_NONE;
	result.green.data_type		  = CHANNEL_DATA_TYPE_NONE;
	result.red.unsigned_byte_data = red;
	result.red.data_type		  = CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	result.data_internalformat	= GL_R8;
	result.data_type			  = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RG16I internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_SHORT for source pixels.
 *						 2) GL_INT for destination pixels.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRG16IPixelData(int is_source_pixel, GLenum type, int red, int green)
{
	PixelData result;

	if (is_source_pixel)
	{
		DE_ASSERT(type == GL_SHORT);
	}
	else
	{
		DE_ASSERT(type == GL_INT);
	}

	deMemset(&result, 0, sizeof(result));

	result.blue.data_type = CHANNEL_DATA_TYPE_NONE;

	if (is_source_pixel)
	{
		result.alpha.data_type		   = CHANNEL_DATA_TYPE_NONE;
		result.green.signed_short_data = green;
		result.green.data_type		   = CHANNEL_DATA_TYPE_SIGNED_SHORT_16BITS;
		result.red.signed_short_data   = red;
		result.red.data_type		   = CHANNEL_DATA_TYPE_SIGNED_SHORT_16BITS;
	}
	else
	{
		result.alpha.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.alpha.signed_integer_data = 1;
		result.green.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.green.signed_integer_data = green;
		result.red.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.red.signed_integer_data   = red;
	}

	result.data_internalformat = GL_RG16I;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RG16UI internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_UNSIGNED_SHORT for source pixels.
 *						 2) GL_UNSIGNED_INT for destination pixels.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRG16UIPixelData(int is_source_pixel, GLenum type, unsigned int red, unsigned int green)
{
	PixelData result;

	if (is_source_pixel)
		DE_ASSERT(type == GL_UNSIGNED_SHORT);
	else
		DE_ASSERT(type == GL_UNSIGNED_INT);

	deMemset(&result, 0, sizeof(result));

	result.blue.data_type = CHANNEL_DATA_TYPE_NONE;

	if (is_source_pixel)
	{
		result.alpha.data_type		   = CHANNEL_DATA_TYPE_NONE;
		result.green.signed_short_data = green;
		result.green.data_type		   = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_16BITS;
		result.red.signed_short_data   = red;
		result.red.data_type		   = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_16BITS;
	}
	else
	{
		result.alpha.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.alpha.unsigned_integer_data = 1;
		result.green.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.green.unsigned_integer_data = green;
		result.red.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.red.unsigned_integer_data   = red;
	}

	result.data_internalformat = GL_RG16UI;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RG32I internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_INT.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRG32IPixelData(int is_source_pixel, GLenum type, int red, int green)
{
	PixelData result;

	DE_ASSERT(type == GL_INT);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
		result.alpha.data_type = CHANNEL_DATA_TYPE_NONE;
	else
	{
		result.alpha.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.alpha.signed_integer_data = 1;
	}

	result.blue.data_type			 = CHANNEL_DATA_TYPE_NONE;
	result.green.signed_integer_data = green;
	result.green.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
	result.red.signed_integer_data   = red;
	result.red.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
	result.data_internalformat		 = GL_RG32I;
	result.data_type				 = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RG32UI internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_UNSIGNED_INT.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRG32UIPixelData(int is_source_pixel, GLenum type, unsigned int red, unsigned int green)
{
	PixelData result;

	DE_ASSERT(type == GL_UNSIGNED_INT);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.alpha.data_type = CHANNEL_DATA_TYPE_NONE;
	}
	else
	{
		result.alpha.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.alpha.unsigned_integer_data = 1;
	}

	result.blue.data_type			   = CHANNEL_DATA_TYPE_NONE;
	result.green.unsigned_integer_data = green;
	result.green.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
	result.red.unsigned_integer_data   = red;
	result.red.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
	result.data_internalformat		   = GL_RG32UI;
	result.data_type				   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RG8I internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_BYTE for source pixels.
 *						 2) GL_INT for destination pixels.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRG8IPixelData(int is_source_pixel, GLenum type, int red, int green)
{
	PixelData result;

	if (is_source_pixel)
		DE_ASSERT(type == GL_BYTE);
	else
		DE_ASSERT(type == GL_INT);

	deMemset(&result, 0, sizeof(result));

	result.blue.data_type = CHANNEL_DATA_TYPE_NONE;

	if (is_source_pixel)
	{
		result.alpha.data_type		  = CHANNEL_DATA_TYPE_NONE;
		result.green.signed_byte_data = green;
		result.green.data_type		  = CHANNEL_DATA_TYPE_SIGNED_BYTE_8BITS;
		result.red.signed_byte_data   = red;
		result.red.data_type		  = CHANNEL_DATA_TYPE_SIGNED_BYTE_8BITS;
	} /* if (is_source_pixel) */
	else
	{
		result.alpha.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.alpha.signed_integer_data = 1;
		result.green.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.green.signed_integer_data = green;
		result.red.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.red.signed_integer_data   = red;
	}

	result.data_internalformat = GL_RG8I;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGB8UI internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_UNSIGNED_BYTE for source pixels.
 *						 2) GL_UNSIGNED_INT for destination pixels.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRG8UIPixelData(int is_source_pixel, GLenum type, unsigned int red, unsigned int green)
{
	PixelData result;

	if (is_source_pixel)
		DE_ASSERT(type == GL_UNSIGNED_BYTE);
	else
		DE_ASSERT(type == GL_UNSIGNED_INT);

	deMemset(&result, 0, sizeof(result));

	result.blue.data_type = CHANNEL_DATA_TYPE_NONE;

	if (is_source_pixel)
	{
		result.alpha.data_type			= CHANNEL_DATA_TYPE_NONE;
		result.green.unsigned_byte_data = green;
		result.green.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.red.unsigned_byte_data   = red;
		result.red.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	}
	else
	{
		result.alpha.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.alpha.unsigned_integer_data = 1;
		result.green.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.green.unsigned_integer_data = green;
		result.red.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.red.unsigned_integer_data   = red;
	}

	result.data_internalformat = GL_RG8UI;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RG8 internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_UNSIGNED_BYTE.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRG8PixelData(int is_source_pixel, GLenum type, unsigned char red, unsigned char green)
{
	PixelData result;

	DE_ASSERT(type == GL_UNSIGNED_BYTE);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.alpha.data_type = CHANNEL_DATA_TYPE_NONE;
	}
	else
	{
		result.alpha.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.alpha.unsigned_byte_data = 255;
	}

	result.blue.data_type			= CHANNEL_DATA_TYPE_NONE;
	result.green.unsigned_byte_data = green;
	result.green.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	result.red.unsigned_byte_data   = red;
	result.red.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	result.data_internalformat		= GL_RG8;
	result.data_type				= type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGB10_A2 internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_UNSIGNED_INT_2_10_10_10_REV.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *  @param alpha		   Value for alpha channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGB10A2PixelData(GLenum type, unsigned short red, unsigned short green,
												  unsigned short blue, unsigned char alpha)
{
	PixelData result;

	DE_ASSERT(red <= 1023);
	DE_ASSERT(green <= 1023);
	DE_ASSERT(blue <= 1023);
	DE_ASSERT(alpha <= 3);

	DE_ASSERT(type == GL_UNSIGNED_INT_2_10_10_10_REV);

	deMemset(&result, 0, sizeof(result));

	result.alpha.unsigned_byte_data  = alpha;
	result.alpha.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_BYTE_2BITS;
	result.blue.unsigned_short_data  = blue;
	result.blue.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_10BITS;
	result.green.unsigned_short_data = green;
	result.green.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_10BITS;
	result.red.unsigned_short_data   = red;
	result.red.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_10BITS;
	result.data_internalformat		 = GL_RGB10_A2;
	result.data_type				 = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGB10A2UI internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_UNSIGNED_INT_2_10_10_10_REV for source pixels.
 *						 2) GL_UNSIGNED_INT for destination pixels.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *  @param alpha		   Value for alpha channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGB10A2UIPixelData(int is_source_pixel, GLenum type, unsigned int red,
													unsigned int green, unsigned int blue, unsigned int alpha)
{
	PixelData result;

	if (is_source_pixel)
		DE_ASSERT(type == GL_UNSIGNED_INT_2_10_10_10_REV);
	else
		DE_ASSERT(type == GL_UNSIGNED_INT);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.alpha.unsigned_byte_data  = alpha;
		result.alpha.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_BYTE_2BITS;
		result.blue.unsigned_short_data  = blue;
		result.blue.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_10BITS;
		result.green.unsigned_short_data = green;
		result.green.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_10BITS;
		result.red.unsigned_short_data   = red;
		result.red.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_10BITS;
	}
	else
	{
		result.alpha.unsigned_integer_data = alpha;
		result.alpha.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.blue.unsigned_integer_data  = blue;
		result.blue.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.green.unsigned_integer_data = green;
		result.green.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.red.unsigned_integer_data   = red;
		result.red.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
	}

	result.data_internalformat = GL_RGB10_A2UI;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGB16I internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_SHORT for source pixels.
 *						 2) GL_INT for destination pixels.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGB16IPixelData(int is_source_pixel, GLenum type, int red, int green, int blue)
{
	PixelData result;

	if (is_source_pixel)
		DE_ASSERT(type == GL_SHORT);
	else
		DE_ASSERT(type == GL_INT);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.alpha.data_type		   = CHANNEL_DATA_TYPE_NONE;
		result.blue.data_type		   = CHANNEL_DATA_TYPE_SIGNED_SHORT_16BITS;
		result.blue.signed_short_data  = blue;
		result.green.data_type		   = CHANNEL_DATA_TYPE_SIGNED_SHORT_16BITS;
		result.green.signed_short_data = green;
		result.red.data_type		   = CHANNEL_DATA_TYPE_SIGNED_SHORT_16BITS;
		result.red.signed_short_data   = red;
	}
	else
	{
		result.alpha.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.alpha.signed_integer_data = 1;
		result.blue.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.blue.signed_integer_data  = blue;
		result.green.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.green.signed_integer_data = green;
		result.red.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.red.signed_integer_data   = red;
	}

	result.data_internalformat = GL_RGB16I;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGB16UI internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_UNSIGNED_SHORT for source pixels.
 *						 2) GL_UNSIGNED_INT for destination pixels.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGB16UIPixelData(int is_source_pixel, GLenum type, unsigned int red,
												  unsigned int green, unsigned int blue)
{
	PixelData result;

	if (is_source_pixel)
		DE_ASSERT(type == GL_UNSIGNED_SHORT);
	else
		DE_ASSERT(type == GL_UNSIGNED_INT);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.alpha.data_type			 = CHANNEL_DATA_TYPE_NONE;
		result.blue.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_16BITS;
		result.blue.unsigned_short_data  = blue;
		result.green.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_16BITS;
		result.green.unsigned_short_data = green;
		result.red.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_16BITS;
		result.red.unsigned_short_data   = red;
	}
	else
	{
		result.alpha.data_type			   = CHANNEL_DATA_TYPE_NONE;
		result.alpha.unsigned_integer_data = 1;
		result.blue.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.blue.unsigned_integer_data  = blue;
		result.green.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.green.unsigned_integer_data = green;
		result.red.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.red.unsigned_integer_data   = red;
	}

	result.data_internalformat = GL_RGB16UI;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGB32I internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_INT.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGB32IPixelData(int is_source_pixel, GLenum type, int red, int green, int blue)
{
	PixelData result;

	DE_ASSERT(type == GL_INT);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.alpha.data_type = CHANNEL_DATA_TYPE_NONE;
	}
	else
	{
		result.alpha.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.alpha.signed_integer_data = 1;
	}

	result.blue.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
	result.blue.signed_integer_data  = blue;
	result.green.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
	result.green.signed_integer_data = green;
	result.red.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
	result.red.signed_integer_data   = red;
	result.data_internalformat		 = GL_RGB32I;
	result.data_type				 = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGB32UI internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_UNSIGNED_INT.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGB32UIPixelData(int is_source_pixel, GLenum type, unsigned int red,
												  unsigned int green, unsigned int blue)
{
	PixelData result;

	DE_ASSERT(type == GL_UNSIGNED_INT);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.alpha.data_type = CHANNEL_DATA_TYPE_NONE;
	}
	else
	{
		result.alpha.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.alpha.unsigned_integer_data = 1;
	}

	result.blue.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
	result.blue.unsigned_integer_data  = blue;
	result.green.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
	result.green.unsigned_integer_data = green;
	result.red.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
	result.red.unsigned_integer_data   = red;
	result.data_internalformat		   = GL_RGB32UI;
	result.data_type				   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGB5A1 internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_UNSIGNED_BYTE or GL_UNSIGNED_SHORT_5_5_5_1 or
 *							GL_UNSIGNED_INT_2_10_10_10_REV for source pixels.
 *						 2) GL_UNSIGNED_BYTE for destination pixels.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *  @param alpha		   Value for alpha channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGB5A1PixelData(int is_source_pixel, GLenum type, unsigned int red, unsigned int green,
												 unsigned int blue, unsigned int alpha)
{
	PixelData result;

	if (is_source_pixel)
	{
		DE_ASSERT(type == GL_UNSIGNED_BYTE || type == GL_UNSIGNED_SHORT_5_5_5_1 ||
				  type == GL_UNSIGNED_INT_2_10_10_10_REV);
	}
	else
	{
		DE_ASSERT(type == GL_UNSIGNED_BYTE);
	}

	deMemset(&result, 0, sizeof(result));

	switch (type)
	{
	case GL_UNSIGNED_BYTE:
	{
		DE_ASSERT(red <= 255);
		DE_ASSERT(green <= 255);
		DE_ASSERT(blue <= 255);
		DE_ASSERT(alpha <= 255);

		// Fill the channel data structures
		result.alpha.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.alpha.unsigned_byte_data = alpha;
		result.blue.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.blue.unsigned_byte_data  = blue;
		result.green.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.green.unsigned_byte_data = green;
		result.red.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.red.unsigned_byte_data   = red;

		break;
	}

	case GL_UNSIGNED_SHORT_5_5_5_1:
	{
		DE_ASSERT(red <= 31);
		DE_ASSERT(green <= 31);
		DE_ASSERT(blue <= 31);
		DE_ASSERT(alpha == 0 || alpha == 1);

		// Fill the channel data structures
		result.alpha.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_1BIT;
		result.alpha.unsigned_byte_data = alpha;
		result.blue.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_5BITS;
		result.blue.unsigned_byte_data  = blue;
		result.green.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_5BITS;
		result.green.unsigned_byte_data = green;
		result.red.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_5BITS;
		result.red.unsigned_byte_data   = red;

		break;
	}

	case GL_UNSIGNED_INT_2_10_10_10_REV:
	{
		// Sanity checks
		DE_ASSERT(red <= 1023);
		DE_ASSERT(green <= 1023);
		DE_ASSERT(blue <= 1023);
		DE_ASSERT(alpha <= 3);

		// Fill the channel data structures
		result.alpha.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_BYTE_2BITS;
		result.alpha.unsigned_byte_data  = alpha;
		result.blue.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_10BITS;
		result.blue.unsigned_short_data  = blue;
		result.green.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_10BITS;
		result.green.unsigned_short_data = green;
		result.red.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_10BITS;
		result.red.unsigned_short_data   = red;

		break;
	}
	}

	result.data_internalformat = GL_RGB5_A1;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGB565 internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_UNSIGNED_BYTE or GL_UNSIGNED_SHORT_5_6_5 for source pixels.
 *						 2) GL_UNSIGNED_BYTE for destination pixels.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGB565PixelData(int is_source_pixel, GLenum type, int red, int green, int blue)
{
	PixelData result;

	if (is_source_pixel)
		DE_ASSERT(type == GL_UNSIGNED_BYTE || type == GL_UNSIGNED_SHORT_5_6_5);
	else
		DE_ASSERT(type == GL_UNSIGNED_BYTE);

	deMemset(&result, 0, sizeof(result));

	switch (type)
	{
	case GL_UNSIGNED_BYTE:
	{
		// Fill the channel data structures
		result.blue.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.blue.unsigned_byte_data  = blue;
		result.green.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.green.unsigned_byte_data = green;
		result.red.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.red.unsigned_byte_data   = red;

		break;
	}

	case GL_UNSIGNED_SHORT_5_6_5:
	{
		DE_ASSERT(red >= 0 && red <= 31);
		DE_ASSERT(green >= 0 && green <= 63);
		DE_ASSERT(blue >= 0 && blue <= 31);

		// Fill the channel data structures
		result.blue.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_5BITS;
		result.blue.unsigned_byte_data  = blue;
		result.green.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_6BITS;
		result.green.unsigned_byte_data = green;
		result.red.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_5BITS;
		result.red.unsigned_byte_data   = red;

		break;
	}
	}

	if (is_source_pixel)
	{
		result.alpha.data_type = CHANNEL_DATA_TYPE_NONE;
	}
	else
	{
		result.alpha.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.alpha.unsigned_byte_data = 255;
	}

	result.data_internalformat = GL_RGB565;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGB8 internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_UNSIGNED_BYTE.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGB8PixelData(int is_source_pixel, GLenum type, unsigned char red, unsigned char green,
											   unsigned char blue)
{
	PixelData result;

	DE_ASSERT(type == GL_UNSIGNED_BYTE);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.alpha.data_type = CHANNEL_DATA_TYPE_NONE;
	}
	else
	{
		result.alpha.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.alpha.unsigned_byte_data = 255;
	}

	result.blue.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	result.blue.unsigned_byte_data  = blue;
	result.green.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	result.green.unsigned_byte_data = green;
	result.red.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	result.red.unsigned_byte_data   = red;
	result.data_internalformat		= GL_RGB8;
	result.data_type				= type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGB8I internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_BYTE for source pixels.
 *						 2) GL_INT for destination pixels.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGB8IPixelData(int is_source_pixel, GLenum type, int red, int green, int blue)
{
	PixelData result;

	if (is_source_pixel)
		DE_ASSERT(type == GL_BYTE);
	else
		DE_ASSERT(type == GL_INT);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.alpha.data_type		  = CHANNEL_DATA_TYPE_NONE;
		result.blue.data_type		  = CHANNEL_DATA_TYPE_SIGNED_BYTE_8BITS;
		result.blue.signed_byte_data  = blue;
		result.green.data_type		  = CHANNEL_DATA_TYPE_SIGNED_BYTE_8BITS;
		result.green.signed_byte_data = green;
		result.red.data_type		  = CHANNEL_DATA_TYPE_SIGNED_BYTE_8BITS;
		result.red.signed_byte_data   = red;
	}
	else
	{
		result.alpha.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.alpha.signed_integer_data = 1;
		result.blue.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.blue.signed_integer_data  = blue;
		result.green.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.green.signed_integer_data = green;
		result.red.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.red.signed_integer_data   = red;
	}

	result.data_internalformat = GL_RGB8I;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGB8UI internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_UNSIGNED_BYTE for source pixels.
 *						 2) GL_UNSIGNED_INT for destination pixels.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *  @param alpha		   Value for alpha channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGB8UIPixelData(int is_source_pixel, GLenum type, unsigned int red, unsigned int green,
												 unsigned int blue)
{
	PixelData result;

	if (is_source_pixel)
		DE_ASSERT(type == GL_UNSIGNED_BYTE);
	else
		DE_ASSERT(type == GL_UNSIGNED_INT);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.alpha.data_type			= CHANNEL_DATA_TYPE_NONE;
		result.blue.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.blue.unsigned_byte_data  = blue;
		result.green.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.green.unsigned_byte_data = green;
		result.red.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.red.unsigned_byte_data   = red;
	}
	else
	{
		result.alpha.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.alpha.unsigned_integer_data = 1;
		result.blue.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.blue.unsigned_integer_data  = blue;
		result.green.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.green.unsigned_integer_data = green;
		result.red.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.red.unsigned_integer_data   = red;
	}

	result.data_internalformat = GL_RGB8UI;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGBA16I internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_SHORT for source pixels.
 *						 2) GL_INT for destination pixels.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *  @param alpha		   Value for alpha channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGBA16IPixelData(int is_source_pixel, GLenum type, int red, int green, int blue,
												  int alpha)
{
	PixelData result;

	if (is_source_pixel)
		DE_ASSERT(type == GL_SHORT);
	else
		DE_ASSERT(type == GL_INT);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.alpha.data_type		   = CHANNEL_DATA_TYPE_SIGNED_SHORT_16BITS;
		result.alpha.signed_short_data = alpha;
		result.blue.data_type		   = CHANNEL_DATA_TYPE_SIGNED_SHORT_16BITS;
		result.blue.signed_short_data  = blue;
		result.green.data_type		   = CHANNEL_DATA_TYPE_SIGNED_SHORT_16BITS;
		result.green.signed_short_data = green;
		result.red.data_type		   = CHANNEL_DATA_TYPE_SIGNED_SHORT_16BITS;
		result.red.signed_short_data   = red;
	}
	else
	{
		result.alpha.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.alpha.signed_integer_data = alpha;
		result.blue.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.blue.signed_integer_data  = blue;
		result.green.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.green.signed_integer_data = green;
		result.red.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.red.signed_integer_data   = red;
	}

	result.data_internalformat = GL_RGBA16I;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGBA16UI internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_UNSIGNED_SHORT for source pixels.
 *						 2) GL_UNSIGNED_INT for destination pixels.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *  @param alpha		   Value for alpha channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGBA16UIPixelData(int is_source_pixel, GLenum type, unsigned int red,
												   unsigned int green, unsigned int blue, unsigned int alpha)
{
	PixelData result;

	if (is_source_pixel)
		DE_ASSERT(type == GL_UNSIGNED_SHORT);
	else
		DE_ASSERT(type == GL_UNSIGNED_INT);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.alpha.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_16BITS;
		result.alpha.unsigned_short_data = alpha;
		result.blue.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_16BITS;
		result.blue.unsigned_short_data  = blue;
		result.green.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_16BITS;
		result.green.unsigned_short_data = green;
		result.red.data_type			 = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_16BITS;
		result.red.unsigned_short_data   = red;
	}
	else
	{
		result.alpha.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.alpha.unsigned_integer_data = alpha;
		result.blue.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.blue.unsigned_integer_data  = blue;
		result.green.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.green.unsigned_integer_data = green;
		result.red.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.red.unsigned_integer_data   = red;
	}

	result.data_internalformat = GL_RGBA16UI;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGBA32I internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_INT.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *  @param alpha		   Value for alpha channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGBA32IPixelData(GLenum type, int red, int green, int blue, int alpha)
{
	PixelData result;

	DE_ASSERT(type == GL_INT);

	deMemset(&result, 0, sizeof(result));

	result.alpha.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
	result.alpha.signed_integer_data = alpha;
	result.blue.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
	result.blue.signed_integer_data  = blue;
	result.green.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
	result.green.signed_integer_data = green;
	result.red.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
	result.red.signed_integer_data   = red;
	result.data_internalformat		 = GL_RGBA32I;
	result.data_type				 = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGBA32UI internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_UNSIGNED_INT.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *  @param alpha		   Value for alpha channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGBA32UIPixelData(GLenum type, unsigned int red, unsigned int green, unsigned int blue,
												   unsigned int alpha)
{
	PixelData result;

	DE_ASSERT(type == GL_UNSIGNED_INT);

	deMemset(&result, 0, sizeof(result));

	result.alpha.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
	result.alpha.unsigned_integer_data = alpha;
	result.blue.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
	result.blue.unsigned_integer_data  = blue;
	result.green.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
	result.green.unsigned_integer_data = green;
	result.red.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
	result.red.unsigned_integer_data   = red;
	result.data_internalformat		   = GL_RGBA32UI;
	result.data_type				   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGBA8I internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_BYTE for source pixels.
 *						 2) GL_INT for destination pixels.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *  @param alpha		   Value for alpha channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGBA8IPixelData(int is_source_pixel, GLenum type, int red, int green, int blue,
												 int alpha)
{
	PixelData result;

	if (is_source_pixel)
		DE_ASSERT(type == GL_BYTE);
	else
		DE_ASSERT(type == GL_INT);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.alpha.data_type		  = CHANNEL_DATA_TYPE_SIGNED_BYTE_8BITS;
		result.alpha.signed_byte_data = alpha;
		result.blue.data_type		  = CHANNEL_DATA_TYPE_SIGNED_BYTE_8BITS;
		result.blue.signed_byte_data  = blue;
		result.green.data_type		  = CHANNEL_DATA_TYPE_SIGNED_BYTE_8BITS;
		result.green.signed_byte_data = green;
		result.red.data_type		  = CHANNEL_DATA_TYPE_SIGNED_BYTE_8BITS;
		result.red.signed_byte_data   = red;
	}
	else
	{
		result.alpha.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.alpha.signed_integer_data = alpha;
		result.blue.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.blue.signed_integer_data  = blue;
		result.green.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.green.signed_integer_data = green;
		result.red.data_type			 = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		result.red.signed_integer_data   = red;
	}

	result.data_internalformat = GL_RGBA8I;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGBA8UI internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_UNSIGNED_BYTE for source pixels.
 *						 2) GL_UNSIGNED_INT for destination pixels.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *  @param alpha		   Value for alpha channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGBA8UIPixelData(int is_source_pixel, GLenum type, unsigned int red,
												  unsigned int green, unsigned int blue, unsigned int alpha)
{
	PixelData result;

	if (is_source_pixel)
		DE_ASSERT(type == GL_UNSIGNED_BYTE);
	else
		DE_ASSERT(type == GL_UNSIGNED_INT);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.alpha.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.alpha.unsigned_byte_data = alpha;
		result.blue.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.blue.unsigned_byte_data  = blue;
		result.green.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.green.unsigned_byte_data = green;
		result.red.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.red.unsigned_byte_data   = red;
	}
	else
	{
		result.alpha.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.alpha.unsigned_integer_data = alpha;
		result.blue.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.blue.unsigned_integer_data  = blue;
		result.green.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.green.unsigned_integer_data = green;
		result.red.data_type			   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		result.red.unsigned_integer_data   = red;
	}

	result.data_internalformat = GL_RGBA8UI;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGBA4 internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be:
 *						 1) GL_UNSIGNED_BYTE or GL_UNSIGNED_SHORT_4_4_4_4 for source pixels.
 *						 2) GL_UNSIGNED_BYTE for destination pixels.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *  @param alpha		   Value for alpha channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGBA4PixelData(int is_source_pixel, GLenum type, unsigned char red,
												unsigned char green, unsigned char blue, unsigned char alpha)
{
	PixelData result;

	if (is_source_pixel)
		DE_ASSERT(type == GL_UNSIGNED_BYTE || type == GL_UNSIGNED_SHORT_4_4_4_4);
	else
		DE_ASSERT(type == GL_UNSIGNED_BYTE);

	deMemset(&result, 0, sizeof(result));

	switch (type)
	{
	case GL_UNSIGNED_BYTE:
	{
		// Fill the channel data structures
		result.alpha.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.alpha.unsigned_byte_data = alpha;
		result.blue.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.blue.unsigned_byte_data  = blue;
		result.green.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.green.unsigned_byte_data = green;
		result.red.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.red.unsigned_byte_data   = red;

		break;
	}

	case GL_UNSIGNED_SHORT_4_4_4_4:
	{
		DE_ASSERT(red <= 15);
		DE_ASSERT(green <= 15);
		DE_ASSERT(blue <= 15);
		DE_ASSERT(alpha <= 15);

		// Fill the channel data structures
		result.alpha.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_4BITS;
		result.alpha.unsigned_byte_data = alpha;
		result.blue.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_4BITS;
		result.blue.unsigned_byte_data  = blue;
		result.green.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_4BITS;
		result.green.unsigned_byte_data = green;
		result.red.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_4BITS;
		result.red.unsigned_byte_data   = red;

		break;
	}
	}

	result.data_internalformat = GL_RGBA4;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGBA8 internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_UNSIGNED_BYTE.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *  @param alpha		   Value for alpha channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGBA8PixelData(GLenum type, unsigned char red, unsigned char green, unsigned char blue,
												unsigned char alpha)
{
	PixelData result;

	DE_ASSERT(type == GL_UNSIGNED_BYTE);

	deMemset(&result, 0, sizeof(result));

	result.alpha.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	result.alpha.unsigned_byte_data = alpha;
	result.blue.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	result.blue.unsigned_byte_data  = blue;
	result.green.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	result.green.unsigned_byte_data = green;
	result.red.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
	result.red.unsigned_byte_data   = red;
	result.data_internalformat		= GL_RGBA8;
	result.data_type				= type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_SRGB8_ALPHA8 internal format.
 *
 *  @param type			GLES type the pixel uses. Must be GL_UNSIGNED_BYTE.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *  @param alpha		   Value for alpha channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getSRGB8Alpha8PixelData(GLenum type, unsigned char red, unsigned char green,
													  unsigned char blue, unsigned char alpha)
{
	PixelData result = getRGBA8PixelData(type, red, green, blue, alpha);

	result.data_internalformat = GL_SRGB8_ALPHA8;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_SRGB8 internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_UNSIGNED_BYTE.
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getSRGB8PixelData(int is_source_pixel, GLenum type, unsigned char red,
												unsigned char green, unsigned char blue)
{
	PixelData result = getSRGB8Alpha8PixelData(type, red, green, blue, 0);

	if (is_source_pixel)
	{
		result.alpha.data_type			= CHANNEL_DATA_TYPE_NONE;
		result.alpha.unsigned_byte_data = 0;
	}
	else
	{
		result.alpha.data_type			= CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		result.alpha.unsigned_byte_data = 255;
	}

	result.data_internalformat = GL_SRGB8;
	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_R16F internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_HALF_FLOAT
 *  @param red			 Value for red channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getR16FPixelData(int is_source_pixel, GLenum type, float red)
{
	PixelData result;

	DE_ASSERT(type == GL_HALF_FLOAT);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.red.float_data = red;
		result.red.data_type  = CHANNEL_DATA_TYPE_FLOAT;
	}
	else
	{
		result.alpha.float_data = 1;
		result.alpha.data_type  = CHANNEL_DATA_TYPE_FLOAT;
		result.red.float_data   = red;
		result.red.data_type	= CHANNEL_DATA_TYPE_FLOAT;
	}

	result.data_internalformat = GL_R16F;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_R32F internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_FLOAT
 *  @param red			 Value for red channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getR32FPixelData(int is_source_pixel, GLenum type, float red)
{
	PixelData result;

	DE_ASSERT(type == GL_FLOAT);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.red.float_data = red;
		result.red.data_type  = CHANNEL_DATA_TYPE_FLOAT;
	}
	else
	{
		result.alpha.float_data = 1;
		result.alpha.data_type  = CHANNEL_DATA_TYPE_FLOAT;
		result.red.float_data   = red;
		result.red.data_type	= CHANNEL_DATA_TYPE_FLOAT;
	}

	result.data_internalformat = GL_R32F;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RG16F internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_HALF_FLOAT
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRG16FPixelData(int is_source_pixel, GLenum type, float red, float green)
{
	PixelData result;

	DE_ASSERT(type == GL_HALF_FLOAT);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.red.float_data   = red;
		result.red.data_type	= CHANNEL_DATA_TYPE_FLOAT;
		result.green.float_data = green;
		result.green.data_type  = CHANNEL_DATA_TYPE_FLOAT;
	}
	else
	{
		result.alpha.float_data = 1;
		result.alpha.data_type  = CHANNEL_DATA_TYPE_FLOAT;
		result.red.float_data   = red;
		result.red.data_type	= CHANNEL_DATA_TYPE_FLOAT;
		result.green.float_data = green;
		result.green.data_type  = CHANNEL_DATA_TYPE_FLOAT;
	}

	result.data_internalformat = GL_RG16F;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RG32F internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_FLOAT
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRG32FPixelData(int is_source_pixel, GLenum type, float red, float green)
{
	PixelData result;

	DE_ASSERT(type == GL_FLOAT);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.red.float_data   = red;
		result.red.data_type	= CHANNEL_DATA_TYPE_FLOAT;
		result.green.float_data = green;
		result.green.data_type  = CHANNEL_DATA_TYPE_FLOAT;
	}
	else
	{
		result.alpha.float_data = 1;
		result.alpha.data_type  = CHANNEL_DATA_TYPE_FLOAT;
		result.red.float_data   = red;
		result.red.data_type	= CHANNEL_DATA_TYPE_FLOAT;
		result.green.float_data = green;
		result.green.data_type  = CHANNEL_DATA_TYPE_FLOAT;
	}

	result.data_internalformat = GL_RG32F;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGB16F internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_HALF_FLOAT
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for green channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGB16FPixelData(int is_source_pixel, GLenum type, float red, float green, float blue)
{
	PixelData result;

	DE_ASSERT(type == GL_HALF_FLOAT);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.red.float_data   = red;
		result.red.data_type	= CHANNEL_DATA_TYPE_FLOAT;
		result.green.float_data = green;
		result.green.data_type  = CHANNEL_DATA_TYPE_FLOAT;
		result.blue.float_data  = blue;
		result.blue.data_type   = CHANNEL_DATA_TYPE_FLOAT;
	}
	else
	{
		result.alpha.float_data = 1;
		result.alpha.data_type  = CHANNEL_DATA_TYPE_FLOAT;
		result.red.float_data   = red;
		result.red.data_type	= CHANNEL_DATA_TYPE_FLOAT;
		result.green.float_data = green;
		result.green.data_type  = CHANNEL_DATA_TYPE_FLOAT;
		result.blue.float_data  = blue;
		result.blue.data_type   = CHANNEL_DATA_TYPE_FLOAT;
	}

	result.data_internalformat = GL_RGB16F;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGB32F internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_FLOAT
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGB32FPixelData(int is_source_pixel, GLenum type, float red, float green, float blue)
{
	PixelData result;

	DE_ASSERT(type == GL_FLOAT);

	deMemset(&result, 0, sizeof(result));

	if (is_source_pixel)
	{
		result.red.float_data   = red;
		result.red.data_type	= CHANNEL_DATA_TYPE_FLOAT;
		result.green.float_data = green;
		result.green.data_type  = CHANNEL_DATA_TYPE_FLOAT;
		result.blue.float_data  = blue;
		result.blue.data_type   = CHANNEL_DATA_TYPE_FLOAT;
	}
	else
	{
		result.alpha.float_data = 1;
		result.alpha.data_type  = CHANNEL_DATA_TYPE_FLOAT;
		result.red.float_data   = red;
		result.red.data_type	= CHANNEL_DATA_TYPE_FLOAT;
		result.green.float_data = green;
		result.green.data_type  = CHANNEL_DATA_TYPE_FLOAT;
		result.blue.float_data  = blue;
		result.blue.data_type   = CHANNEL_DATA_TYPE_FLOAT;
	}

	result.data_internalformat = GL_RGB32F;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGBA16F internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_HALF_FLOAT
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *  @param alpha		   Value for alpha channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGBA16FPixelData(GLenum type, float red, float green, float blue, float alpha)
{
	PixelData result;

	DE_ASSERT(type == GL_HALF_FLOAT);

	deMemset(&result, 0, sizeof(result));

	result.alpha.float_data = alpha;
	result.alpha.data_type  = CHANNEL_DATA_TYPE_FLOAT;
	result.red.float_data   = red;
	result.red.data_type	= CHANNEL_DATA_TYPE_FLOAT;
	result.green.float_data = green;
	result.green.data_type  = CHANNEL_DATA_TYPE_FLOAT;
	result.blue.float_data  = blue;
	result.blue.data_type   = CHANNEL_DATA_TYPE_FLOAT;

	result.data_internalformat = GL_RGBA16F;
	result.data_type		   = type;

	return result;
}

/** Retrieves a PixelData instance describing a single pixel stored in
 *  GL_RGBA32F internal format.
 *
 *  @param is_source_pixel 1 if the pixel is going to be used as conversion source,
 *						 0 otherwise.
 *  @param type			GLES type the pixel uses. Must be GL_FLOAT
 *  @param red			 Value for red channel.
 *  @param green		   Value for green channel.
 *  @param blue			Value for blue channel.
 *  @param alpha		   Value for alpha channel.
 *
 *  @return Filled PixelData instance.
 **/
PixelData ConversionDatabase::getRGBA32FPixelData(GLenum type, float red, float green, float blue, float alpha)
{
	PixelData result;

	DE_ASSERT(type == GL_FLOAT);

	deMemset(&result, 0, sizeof(result));

	result.alpha.float_data = alpha;
	result.alpha.data_type  = CHANNEL_DATA_TYPE_FLOAT;
	result.red.float_data   = red;
	result.red.data_type	= CHANNEL_DATA_TYPE_FLOAT;
	result.green.float_data = green;
	result.green.data_type  = CHANNEL_DATA_TYPE_FLOAT;
	result.blue.float_data  = blue;
	result.blue.data_type   = CHANNEL_DATA_TYPE_FLOAT;

	result.data_internalformat = GL_RGBA32F;
	result.data_type		   = type;

	return result;
}

/** Adds a new conversion rule to a conversion database.
 *
 *  Destination pixel datasets can only use one of the following types:
 *
 *  GL_UNSIGNED_BYTE			   (for fixed-point source types);
 *  GL_INT						 (for signed integer types);
 *  GL_UNSIGNED_INT				(for unsigned integer types);
 *  GL_UNSIGNED_INT_2_10_10_10_REV (for GL_RGB10_A2 type ONLY)
 *
 *  The type used for destination storage configures arguments that
 *  will be passed to a gl.readPixels() call in verification stage IF
 *  source internalformat is color-renderable. If not, destination type
 *  determines how result & reference data should be compared using
 *  a special program object.
 *
 *  It is illegal to:
 *
 *  1) add more than one conversion rule that uses the same source+destination
 *	 internalformat+type combination.
 *  2) use source pixels of different internalformats or types;
 *  3) use destination pixels of different internalformats or types;
 *  4) use pixel data instances using invalid internalformat or types.
 *
 *  @param src_topleft	 Pixel-data instance describing source top-left corner.
 *  @param dst_topleft	 Pixel-data instance describing destination top-left corner.
 *  @param src_topright	Pixel-data instance describing source top-right corner.
 *  @param dst_topright	Pixel-data instance describing destination top-right corner.
 *  @param src_bottomleft  Pixel-data instance describing source bottom-left corner.
 *  @param dst_bottomleft  Pixel-data instance describing destination bottom-left corner.
 *  @param src_bottomright Pixel-data instance describing source bottom-right corner.
 *  @param dst_bottomright Pixel-data instance describing destination bottom-right corner.
 **/
void ConversionDatabase::addEntryToConversionDatabase(PixelData src_topleft, PixelData dst_topleft,
													  PixelData src_topright, PixelData dst_topright,
													  PixelData src_bottomleft, PixelData dst_bottomleft,
													  PixelData src_bottomright, PixelData dst_bottomright,
													  PixelCompareChannel channels_to_compare)
{
	GLenum dst_internalformat		   = GL_NONE;
	GLenum dst_type					   = GL_NONE;
	int	is_dst_internalformat_valid = 0;
	int	is_dst_type_valid		   = 0;
	GLenum src_internalformat		   = GL_NONE;
	GLenum src_type					   = GL_NONE;

	// Sanity checks: general
	DE_ASSERT(src_topleft.data_internalformat != GL_NONE);
	DE_ASSERT(dst_topleft.data_internalformat != GL_NONE);

	if (src_topleft.data_internalformat == GL_NONE || dst_topleft.data_internalformat == GL_NONE)
		return; // if (source / destination internalformats are GL_NONE)

	DE_ASSERT(src_topleft.data_internalformat == src_topright.data_internalformat);
	DE_ASSERT(src_topleft.data_internalformat == src_bottomleft.data_internalformat);
	DE_ASSERT(src_topleft.data_internalformat == src_bottomright.data_internalformat);
	DE_ASSERT(src_topleft.data_type == src_topright.data_type);
	DE_ASSERT(src_topleft.data_type == src_bottomleft.data_type);
	DE_ASSERT(src_topleft.data_type == src_bottomright.data_type);

	if (src_topleft.data_internalformat != src_topright.data_internalformat ||
		src_topleft.data_internalformat != src_bottomleft.data_internalformat ||
		src_topleft.data_internalformat != src_bottomright.data_internalformat ||
			src_topleft.data_type != src_topright.data_type || src_topleft.data_type != src_bottomleft.data_type ||
		src_topleft.data_type != src_bottomright.data_type)
	{
		return;
	} // if (source pixels' internalformats and/or types are not the same values)

	DE_ASSERT(dst_topleft.data_internalformat == dst_topright.data_internalformat);
	DE_ASSERT(dst_topleft.data_internalformat == dst_bottomleft.data_internalformat);
	DE_ASSERT(dst_topleft.data_internalformat == dst_bottomright.data_internalformat);
	DE_ASSERT(dst_topleft.data_type == dst_topright.data_type);
	DE_ASSERT(dst_topleft.data_type == dst_bottomleft.data_type);
	DE_ASSERT(dst_topleft.data_type == dst_bottomright.data_type);

	if (dst_topleft.data_internalformat != dst_topright.data_internalformat ||
		dst_topleft.data_internalformat != dst_bottomleft.data_internalformat ||
		dst_topleft.data_internalformat != dst_bottomright.data_internalformat ||
		dst_topleft.data_type != dst_topright.data_type || dst_topleft.data_type != dst_bottomleft.data_type ||
		dst_topleft.data_type != dst_bottomright.data_type)
	{
		return;
	} // if (destination pixels' internalformats and/or types are not the same values)

	src_internalformat = src_topleft.data_internalformat;
	src_type		   = src_topleft.data_type;
	dst_internalformat = dst_topleft.data_internalformat;
	dst_type		   = dst_topleft.data_type;

	// Sanity checks: format used for destination storage
	is_dst_type_valid			= isTypeSupportedByGLReadPixels(dst_type);
	is_dst_internalformat_valid = isInternalFormatCompatibleWithType(dst_type, dst_internalformat);

	DE_ASSERT(is_dst_type_valid && is_dst_internalformat_valid);
	if (!is_dst_type_valid || !is_dst_internalformat_valid)
		TCU_FAIL("Requested destination type or internalformat is not compatible with validation requirements.");

	// Sanity checks: make sure the conversion has not been already added
	for (unsigned int n = 0; n < n_entries_added; ++n)
	{
		ConversionDatabaseEntry& entry_ptr = entries[n];

		GLenum iterated_dst_internalformat = entry_ptr.dst_topleft_corner.data_internalformat;
		GLenum iterated_dst_type		   = entry_ptr.dst_topleft_corner.data_type;
		GLenum iterated_src_internalformat = entry_ptr.src_topleft_corner.data_internalformat;
		GLenum iterated_src_type		   = entry_ptr.src_topleft_corner.data_type;
		int	is_new_rule				   = src_internalformat != iterated_src_internalformat ||
						  ((src_internalformat == iterated_src_internalformat) && (src_type != iterated_src_type)) ||
						  ((src_internalformat == iterated_src_internalformat) && (src_type == iterated_src_type) &&
						   (dst_internalformat != iterated_dst_internalformat)) ||
						  ((src_internalformat == iterated_src_internalformat) && (src_type == iterated_src_type) &&
						   (dst_internalformat == iterated_dst_internalformat) && (dst_type != iterated_dst_type));

		DE_ASSERT(is_new_rule);
		if (!is_new_rule)
			TCU_FAIL("This conversion rule already exists!");
	}

	// Make sure there's enough space to hold a new entry
	if ((n_entries_added + 1) >= n_entries_allocated)
	{
		// Realloc is needed
		n_entries_allocated <<= 1;
		entries.resize(n_entries_allocated);
		if (entries.empty())
			TCU_FAIL("Out of memory while reallocating conversion database");
	}

	// Add the new entry
	ConversionDatabaseEntry& entry_ptr = entries[n_entries_added];
	entry_ptr.dst_bottomleft_corner	= dst_bottomleft;
	entry_ptr.dst_bottomright_corner   = dst_bottomright;
	entry_ptr.dst_topleft_corner	   = dst_topleft;
	entry_ptr.dst_topright_corner	  = dst_topright;
	entry_ptr.src_bottomleft_corner	= src_bottomleft;
	entry_ptr.src_bottomright_corner   = src_bottomright;
	entry_ptr.src_topleft_corner	   = src_topleft;
	entry_ptr.src_topright_corner	  = src_topright;
	entry_ptr.channels_to_compare	  = channels_to_compare;

	++n_entries_added;
}

/** Adds all known conversion rules to a conversion database passed by argument.
 *
 *  A conversion database stores exactly one conversion rule for each valid combination
 *  of source+destination internal-formats (with an exception that for each internalformat
 *  data may be represented with many different types!).
 *  These rules are then used by copy_tex_image_conversions_required conformance test to
 *  validate successfully executed conversions.
 *
 *  A quick reminder:
 *
 *	  Source dataset corresponds to 2x2 image (using up to 4 channels) that the attachment bound to
 *  read buffer will use prior to glCopyTexImage2D() call. This image is defined by 4 Get*PixelData()
 *  calls with the first argument set to 1.
 *	  Destination dataset corresponds to 2x2 image (using up to 4 channels) that the result texture
 *  object should match (within acceptable epsilon). This image is defined by 4 Get*PixelData() calls
 *  with the first argument set to 0.
 *
 *  Source datasets are allowed to use any internalformat+type combination that is considered supported
 *  by GLES implementation.
 *  Destination datasets are only allowed to use specific types - please see AddEntryToConversionDatabase()
 *  doxygen for more details.
 *
 *  @param database Conversion database handle.
 **/
void ConversionDatabase::configureConversionDatabase()
{
	int bits_1010102[4] = { 10, 10, 10, 2 };
	int bits_4444[4]	= { 4, 4, 4, 4 };
	int bits_5551[4]	= { 5, 5, 5, 1 };
	int bits_565[4]		= { 5, 6, 5, 0 };
	int bits_888[4]		= { 8, 8, 8, 0 };
	int bits_8888[4]	= { 8, 8, 8, 8 };

	/* GL_R8 */
	{
		const unsigned char texel1[1] = { 255 };
		const unsigned char texel2[1] = { 127 };
		const unsigned char texel3[1] = { 63 };
		const unsigned char texel4[1] = { 0 };

		/* GL_R8 => GL_LUMINANCE8_OES */
		addEntryToConversionDatabase(
			getR8PixelData(1, GL_UNSIGNED_BYTE, texel1[0]), getLuminance8OESPixelData(GL_UNSIGNED_BYTE, texel1[0]),
			getR8PixelData(1, GL_UNSIGNED_BYTE, texel2[0]), getLuminance8OESPixelData(GL_UNSIGNED_BYTE, texel2[0]),
			getR8PixelData(1, GL_UNSIGNED_BYTE, texel3[0]), getLuminance8OESPixelData(GL_UNSIGNED_BYTE, texel3[0]),
			getR8PixelData(1, GL_UNSIGNED_BYTE, texel4[0]), getLuminance8OESPixelData(GL_UNSIGNED_BYTE, texel4[0]),
			PIXEL_COMPARE_CHANNEL_R);

		/* GL_R8 => GL_R8 */
		addEntryToConversionDatabase(
			getR8PixelData(1, GL_UNSIGNED_BYTE, texel1[0]), getR8PixelData(0, GL_UNSIGNED_BYTE, texel1[0]),
			getR8PixelData(1, GL_UNSIGNED_BYTE, texel2[0]), getR8PixelData(0, GL_UNSIGNED_BYTE, texel2[0]),
			getR8PixelData(1, GL_UNSIGNED_BYTE, texel3[0]), getR8PixelData(0, GL_UNSIGNED_BYTE, texel3[0]),
			getR8PixelData(1, GL_UNSIGNED_BYTE, texel4[0]), getR8PixelData(0, GL_UNSIGNED_BYTE, texel4[0]),
			PIXEL_COMPARE_CHANNEL_R);
	}

	/* GL_RG8 */
	{
		const unsigned char texel1[2] = { 255, 127 };
		const unsigned char texel2[2] = { 127, 63 };
		const unsigned char texel3[2] = { 63, 0 };
		const unsigned char texel4[2] = { 0, 255 };

		/* GL_RG8 => GL_LUMINANCE8_OES */
		addEntryToConversionDatabase(getRG8PixelData(1, GL_UNSIGNED_BYTE, texel1[0], texel1[1]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, texel1[0]),
									 getRG8PixelData(1, GL_UNSIGNED_BYTE, texel2[0], texel2[1]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, texel2[0]),
									 getRG8PixelData(1, GL_UNSIGNED_BYTE, texel3[0], texel3[1]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, texel3[0]),
									 getRG8PixelData(1, GL_UNSIGNED_BYTE, texel4[0], texel4[1]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, texel4[0]), PIXEL_COMPARE_CHANNEL_R);

		/* GL_RG8 => GL_R8 */
		addEntryToConversionDatabase(
			getRG8PixelData(1, GL_UNSIGNED_BYTE, texel1[0], texel1[1]), getR8PixelData(0, GL_UNSIGNED_BYTE, texel1[0]),
			getRG8PixelData(1, GL_UNSIGNED_BYTE, texel2[0], texel2[1]), getR8PixelData(0, GL_UNSIGNED_BYTE, texel2[0]),
			getRG8PixelData(1, GL_UNSIGNED_BYTE, texel3[0], texel3[1]), getR8PixelData(0, GL_UNSIGNED_BYTE, texel3[0]),
			getRG8PixelData(1, GL_UNSIGNED_BYTE, texel4[0], texel4[1]), getR8PixelData(0, GL_UNSIGNED_BYTE, texel4[0]),
			PIXEL_COMPARE_CHANNEL_R);

		/* GL_RG8 => GL_RG8 */
		addEntryToConversionDatabase(getRG8PixelData(1, GL_UNSIGNED_BYTE, texel1[0], texel1[1]),
									 getRG8PixelData(0, GL_UNSIGNED_BYTE, texel1[0], texel1[1]),
									 getRG8PixelData(1, GL_UNSIGNED_BYTE, texel2[0], texel2[1]),
									 getRG8PixelData(0, GL_UNSIGNED_BYTE, texel2[0], texel2[1]),
									 getRG8PixelData(1, GL_UNSIGNED_BYTE, texel3[0], texel3[1]),
									 getRG8PixelData(0, GL_UNSIGNED_BYTE, texel3[0], texel3[1]),
									 getRG8PixelData(1, GL_UNSIGNED_BYTE, texel4[0], texel4[1]),
									 getRG8PixelData(0, GL_UNSIGNED_BYTE, texel4[0], texel4[1]),
									 PIXEL_COMPARE_CHANNEL_RG);
	}

	/* GL_RGB8 */
	{
		const unsigned char texel1[3] = { 255, 127, 63 };
		const unsigned char texel2[3] = { 127, 63, 0 };
		const unsigned char texel3[3] = { 63, 0, 255 };
		const unsigned char texel4[3] = { 0, 255, 127 };

		/* GL_RGB8 => GL_RGB8 */
		addEntryToConversionDatabase(getRGB8PixelData(1, GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2]),
									 getRGB8PixelData(0, GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2]),
									 getRGB8PixelData(1, GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2]),
									 getRGB8PixelData(0, GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2]),
									 getRGB8PixelData(1, GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2]),
									 getRGB8PixelData(0, GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2]),
									 getRGB8PixelData(1, GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2]),
									 getRGB8PixelData(0, GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2]),
									 PIXEL_COMPARE_CHANNEL_RGB);

		/* GL_RGB8 => GL_LUMINANCE8_OES */
		addEntryToConversionDatabase(getRGB8PixelData(1, GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, texel1[0]),
									 getRGB8PixelData(1, GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, texel2[0]),
									 getRGB8PixelData(1, GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, texel3[0]),
									 getRGB8PixelData(1, GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, texel4[0]), PIXEL_COMPARE_CHANNEL_R);

		/* GL_RGB8 => GL_R8 */
		addEntryToConversionDatabase(getRGB8PixelData(1, GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2]),
									 getR8PixelData(0, GL_UNSIGNED_BYTE, texel1[0]),
									 getRGB8PixelData(1, GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2]),
									 getR8PixelData(0, GL_UNSIGNED_BYTE, texel2[0]),
									 getRGB8PixelData(1, GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2]),
									 getR8PixelData(0, GL_UNSIGNED_BYTE, texel3[0]),
									 getRGB8PixelData(1, GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2]),
									 getR8PixelData(0, GL_UNSIGNED_BYTE, texel4[0]), PIXEL_COMPARE_CHANNEL_R);

		/* GL_RGB8 => GL_RG8 */
		addEntryToConversionDatabase(getRGB8PixelData(1, GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2]),
									 getRG8PixelData(0, GL_UNSIGNED_BYTE, texel1[0], texel1[1]),
									 getRGB8PixelData(1, GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2]),
									 getRG8PixelData(0, GL_UNSIGNED_BYTE, texel2[0], texel2[1]),
									 getRGB8PixelData(1, GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2]),
									 getRG8PixelData(0, GL_UNSIGNED_BYTE, texel3[0], texel3[1]),
									 getRGB8PixelData(1, GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2]),
									 getRG8PixelData(0, GL_UNSIGNED_BYTE, texel4[0], texel4[1]),
									 PIXEL_COMPARE_CHANNEL_RG);
	}

	{ /* GL_RGB565 */
		int texel565_1[4] = { 31, 63, 21, 0 };
		int texel565_2[4] = { 21, 43, 11, 0 };
		int texel565_3[4] = { 11, 23, 1, 0 };
		int texel888_1[4] = { 255, 155, 55, 0 };
		int texel888_2[4] = { 176, 76, 36, 0 };
		int texel888_3[4] = { 88, 66, 44, 0 };
		int texel888_4[4] = { 20, 10, 0, 0 };

		int temp_565_to_888_bl[4]			  = { 0 };
		int temp_565_to_888_tl[4]			  = { 0 };
		int temp_565_to_888_tr[4]			  = { 0 };
		int temp_888_through_565_to_888_bl[4] = { 0 };
		int temp_888_through_565_to_888_br[4] = { 0 };
		int temp_888_through_565_to_888_tl[4] = { 0 };
		int temp_888_through_565_to_888_tr[4] = { 0 };

		convertNormalizedUnsignedFixedPoint(bits_565, bits_888, bits_888, bits_888, texel565_1, temp_565_to_888_tl);
		convertNormalizedUnsignedFixedPoint(bits_565, bits_888, bits_888, bits_888, texel565_2, temp_565_to_888_tr);
		convertNormalizedUnsignedFixedPoint(bits_565, bits_888, bits_888, bits_888, texel565_3, temp_565_to_888_bl);

		convertNormalizedUnsignedFixedPoint(bits_888, bits_565, bits_888, bits_888, texel888_1,
											temp_888_through_565_to_888_tl);
		convertNormalizedUnsignedFixedPoint(bits_888, bits_565, bits_888, bits_888, texel888_2,
											temp_888_through_565_to_888_tr);
		convertNormalizedUnsignedFixedPoint(bits_888, bits_565, bits_888, bits_888, texel888_3,
											temp_888_through_565_to_888_bl);
		convertNormalizedUnsignedFixedPoint(bits_888, bits_565, bits_888, bits_888, texel888_4,
											temp_888_through_565_to_888_br);

		/* GL_RGB565 => GL_RGB565 */
		addEntryToConversionDatabase(
			getRGB565PixelData(1, GL_UNSIGNED_SHORT_5_6_5, texel565_1[0], texel565_1[1], texel565_1[2]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_565_to_888_tl[0], temp_565_to_888_tl[1],
							   temp_565_to_888_tl[2]),
			getRGB565PixelData(1, GL_UNSIGNED_SHORT_5_6_5, texel565_2[0], texel565_2[1], texel565_2[2]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_565_to_888_tr[0], temp_565_to_888_tr[1],
							   temp_565_to_888_tr[2]),
			getRGB565PixelData(1, GL_UNSIGNED_SHORT_5_6_5, texel565_3[0], texel565_3[1], texel565_3[2]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_565_to_888_bl[0], temp_565_to_888_bl[1],
							   temp_565_to_888_bl[2]),
			getRGB565PixelData(1, GL_UNSIGNED_SHORT_5_6_5, 0, 0, 0), getRGB565PixelData(0, GL_UNSIGNED_BYTE, 0, 0, 0),
			PIXEL_COMPARE_CHANNEL_RGB);

		addEntryToConversionDatabase(
			getRGB565PixelData(1, GL_UNSIGNED_BYTE, texel888_1[0], texel888_1[1], texel888_1[2]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_888_through_565_to_888_tl[0],
							   temp_888_through_565_to_888_tl[1], temp_888_through_565_to_888_tl[2]),
			getRGB565PixelData(1, GL_UNSIGNED_BYTE, texel888_2[0], texel888_2[1], texel888_2[2]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_888_through_565_to_888_tr[0],
							   temp_888_through_565_to_888_tr[1], temp_888_through_565_to_888_tr[2]),
			getRGB565PixelData(1, GL_UNSIGNED_BYTE, texel888_3[0], texel888_3[1], texel888_3[2]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_888_through_565_to_888_bl[0],
							   temp_888_through_565_to_888_bl[1], temp_888_through_565_to_888_bl[2]),
			getRGB565PixelData(1, GL_UNSIGNED_BYTE, texel888_4[0], texel888_4[1], texel888_4[2]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_888_through_565_to_888_br[0],
							   temp_888_through_565_to_888_br[1], temp_888_through_565_to_888_br[2]),
			PIXEL_COMPARE_CHANNEL_RGB);

		/* GL_RGB565 => GL_LUMINANCE8_OES */
		addEntryToConversionDatabase(
			getRGB565PixelData(1, GL_UNSIGNED_SHORT_5_6_5, texel565_1[0], texel565_1[1], texel565_1[2]),
			getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_565_to_888_tl[0]),
			getRGB565PixelData(1, GL_UNSIGNED_SHORT_5_6_5, texel565_2[0], texel565_2[1], texel565_2[2]),
			getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_565_to_888_tr[0]),
			getRGB565PixelData(1, GL_UNSIGNED_SHORT_5_6_5, texel565_3[0], texel565_3[1], texel565_3[2]),
			getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_565_to_888_bl[0]),
			getRGB565PixelData(1, GL_UNSIGNED_SHORT_5_6_5, 0, 0, 0), getLuminance8OESPixelData(GL_UNSIGNED_BYTE, 0),
			PIXEL_COMPARE_CHANNEL_R);

		addEntryToConversionDatabase(
			getRGB565PixelData(1, GL_UNSIGNED_BYTE, texel888_1[0], texel888_1[1], texel888_1[2]),
			getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_888_through_565_to_888_tl[0]),
			getRGB565PixelData(1, GL_UNSIGNED_BYTE, texel888_2[0], texel888_2[1], texel888_2[2]),
			getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_888_through_565_to_888_tr[0]),
			getRGB565PixelData(1, GL_UNSIGNED_BYTE, texel888_3[0], texel888_3[1], texel888_3[2]),
			getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_888_through_565_to_888_bl[0]),
			getRGB565PixelData(1, GL_UNSIGNED_BYTE, texel888_4[0], texel888_4[1], texel888_4[2]),
			getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_888_through_565_to_888_br[0]), PIXEL_COMPARE_CHANNEL_R);
	}

	/* GL_RGBA4 */
	{
		int texel4444_1[4] = { 15, 9, 4, 0 };
		int texel4444_2[4] = { 9, 4, 0, 15 };
		int texel4444_3[4] = { 4, 0, 15, 9 };
		int texel4444_4[4] = { 0, 15, 9, 4 };
		int texel8888_1[4] = { 255, 159, 79, 0 };
		int texel8888_2[4] = { 159, 79, 0, 255 };
		int texel8888_3[4] = { 79, 0, 255, 159 };
		int texel8888_4[4] = { 0, 255, 159, 79 };

		int temp_4444_to_565_8888_tl[4]				 = { 0 };
		int temp_4444_to_565_8888_tr[4]				 = { 0 };
		int temp_4444_to_565_8888_bl[4]				 = { 0 };
		int temp_4444_to_565_8888_br[4]				 = { 0 };
		int temp_4444_to_8888_tl[4]					 = { 0 };
		int temp_4444_to_8888_tr[4]					 = { 0 };
		int temp_4444_to_8888_bl[4]					 = { 0 };
		int temp_4444_to_8888_br[4]					 = { 0 };
		int temp_8888_through_4444_to_565_tl[4]		 = { 0 };
		int temp_8888_through_4444_to_565_tr[4]		 = { 0 };
		int temp_8888_through_4444_to_565_bl[4]		 = { 0 };
		int temp_8888_through_4444_to_565_br[4]		 = { 0 };
		int temp_8888_through_4444_to_8888_tl[4]	 = { 0 };
		int temp_8888_through_4444_to_8888_tr[4]	 = { 0 };
		int temp_8888_through_4444_to_8888_bl[4]	 = { 0 };
		int temp_8888_through_4444_to_8888_br[4]	 = { 0 };
		int temp_8888_through_4444_565_to_8888_tl[4] = { 0 };
		int temp_8888_through_4444_565_to_8888_tr[4] = { 0 };
		int temp_8888_through_4444_565_to_8888_bl[4] = { 0 };
		int temp_8888_through_4444_565_to_8888_br[4] = { 0 };

		convertNormalizedUnsignedFixedPoint(bits_4444, bits_565, bits_8888, bits_8888, texel4444_1,
											temp_4444_to_565_8888_tl);
		convertNormalizedUnsignedFixedPoint(bits_4444, bits_565, bits_8888, bits_8888, texel4444_2,
											temp_4444_to_565_8888_tr);
		convertNormalizedUnsignedFixedPoint(bits_4444, bits_565, bits_8888, bits_8888, texel4444_3,
											temp_4444_to_565_8888_bl);
		convertNormalizedUnsignedFixedPoint(bits_4444, bits_565, bits_8888, bits_8888, texel4444_4,
											temp_4444_to_565_8888_br);

		convertNormalizedUnsignedFixedPoint(bits_4444, bits_8888, bits_8888, bits_8888, texel4444_1,
											temp_4444_to_8888_tl);
		convertNormalizedUnsignedFixedPoint(bits_4444, bits_8888, bits_8888, bits_8888, texel4444_2,
											temp_4444_to_8888_tr);
		convertNormalizedUnsignedFixedPoint(bits_4444, bits_8888, bits_8888, bits_8888, texel4444_3,
											temp_4444_to_8888_bl);
		convertNormalizedUnsignedFixedPoint(bits_4444, bits_8888, bits_8888, bits_8888, texel4444_4,
											temp_4444_to_8888_br);

		convertNormalizedUnsignedFixedPoint(bits_8888, bits_4444, bits_565, bits_565, texel8888_1,
											temp_8888_through_4444_to_565_tl);
		convertNormalizedUnsignedFixedPoint(bits_8888, bits_4444, bits_565, bits_565, texel8888_2,
											temp_8888_through_4444_to_565_tr);
		convertNormalizedUnsignedFixedPoint(bits_8888, bits_4444, bits_565, bits_565, texel8888_3,
											temp_8888_through_4444_to_565_bl);
		convertNormalizedUnsignedFixedPoint(bits_8888, bits_4444, bits_565, bits_565, texel8888_4,
											temp_8888_through_4444_to_565_br);

		convertNormalizedUnsignedFixedPoint(bits_8888, bits_4444, bits_8888, bits_8888, texel8888_1,
											temp_8888_through_4444_to_8888_tl);
		convertNormalizedUnsignedFixedPoint(bits_8888, bits_4444, bits_8888, bits_8888, texel8888_2,
											temp_8888_through_4444_to_8888_tr);
		convertNormalizedUnsignedFixedPoint(bits_8888, bits_4444, bits_8888, bits_8888, texel8888_3,
											temp_8888_through_4444_to_8888_bl);
		convertNormalizedUnsignedFixedPoint(bits_8888, bits_4444, bits_8888, bits_8888, texel8888_4,
											temp_8888_through_4444_to_8888_br);

		convertNormalizedUnsignedFixedPoint(bits_8888, bits_4444, bits_565, bits_8888, texel8888_1,
											temp_8888_through_4444_565_to_8888_tl);
		convertNormalizedUnsignedFixedPoint(bits_8888, bits_4444, bits_565, bits_8888, texel8888_2,
											temp_8888_through_4444_565_to_8888_tr);
		convertNormalizedUnsignedFixedPoint(bits_8888, bits_4444, bits_565, bits_8888, texel8888_3,
											temp_8888_through_4444_565_to_8888_bl);
		convertNormalizedUnsignedFixedPoint(bits_8888, bits_4444, bits_565, bits_8888, texel8888_4,
											temp_8888_through_4444_565_to_8888_br);

		/* GL_RGBA4 => GL_RGBA4 */
		addEntryToConversionDatabase(
			getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_1[0], texel4444_1[1], texel4444_1[2],
							  texel4444_1[3]),
			getRGBA4PixelData(0, GL_UNSIGNED_BYTE, temp_4444_to_8888_tl[0], temp_4444_to_8888_tl[1],
							  temp_4444_to_8888_tl[2], temp_4444_to_8888_tl[3]),
			getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_2[0], texel4444_2[1], texel4444_2[2],
							  texel4444_2[3]),
			getRGBA4PixelData(0, GL_UNSIGNED_BYTE, temp_4444_to_8888_tr[0], temp_4444_to_8888_tr[1],
							  temp_4444_to_8888_tr[2], temp_4444_to_8888_tr[3]),
			getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_3[0], texel4444_3[1], texel4444_3[2],
							  texel4444_3[3]),
			getRGBA4PixelData(0, GL_UNSIGNED_BYTE, temp_4444_to_8888_bl[0], temp_4444_to_8888_bl[1],
							  temp_4444_to_8888_bl[2], temp_4444_to_8888_bl[3]),
			getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_4[0], texel4444_4[1], texel4444_4[2],
							  texel4444_4[3]),
			getRGBA4PixelData(0, GL_UNSIGNED_BYTE, temp_4444_to_8888_br[0], temp_4444_to_8888_br[1],
							  temp_4444_to_8888_br[2], temp_4444_to_8888_br[3]),
			PIXEL_COMPARE_CHANNEL_RGBA);

		addEntryToConversionDatabase(
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel8888_1[0], texel8888_1[1], texel8888_1[2], texel8888_1[3]),
			getRGBA4PixelData(0, GL_UNSIGNED_BYTE, temp_8888_through_4444_to_8888_tl[0],
							  temp_8888_through_4444_to_8888_tl[1], temp_8888_through_4444_to_8888_tl[2],
							  temp_8888_through_4444_to_8888_tl[3]),
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel8888_2[0], texel8888_2[1], texel8888_2[2], texel8888_2[3]),
			getRGBA4PixelData(0, GL_UNSIGNED_BYTE, temp_8888_through_4444_to_8888_tr[0],
							  temp_8888_through_4444_to_8888_tr[1], temp_8888_through_4444_to_8888_tr[2],
							  temp_8888_through_4444_to_8888_tr[3]),
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel8888_3[0], texel8888_3[1], texel8888_3[2], texel8888_3[3]),
			getRGBA4PixelData(0, GL_UNSIGNED_BYTE, temp_8888_through_4444_to_8888_bl[0],
							  temp_8888_through_4444_to_8888_bl[1], temp_8888_through_4444_to_8888_bl[2],
							  temp_8888_through_4444_to_8888_bl[3]),
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel8888_4[0], texel8888_4[1], texel8888_4[2], texel8888_4[3]),
			getRGBA4PixelData(0, GL_UNSIGNED_BYTE, temp_8888_through_4444_to_8888_br[0],
							  temp_8888_through_4444_to_8888_br[1], temp_8888_through_4444_to_8888_br[2],
							  temp_8888_through_4444_to_8888_br[3]),
			PIXEL_COMPARE_CHANNEL_RGBA);

		/* GL_RGBA4 => GL_RGB565 */
		addEntryToConversionDatabase(getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_1[0], texel4444_1[1],
													   texel4444_1[2], texel4444_1[3]),
									 getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_4444_to_565_8888_tl[0],
														temp_4444_to_565_8888_tl[1], temp_4444_to_565_8888_tl[2]),
									 getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_2[0], texel4444_2[1],
													   texel4444_2[2], texel4444_2[3]),
									 getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_4444_to_565_8888_tr[0],
														temp_4444_to_565_8888_tr[1], temp_4444_to_565_8888_tr[2]),
									 getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_3[0], texel4444_3[1],
													   texel4444_3[2], texel4444_3[3]),
									 getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_4444_to_565_8888_bl[0],
														temp_4444_to_565_8888_bl[1], temp_4444_to_565_8888_bl[2]),
									 getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_4[0], texel4444_4[1],
													   texel4444_4[2], texel4444_4[3]),
									 getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_4444_to_565_8888_br[0],
														temp_4444_to_565_8888_br[1], temp_4444_to_565_8888_br[2]),
									 PIXEL_COMPARE_CHANNEL_RGB);

		addEntryToConversionDatabase(
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel8888_1[0], texel8888_1[1], texel8888_1[2], texel8888_1[3]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_8888_through_4444_565_to_8888_tl[0],
							   temp_8888_through_4444_565_to_8888_tl[1], temp_8888_through_4444_565_to_8888_tl[2]),
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel8888_2[0], texel8888_2[1], texel8888_2[2], texel8888_2[3]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_8888_through_4444_565_to_8888_tr[0],
							   temp_8888_through_4444_565_to_8888_tr[1], temp_8888_through_4444_565_to_8888_tr[2]),
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel8888_3[0], texel8888_3[1], texel8888_3[2], texel8888_3[3]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_8888_through_4444_565_to_8888_bl[0],
							   temp_8888_through_4444_565_to_8888_bl[1], temp_8888_through_4444_565_to_8888_bl[2]),
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel8888_4[0], texel8888_4[1], texel8888_4[2], texel8888_4[3]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_8888_through_4444_565_to_8888_br[0],
							   temp_8888_through_4444_565_to_8888_br[1], temp_8888_through_4444_565_to_8888_br[2]),
			PIXEL_COMPARE_CHANNEL_RGB);

		/* GL_RGBA4 => GL_LUMINANCE8_ALPHA8_OES */
		addEntryToConversionDatabase(
			getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_1[0], texel4444_1[1], texel4444_1[2],
							  texel4444_1[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_4444_to_8888_tl[0], temp_4444_to_8888_tl[3]),
			getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_2[0], texel4444_2[1], texel4444_2[2],
							  texel4444_2[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_4444_to_8888_tr[0], temp_4444_to_8888_tr[3]),
			getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_3[0], texel4444_3[1], texel4444_3[2],
							  texel4444_3[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_4444_to_8888_bl[0], temp_4444_to_8888_bl[3]),
			getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_4[0], texel4444_4[1], texel4444_4[2],
							  texel4444_4[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_4444_to_8888_br[0], temp_4444_to_8888_br[3]),
			PIXEL_COMPARE_CHANNEL_RA);

		addEntryToConversionDatabase(
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel4444_1[0], texel4444_1[1], texel4444_1[2], texel4444_1[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_4444_to_8888_tl[0],
											temp_8888_through_4444_to_8888_tl[3]),
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel4444_2[0], texel4444_2[1], texel4444_2[2], texel4444_2[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_4444_to_8888_tr[0],
											temp_8888_through_4444_to_8888_tr[3]),
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel4444_3[0], texel4444_3[1], texel4444_3[2], texel4444_3[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_4444_to_8888_bl[0],
											temp_8888_through_4444_to_8888_bl[3]),
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel4444_4[0], texel4444_4[1], texel4444_4[2], texel4444_4[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_4444_to_8888_br[0],
											temp_8888_through_4444_to_8888_br[3]),
			PIXEL_COMPARE_CHANNEL_RA);

		/* GL_RGBA4 => GL_LUMINANCE8_OES */
		addEntryToConversionDatabase(getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_1[0], texel4444_1[1],
													   texel4444_1[2], texel4444_1[3]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_4444_to_8888_tl[0]),
									 getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_2[0], texel4444_2[1],
													   texel4444_2[2], texel4444_2[3]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_4444_to_8888_tr[0]),
									 getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_3[0], texel4444_3[1],
													   texel4444_3[2], texel4444_3[3]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_4444_to_8888_bl[0]),
									 getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_4[0], texel4444_4[1],
													   texel4444_4[2], texel4444_4[3]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_4444_to_8888_br[0]),
									 PIXEL_COMPARE_CHANNEL_R);

		addEntryToConversionDatabase(
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel4444_1[0], texel4444_1[1], texel4444_1[2], texel4444_1[3]),
			getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_4444_to_8888_tl[0]),
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel4444_2[0], texel4444_2[1], texel4444_2[2], texel4444_2[3]),
			getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_4444_to_8888_tr[0]),
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel4444_3[0], texel4444_3[1], texel4444_3[2], texel4444_3[3]),
			getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_4444_to_8888_bl[0]),
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel4444_4[0], texel4444_4[1], texel4444_4[2], texel4444_4[3]),
			getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_4444_to_8888_br[0]), PIXEL_COMPARE_CHANNEL_R);

		/* GL_RGBA4 => GL_ALPHA8_OES */
		addEntryToConversionDatabase(getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_1[0], texel4444_1[1],
													   texel4444_1[2], texel4444_1[3]),
									 getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_4444_to_8888_tl[3]),
									 getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_2[0], texel4444_2[1],
													   texel4444_2[2], texel4444_2[3]),
									 getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_4444_to_8888_tr[3]),
									 getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_3[0], texel4444_3[1],
													   texel4444_3[2], texel4444_3[3]),
									 getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_4444_to_8888_bl[3]),
									 getRGBA4PixelData(1, GL_UNSIGNED_SHORT_4_4_4_4, texel4444_4[0], texel4444_4[1],
													   texel4444_4[2], texel4444_4[3]),
									 getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_4444_to_8888_br[3]),
									 PIXEL_COMPARE_CHANNEL_A);

		addEntryToConversionDatabase(
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel4444_1[0], texel4444_1[1], texel4444_1[2], texel4444_1[3]),
			getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_4444_to_8888_tl[3]),
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel4444_2[0], texel4444_2[1], texel4444_2[2], texel4444_2[3]),
			getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_4444_to_8888_tr[3]),
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel4444_3[0], texel4444_3[1], texel4444_3[2], texel4444_3[3]),
			getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_4444_to_8888_bl[3]),
			getRGBA4PixelData(1, GL_UNSIGNED_BYTE, texel4444_4[0], texel4444_4[1], texel4444_4[2], texel4444_4[3]),
			getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_4444_to_8888_br[3]), PIXEL_COMPARE_CHANNEL_A);
	}

	/* GL_RGB5_A1 */
	{
		int texel2101010_1[4] = { 1023, 703, 383, 2 };
		int texel2101010_2[4] = { 703, 383, 0, 0 };
		int texel2101010_3[4] = { 383, 0, 1023, 2 };
		int texel2101010_4[4] = { 0, 1023, 703, 0 };
		int texel5551_1[4]	= { 31, 21, 11, 1 };
		int texel5551_2[4]	= { 21, 11, 0, 0 };
		int texel5551_3[4]	= { 11, 0, 31, 1 };
		int texel5551_4[4]	= { 0, 31, 21, 0 };
		int texel8888_1[4]	= { 255, 207, 95, 255 };
		int texel8888_2[4]	= { 207, 95, 0, 0 };
		int texel8888_3[4]	= { 95, 0, 255, 255 };
		int texel8888_4[4]	= { 0, 255, 207, 0 };

		int temp_2101010rev_through_5551_to_8888_tl[4]	 = { 0 };
		int temp_2101010rev_through_5551_to_8888_tr[4]	 = { 0 };
		int temp_2101010rev_through_5551_to_8888_bl[4]	 = { 0 };
		int temp_2101010rev_through_5551_to_8888_br[4]	 = { 0 };
		int temp_2101010rev_through_5551_565_to_8888_tl[4] = { 0 };
		int temp_2101010rev_through_5551_565_to_8888_tr[4] = { 0 };
		int temp_2101010rev_through_5551_565_to_8888_bl[4] = { 0 };
		int temp_2101010rev_through_5551_565_to_8888_br[4] = { 0 };
		int temp_5551_to_8888_tl[4]						   = { 0 };
		int temp_5551_to_8888_tr[4]						   = { 0 };
		int temp_5551_to_8888_bl[4]						   = { 0 };
		int temp_5551_to_8888_br[4]						   = { 0 };
		int temp_5551_through_565_to_8888_tl[4]			   = { 0 };
		int temp_5551_through_565_to_8888_tr[4]			   = { 0 };
		int temp_5551_through_565_to_8888_bl[4]			   = { 0 };
		int temp_5551_through_565_to_8888_br[4]			   = { 0 };
		int temp_8888_through_5551_to_8888_tl[4]		   = { 0 };
		int temp_8888_through_5551_to_8888_tr[4]		   = { 0 };
		int temp_8888_through_5551_to_8888_bl[4]		   = { 0 };
		int temp_8888_through_5551_to_8888_br[4]		   = { 0 };
		int temp_8888_through_5551_565_to_8888_tl[4]	   = { 0 };
		int temp_8888_through_5551_565_to_8888_tr[4]	   = { 0 };
		int temp_8888_through_5551_565_to_8888_bl[4]	   = { 0 };
		int temp_8888_through_5551_565_to_8888_br[4]	   = { 0 };

		convertNormalizedUnsignedFixedPoint(bits_1010102, bits_5551, bits_8888, bits_8888, texel2101010_1,
											temp_2101010rev_through_5551_to_8888_tl);
		convertNormalizedUnsignedFixedPoint(bits_1010102, bits_5551, bits_8888, bits_8888, texel2101010_2,
											temp_2101010rev_through_5551_to_8888_tr);
		convertNormalizedUnsignedFixedPoint(bits_1010102, bits_5551, bits_8888, bits_8888, texel2101010_3,
											temp_2101010rev_through_5551_to_8888_bl);
		convertNormalizedUnsignedFixedPoint(bits_1010102, bits_5551, bits_8888, bits_8888, texel2101010_4,
											temp_2101010rev_through_5551_to_8888_br);

		convertNormalizedUnsignedFixedPoint(bits_1010102, bits_5551, bits_565, bits_8888, texel2101010_1,
											temp_2101010rev_through_5551_565_to_8888_tl);
		convertNormalizedUnsignedFixedPoint(bits_1010102, bits_5551, bits_565, bits_8888, texel2101010_2,
											temp_2101010rev_through_5551_565_to_8888_tr);
		convertNormalizedUnsignedFixedPoint(bits_1010102, bits_5551, bits_565, bits_8888, texel2101010_3,
											temp_2101010rev_through_5551_565_to_8888_bl);
		convertNormalizedUnsignedFixedPoint(bits_1010102, bits_5551, bits_565, bits_8888, texel2101010_4,
											temp_2101010rev_through_5551_565_to_8888_br);

		convertNormalizedUnsignedFixedPoint(bits_5551, bits_8888, bits_8888, bits_8888, texel5551_1,
											temp_5551_to_8888_tl);
		convertNormalizedUnsignedFixedPoint(bits_5551, bits_8888, bits_8888, bits_8888, texel5551_2,
											temp_5551_to_8888_tr);
		convertNormalizedUnsignedFixedPoint(bits_5551, bits_8888, bits_8888, bits_8888, texel5551_3,
											temp_5551_to_8888_bl);
		convertNormalizedUnsignedFixedPoint(bits_5551, bits_8888, bits_8888, bits_8888, texel5551_4,
											temp_5551_to_8888_br);

		convertNormalizedUnsignedFixedPoint(bits_8888, bits_5551, bits_8888, bits_8888, texel8888_1,
											temp_8888_through_5551_to_8888_tl);
		convertNormalizedUnsignedFixedPoint(bits_8888, bits_5551, bits_8888, bits_8888, texel8888_2,
											temp_8888_through_5551_to_8888_tr);
		convertNormalizedUnsignedFixedPoint(bits_8888, bits_5551, bits_8888, bits_8888, texel8888_3,
											temp_8888_through_5551_to_8888_bl);
		convertNormalizedUnsignedFixedPoint(bits_8888, bits_5551, bits_8888, bits_8888, texel8888_4,
											temp_8888_through_5551_to_8888_br);

		convertNormalizedUnsignedFixedPoint(bits_8888, bits_5551, bits_565, bits_8888, texel8888_1,
											temp_8888_through_5551_565_to_8888_tl);
		convertNormalizedUnsignedFixedPoint(bits_8888, bits_5551, bits_565, bits_8888, texel8888_2,
											temp_8888_through_5551_565_to_8888_tr);
		convertNormalizedUnsignedFixedPoint(bits_8888, bits_5551, bits_565, bits_8888, texel8888_3,
											temp_8888_through_5551_565_to_8888_bl);
		convertNormalizedUnsignedFixedPoint(bits_8888, bits_5551, bits_565, bits_8888, texel8888_4,
											temp_8888_through_5551_565_to_8888_br);

		convertNormalizedUnsignedFixedPoint(bits_5551, bits_565, bits_8888, bits_8888, texel5551_1,
											temp_5551_through_565_to_8888_tl);
		convertNormalizedUnsignedFixedPoint(bits_5551, bits_565, bits_8888, bits_8888, texel5551_2,
											temp_5551_through_565_to_8888_tr);
		convertNormalizedUnsignedFixedPoint(bits_5551, bits_565, bits_8888, bits_8888, texel5551_3,
											temp_5551_through_565_to_8888_bl);
		convertNormalizedUnsignedFixedPoint(bits_5551, bits_565, bits_8888, bits_8888, texel5551_4,
											temp_5551_through_565_to_8888_br);

		/* GL_RGB5_A1 => GL_RGB5_A1 */
		addEntryToConversionDatabase(
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_1[0], texel8888_1[1], texel8888_1[2], texel8888_1[3]),
			getRGB5A1PixelData(0, GL_UNSIGNED_BYTE, temp_8888_through_5551_to_8888_tl[0],
							   temp_8888_through_5551_to_8888_tl[1], temp_8888_through_5551_to_8888_tl[2],
							   temp_8888_through_5551_to_8888_tl[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_2[0], texel8888_2[1], texel8888_2[2], texel8888_2[3]),
			getRGB5A1PixelData(0, GL_UNSIGNED_BYTE, temp_8888_through_5551_to_8888_tr[0],
							   temp_8888_through_5551_to_8888_tr[1], temp_8888_through_5551_to_8888_tr[2],
							   temp_8888_through_5551_to_8888_tr[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_3[0], texel8888_3[1], texel8888_3[2], texel8888_3[3]),
			getRGB5A1PixelData(0, GL_UNSIGNED_BYTE, temp_8888_through_5551_to_8888_bl[0],
							   temp_8888_through_5551_to_8888_bl[1], temp_8888_through_5551_to_8888_bl[2],
							   temp_8888_through_5551_to_8888_bl[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_4[0], texel8888_4[1], texel8888_4[2], texel8888_4[3]),
			getRGB5A1PixelData(0, GL_UNSIGNED_BYTE, temp_8888_through_5551_to_8888_br[0],
							   temp_8888_through_5551_to_8888_br[1], temp_8888_through_5551_to_8888_br[2],
							   temp_8888_through_5551_to_8888_br[3]),
			PIXEL_COMPARE_CHANNEL_RGBA);

		addEntryToConversionDatabase(
			getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_1[0], texel5551_1[1], texel5551_1[2],
							   texel5551_1[3]),
			getRGB5A1PixelData(0, GL_UNSIGNED_BYTE, temp_5551_to_8888_tl[0], temp_5551_to_8888_tl[1],
							   temp_5551_to_8888_tl[2], temp_5551_to_8888_tl[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_2[0], texel5551_2[1], texel5551_2[2],
							   texel5551_2[3]),
			getRGB5A1PixelData(0, GL_UNSIGNED_BYTE, temp_5551_to_8888_tr[0], temp_5551_to_8888_tr[1],
							   temp_5551_to_8888_tr[2], temp_5551_to_8888_tr[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_3[0], texel5551_3[1], texel5551_3[2],
							   texel5551_3[3]),
			getRGB5A1PixelData(0, GL_UNSIGNED_BYTE, temp_5551_to_8888_bl[0], temp_5551_to_8888_bl[1],
							   temp_5551_to_8888_bl[2], temp_5551_to_8888_bl[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_4[0], texel5551_4[1], texel5551_4[2],
							   texel5551_4[3]),
			getRGB5A1PixelData(0, GL_UNSIGNED_BYTE, temp_5551_to_8888_br[0], temp_5551_to_8888_br[1],
							   temp_5551_to_8888_br[2], temp_5551_to_8888_br[3]),
			PIXEL_COMPARE_CHANNEL_RGBA);

		addEntryToConversionDatabase(
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_1[0], texel2101010_1[1],
							   texel2101010_1[2], texel2101010_1[3]),
			getRGB5A1PixelData(0, GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_to_8888_tl[0],
							   temp_2101010rev_through_5551_to_8888_tl[1], temp_2101010rev_through_5551_to_8888_tl[2],
							   temp_2101010rev_through_5551_to_8888_tl[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_2[0], texel2101010_2[1],
							   texel2101010_2[2], texel2101010_2[3]),
			getRGB5A1PixelData(0, GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_to_8888_tr[0],
							   temp_2101010rev_through_5551_to_8888_tr[1], temp_2101010rev_through_5551_to_8888_tr[2],
							   temp_2101010rev_through_5551_to_8888_tr[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_3[0], texel2101010_3[1],
							   texel2101010_3[2], texel2101010_3[3]),
			getRGB5A1PixelData(0, GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_to_8888_bl[0],
							   temp_2101010rev_through_5551_to_8888_bl[1], temp_2101010rev_through_5551_to_8888_bl[2],
							   temp_2101010rev_through_5551_to_8888_bl[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_4[0], texel2101010_4[1],
							   texel2101010_4[2], texel2101010_4[3]),
			getRGB5A1PixelData(0, GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_to_8888_br[0],
							   temp_2101010rev_through_5551_to_8888_br[1], temp_2101010rev_through_5551_to_8888_br[2],
							   temp_2101010rev_through_5551_to_8888_br[3]),
			PIXEL_COMPARE_CHANNEL_RGBA);

		/* GL_RGB5_A1 => GL_RGB565 */
		addEntryToConversionDatabase(
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_1[0], texel8888_1[1], texel8888_1[2], texel8888_1[3]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_8888_through_5551_565_to_8888_tl[0],
							   temp_8888_through_5551_565_to_8888_tl[1], temp_8888_through_5551_565_to_8888_tl[2]),
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_2[0], texel8888_2[1], texel8888_2[2], texel8888_2[3]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_8888_through_5551_565_to_8888_tr[0],
							   temp_8888_through_5551_565_to_8888_tr[1], temp_8888_through_5551_565_to_8888_tr[2]),
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_3[0], texel8888_3[1], texel8888_3[2], texel8888_3[3]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_8888_through_5551_565_to_8888_bl[0],
							   temp_8888_through_5551_565_to_8888_bl[1], temp_8888_through_5551_565_to_8888_bl[2]),
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_4[0], texel8888_4[1], texel8888_4[2], texel8888_4[3]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_8888_through_5551_565_to_8888_br[0],
							   temp_8888_through_5551_565_to_8888_br[1], temp_8888_through_5551_565_to_8888_br[2]),
			PIXEL_COMPARE_CHANNEL_RGB);

		addEntryToConversionDatabase(
			getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_1[0], texel5551_1[1], texel5551_1[2],
							   texel5551_1[3]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_5551_through_565_to_8888_tl[0],
							   temp_5551_through_565_to_8888_tl[1], temp_5551_through_565_to_8888_tl[2]),
			getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_2[0], texel5551_2[1], texel5551_2[2],
							   texel5551_2[3]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_5551_through_565_to_8888_tr[0],
							   temp_5551_through_565_to_8888_tr[1], temp_5551_through_565_to_8888_tr[2]),
			getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_3[0], texel5551_3[1], texel5551_3[2],
							   texel5551_3[3]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_5551_through_565_to_8888_bl[0],
							   temp_5551_through_565_to_8888_bl[1], temp_5551_through_565_to_8888_bl[2]),
			getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_4[0], texel5551_4[1], texel5551_4[2],
							   texel5551_4[3]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_5551_through_565_to_8888_br[0],
							   temp_5551_through_565_to_8888_br[1], temp_5551_through_565_to_8888_br[2]),
			PIXEL_COMPARE_CHANNEL_RGB);

		addEntryToConversionDatabase(
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_1[0], texel2101010_1[1],
							   texel2101010_1[2], texel2101010_1[3]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_565_to_8888_tl[0],
							   temp_2101010rev_through_5551_565_to_8888_tl[1],
							   temp_2101010rev_through_5551_565_to_8888_tl[2]),
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_2[0], texel2101010_2[1],
							   texel2101010_2[2], texel2101010_2[3]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_565_to_8888_tr[0],
							   temp_2101010rev_through_5551_565_to_8888_tr[1],
							   temp_2101010rev_through_5551_565_to_8888_tr[2]),
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_3[0], texel2101010_3[1],
							   texel2101010_3[2], texel2101010_3[3]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_565_to_8888_bl[0],
							   temp_2101010rev_through_5551_565_to_8888_bl[1],
							   temp_2101010rev_through_5551_565_to_8888_bl[2]),
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_4[0], texel2101010_4[1],
							   texel2101010_4[2], texel2101010_4[3]),
			getRGB565PixelData(0, GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_565_to_8888_br[0],
							   temp_2101010rev_through_5551_565_to_8888_br[1],
							   temp_2101010rev_through_5551_565_to_8888_br[2]),
			PIXEL_COMPARE_CHANNEL_RGB);

		/* GL_RGB5_A1 => GL_LUMINANCE8_ALPHA8_OES */
		addEntryToConversionDatabase(
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_1[0], texel8888_1[1], texel8888_1[2], texel8888_1[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_5551_to_8888_tl[0],
											temp_8888_through_5551_to_8888_tl[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_2[0], texel8888_2[1], texel8888_2[2], texel8888_2[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_5551_to_8888_tr[0],
											temp_8888_through_5551_to_8888_tr[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_3[0], texel8888_3[1], texel8888_3[2], texel8888_3[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_5551_to_8888_bl[0],
											temp_8888_through_5551_to_8888_bl[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_4[0], texel8888_4[1], texel8888_4[2], texel8888_4[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_5551_to_8888_br[0],
											temp_8888_through_5551_to_8888_br[3]),
			PIXEL_COMPARE_CHANNEL_RA);

		addEntryToConversionDatabase(
			getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_1[0], texel5551_1[1], texel5551_1[2],
							   texel5551_1[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_5551_to_8888_tl[0], temp_5551_to_8888_tl[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_2[0], texel5551_2[1], texel5551_2[2],
							   texel5551_2[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_5551_to_8888_tr[0], temp_5551_to_8888_tr[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_3[0], texel5551_3[1], texel5551_3[2],
							   texel5551_3[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_5551_to_8888_bl[0], temp_5551_to_8888_bl[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_4[0], texel5551_4[1], texel5551_4[2],
							   texel5551_4[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_5551_to_8888_br[0], temp_5551_to_8888_br[3]),
			PIXEL_COMPARE_CHANNEL_RA);

		addEntryToConversionDatabase(
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_1[0], texel2101010_1[1],
							   texel2101010_1[2], texel2101010_1[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_to_8888_tl[0],
											temp_2101010rev_through_5551_to_8888_tl[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_2[0], texel2101010_2[1],
							   texel2101010_2[2], texel2101010_2[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_to_8888_tr[0],
											temp_2101010rev_through_5551_to_8888_tr[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_3[0], texel2101010_3[1],
							   texel2101010_3[2], texel2101010_3[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_to_8888_bl[0],
											temp_2101010rev_through_5551_to_8888_bl[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_4[0], texel2101010_4[1],
							   texel2101010_4[2], texel2101010_4[3]),
			getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_to_8888_br[0],
											temp_2101010rev_through_5551_to_8888_br[3]),
			PIXEL_COMPARE_CHANNEL_RA);

		/* GL_RGB5_A1 => GL_LUMINANCE8_OES */
		addEntryToConversionDatabase(
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_1[0], texel8888_1[1], texel8888_1[2], texel8888_1[3]),
			getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_5551_to_8888_tl[0]),
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_2[0], texel8888_2[1], texel8888_2[2], texel8888_2[3]),
			getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_5551_to_8888_tr[0]),
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_3[0], texel8888_3[1], texel8888_3[2], texel8888_3[3]),
			getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_5551_to_8888_bl[0]),
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_4[0], texel8888_4[1], texel8888_4[2], texel8888_4[3]),
			getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_5551_to_8888_br[0]), PIXEL_COMPARE_CHANNEL_R);

		addEntryToConversionDatabase(getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_1[0], texel5551_1[1],
														texel5551_1[2], texel5551_1[3]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_5551_to_8888_tl[0]),
									 getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_2[0], texel5551_2[1],
														texel5551_2[2], texel5551_2[3]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_5551_to_8888_tr[0]),
									 getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_3[0], texel5551_3[1],
														texel5551_3[2], texel5551_3[3]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_5551_to_8888_bl[0]),
									 getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_4[0], texel5551_4[1],
														texel5551_4[2], texel5551_4[3]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_5551_to_8888_br[0]),
									 PIXEL_COMPARE_CHANNEL_R);

		addEntryToConversionDatabase(
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_1[0], texel2101010_1[1],
							   texel2101010_1[2], texel2101010_1[3]),
			getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_to_8888_tl[0]),
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_2[0], texel2101010_2[1],
							   texel2101010_2[2], texel2101010_2[3]),
			getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_to_8888_tr[0]),
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_3[0], texel2101010_3[1],
							   texel2101010_3[2], texel2101010_3[3]),
			getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_to_8888_bl[0]),
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_4[0], texel2101010_4[1],
							   texel2101010_4[2], texel2101010_4[3]),
			getLuminance8OESPixelData(GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_to_8888_br[0]),
			PIXEL_COMPARE_CHANNEL_R);

		/* GL_RGB5_A1 => GL_ALPHA8_OES */
		addEntryToConversionDatabase(
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_1[0], texel8888_1[1], texel8888_1[2], texel8888_1[3]),
			getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_5551_to_8888_tl[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_2[0], texel8888_2[1], texel8888_2[2], texel8888_2[3]),
			getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_5551_to_8888_tr[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_3[0], texel8888_3[1], texel8888_3[2], texel8888_3[3]),
			getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_5551_to_8888_bl[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_BYTE, texel8888_4[0], texel8888_4[1], texel8888_4[2], texel8888_4[3]),
			getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_8888_through_5551_to_8888_br[3]), PIXEL_COMPARE_CHANNEL_A);

		addEntryToConversionDatabase(getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_1[0], texel5551_1[1],
														texel5551_1[2], texel5551_1[3]),
									 getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_5551_to_8888_tl[3]),
									 getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_2[0], texel5551_2[1],
														texel5551_2[2], texel5551_2[3]),
									 getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_5551_to_8888_tr[3]),
									 getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_3[0], texel5551_3[1],
														texel5551_3[2], texel5551_3[3]),
									 getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_5551_to_8888_bl[3]),
									 getRGB5A1PixelData(1, GL_UNSIGNED_SHORT_5_5_5_1, texel5551_4[0], texel5551_4[1],
														texel5551_4[2], texel5551_4[3]),
									 getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_5551_to_8888_br[3]),
									 PIXEL_COMPARE_CHANNEL_A);

		addEntryToConversionDatabase(
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_1[0], texel2101010_1[1],
							   texel2101010_1[2], texel2101010_1[3]),
			getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_to_8888_tl[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_2[0], texel2101010_2[1],
							   texel2101010_2[2], texel2101010_2[3]),
			getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_to_8888_tr[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_3[0], texel2101010_3[1],
							   texel2101010_3[2], texel2101010_3[3]),
			getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_to_8888_bl[3]),
			getRGB5A1PixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2101010_4[0], texel2101010_4[1],
							   texel2101010_4[2], texel2101010_4[3]),
			getAlpha8OESPixelData(GL_UNSIGNED_BYTE, temp_2101010rev_through_5551_to_8888_br[3]),
			PIXEL_COMPARE_CHANNEL_A);
	}

	/* GL_RGBA8 */
	{
		const unsigned char texel1[4] = { 255, 127, 63, 0 };
		const unsigned char texel2[4] = { 127, 63, 0, 255 };
		const unsigned char texel3[4] = { 63, 0, 255, 127 };
		const unsigned char texel4[4] = { 0, 255, 127, 63 };

		/* GL_RGBA8 => GL_RGBA8 */
		addEntryToConversionDatabase(getRGBA8PixelData(GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2], texel4[3]),
									 PIXEL_COMPARE_CHANNEL_RGBA);

		/* GL_RGBA8 => GL_RGB8 */
		addEntryToConversionDatabase(getRGBA8PixelData(GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGB8PixelData(0, GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGB8PixelData(0, GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGB8PixelData(0, GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRGB8PixelData(0, GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2]),
									 PIXEL_COMPARE_CHANNEL_RGB);

		/* GL_RGBA8 => GL_LUMINANCE8_ALPHA8_OES */
		addEntryToConversionDatabase(getRGBA8PixelData(GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, texel1[0], texel1[3]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, texel2[0], texel2[3]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, texel3[0], texel3[3]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getLuminance8Alpha8OESPixelData(GL_UNSIGNED_BYTE, texel4[0], texel4[3]),
									 PIXEL_COMPARE_CHANNEL_RA);

		/* GL_RGBA8 => GL_LUMINANCE8_OES */
		addEntryToConversionDatabase(getRGBA8PixelData(GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, texel1[0]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, texel2[0]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, texel3[0]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getLuminance8OESPixelData(GL_UNSIGNED_BYTE, texel4[0]), PIXEL_COMPARE_CHANNEL_R);

		/* GL_RGBA8 => GL_ALPHA8_OES */
		addEntryToConversionDatabase(getRGBA8PixelData(GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getAlpha8OESPixelData(GL_UNSIGNED_BYTE, texel1[3]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getAlpha8OESPixelData(GL_UNSIGNED_BYTE, texel2[3]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getAlpha8OESPixelData(GL_UNSIGNED_BYTE, texel3[3]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getAlpha8OESPixelData(GL_UNSIGNED_BYTE, texel4[3]), PIXEL_COMPARE_CHANNEL_A);

		/* GL_RGBA8 => GL_R8 */
		addEntryToConversionDatabase(getRGBA8PixelData(GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getR8PixelData(0, GL_UNSIGNED_BYTE, texel1[0]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getR8PixelData(0, GL_UNSIGNED_BYTE, texel2[0]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getR8PixelData(0, GL_UNSIGNED_BYTE, texel3[0]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getR8PixelData(0, GL_UNSIGNED_BYTE, texel4[0]), PIXEL_COMPARE_CHANNEL_R);

		/* GL_RGBA8 => GL_RG8 */
		addEntryToConversionDatabase(getRGBA8PixelData(GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRG8PixelData(0, GL_UNSIGNED_BYTE, texel1[0], texel1[1]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRG8PixelData(0, GL_UNSIGNED_BYTE, texel2[0], texel2[1]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRG8PixelData(0, GL_UNSIGNED_BYTE, texel3[0], texel3[1]),
									 getRGBA8PixelData(GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRG8PixelData(0, GL_UNSIGNED_BYTE, texel4[0], texel4[1]),
									 PIXEL_COMPARE_CHANNEL_RG);
	}

	/* GL_RGB10_A2 */
	{
		const unsigned short texel1[4] = { 1023, 682, 341, 3 };
		const unsigned short texel2[4] = { 682, 341, 0, 2 };
		const unsigned short texel3[4] = { 341, 0, 1023, 1 };
		const unsigned short texel4[4] = { 0, 1023, 682, 0 };

		/* GL_RGB10_A2 => GL_RGB10_A2 */
		addEntryToConversionDatabase(getRGB10A2PixelData(GL_UNSIGNED_INT_2_10_10_10_REV, texel1[0], texel1[1],
														 texel1[2], (unsigned char)texel1[3]),
									 getRGB10A2PixelData(GL_UNSIGNED_INT_2_10_10_10_REV, texel1[0], texel1[1],
														 texel1[2], (unsigned char)texel1[3]),
									 getRGB10A2PixelData(GL_UNSIGNED_INT_2_10_10_10_REV, texel2[0], texel2[1],
														 texel2[2], (unsigned char)texel2[3]),
									 getRGB10A2PixelData(GL_UNSIGNED_INT_2_10_10_10_REV, texel2[0], texel2[1],
														 texel2[2], (unsigned char)texel2[3]),
									 getRGB10A2PixelData(GL_UNSIGNED_INT_2_10_10_10_REV, texel3[0], texel3[1],
														 texel3[2], (unsigned char)texel3[3]),
									 getRGB10A2PixelData(GL_UNSIGNED_INT_2_10_10_10_REV, texel3[0], texel3[1],
														 texel3[2], (unsigned char)texel3[3]),
									 getRGB10A2PixelData(GL_UNSIGNED_INT_2_10_10_10_REV, texel4[0], texel4[1],
														 texel4[2], (unsigned char)texel4[3]),
									 getRGB10A2PixelData(GL_UNSIGNED_INT_2_10_10_10_REV, texel4[0], texel4[1],
														 texel4[2], (unsigned char)texel4[3]),
									 PIXEL_COMPARE_CHANNEL_RGBA);
	}

	/* GL_RGB10_A2UI */
	{
		const unsigned short texel1[4] = { 1023, 682, 341, 3 };
		const unsigned short texel2[4] = { 682, 341, 0, 2 };
		const unsigned short texel3[4] = { 341, 0, 1023, 1 };
		const unsigned short texel4[4] = { 0, 1023, 682, 0 };

		/* GL_RGB10_A2UI => GL_RGB10_A2UI */
		addEntryToConversionDatabase(
			getRGB10A2UIPixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel1[0], texel1[1], texel1[2], texel1[3]),
			getRGB10A2UIPixelData(0, GL_UNSIGNED_INT, texel1[0], texel1[1], texel1[2], texel1[3]),
			getRGB10A2UIPixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel2[0], texel2[1], texel2[2], texel2[3]),
			getRGB10A2UIPixelData(0, GL_UNSIGNED_INT, texel2[0], texel2[1], texel2[2], texel2[3]),
			getRGB10A2UIPixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel3[0], texel3[1], texel3[2], texel3[3]),
			getRGB10A2UIPixelData(0, GL_UNSIGNED_INT, texel3[0], texel3[1], texel3[2], texel3[3]),
			getRGB10A2UIPixelData(1, GL_UNSIGNED_INT_2_10_10_10_REV, texel4[0], texel4[1], texel4[2], texel4[3]),
			getRGB10A2UIPixelData(0, GL_UNSIGNED_INT, texel4[0], texel4[1], texel4[2], texel4[3]),
			PIXEL_COMPARE_CHANNEL_RGBA);
	}

	/* GL_SRGB8_ALPHA8 */
	{
		const unsigned char texel1[4] = { 255, 127, 63, 0 };
		const unsigned char texel2[4] = { 127, 63, 0, 255 };
		const unsigned char texel3[4] = { 63, 0, 255, 127 };
		const unsigned char texel4[4] = { 0, 255, 127, 63 };

		/* GL_SRGB8_ALPHA8 => GL_SRGB8 */
		addEntryToConversionDatabase(
			getSRGB8Alpha8PixelData(GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2], texel1[3]),
			getSRGB8PixelData(0, GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2]),
			getSRGB8Alpha8PixelData(GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2], texel2[3]),
			getSRGB8PixelData(0, GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2]),
			getSRGB8Alpha8PixelData(GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2], texel3[3]),
			getSRGB8PixelData(0, GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2]),
			getSRGB8Alpha8PixelData(GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2], texel4[3]),
			getSRGB8PixelData(0, GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2]), PIXEL_COMPARE_CHANNEL_RGB);

		/* GL_SRGB8_ALPHA8 => GL_SRGB8_ALPHA8 */
		addEntryToConversionDatabase(
			getSRGB8Alpha8PixelData(GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2], texel1[3]),
			getSRGB8Alpha8PixelData(GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2], texel1[3]),
			getSRGB8Alpha8PixelData(GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2], texel2[3]),
			getSRGB8Alpha8PixelData(GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2], texel2[3]),
			getSRGB8Alpha8PixelData(GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2], texel3[3]),
			getSRGB8Alpha8PixelData(GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2], texel3[3]),
			getSRGB8Alpha8PixelData(GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2], texel4[3]),
			getSRGB8Alpha8PixelData(GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2], texel4[3]),
			PIXEL_COMPARE_CHANNEL_RGBA);
	}

	/* GL_R8I */
	{
		const signed char texel1[1] = { 127 };
		const signed char texel2[1] = { 42 };
		const signed char texel3[1] = { -43 };
		const signed char texel4[1] = { -127 };

		/* GL_R8I => GL_R8I */
		addEntryToConversionDatabase(getR8IPixelData(1, GL_BYTE, texel1[0]), getR8IPixelData(0, GL_INT, texel1[0]),
									 getR8IPixelData(1, GL_BYTE, texel2[0]), getR8IPixelData(0, GL_INT, texel2[0]),
									 getR8IPixelData(1, GL_BYTE, texel3[0]), getR8IPixelData(0, GL_INT, texel3[0]),
									 getR8IPixelData(1, GL_BYTE, texel4[0]), getR8IPixelData(0, GL_INT, texel4[0]),
									 PIXEL_COMPARE_CHANNEL_R);
	}

	/* GL_R8UI */
	{
		const unsigned char texel1[1] = { 255 };
		const unsigned char texel2[1] = { 127 };
		const unsigned char texel3[1] = { 63 };
		const unsigned char texel4[1] = { 0 };

		/* GL_R8UI => GL_R8UI */
		addEntryToConversionDatabase(
			getR8UIPixelData(1, GL_UNSIGNED_BYTE, texel1[0]), getR8UIPixelData(0, GL_UNSIGNED_INT, texel1[0]),
			getR8UIPixelData(1, GL_UNSIGNED_BYTE, texel2[0]), getR8UIPixelData(0, GL_UNSIGNED_INT, texel2[0]),
			getR8UIPixelData(1, GL_UNSIGNED_BYTE, texel3[0]), getR8UIPixelData(0, GL_UNSIGNED_INT, texel3[0]),
			getR8UIPixelData(1, GL_UNSIGNED_BYTE, texel4[0]), getR8UIPixelData(0, GL_UNSIGNED_INT, texel4[0]),
			PIXEL_COMPARE_CHANNEL_R);
	}

	/* GL_R16I */
	{
		const signed short texel1[1] = { 32767 };
		const signed short texel2[1] = { 10922 };
		const signed short texel3[1] = { -10923 };
		const signed short texel4[1] = { -32767 };

		/* GL_R16I => GL_R16I */
		addEntryToConversionDatabase(getR16IPixelData(1, GL_SHORT, texel1[0]), getR16IPixelData(0, GL_INT, texel1[0]),
									 getR16IPixelData(1, GL_SHORT, texel2[0]), getR16IPixelData(0, GL_INT, texel2[0]),
									 getR16IPixelData(1, GL_SHORT, texel3[0]), getR16IPixelData(0, GL_INT, texel3[0]),
									 getR16IPixelData(1, GL_SHORT, texel4[0]), getR16IPixelData(0, GL_INT, texel4[0]),
									 PIXEL_COMPARE_CHANNEL_R);
	}

	/* GL_R16UI */
	{
		const unsigned short texel1[1] = { 65535 };
		const unsigned short texel2[1] = { 43690 };
		const unsigned short texel3[1] = { 21845 };
		const unsigned short texel4[1] = { 0 };

		/* GL_R16UI => GL_R16UI */
		addEntryToConversionDatabase(
			getR16UIPixelData(1, GL_UNSIGNED_SHORT, texel1[0]), getR16UIPixelData(0, GL_UNSIGNED_INT, texel1[0]),
			getR16UIPixelData(1, GL_UNSIGNED_SHORT, texel2[0]), getR16UIPixelData(0, GL_UNSIGNED_INT, texel2[0]),
			getR16UIPixelData(1, GL_UNSIGNED_SHORT, texel3[0]), getR16UIPixelData(0, GL_UNSIGNED_INT, texel3[0]),
			getR16UIPixelData(1, GL_UNSIGNED_SHORT, texel4[0]), getR16UIPixelData(0, GL_UNSIGNED_INT, texel4[0]),
			PIXEL_COMPARE_CHANNEL_R);
	}

	/* GL_R32I */
	{
		const int texel1[1] = { 2147483647l };
		const int texel2[1] = { 715827883l };
		const int texel3[1] = { -715827881l };
		const int texel4[1] = { -2147483647l };

		/* GL_R32I => GL_R32I */
		addEntryToConversionDatabase(getR32IPixelData(1, GL_INT, texel1[0]), getR32IPixelData(0, GL_INT, texel1[0]),
									 getR32IPixelData(1, GL_INT, texel2[0]), getR32IPixelData(0, GL_INT, texel2[0]),
									 getR32IPixelData(1, GL_INT, texel3[0]), getR32IPixelData(0, GL_INT, texel3[0]),
									 getR32IPixelData(1, GL_INT, texel4[0]), getR32IPixelData(0, GL_INT, texel4[0]),
									 PIXEL_COMPARE_CHANNEL_R);
	}

	/* GL_R32UI */
	{
		const unsigned int texel1[1] = { 4294967295u };
		const unsigned int texel2[1] = { 2863311530u };
		const unsigned int texel3[1] = { 1431655765u };
		const unsigned int texel4[1] = { 0 };

		/* GL_R32UI => GL_R32UI */
		addEntryToConversionDatabase(
			getR32UIPixelData(1, GL_UNSIGNED_INT, texel1[0]), getR32UIPixelData(0, GL_UNSIGNED_INT, texel1[0]),
			getR32UIPixelData(1, GL_UNSIGNED_INT, texel2[0]), getR32UIPixelData(0, GL_UNSIGNED_INT, texel2[0]),
			getR32UIPixelData(1, GL_UNSIGNED_INT, texel3[0]), getR32UIPixelData(0, GL_UNSIGNED_INT, texel3[0]),
			getR32UIPixelData(1, GL_UNSIGNED_INT, texel4[0]), getR32UIPixelData(0, GL_UNSIGNED_INT, texel4[0]),
			PIXEL_COMPARE_CHANNEL_R);
	}

	/* GL_RG8I */
	{
		const signed char texel1[2] = { 127, 42 };
		const signed char texel2[2] = { 42, -43 };
		const signed char texel3[2] = { -43, -127 };
		const signed char texel4[2] = { -127, 127 };

		/* GL_RG8I => GL_R8I */
		addEntryToConversionDatabase(
			getRG8IPixelData(1, GL_BYTE, texel1[0], texel1[1]), getR8IPixelData(0, GL_INT, texel1[0]),
			getRG8IPixelData(1, GL_BYTE, texel2[0], texel2[1]), getR8IPixelData(0, GL_INT, texel2[0]),
			getRG8IPixelData(1, GL_BYTE, texel3[0], texel3[1]), getR8IPixelData(0, GL_INT, texel3[0]),
			getRG8IPixelData(1, GL_BYTE, texel4[0], texel4[1]), getR8IPixelData(0, GL_INT, texel4[0]),
			PIXEL_COMPARE_CHANNEL_R);
		/* GL_RG8I => GL_RG8I */
		addEntryToConversionDatabase(
			getRG8IPixelData(1, GL_BYTE, texel1[0], texel1[1]), getRG8IPixelData(0, GL_INT, texel1[0], texel1[1]),
			getRG8IPixelData(1, GL_BYTE, texel2[0], texel2[1]), getRG8IPixelData(0, GL_INT, texel2[0], texel2[1]),
			getRG8IPixelData(1, GL_BYTE, texel3[0], texel3[1]), getRG8IPixelData(0, GL_INT, texel3[0], texel3[1]),
			getRG8IPixelData(1, GL_BYTE, texel4[0], texel4[1]), getRG8IPixelData(0, GL_INT, texel4[0], texel4[1]),
			PIXEL_COMPARE_CHANNEL_RG);
	}

	/* GL_RG8UI */
	{
		const unsigned char texel1[2] = { 255, 127 };
		const unsigned char texel2[2] = { 127, 63 };
		const unsigned char texel3[2] = { 63, 0 };
		const unsigned char texel4[2] = { 0, 255 };

		/* GL_RG8UI => GL_R8UI */
		addEntryToConversionDatabase(getRG8UIPixelData(1, GL_UNSIGNED_BYTE, texel1[0], texel1[1]),
									 getR8UIPixelData(0, GL_UNSIGNED_INT, texel1[0]),
									 getRG8UIPixelData(1, GL_UNSIGNED_BYTE, texel2[0], texel2[1]),
									 getR8UIPixelData(0, GL_UNSIGNED_INT, texel2[0]),
									 getRG8UIPixelData(1, GL_UNSIGNED_BYTE, texel3[0], texel3[1]),
									 getR8UIPixelData(0, GL_UNSIGNED_INT, texel3[0]),
									 getRG8UIPixelData(1, GL_UNSIGNED_BYTE, texel4[0], texel4[1]),
									 getR8UIPixelData(0, GL_UNSIGNED_INT, texel4[0]), PIXEL_COMPARE_CHANNEL_R);

		/* GL_RG8UI => GL_RG8UI */
		addEntryToConversionDatabase(getRG8UIPixelData(1, GL_UNSIGNED_BYTE, texel1[0], texel1[1]),
									 getRG8UIPixelData(0, GL_UNSIGNED_INT, texel1[0], texel1[1]),
									 getRG8UIPixelData(1, GL_UNSIGNED_BYTE, texel2[0], texel2[1]),
									 getRG8UIPixelData(0, GL_UNSIGNED_INT, texel2[0], texel2[1]),
									 getRG8UIPixelData(1, GL_UNSIGNED_BYTE, texel3[0], texel3[1]),
									 getRG8UIPixelData(0, GL_UNSIGNED_INT, texel3[0], texel3[1]),
									 getRG8UIPixelData(1, GL_UNSIGNED_BYTE, texel4[0], texel4[1]),
									 getRG8UIPixelData(0, GL_UNSIGNED_INT, texel4[0], texel4[1]),
									 PIXEL_COMPARE_CHANNEL_RG);
	}

	/* GL_RG16I */
	{
		const short texel1[2] = { 32767, 10922 };
		const short texel2[2] = { 10922, -10923 };
		const short texel3[2] = { -10923, -32767 };
		const short texel4[2] = { -32767, 32767 };

		/* GL_RG16I => GL_R16I */
		addEntryToConversionDatabase(
			getRG16IPixelData(1, GL_SHORT, texel1[0], texel1[1]), getR16IPixelData(0, GL_INT, texel1[0]),
			getRG16IPixelData(1, GL_SHORT, texel2[0], texel2[1]), getR16IPixelData(0, GL_INT, texel2[0]),
			getRG16IPixelData(1, GL_SHORT, texel3[0], texel3[1]), getR16IPixelData(0, GL_INT, texel3[0]),
			getRG16IPixelData(1, GL_SHORT, texel4[0], texel4[1]), getR16IPixelData(0, GL_INT, texel4[0]),
			PIXEL_COMPARE_CHANNEL_R);

		/* GL_RG16I => GL_RG16I */
		addEntryToConversionDatabase(
			getRG16IPixelData(1, GL_SHORT, texel1[0], texel1[1]), getRG16IPixelData(0, GL_INT, texel1[0], texel1[1]),
			getRG16IPixelData(1, GL_SHORT, texel2[0], texel2[1]), getRG16IPixelData(0, GL_INT, texel2[0], texel2[1]),
			getRG16IPixelData(1, GL_SHORT, texel3[0], texel3[1]), getRG16IPixelData(0, GL_INT, texel3[0], texel3[1]),
			getRG16IPixelData(1, GL_SHORT, texel4[0], texel4[1]), getRG16IPixelData(0, GL_INT, texel4[0], texel4[1]),
			PIXEL_COMPARE_CHANNEL_RG);
	}

	/* GL_RG16UI */
	{
		const unsigned short texel1[2] = { 65535, 43690 };
		const unsigned short texel2[2] = { 43690, 21845 };
		const unsigned short texel3[2] = { 21845, 0 };
		const unsigned short texel4[2] = { 0, 65535 };

		/* GL_RG16UI => GL_R16UI */
		addEntryToConversionDatabase(getRG16UIPixelData(1, GL_UNSIGNED_SHORT, texel1[0], texel1[1]),
									 getR16UIPixelData(0, GL_UNSIGNED_INT, texel1[0]),
									 getRG16UIPixelData(1, GL_UNSIGNED_SHORT, texel2[0], texel2[1]),
									 getR16UIPixelData(0, GL_UNSIGNED_INT, texel2[0]),
									 getRG16UIPixelData(1, GL_UNSIGNED_SHORT, texel3[0], texel3[1]),
									 getR16UIPixelData(0, GL_UNSIGNED_INT, texel3[0]),
									 getRG16UIPixelData(1, GL_UNSIGNED_SHORT, texel4[0], texel4[1]),
									 getR16UIPixelData(0, GL_UNSIGNED_INT, texel4[0]), PIXEL_COMPARE_CHANNEL_R);

		/* GL_RG16UI => GL_RG16UI */
		addEntryToConversionDatabase(getRG16UIPixelData(1, GL_UNSIGNED_SHORT, texel1[0], texel1[1]),
									 getRG16UIPixelData(0, GL_UNSIGNED_INT, texel1[0], texel1[1]),
									 getRG16UIPixelData(1, GL_UNSIGNED_SHORT, texel2[0], texel2[1]),
									 getRG16UIPixelData(0, GL_UNSIGNED_INT, texel2[0], texel2[1]),
									 getRG16UIPixelData(1, GL_UNSIGNED_SHORT, texel3[0], texel3[1]),
									 getRG16UIPixelData(0, GL_UNSIGNED_INT, texel3[0], texel3[1]),
									 getRG16UIPixelData(1, GL_UNSIGNED_SHORT, texel4[0], texel4[1]),
									 getRG16UIPixelData(0, GL_UNSIGNED_INT, texel4[0], texel4[1]),
									 PIXEL_COMPARE_CHANNEL_RG);
	}

	/* GL_RG32I */
	{
		const int texel1[2] = { 2147483647, 715827883l };
		const int texel2[2] = { 715827883, -715827881l };
		const int texel3[2] = { -715827881, -2147483647l };
		const int texel4[2] = { -2147483647, 2147483647l };

		/* GL_RG32I => GL_R32I */
		addEntryToConversionDatabase(
			getRG32IPixelData(1, GL_INT, texel1[0], texel1[1]), getR32IPixelData(0, GL_INT, texel1[0]),
			getRG32IPixelData(1, GL_INT, texel2[0], texel2[1]), getR32IPixelData(0, GL_INT, texel2[0]),
			getRG32IPixelData(1, GL_INT, texel3[0], texel3[1]), getR32IPixelData(0, GL_INT, texel3[0]),
			getRG32IPixelData(1, GL_INT, texel4[0], texel4[1]), getR32IPixelData(0, GL_INT, texel4[0]),
			PIXEL_COMPARE_CHANNEL_R);

		/* GL_RG32I => GL_RG32I */
		addEntryToConversionDatabase(
			getRG32IPixelData(1, GL_INT, texel1[0], texel1[1]), getRG32IPixelData(0, GL_INT, texel1[0], texel1[1]),
			getRG32IPixelData(1, GL_INT, texel2[0], texel2[1]), getRG32IPixelData(0, GL_INT, texel2[0], texel2[1]),
			getRG32IPixelData(1, GL_INT, texel3[0], texel3[1]), getRG32IPixelData(0, GL_INT, texel3[0], texel3[1]),
			getRG32IPixelData(1, GL_INT, texel4[0], texel4[1]), getRG32IPixelData(0, GL_INT, texel4[0], texel4[1]),
			PIXEL_COMPARE_CHANNEL_RG);
	}

	/* GL_RG32UI */
	{
		const unsigned int texel1[2] = { 4294967295u, 2863311530u };
		const unsigned int texel2[2] = { 2863311530u, 1431655765u };
		const unsigned int texel3[2] = { 1431655765u, 0 };
		const unsigned int texel4[2] = { 0, 4294967295u };

		/* GL_RG32UI => GL_R32UI */
		addEntryToConversionDatabase(getRG32UIPixelData(1, GL_UNSIGNED_INT, texel1[0], texel1[1]),
									 getR32UIPixelData(0, GL_UNSIGNED_INT, texel1[0]),
									 getRG32UIPixelData(1, GL_UNSIGNED_INT, texel2[0], texel2[1]),
									 getR32UIPixelData(0, GL_UNSIGNED_INT, texel2[0]),
									 getRG32UIPixelData(1, GL_UNSIGNED_INT, texel3[0], texel3[1]),
									 getR32UIPixelData(0, GL_UNSIGNED_INT, texel3[0]),
									 getRG32UIPixelData(1, GL_UNSIGNED_INT, texel4[0], texel4[1]),
									 getR32UIPixelData(0, GL_UNSIGNED_INT, texel4[0]), PIXEL_COMPARE_CHANNEL_R);

		/* GL_RG32UI => GL_RG32UI */
		addEntryToConversionDatabase(getRG32UIPixelData(1, GL_UNSIGNED_INT, texel1[0], texel1[1]),
									 getRG32UIPixelData(0, GL_UNSIGNED_INT, texel1[0], texel1[1]),
									 getRG32UIPixelData(1, GL_UNSIGNED_INT, texel2[0], texel2[1]),
									 getRG32UIPixelData(0, GL_UNSIGNED_INT, texel2[0], texel2[1]),
									 getRG32UIPixelData(1, GL_UNSIGNED_INT, texel3[0], texel3[1]),
									 getRG32UIPixelData(0, GL_UNSIGNED_INT, texel3[0], texel3[1]),
									 getRG32UIPixelData(1, GL_UNSIGNED_INT, texel4[0], texel4[1]),
									 getRG32UIPixelData(0, GL_UNSIGNED_INT, texel4[0], texel4[1]),
									 PIXEL_COMPARE_CHANNEL_RG);
	}

	/* GL_RGBA8I */
	{
		const signed char texel1[4] = { 127, 42, -43, -127 };
		const signed char texel2[4] = { 42, -43, -127, 127 };
		const signed char texel3[4] = { -43, -127, 127, 42 };
		const signed char texel4[4] = { -127, 127, 42, -43 };

		/* GL_RGBA8I => GL_R8I */
		addEntryToConversionDatabase(getRGBA8IPixelData(1, GL_BYTE, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getR8IPixelData(0, GL_INT, texel1[0]),
									 getRGBA8IPixelData(1, GL_BYTE, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getR8IPixelData(0, GL_INT, texel2[0]),
									 getRGBA8IPixelData(1, GL_BYTE, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getR8IPixelData(0, GL_INT, texel3[0]),
									 getRGBA8IPixelData(1, GL_BYTE, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getR8IPixelData(0, GL_INT, texel4[0]), PIXEL_COMPARE_CHANNEL_R);

		/* GL_RGBA8I => GL_RG8I */
		addEntryToConversionDatabase(getRGBA8IPixelData(1, GL_BYTE, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRG8IPixelData(0, GL_INT, texel1[0], texel1[1]),
									 getRGBA8IPixelData(1, GL_BYTE, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRG8IPixelData(0, GL_INT, texel2[0], texel2[1]),
									 getRGBA8IPixelData(1, GL_BYTE, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRG8IPixelData(0, GL_INT, texel3[0], texel3[1]),
									 getRGBA8IPixelData(1, GL_BYTE, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRG8IPixelData(0, GL_INT, texel4[0], texel4[1]), PIXEL_COMPARE_CHANNEL_RG);

		/* GL_RGBA8I => GL_RGB8I */
		addEntryToConversionDatabase(getRGBA8IPixelData(1, GL_BYTE, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGB8IPixelData(0, GL_INT, texel1[0], texel1[1], texel1[2]),
									 getRGBA8IPixelData(1, GL_BYTE, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGB8IPixelData(0, GL_INT, texel2[0], texel2[1], texel2[2]),
									 getRGBA8IPixelData(1, GL_BYTE, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGB8IPixelData(0, GL_INT, texel3[0], texel3[1], texel3[2]),
									 getRGBA8IPixelData(1, GL_BYTE, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRGB8IPixelData(0, GL_INT, texel4[0], texel4[1], texel4[2]),
									 PIXEL_COMPARE_CHANNEL_RGB);

		/* GL_RGBA8I => GL_RGBA8I */
		addEntryToConversionDatabase(getRGBA8IPixelData(1, GL_BYTE, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGBA8IPixelData(0, GL_INT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGBA8IPixelData(1, GL_BYTE, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGBA8IPixelData(0, GL_INT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGBA8IPixelData(1, GL_BYTE, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGBA8IPixelData(0, GL_INT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGBA8IPixelData(1, GL_BYTE, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRGBA8IPixelData(0, GL_INT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 PIXEL_COMPARE_CHANNEL_RGBA);
	}

	/* GL_RGBA8UI */
	{
		const unsigned char texel1[4] = { 255, 127, 63, 0 };
		const unsigned char texel2[4] = { 127, 63, 0, 255 };
		const unsigned char texel3[4] = { 63, 0, 255, 127 };
		const unsigned char texel4[4] = { 0, 255, 127, 63 };

		/* GL_RGBA8UI => GL_R8UI */
		addEntryToConversionDatabase(
			getRGBA8UIPixelData(1, GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2], texel1[3]),
			getR8UIPixelData(0, GL_UNSIGNED_INT, texel1[0]),
			getRGBA8UIPixelData(1, GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2], texel2[3]),
			getR8UIPixelData(0, GL_UNSIGNED_INT, texel2[0]),
			getRGBA8UIPixelData(1, GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2], texel3[3]),
			getR8UIPixelData(0, GL_UNSIGNED_INT, texel3[0]),
			getRGBA8UIPixelData(1, GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2], texel4[3]),
			getR8UIPixelData(0, GL_UNSIGNED_INT, texel4[0]), PIXEL_COMPARE_CHANNEL_R);

		/* GL_RGBA8UI => GL_RG8UI */
		addEntryToConversionDatabase(
			getRGBA8UIPixelData(1, GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2], texel1[3]),
			getRG8UIPixelData(0, GL_UNSIGNED_INT, texel1[0], texel1[1]),
			getRGBA8UIPixelData(1, GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2], texel2[3]),
			getRG8UIPixelData(0, GL_UNSIGNED_INT, texel2[0], texel2[1]),
			getRGBA8UIPixelData(1, GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2], texel3[3]),
			getRG8UIPixelData(0, GL_UNSIGNED_INT, texel3[0], texel3[1]),
			getRGBA8UIPixelData(1, GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2], texel4[3]),
			getRG8UIPixelData(0, GL_UNSIGNED_INT, texel4[0], texel4[1]), PIXEL_COMPARE_CHANNEL_RG);

		/* GL_RGBA8UI => GL_RGB8UI */
		addEntryToConversionDatabase(
			getRGBA8UIPixelData(1, GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2], texel1[3]),
			getRGB8UIPixelData(0, GL_UNSIGNED_INT, texel1[0], texel1[1], texel1[2]),
			getRGBA8UIPixelData(1, GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2], texel2[3]),
			getRGB8UIPixelData(0, GL_UNSIGNED_INT, texel2[0], texel2[1], texel2[2]),
			getRGBA8UIPixelData(1, GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2], texel3[3]),
			getRGB8UIPixelData(0, GL_UNSIGNED_INT, texel3[0], texel3[1], texel3[2]),
			getRGBA8UIPixelData(1, GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2], texel4[3]),
			getRGB8UIPixelData(0, GL_UNSIGNED_INT, texel4[0], texel4[1], texel4[2]), PIXEL_COMPARE_CHANNEL_RGB);

		/* GL_RGBA8UI => GL_RGBA8UI */
		addEntryToConversionDatabase(
			getRGBA8UIPixelData(1, GL_UNSIGNED_BYTE, texel1[0], texel1[1], texel1[2], texel1[3]),
			getRGBA8UIPixelData(0, GL_UNSIGNED_INT, texel1[0], texel1[1], texel1[2], texel1[3]),
			getRGBA8UIPixelData(1, GL_UNSIGNED_BYTE, texel2[0], texel2[1], texel2[2], texel2[3]),
			getRGBA8UIPixelData(0, GL_UNSIGNED_INT, texel2[0], texel2[1], texel2[2], texel2[3]),
			getRGBA8UIPixelData(1, GL_UNSIGNED_BYTE, texel3[0], texel3[1], texel3[2], texel3[3]),
			getRGBA8UIPixelData(0, GL_UNSIGNED_INT, texel3[0], texel3[1], texel3[2], texel3[3]),
			getRGBA8UIPixelData(1, GL_UNSIGNED_BYTE, texel4[0], texel4[1], texel4[2], texel4[3]),
			getRGBA8UIPixelData(0, GL_UNSIGNED_INT, texel4[0], texel4[1], texel4[2], texel4[3]),
			PIXEL_COMPARE_CHANNEL_RGBA);
	}

	/* GL_RGBA16I */
	{
		const short texel1[4] = { 32767, 10922, -10923, -32767 };
		const short texel2[4] = { 10922, -10923, -32767, 32767 };
		const short texel3[4] = { -10923, -32767, 32767, 10922 };
		const short texel4[4] = { -32767, 32767, 10922, -10923 };

		/* GL_RGBA16I => GL_R16I */
		addEntryToConversionDatabase(getRGBA16IPixelData(1, GL_SHORT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getR16IPixelData(0, GL_INT, texel1[0]),
									 getRGBA16IPixelData(1, GL_SHORT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getR16IPixelData(0, GL_INT, texel2[0]),
									 getRGBA16IPixelData(1, GL_SHORT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getR16IPixelData(0, GL_INT, texel3[0]),
									 getRGBA16IPixelData(1, GL_SHORT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getR16IPixelData(0, GL_INT, texel4[0]), PIXEL_COMPARE_CHANNEL_R);

		/* GL_RGBA16I => GL_RG16I */
		addEntryToConversionDatabase(getRGBA16IPixelData(1, GL_SHORT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRG16IPixelData(0, GL_INT, texel1[0], texel1[1]),
									 getRGBA16IPixelData(1, GL_SHORT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRG16IPixelData(0, GL_INT, texel2[0], texel2[1]),
									 getRGBA16IPixelData(1, GL_SHORT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRG16IPixelData(0, GL_INT, texel3[0], texel3[1]),
									 getRGBA16IPixelData(1, GL_SHORT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRG16IPixelData(0, GL_INT, texel4[0], texel4[1]), PIXEL_COMPARE_CHANNEL_RG);

		/* GL_RGBA16I => GL_RGB16I */
		addEntryToConversionDatabase(getRGBA16IPixelData(1, GL_SHORT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGB16IPixelData(0, GL_INT, texel1[0], texel1[1], texel1[2]),
									 getRGBA16IPixelData(1, GL_SHORT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGB16IPixelData(0, GL_INT, texel2[0], texel2[1], texel2[2]),
									 getRGBA16IPixelData(1, GL_SHORT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGB16IPixelData(0, GL_INT, texel3[0], texel3[1], texel3[2]),
									 getRGBA16IPixelData(1, GL_SHORT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRGB16IPixelData(0, GL_INT, texel4[0], texel4[1], texel4[2]),
									 PIXEL_COMPARE_CHANNEL_RGB);

		/* GL_RGBA16I => GL_RGBA16I */
		addEntryToConversionDatabase(getRGBA16IPixelData(1, GL_SHORT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGBA16IPixelData(0, GL_INT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGBA16IPixelData(1, GL_SHORT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGBA16IPixelData(0, GL_INT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGBA16IPixelData(1, GL_SHORT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGBA16IPixelData(0, GL_INT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGBA16IPixelData(1, GL_SHORT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRGBA16IPixelData(0, GL_INT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 PIXEL_COMPARE_CHANNEL_RGBA);
	}

	/* GL_RGBA16UI */
	{
		const unsigned short texel1[4] = { 65535, 43690, 21845, 0 };
		const unsigned short texel2[4] = { 43690, 21845, 0, 65535 };
		const unsigned short texel3[4] = { 21845, 0, 65535, 43690 };
		const unsigned short texel4[4] = { 0, 65535, 43690, 21845 };

		/* GL_RGBA16UI => GL_R16UI */
		addEntryToConversionDatabase(
			getRGBA16UIPixelData(1, GL_UNSIGNED_SHORT, texel1[0], texel1[1], texel1[2], texel1[3]),
			getR16UIPixelData(0, GL_UNSIGNED_INT, texel1[0]),
			getRGBA16UIPixelData(1, GL_UNSIGNED_SHORT, texel2[0], texel2[1], texel2[2], texel2[3]),
			getR16UIPixelData(0, GL_UNSIGNED_INT, texel2[0]),
			getRGBA16UIPixelData(1, GL_UNSIGNED_SHORT, texel3[0], texel3[1], texel3[2], texel3[3]),
			getR16UIPixelData(0, GL_UNSIGNED_INT, texel3[0]),
			getRGBA16UIPixelData(1, GL_UNSIGNED_SHORT, texel4[0], texel4[1], texel4[2], texel4[3]),
			getR16UIPixelData(0, GL_UNSIGNED_INT, texel4[0]), PIXEL_COMPARE_CHANNEL_R);

		/* GL_RGBA16UI => GL_RG16UI */
		addEntryToConversionDatabase(
			getRGBA16UIPixelData(1, GL_UNSIGNED_SHORT, texel1[0], texel1[1], texel1[2], texel1[3]),
			getRG16UIPixelData(0, GL_UNSIGNED_INT, texel1[0], texel1[1]),
			getRGBA16UIPixelData(1, GL_UNSIGNED_SHORT, texel2[0], texel2[1], texel2[2], texel2[3]),
			getRG16UIPixelData(0, GL_UNSIGNED_INT, texel2[0], texel2[1]),
			getRGBA16UIPixelData(1, GL_UNSIGNED_SHORT, texel3[0], texel3[1], texel3[2], texel3[3]),
			getRG16UIPixelData(0, GL_UNSIGNED_INT, texel3[0], texel3[1]),
			getRGBA16UIPixelData(1, GL_UNSIGNED_SHORT, texel4[0], texel4[1], texel4[2], texel4[3]),
			getRG16UIPixelData(0, GL_UNSIGNED_INT, texel4[0], texel4[1]), PIXEL_COMPARE_CHANNEL_RG);

		/* GL_RGBA16UI => GL_RGB16UI */
		addEntryToConversionDatabase(
			getRGBA16UIPixelData(1, GL_UNSIGNED_SHORT, texel1[0], texel1[1], texel1[2], texel1[3]),
			getRGB16UIPixelData(0, GL_UNSIGNED_INT, texel1[0], texel1[1], texel1[2]),
			getRGBA16UIPixelData(1, GL_UNSIGNED_SHORT, texel2[0], texel2[1], texel2[2], texel2[3]),
			getRGB16UIPixelData(0, GL_UNSIGNED_INT, texel2[0], texel2[1], texel2[2]),
			getRGBA16UIPixelData(1, GL_UNSIGNED_SHORT, texel3[0], texel3[1], texel3[2], texel3[3]),
			getRGB16UIPixelData(0, GL_UNSIGNED_INT, texel3[0], texel3[1], texel3[2]),
			getRGBA16UIPixelData(1, GL_UNSIGNED_SHORT, texel4[0], texel4[1], texel4[2], texel4[3]),
			getRGB16UIPixelData(0, GL_UNSIGNED_INT, texel4[0], texel4[1], texel4[2]), PIXEL_COMPARE_CHANNEL_RGB);

		/* GL_RGBA16UI => GL_RGBA16UI */
		addEntryToConversionDatabase(
			getRGBA16UIPixelData(1, GL_UNSIGNED_SHORT, texel1[0], texel1[1], texel1[2], texel1[3]),
			getRGBA16UIPixelData(0, GL_UNSIGNED_INT, texel1[0], texel1[1], texel1[2], texel1[3]),
			getRGBA16UIPixelData(1, GL_UNSIGNED_SHORT, texel2[0], texel2[1], texel2[2], texel2[3]),
			getRGBA16UIPixelData(0, GL_UNSIGNED_INT, texel2[0], texel2[1], texel2[2], texel2[3]),
			getRGBA16UIPixelData(1, GL_UNSIGNED_SHORT, texel3[0], texel3[1], texel3[2], texel3[3]),
			getRGBA16UIPixelData(0, GL_UNSIGNED_INT, texel3[0], texel3[1], texel3[2], texel3[3]),
			getRGBA16UIPixelData(1, GL_UNSIGNED_SHORT, texel4[0], texel4[1], texel4[2], texel4[3]),
			getRGBA16UIPixelData(0, GL_UNSIGNED_INT, texel4[0], texel4[1], texel4[2], texel4[3]),
			PIXEL_COMPARE_CHANNEL_RGBA);
	}

	/* GL_RGBA32I */
	{
		const int texel1[4] = { 2147483647, 715827883, -715827881, -2147483647 };
		const int texel2[4] = { 715827883, -715827881, -2147483647, 2147483647 };
		const int texel3[4] = { -715827881, -2147483647, 2147483647, 715827883 };
		const int texel4[4] = { -2147483647, 2147483647, 715827883, -715827881 };

		/* GL_RGBA32I => GL_R32I */
		addEntryToConversionDatabase(getRGBA32IPixelData(GL_INT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getR32IPixelData(0, GL_INT, texel1[0]),
									 getRGBA32IPixelData(GL_INT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getR32IPixelData(0, GL_INT, texel2[0]),
									 getRGBA32IPixelData(GL_INT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getR32IPixelData(0, GL_INT, texel3[0]),
									 getRGBA32IPixelData(GL_INT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getR32IPixelData(0, GL_INT, texel4[0]), PIXEL_COMPARE_CHANNEL_R);

		/* GL_RGBA32I => GL_RG32I */
		addEntryToConversionDatabase(getRGBA32IPixelData(GL_INT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRG32IPixelData(0, GL_INT, texel1[0], texel1[1]),
									 getRGBA32IPixelData(GL_INT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRG32IPixelData(0, GL_INT, texel2[0], texel2[1]),
									 getRGBA32IPixelData(GL_INT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRG32IPixelData(0, GL_INT, texel3[0], texel3[1]),
									 getRGBA32IPixelData(GL_INT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRG32IPixelData(0, GL_INT, texel4[0], texel4[1]), PIXEL_COMPARE_CHANNEL_RG);

		/* GL_RGBA32I => GL_RGB32I */
		addEntryToConversionDatabase(getRGBA32IPixelData(GL_INT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGB32IPixelData(0, GL_INT, texel1[0], texel1[1], texel1[2]),
									 getRGBA32IPixelData(GL_INT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGB32IPixelData(0, GL_INT, texel2[0], texel2[1], texel2[2]),
									 getRGBA32IPixelData(GL_INT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGB32IPixelData(0, GL_INT, texel3[0], texel3[1], texel3[2]),
									 getRGBA32IPixelData(GL_INT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRGB32IPixelData(0, GL_INT, texel4[0], texel4[1], texel4[2]),
									 PIXEL_COMPARE_CHANNEL_RGB);

		/* GL_RGBA32I => GL_RGBA32I */
		addEntryToConversionDatabase(getRGBA32IPixelData(GL_INT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGBA32IPixelData(GL_INT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGBA32IPixelData(GL_INT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGBA32IPixelData(GL_INT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGBA32IPixelData(GL_INT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGBA32IPixelData(GL_INT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGBA32IPixelData(GL_INT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRGBA32IPixelData(GL_INT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 PIXEL_COMPARE_CHANNEL_RGBA);
	}

	/* GL_RGBA32UI */
	{
		const unsigned int texel1[4] = { 4294967295u, 2863311530u, 1431655765u, 0 };
		const unsigned int texel2[4] = { 2863311530u, 1431655765u, 0, 4294967295u };
		const unsigned int texel3[4] = { 1431655765u, 0, 4294967295u, 2863311530u };
		const unsigned int texel4[4] = { 0, 4294967295u, 2863311530u, 1431655765u };

		/* GL_RGBA32UI => GL_R32UI */
		addEntryToConversionDatabase(getRGBA32UIPixelData(GL_UNSIGNED_INT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getR32UIPixelData(0, GL_UNSIGNED_INT, texel1[0]),
									 getRGBA32UIPixelData(GL_UNSIGNED_INT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getR32UIPixelData(0, GL_UNSIGNED_INT, texel2[0]),
									 getRGBA32UIPixelData(GL_UNSIGNED_INT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getR32UIPixelData(0, GL_UNSIGNED_INT, texel3[0]),
									 getRGBA32UIPixelData(GL_UNSIGNED_INT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getR32UIPixelData(0, GL_UNSIGNED_INT, texel4[0]), PIXEL_COMPARE_CHANNEL_R);

		/* GL_RGBA32UI => GL_RG32UI */
		addEntryToConversionDatabase(getRGBA32UIPixelData(GL_UNSIGNED_INT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRG32UIPixelData(0, GL_UNSIGNED_INT, texel1[0], texel1[1]),
									 getRGBA32UIPixelData(GL_UNSIGNED_INT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRG32UIPixelData(0, GL_UNSIGNED_INT, texel2[0], texel2[1]),
									 getRGBA32UIPixelData(GL_UNSIGNED_INT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRG32UIPixelData(0, GL_UNSIGNED_INT, texel3[0], texel3[1]),
									 getRGBA32UIPixelData(GL_UNSIGNED_INT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRG32UIPixelData(0, GL_UNSIGNED_INT, texel4[0], texel4[1]),
									 PIXEL_COMPARE_CHANNEL_RG);

		/* GL_RGBA32UI => GL_RGB32UI */
		addEntryToConversionDatabase(getRGBA32UIPixelData(GL_UNSIGNED_INT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGB32UIPixelData(0, GL_UNSIGNED_INT, texel1[0], texel1[1], texel1[2]),
									 getRGBA32UIPixelData(GL_UNSIGNED_INT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGB32UIPixelData(0, GL_UNSIGNED_INT, texel2[0], texel2[1], texel2[2]),
									 getRGBA32UIPixelData(GL_UNSIGNED_INT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGB32UIPixelData(0, GL_UNSIGNED_INT, texel3[0], texel3[1], texel3[2]),
									 getRGBA32UIPixelData(GL_UNSIGNED_INT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRGB32UIPixelData(0, GL_UNSIGNED_INT, texel4[0], texel4[1], texel4[2]),
									 PIXEL_COMPARE_CHANNEL_RGB);

		/* GL_RGBA32UI => GL_RGBA32UI */
		addEntryToConversionDatabase(getRGBA32UIPixelData(GL_UNSIGNED_INT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGBA32UIPixelData(GL_UNSIGNED_INT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGBA32UIPixelData(GL_UNSIGNED_INT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGBA32UIPixelData(GL_UNSIGNED_INT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGBA32UIPixelData(GL_UNSIGNED_INT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGBA32UIPixelData(GL_UNSIGNED_INT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGBA32UIPixelData(GL_UNSIGNED_INT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRGBA32UIPixelData(GL_UNSIGNED_INT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 PIXEL_COMPARE_CHANNEL_RGBA);
	}

	/* GL_R16F */
	{
		const float texel1[1] = { 1 };
		const float texel2[1] = { 4096 };
		const float texel3[1] = { -4096 };
		const float texel4[1] = { 32000 };

		/* GL_R16F => GL_R16F */
		addEntryToConversionDatabase(
			getR16FPixelData(1, GL_HALF_FLOAT, texel1[0]), getR16FPixelData(0, GL_HALF_FLOAT, texel1[0]),
			getR16FPixelData(1, GL_HALF_FLOAT, texel2[0]), getR16FPixelData(0, GL_HALF_FLOAT, texel2[0]),
			getR16FPixelData(1, GL_HALF_FLOAT, texel3[0]), getR16FPixelData(0, GL_HALF_FLOAT, texel3[0]),
			getR16FPixelData(1, GL_HALF_FLOAT, texel4[0]), getR16FPixelData(0, GL_HALF_FLOAT, texel4[0]),
			PIXEL_COMPARE_CHANNEL_R);
	}

	/* GL_RG16F */
	{
		const float texel1[2] = { 1, 0 };
		const float texel2[2] = { 4096, -4096 };
		const float texel3[2] = { -32000, 32000 };
		const float texel4[2] = { 1.5f, -4.7f };

		/* GL_RG16F => GL_R16F */
		addEntryToConversionDatabase(
			getRG16FPixelData(1, GL_HALF_FLOAT, texel1[0], texel1[1]), getR16FPixelData(0, GL_HALF_FLOAT, texel1[0]),
			getRG16FPixelData(1, GL_HALF_FLOAT, texel2[0], texel2[1]), getR16FPixelData(0, GL_HALF_FLOAT, texel2[0]),
			getRG16FPixelData(1, GL_HALF_FLOAT, texel3[0], texel3[1]), getR16FPixelData(0, GL_HALF_FLOAT, texel3[0]),
			getRG16FPixelData(1, GL_HALF_FLOAT, texel4[0], texel4[1]), getR16FPixelData(0, GL_HALF_FLOAT, texel4[0]),
			PIXEL_COMPARE_CHANNEL_R);

		/* GL_RG16F => GL_RG16F */
		addEntryToConversionDatabase(getRG16FPixelData(1, GL_HALF_FLOAT, texel1[0], texel1[1]),
									 getRG16FPixelData(0, GL_HALF_FLOAT, texel1[0], texel1[1]),
									 getRG16FPixelData(1, GL_HALF_FLOAT, texel2[0], texel2[1]),
									 getRG16FPixelData(0, GL_HALF_FLOAT, texel2[0], texel2[1]),
									 getRG16FPixelData(1, GL_HALF_FLOAT, texel3[0], texel3[1]),
									 getRG16FPixelData(0, GL_HALF_FLOAT, texel3[0], texel3[1]),
									 getRG16FPixelData(1, GL_HALF_FLOAT, texel4[0], texel4[1]),
									 getRG16FPixelData(0, GL_HALF_FLOAT, texel4[0], texel4[1]),
									 PIXEL_COMPARE_CHANNEL_RG);
	}

	/* GL_R32F */
	{
		const float texel1[1] = { 1 };
		const float texel2[1] = { 4096 };
		const float texel3[1] = { -4096 };
		const float texel4[1] = { 32000 };

		/* GL_R32F => GL_R32F */
		addEntryToConversionDatabase(getR32FPixelData(1, GL_FLOAT, texel1[0]), getR32FPixelData(0, GL_FLOAT, texel1[0]),
									 getR32FPixelData(1, GL_FLOAT, texel2[0]), getR32FPixelData(0, GL_FLOAT, texel2[0]),
									 getR32FPixelData(1, GL_FLOAT, texel3[0]), getR32FPixelData(0, GL_FLOAT, texel3[0]),
									 getR32FPixelData(1, GL_FLOAT, texel4[0]), getR32FPixelData(0, GL_FLOAT, texel4[0]),
									 PIXEL_COMPARE_CHANNEL_R);
	}

	/* GL_RG32F */
	{
		const float texel1[2] = { 1, 0 };
		const float texel2[2] = { 4096, -4096 };
		const float texel3[2] = { -32000, 32000 };
		const float texel4[2] = { 1.5f, -4.7f };

		/* GL_RG32F => GL_R32F */
		addEntryToConversionDatabase(
			getRG32FPixelData(1, GL_FLOAT, texel1[0], texel1[1]), getR32FPixelData(0, GL_FLOAT, texel1[0]),
			getRG32FPixelData(1, GL_FLOAT, texel2[0], texel2[1]), getR32FPixelData(0, GL_FLOAT, texel2[0]),
			getRG32FPixelData(1, GL_FLOAT, texel3[0], texel3[1]), getR32FPixelData(0, GL_FLOAT, texel3[0]),
			getRG32FPixelData(1, GL_FLOAT, texel4[0], texel4[1]), getR32FPixelData(0, GL_FLOAT, texel4[0]),
			PIXEL_COMPARE_CHANNEL_R);

		/* GL_RG32F => GL_RG32F */
		addEntryToConversionDatabase(
			getRG32FPixelData(1, GL_FLOAT, texel1[0], texel1[1]), getRG32FPixelData(0, GL_FLOAT, texel1[0], texel1[1]),
			getRG32FPixelData(1, GL_FLOAT, texel2[0], texel2[1]), getRG32FPixelData(0, GL_FLOAT, texel2[0], texel2[1]),
			getRG32FPixelData(1, GL_FLOAT, texel3[0], texel3[1]), getRG32FPixelData(0, GL_FLOAT, texel3[0], texel3[1]),
			getRG32FPixelData(1, GL_FLOAT, texel4[0], texel4[1]), getRG32FPixelData(0, GL_FLOAT, texel4[0], texel4[1]),
			PIXEL_COMPARE_CHANNEL_RG);
	}

	/* GL_RGB16F */
	{
		const float texel1[3] = { 1, 0, -1 };
		const float texel2[3] = { 4096, -4096, 127.5f };
		const float texel3[3] = { -32000, 32000, -456.7f };
		const float texel4[3] = { 1.5f, -4.7f, 123.6f };

		/* GL_RGB16F => GL_R16F */
		addEntryToConversionDatabase(getRGB16FPixelData(1, GL_HALF_FLOAT, texel1[0], texel1[1], texel1[2]),
									 getR16FPixelData(0, GL_HALF_FLOAT, texel1[0]),
									 getRGB16FPixelData(1, GL_HALF_FLOAT, texel2[0], texel2[1], texel2[2]),
									 getR16FPixelData(0, GL_HALF_FLOAT, texel2[0]),
									 getRGB16FPixelData(1, GL_HALF_FLOAT, texel3[0], texel3[1], texel3[2]),
									 getR16FPixelData(0, GL_HALF_FLOAT, texel3[0]),
									 getRGB16FPixelData(1, GL_HALF_FLOAT, texel4[0], texel4[1], texel4[2]),
									 getR16FPixelData(0, GL_HALF_FLOAT, texel4[0]), PIXEL_COMPARE_CHANNEL_R);

		/* GL_RGB16F => GL_RG16F */
		addEntryToConversionDatabase(getRGB16FPixelData(1, GL_HALF_FLOAT, texel1[0], texel1[1], texel1[2]),
									 getRG16FPixelData(0, GL_HALF_FLOAT, texel1[0], texel1[1]),
									 getRGB16FPixelData(1, GL_HALF_FLOAT, texel2[0], texel2[1], texel2[2]),
									 getRG16FPixelData(0, GL_HALF_FLOAT, texel2[0], texel2[1]),
									 getRGB16FPixelData(1, GL_HALF_FLOAT, texel3[0], texel3[1], texel3[2]),
									 getRG16FPixelData(0, GL_HALF_FLOAT, texel3[0], texel3[1]),
									 getRGB16FPixelData(1, GL_HALF_FLOAT, texel4[0], texel4[1], texel4[2]),
									 getRG16FPixelData(0, GL_HALF_FLOAT, texel4[0], texel4[1]),
									 PIXEL_COMPARE_CHANNEL_RG);

		/* GL_RGB16F => GL_RGB16F */
		addEntryToConversionDatabase(getRGB16FPixelData(1, GL_HALF_FLOAT, texel1[0], texel1[1], texel1[2]),
									 getRGB16FPixelData(0, GL_HALF_FLOAT, texel1[0], texel1[1], texel1[2]),
									 getRGB16FPixelData(1, GL_HALF_FLOAT, texel2[0], texel2[1], texel2[2]),
									 getRGB16FPixelData(0, GL_HALF_FLOAT, texel2[0], texel2[1], texel2[2]),
									 getRGB16FPixelData(1, GL_HALF_FLOAT, texel3[0], texel3[1], texel3[2]),
									 getRGB16FPixelData(0, GL_HALF_FLOAT, texel3[0], texel3[1], texel3[2]),
									 getRGB16FPixelData(1, GL_HALF_FLOAT, texel4[0], texel4[1], texel4[2]),
									 getRGB16FPixelData(0, GL_HALF_FLOAT, texel4[0], texel4[1], texel4[2]),
									 PIXEL_COMPARE_CHANNEL_RGB);
	}

	/* GL_RGBA16F */
	{
		const float texel1[4] = { 1, 0, -1, 0.25f };
		const float texel2[4] = { 4096, -4096, 127.5f, 0.5f };
		const float texel3[4] = { -32000, 32000, -456.7f, 0.75f };
		const float texel4[4] = { 1.5f, -4.7f, 123.6f, 1 };

		/* GL_RGBA16F => GL_R16F */
		addEntryToConversionDatabase(getRGBA16FPixelData(GL_HALF_FLOAT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getR16FPixelData(0, GL_HALF_FLOAT, texel1[0]),
									 getRGBA16FPixelData(GL_HALF_FLOAT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getR16FPixelData(0, GL_HALF_FLOAT, texel2[0]),
									 getRGBA16FPixelData(GL_HALF_FLOAT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getR16FPixelData(0, GL_HALF_FLOAT, texel3[0]),
									 getRGBA16FPixelData(GL_HALF_FLOAT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getR16FPixelData(0, GL_HALF_FLOAT, texel4[0]), PIXEL_COMPARE_CHANNEL_R);

		/* GL_RGBA16F => GL_RG16F */
		addEntryToConversionDatabase(getRGBA16FPixelData(GL_HALF_FLOAT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRG16FPixelData(0, GL_HALF_FLOAT, texel1[0], texel1[1]),
									 getRGBA16FPixelData(GL_HALF_FLOAT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRG16FPixelData(0, GL_HALF_FLOAT, texel2[0], texel2[1]),
									 getRGBA16FPixelData(GL_HALF_FLOAT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRG16FPixelData(0, GL_HALF_FLOAT, texel3[0], texel3[1]),
									 getRGBA16FPixelData(GL_HALF_FLOAT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRG16FPixelData(0, GL_HALF_FLOAT, texel4[0], texel4[1]),
									 PIXEL_COMPARE_CHANNEL_RG);

		/* GL_RGBA16F => GL_RGB16F */
		addEntryToConversionDatabase(getRGBA16FPixelData(GL_HALF_FLOAT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGB16FPixelData(0, GL_HALF_FLOAT, texel1[0], texel1[1], texel1[2]),
									 getRGBA16FPixelData(GL_HALF_FLOAT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGB16FPixelData(0, GL_HALF_FLOAT, texel2[0], texel2[1], texel2[2]),
									 getRGBA16FPixelData(GL_HALF_FLOAT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGB16FPixelData(0, GL_HALF_FLOAT, texel3[0], texel3[1], texel3[2]),
									 getRGBA16FPixelData(GL_HALF_FLOAT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRGB16FPixelData(0, GL_HALF_FLOAT, texel4[0], texel4[1], texel4[2]),
									 PIXEL_COMPARE_CHANNEL_RGB);

		/* GL_RGBA16F => GL_RGBA16F */
		addEntryToConversionDatabase(getRGBA16FPixelData(GL_HALF_FLOAT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGBA16FPixelData(GL_HALF_FLOAT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGBA16FPixelData(GL_HALF_FLOAT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGBA16FPixelData(GL_HALF_FLOAT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGBA16FPixelData(GL_HALF_FLOAT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGBA16FPixelData(GL_HALF_FLOAT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGBA16FPixelData(GL_HALF_FLOAT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRGBA16FPixelData(GL_HALF_FLOAT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 PIXEL_COMPARE_CHANNEL_RGBA);
	}

	/* GL_RGB32F */
	{
		const float texel1[3] = { 1, 0, -1 };
		const float texel2[3] = { 4096, -4096, 127.5f };
		const float texel3[3] = { -32000, 32000, -456.7f };
		const float texel4[3] = { 1.5f, -4.7f, 123.6f };

		/* GL_RGB32F => GL_R32F */
		addEntryToConversionDatabase(
			getRGB32FPixelData(1, GL_FLOAT, texel1[0], texel1[1], texel1[2]), getR32FPixelData(0, GL_FLOAT, texel1[0]),
			getRGB32FPixelData(1, GL_FLOAT, texel2[0], texel2[1], texel2[2]), getR32FPixelData(0, GL_FLOAT, texel2[0]),
			getRGB32FPixelData(1, GL_FLOAT, texel3[0], texel3[1], texel3[2]), getR32FPixelData(0, GL_FLOAT, texel3[0]),
			getRGB32FPixelData(1, GL_FLOAT, texel4[0], texel4[1], texel4[2]), getR32FPixelData(0, GL_FLOAT, texel4[0]),
			PIXEL_COMPARE_CHANNEL_R);

		/* GL_RGB32F => GL_RG32F */
		addEntryToConversionDatabase(getRGB32FPixelData(1, GL_FLOAT, texel1[0], texel1[1], texel1[2]),
									 getRG32FPixelData(0, GL_FLOAT, texel1[0], texel1[1]),
									 getRGB32FPixelData(1, GL_FLOAT, texel2[0], texel2[1], texel2[2]),
									 getRG32FPixelData(0, GL_FLOAT, texel2[0], texel2[1]),
									 getRGB32FPixelData(1, GL_FLOAT, texel3[0], texel3[1], texel3[2]),
									 getRG32FPixelData(0, GL_FLOAT, texel3[0], texel3[1]),
									 getRGB32FPixelData(1, GL_FLOAT, texel4[0], texel4[1], texel4[2]),
									 getRG32FPixelData(0, GL_FLOAT, texel4[0], texel4[1]), PIXEL_COMPARE_CHANNEL_RG);

		/* GL_RGB32F => GL_RGB32F */
		addEntryToConversionDatabase(getRGB32FPixelData(1, GL_FLOAT, texel1[0], texel1[1], texel1[2]),
									 getRGB32FPixelData(0, GL_FLOAT, texel1[0], texel1[1], texel1[2]),
									 getRGB32FPixelData(1, GL_FLOAT, texel2[0], texel2[1], texel2[2]),
									 getRGB32FPixelData(0, GL_FLOAT, texel2[0], texel2[1], texel2[2]),
									 getRGB32FPixelData(1, GL_FLOAT, texel3[0], texel3[1], texel3[2]),
									 getRGB32FPixelData(0, GL_FLOAT, texel3[0], texel3[1], texel3[2]),
									 getRGB32FPixelData(1, GL_FLOAT, texel4[0], texel4[1], texel4[2]),
									 getRGB32FPixelData(0, GL_FLOAT, texel4[0], texel4[1], texel4[2]),
									 PIXEL_COMPARE_CHANNEL_RGB);
	}

	/* GL_RGBA32F */
	{
		const float texel1[4] = { 1, 0, -1, 0.25f };
		const float texel2[4] = { 4096, -4096, 127.5f, 0.5f };
		const float texel3[4] = { -32000, 32000, -456.7f, 0.75f };
		const float texel4[4] = { 1.5f, -4.7f, 123.6f, 1 };

		/* GL_RGBA32F => GL_R32F */
		addEntryToConversionDatabase(getRGBA32FPixelData(GL_FLOAT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getR32FPixelData(0, GL_FLOAT, texel1[0]),
									 getRGBA32FPixelData(GL_FLOAT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getR32FPixelData(0, GL_FLOAT, texel2[0]),
									 getRGBA32FPixelData(GL_FLOAT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getR32FPixelData(0, GL_FLOAT, texel3[0]),
									 getRGBA32FPixelData(GL_FLOAT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getR32FPixelData(0, GL_FLOAT, texel4[0]), PIXEL_COMPARE_CHANNEL_R);

		/* GL_RGBA32F => GL_RG32F */
		addEntryToConversionDatabase(getRGBA32FPixelData(GL_FLOAT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRG32FPixelData(0, GL_FLOAT, texel1[0], texel1[1]),
									 getRGBA32FPixelData(GL_FLOAT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRG32FPixelData(0, GL_FLOAT, texel2[0], texel2[1]),
									 getRGBA32FPixelData(GL_FLOAT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRG32FPixelData(0, GL_FLOAT, texel3[0], texel3[1]),
									 getRGBA32FPixelData(GL_FLOAT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRG32FPixelData(0, GL_FLOAT, texel4[0], texel4[1]), PIXEL_COMPARE_CHANNEL_RG);

		/* GL_RGBA32F => GL_RGB32F */
		addEntryToConversionDatabase(getRGBA32FPixelData(GL_FLOAT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGB32FPixelData(0, GL_FLOAT, texel1[0], texel1[1], texel1[2]),
									 getRGBA32FPixelData(GL_FLOAT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGB32FPixelData(0, GL_FLOAT, texel2[0], texel2[1], texel2[2]),
									 getRGBA32FPixelData(GL_FLOAT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGB32FPixelData(0, GL_FLOAT, texel3[0], texel3[1], texel3[2]),
									 getRGBA32FPixelData(GL_FLOAT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRGB32FPixelData(0, GL_FLOAT, texel4[0], texel4[1], texel4[2]),
									 PIXEL_COMPARE_CHANNEL_RGB);

		/* GL_RGBA32F => GL_RGBA32F */
		addEntryToConversionDatabase(getRGBA32FPixelData(GL_FLOAT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGBA32FPixelData(GL_FLOAT, texel1[0], texel1[1], texel1[2], texel1[3]),
									 getRGBA32FPixelData(GL_FLOAT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGBA32FPixelData(GL_FLOAT, texel2[0], texel2[1], texel2[2], texel2[3]),
									 getRGBA32FPixelData(GL_FLOAT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGBA32FPixelData(GL_FLOAT, texel3[0], texel3[1], texel3[2], texel3[3]),
									 getRGBA32FPixelData(GL_FLOAT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 getRGBA32FPixelData(GL_FLOAT, texel4[0], texel4[1], texel4[2], texel4[3]),
									 PIXEL_COMPARE_CHANNEL_RGBA);
	}
}

class TestBase : public deqp::TestCase
{
public:
	TestBase(deqp::Context& context, GLenum source_attachment_type, GLenum destination_attachment_type);
	virtual ~TestBase();

protected:
	bool getFormatAndTypeCompatibleWithInternalformat(GLenum internalformat, int index, GLenum* out_format,
													  GLenum* out_type) const;
	bool getFormatForInternalformat(GLenum internalformat, GLenum* out_format) const;
	GLenum getFBOEffectiveInternalFormatAtIndex(unsigned int index) const;
	GLenum getCopyTexImage2DInternalFormatAtIndex(unsigned int index) const;
	const char* getTargetName(GLenum target) const;
	GLenum getGeneralTargetForDetailedTarget(GLenum target);

	GLuint generateGLObject(GLenum object_type);
	bool configureGLObject(int is_source_gl_object, GLenum object_target, GLint object_id, GLenum internal_format,
						   GLenum format, GLenum type, void* data);
	void destroyGLObject(GLenum target, GLuint object_id);

	bool isValidRBOInternalFormat(GLenum internalformat) const;
	bool isColorRenderableInternalFormat(GLenum internalformat) const;
	bool isDepthRenderableInternalFormat(GLenum internalformat) const;
	bool isDepthStencilRenderableInternalFormat(GLenum internalformat) const;
	bool isFBOEffectiveInternalFormatCompatibleWithDestinationInternalFormat(GLenum src_internalformat,
																			 GLenum dst_internalformat) const;
	const char* getInternalformatString(GLenum internalformat);

protected:
	GLenum m_source_attachment_type;
	GLenum m_destination_attachment_type;
};

TestBase::TestBase(deqp::Context& context, GLenum source_attachment_type, GLenum destination_attachment_type)
	: deqp::TestCase(context, "", "")
	, m_source_attachment_type(source_attachment_type)
	, m_destination_attachment_type(destination_attachment_type)
{
	static std::map<GLenum, std::string> attachment_name_map;
	if (attachment_name_map.empty())
	{
		attachment_name_map[GL_TEXTURE_2D]					= "texture2d";
		attachment_name_map[GL_TEXTURE_CUBE_MAP_NEGATIVE_X] = "cubemap_negx";
		attachment_name_map[GL_TEXTURE_CUBE_MAP_NEGATIVE_Y] = "cubemap_negy";
		attachment_name_map[GL_TEXTURE_CUBE_MAP_NEGATIVE_Z] = "cubemap_negz";
		attachment_name_map[GL_TEXTURE_CUBE_MAP_POSITIVE_X] = "cubemap_posx";
		attachment_name_map[GL_TEXTURE_CUBE_MAP_POSITIVE_Y] = "cubemap_posy";
		attachment_name_map[GL_TEXTURE_CUBE_MAP_POSITIVE_Z] = "cubemap_posz";
		attachment_name_map[GL_TEXTURE_2D_ARRAY]			= "texture_array";
		attachment_name_map[GL_TEXTURE_3D]					= "texture3d";
		attachment_name_map[GL_RENDERBUFFER]				= "renderbuffer";
	}

	m_name = attachment_name_map[m_source_attachment_type] + "_" + attachment_name_map[m_destination_attachment_type];
}

TestBase::~TestBase()
{
}

/** For every valid GLES internalformat, gl.readPixels() can often work with a variety of different
 *  format+type combinations. This function allows to enumerate valid pairs for user-specified
 *  internal formats.
 *
 *  Enumeration should start from 0 and continue until the function starts reporting failure.
 *
 *  @param internalformat GLES internal format to consider.
 *  @param index		  Index of format+type pair to look up.
 *  @param out_format	 Deref will be used to store compatible GLES format. Cannot be NULL.
 *  @param out_type	   Deref will be used to store compatible GLES type. Cannot be NULL.
 *
 *  @return true if successful and relevant format & type information has been stored under
 *		  dereferences of corresponding arguments, false otherwise.
 **/
bool TestBase::getFormatAndTypeCompatibleWithInternalformat(GLenum internalformat, int index, GLenum* out_format,
															GLenum* out_type) const
{
	const glu::ContextInfo& contextInfo   = m_context.getContextInfo();
	bool is_ext_texture_storage_supported = contextInfo.isExtensionSupported("GL_EXT_texture_storage");
	bool is_ext_texture_type_2_10_10_10_rev_supported =
		contextInfo.isExtensionSupported("GL_EXT_texture_type_2_10_10_10_REV");

	DE_ASSERT(out_format != NULL);
	DE_ASSERT(out_type != NULL);

	if (!getFormatForInternalformat(internalformat, out_format))
		TCU_FAIL("No format known for requested internalformat");

	switch (internalformat)
	{
	case GL_ALPHA:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_BYTE;
		else
			return false;
		break;
	}

	case GL_LUMINANCE:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_BYTE;
		else
			return false;
		break;
	}

	case GL_R8:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_BYTE;
		else
			return false;
		break;
	}

	case GL_LUMINANCE_ALPHA:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_BYTE;
		else
			return false;
		break;
	}

	case GL_RG8:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_BYTE;
		else
			return false;
		break;
	}

	case GL_SRGB:
	case GL_RGB:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_BYTE;
		else if (index == 1)
			*out_type = GL_UNSIGNED_SHORT_5_6_5;
		else if (index == 2)
			*out_type = GL_UNSIGNED_INT_2_10_10_10_REV;
		else if (index == 3)
			*out_type = GL_HALF_FLOAT;
		else if (index == 4)
			*out_type = GL_FLOAT;
		else
			return false;
		break;
	}

	case GL_SRGB8:
	case GL_RGB8:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_BYTE;
		else
			return false;
		break;
	}

	case GL_RGB565:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_SHORT_5_6_5;
		else if (index == 1)
			*out_type = GL_UNSIGNED_BYTE;
		else
			return false;
		break;
	}

	case GL_RGBA:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_BYTE;
		else if (index == 1)
			*out_type = GL_UNSIGNED_SHORT_4_4_4_4;
		else if (index == 2)
			*out_type = GL_UNSIGNED_SHORT_5_5_5_1;
		else if (index == 3)
			*out_type = GL_HALF_FLOAT;
		else if (index == 4)
			*out_type = GL_FLOAT;
		else
			return false;
		break;
	}

	case GL_RGBA4:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_SHORT_4_4_4_4;
		else if (index == 1)
			*out_type = GL_UNSIGNED_BYTE;
		else
			return false;
		break;
	}

	case GL_RGB5_A1:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_SHORT_5_5_5_1;
		else if (index == 1)
			*out_type = GL_UNSIGNED_BYTE;
		else if (index == 2)
			*out_type = GL_UNSIGNED_INT_2_10_10_10_REV;
		else
			return false;
		break;
	}

	case GL_RGBA8:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_BYTE;
		else
			return false;
		break;
	}

	case GL_RGB10_A2:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_INT_2_10_10_10_REV;
		else
			return false;
		break;
	}

	case GL_RGB10_A2UI:
	{
		if (index == 0)
		{
			*out_type = GL_UNSIGNED_INT_2_10_10_10_REV;
		} /* if (index == 0) */
		else
		{
			return false;
		}

		break;
	}

	case GL_SRGB8_ALPHA8:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_BYTE;
		else
			return false;
		break;
	}

	case GL_R8I:
	{
		if (index == 0)
			*out_type = GL_BYTE;
		else
			return false;
		break;
	}

	case GL_R8UI:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_BYTE;
		else
			return false;
		break;
	}

	case GL_R16I:
	{
		if (index == 0)
			*out_type = GL_SHORT;
		else
			return false;
		break;
	}

	case GL_R16UI:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_SHORT;
		else
			return false;
		break;
	}

	case GL_R32I:
	{
		if (index == 0)
			*out_type = GL_INT;
		else
			return false;
		break;
	}

	case GL_R32UI:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_INT;
		else
			return false;
		break;
	}

	case GL_RG8I:
	{
		if (index == 0)
			*out_type = GL_BYTE;
		else
			return false;
		break;
	}

	case GL_RG8UI:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_BYTE;
		else
			return false;
		break;
	}

	case GL_RG16I:
	{
		if (index == 0)
			*out_type = GL_SHORT;
		else
			return false;
		break;
	}

	case GL_RG16UI:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_SHORT;
		else
			return false;
		break;
	}

	case GL_RG32I:
	{
		if (index == 0)
			*out_type = GL_INT;
		else
			return false;
		break;
	}

	case GL_RG32UI:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_INT;
		else
			return false;
		break;
	}

	case GL_RGB8I:
	{
		if (index == 0)
			*out_type = GL_BYTE;
		else
			return false;
		break;
	}

	case GL_RGB8UI:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_BYTE;
		else
			return false;
		break;
	}

	case GL_RGB16I:
	{
		if (index == 0)
			*out_type = GL_SHORT;
		else
			return false;
		break;
	}

	case GL_RGB16UI:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_SHORT;
		else
			return false;
		break;
	}

	case GL_RGB32I:
	{
		if (index == 0)
			*out_type = GL_INT;
		else
			return false;
		break;
	}

	case GL_RGB32UI:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_INT;
		else
			return false;
		break;
	}

	case GL_RGBA8I:
	{
		if (index == 0)
			*out_type = GL_BYTE;
		else
			return false;
		break;
	}

	case GL_RGBA8UI:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_BYTE;
		else
			return false;
		break;
	}

	case GL_RGBA16I:
	{
		if (index == 0)
			*out_type = GL_SHORT;
		else
			return false;
		break;
	}

	case GL_RGBA16UI:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_SHORT;
		else
			return false;
		break;
	}

	case GL_RGBA32I:
	{
		if (index == 0)
			*out_type = GL_INT;
		else
			return false;
		break;
	}

	case GL_RGBA32UI:
	{
		if (index == 0)
			*out_type = GL_UNSIGNED_INT;
		else
			return false;
		break;
	}

	case GL_R16F:
	{
		if (index == 0)
			*out_type = GL_HALF_FLOAT;
		else
			return false;
		break;
	}

	case GL_RG16F:
	{
		if (index == 0)
			*out_type = GL_HALF_FLOAT;
		else
			return false;
		break;
	}

	case GL_R32F:
	{
		if (index == 0)
			*out_type = GL_FLOAT;
		else
			return false;
		break;
	}

	case GL_RG32F:
	{
		if (index == 0)
			*out_type = GL_FLOAT;
		else
			return false;
		break;
	}

	case GL_RGB16F:
	{
		if (index == 0)
			*out_type = GL_HALF_FLOAT;
		else
			return false;
		break;
	}

	case GL_RGBA16F:
	{
		if (index == 0)
			*out_type = GL_HALF_FLOAT;
		else
			return false;
		break;
	}

	case GL_RGB32F:
	{
		if (index == 0)
			*out_type = GL_FLOAT;
		else
			return false;
		break;
	}

	case GL_RGBA32F:
	{
		if (index == 0)
			*out_type = GL_FLOAT;
		else
			return false;
		break;
	}

	case GL_RGB10_EXT:
	{
		if (index == 0)
		{
			if (is_ext_texture_type_2_10_10_10_rev_supported && is_ext_texture_storage_supported)
			{
				*out_type = GL_UNSIGNED_INT_2_10_10_10_REV;
			} /* if (is_ext_texture_type_2_10_10_10_rev_supported) */
			else
			{
				return false;
			}
		} /* if (index == 0) */
		else
		{
			return false;
		}
		break;
	}

	case GL_ALPHA8_EXT:
	{
		// TODO: No extension available at the time of writing.
		return false;
	}

	case GL_LUMINANCE8_EXT:
	{
		// TODO: No extension available at the time of writing.
		return false;
	}

	case GL_LUMINANCE8_ALPHA8_EXT:
	{
		// TODO: No extension available at the time of writing.
		return false;
	}

	default:
	{
		TCU_FAIL("Unsupported internalformat");
	}
	} // switch (internalformat)

	return true;
}

/** Retrieves GLES format compatible for user-specified GLES internal format.
 *
 *  @param internalformat GLES internalformat to consider.
 *  @param out_format	 Deref will be used to store the result. Cannot be NULL.
 *
 *  @return true if successful, false otherwise.
 **/
bool TestBase::getFormatForInternalformat(GLenum internalformat, GLenum* out_format) const
{
	DE_ASSERT(out_format != NULL);

	// Find out the format for user-provided internalformat
	switch (internalformat)
	{
	case GL_ALPHA:
		*out_format = GL_ALPHA;
		break;

	case GL_LUMINANCE_ALPHA:
		*out_format = GL_LUMINANCE_ALPHA;
		break;

	case GL_LUMINANCE:
	case GL_LUMINANCE8_OES:
		*out_format = GL_LUMINANCE;
		break;

	case GL_R8:
	case GL_R8_SNORM:
	case GL_R16F:
	case GL_R32F:
		*out_format = GL_RED;
		break;

	case GL_R8UI:
	case GL_R8I:
	case GL_R16UI:
	case GL_R16I:
	case GL_R32UI:
	case GL_R32I:
		*out_format = GL_RED_INTEGER;
		break;

	case GL_RG8:
	case GL_RG8_SNORM:
	case GL_RG16F:
	case GL_RG32F:
		*out_format = GL_RG;
		break;

	case GL_RG8UI:
	case GL_RG8I:
	case GL_RG16UI:
	case GL_RG16I:
	case GL_RG32UI:
	case GL_RG32I:
		*out_format = GL_RG_INTEGER;
		break;

	case GL_RGB:
	case GL_RGB8:
	case GL_SRGB8:
	case GL_RGB565:
	case GL_RGB8_SNORM:
	case GL_R11F_G11F_B10F:
	case GL_RGB9_E5:
	case GL_RGB16F:
	case GL_RGB32F:
		*out_format = GL_RGB;
		break;

	case GL_RGB8UI:
	case GL_RGB8I:
	case GL_RGB16UI:
	case GL_RGB16I:
	case GL_RGB32UI:
	case GL_RGB32I:
		*out_format = GL_RGB_INTEGER;
		break;

	case GL_RGBA:
	case GL_RGBA8:
	case GL_SRGB8_ALPHA8:
	case GL_RGBA8_SNORM:
	case GL_RGB5_A1:
	case GL_RGBA4:
	case GL_RGB10_A2:
	case GL_RGBA16F:
	case GL_RGBA32F:
		*out_format = GL_RGBA;
		break;

	case GL_RGBA8UI:
	case GL_RGBA8I:
	case GL_RGB10_A2UI:
	case GL_RGBA16UI:
	case GL_RGBA16I:
	case GL_RGBA32I:
	case GL_RGBA32UI:
		*out_format = GL_RGBA_INTEGER;
		break;

	case GL_DEPTH_COMPONENT16:
	case GL_DEPTH_COMPONENT24:
	case GL_DEPTH_COMPONENT32F:
		*out_format = GL_DEPTH_COMPONENT;
		break;

	case GL_DEPTH24_STENCIL8:
	case GL_DEPTH32F_STENCIL8:
		*out_format = GL_DEPTH_STENCIL;
		break;

	default:
		TCU_FAIL("Internalformat not recognized");
		return false;
	} // switch (internalformat)

	return true;
}

/** Retrieves FBO effective internal format at user-specified index.
 *
 *  Pays extra care not to reach outside of fbo_effective_internal_format_ordering array.
 *
 *  @param index Index to look up the internal format at.
 *
 *  @return Requested information or GL_NONE if failed or 0xFFFFFFFF if index is
 *		  outside allowed range.
 **/
GLenum TestBase::getFBOEffectiveInternalFormatAtIndex(unsigned int index) const
{
	const unsigned int n_effective_internalformats = DE_LENGTH_OF_ARRAY(fboEffectiveInternalFormatOrdering);

	DE_ASSERT(index < n_effective_internalformats);
	if (index < n_effective_internalformats)
		return fboEffectiveInternalFormatOrdering[index];

	// Return glitch
	m_testCtx.getLog() << tcu::TestLog::Message
					   << "GetFBOEffectiveInternalFormatAtIndex - Invalid index requested: " << index
					   << tcu::TestLog::EndMessage;

	return static_cast<GLenum>(0xFFFFFFFF);
}

/** Retrieves glCopyTexImage2D() internal format at user-specified index.
 *
 *  Pays extra care not to reach outside of copy_tex_image_2d_internal_format_orderingarray.
 *
 *  @param index Index to look up the internal format at.
 *
 *  @return Requested information or GL_NONE if failed or 0xFFFFFFFF if index is outside
 *		  allowed range.
 **/
GLenum TestBase::getCopyTexImage2DInternalFormatAtIndex(unsigned int index) const
{
	const unsigned int n_internalformats = DE_LENGTH_OF_ARRAY(copyTexImage2DInternalFormatOrdering);

	DE_ASSERT(index < n_internalformats);
	if (index < n_internalformats)
		return copyTexImage2DInternalFormatOrdering[index];

	// Return glitch
	m_testCtx.getLog() << tcu::TestLog::Message
					   << "GetCopyTexImage2DInternalFormatAtIndex - Invalid index requested: " << index
					   << tcu::TestLog::EndMessage;

	return static_cast<GLenum>(0xFFFFFFFF);
}

/** Retrieves a string representing name of target passed by argument.
 *
 *  @param target GLES target to retrieve a string for.
 *
 *  @return A relevant string or "?" (without double quotation marks)
 *		  if type is unrecognized.
 **/
const char* TestBase::getTargetName(GLenum target) const
{
	const char* result = "?";

	switch (target)
	{
	case GL_RENDERBUFFER:
		result = "GL_RENDERBUFFER";
		break;
	case GL_TEXTURE_2D:
		result = "GL_TEXTURE_2D";
		break;
	case GL_TEXTURE_2D_ARRAY:
		result = "GL_TEXTURE_2D_ARRAY";
		break;
	case GL_TEXTURE_3D:
		result = "GL_TEXTURE_3D";
		break;
	case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
		result = "GL_TEXTURE_CUBE_MAP_NEGATIVE_X";
		break;
	case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
		result = "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y";
		break;
	case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
		result = "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z";
		break;
	case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
		result = "GL_TEXTURE_CUBE_MAP_POSITIVE_X";
		break;
	case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
		result = "GL_TEXTURE_CUBE_MAP_POSITIVE_Y";
		break;
	case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
		result = "GL_TEXTURE_CUBE_MAP_POSITIVE_Z";
		break;
	}

	return result;
}

/** Returns a general texture target for cube-map texture targets or
 *  user-specified target otherwise.
 *
 *  @param target GLES target to consider. Allowed values:
 *				1)  GL_RENDERBUFFER,
 *				2)  GL_TEXTURE_2D,
 *				3)  GL_TEXTURE_2D_ARRAY,
 *				4)  GL_TEXTURE_3D,
 *				5)  GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
 *				6)  GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
 *				7)  GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
 *				8)  GL_TEXTURE_CUBE_MAP_POSITIVE_X,
 *				9)  GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
 *				10) GL_TEXTURE_CUBE_MAP_POSITIVE_Z.
 *
 *  @return General texture target or used-specified target
 *		  if successful, GL_NONE otherwise.
 */
GLenum TestBase::getGeneralTargetForDetailedTarget(GLenum target)
{
	GLenum result = GL_NONE;

	switch (target)
	{
	case GL_RENDERBUFFER:
	case GL_TEXTURE_2D:
	case GL_TEXTURE_2D_ARRAY:
	case GL_TEXTURE_3D:
	{
		result = target;

		break;
	} // renderbuffer & 2D/3D texture targets

	case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
	case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
	case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
	case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
	case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
	case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
	{
		result = GL_TEXTURE_CUBE_MAP;

		break;
	} // cube-map texture targets

	default:
	{
		TCU_FAIL("Unrecognized target");
	}
	}

	return result;
}

/** Generates a GL object of an user-requested type.
 *
 *  NOTE: It is expected no error is reported by OpenGL ES prior to
 *		the call.
 *
 *  @param object_type Type of a GL object to create. Allowed values:
 *					 1)  GL_RENDERBUFFER,
 *					 2)  GL_TEXTURE_2D,
 *					 3)  GL_TEXTURE_2D_ARRAY,
 *					 4)  GL_TEXTURE_3D,
 *					 5)  GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
 *					 6)  GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
 *					 7)  GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
 *					 8)  GL_TEXTURE_CUBE_MAP_POSITIVE_X,
 *					 9)  GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
 *					 10) GL_TEXTURE_CUBE_MAP_POSITIVE_Z.
 *
 *  @return GLES ID (different than zero) of the created object if
 *		  successful, zero otherwise.
 */
GLuint TestBase::generateGLObject(GLenum object_type)
{
	const Functions& gl			= m_context.getRenderContext().getFunctions();
	GLenum			 error_code = GL_NO_ERROR;
	GLuint			 result		= 0;

	switch (object_type)
	{
	case GL_RENDERBUFFER:
	{
		gl.genRenderbuffers(1, &result);
		break;
	}

	case GL_TEXTURE_2D:
	case GL_TEXTURE_2D_ARRAY:
	case GL_TEXTURE_3D:
	case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
	case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
	case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
	case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
	case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
	case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
	{
		gl.genTextures(1, &result);
		break;
	}

	default:
		TCU_FAIL("Unsupported source attachment type");
	}

	// check if all is good with our new object
	error_code = gl.getError();

	if (error_code != GL_NO_ERROR)
	{
		m_testCtx.getLog() << tcu::TestLog::Message
						   << "Could not generate a renderbuffer OR texture object. GL reported error: [" << error_code
						   << "]" << tcu::TestLog::EndMessage;
		return 0;
	}

	return result;
}

/** Sets up a GL object and binds it to either GL_DRAW_FRAMEBUFFER
 *  (if @param is_source_gl_object is 0) or GL_READ_FRAMEBUFFER zeroth
 *  color attachment.
 *
 *  NOTE: The function assumes the object at @param object_id of @param
 *		object_target type has already been generated!
 *
 *  @param is_source_gl_object 1 if the object should be bound to
 *							 GL_DRAW_FRAMEBUFFER target once configured,
 *							 0 to bound the object to GL_READ_FRAMEBUFFER
 *							 target instead.
 *  @param object_target	   Type of the object to configure. Allowed values:
 *							 1)  GL_RENDERBUFFER,
 *							 2)  GL_TEXTURE_2D,
 *							 3)  GL_TEXTURE_2D_ARRAY,
 *							 4)  GL_TEXTURE_3D,
 *							 5)  GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
 *							 6)  GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
 *							 7)  GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
 *							 8)  GL_TEXTURE_CUBE_MAP_POSITIVE_X,
 *							 9)  GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
 *							 10) GL_TEXTURE_CUBE_MAP_POSITIVE_Z.
 *  @param object_id		   GLES ID of the object to configure.
 *  @param internal_format	 Internal-format of the data under @param data.
 *  @param format			  Format of the data under @param data.
 *  @param type				Type the data @param data is represented with.
 *  @param data				Buffer with the data to fill the object with.
 *							 Cannot be NULL.
 *
 *  @return true if successful, false otherwise.,
 **/
bool TestBase::configureGLObject(int is_source_gl_object, GLenum object_target, GLint object_id, GLenum internal_format,
								 GLenum format, GLenum type, void* data)
{
	const Functions& gl			= m_context.getRenderContext().getFunctions();
	GLenum			 fbo_target = (is_source_gl_object == 0) ? GL_DRAW_FRAMEBUFFER : GL_READ_FRAMEBUFFER;
	bool			 result		= true;

	// Special case for GL_HALF_FLOAT -> input data is in GL_FLOAT
	if (type == GL_HALF_FLOAT)
		type = GL_FLOAT;

	switch (object_target)
	{
	case GL_RENDERBUFFER:
	{
		GLint  current_draw_fbo_id   = 0;
		GLint  current_read_fbo_id   = 0;
		GLuint temporary_draw_fbo_id = 0;
		GLuint temporary_read_fbo_id = 0;
		GLuint temporary_to_id		 = 0;

		// Retrieve current draw/read fbo bindings
		gl.getIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &current_draw_fbo_id);
		gl.getIntegerv(GL_READ_FRAMEBUFFER_BINDING, &current_read_fbo_id);

		// Set up the RBO */
		gl.bindRenderbuffer(GL_RENDERBUFFER, object_id);
		gl.renderbufferStorage(GL_RENDERBUFFER, internal_format, TEXTURE_WIDTH, TEXTURE_HEIGHT);

		// Generate a temporary 2D texture object and copy the data into it
		gl.genTextures(1, &temporary_to_id);
		gl.bindTexture(GL_TEXTURE_2D, temporary_to_id);
		gl.texImage2D(GL_TEXTURE_2D, 0 /* level */, internal_format, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0 /* border */,
					  format, type, data);

		// Set up a temporary read FBO with the texture object attached to zeroth color attachment..
		gl.genFramebuffers(1, &temporary_read_fbo_id);
		gl.bindFramebuffer(GL_READ_FRAMEBUFFER, temporary_read_fbo_id);
		gl.framebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, temporary_to_id,
								0 /* level */);

		// and another one we'll bind to draw framebuffer target with the renderbuffer object attached
		gl.genFramebuffers(1, &temporary_draw_fbo_id);
		gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, temporary_draw_fbo_id);
		gl.framebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, object_id);

		// Blit the texture contents into the renderbuffer.
		gl.blitFramebuffer(0 /* srcX0 */, 0 /* srcY0 */, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0 /* dstX0 */, 0 /* dstY0 */,
						   TEXTURE_WIDTH, TEXTURE_HEIGHT, GL_COLOR_BUFFER_BIT, GL_NEAREST);

		// Restore pre-call configuration
		gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, current_draw_fbo_id);
		gl.bindFramebuffer(GL_READ_FRAMEBUFFER, current_read_fbo_id);

		// Get rid of the temporary objects
		gl.bindTexture(GL_TEXTURE_2D, 0);
		gl.deleteTextures(1, &temporary_to_id);
		gl.deleteFramebuffers(1, &temporary_draw_fbo_id);
		gl.deleteFramebuffers(1, &temporary_read_fbo_id);

		// Update the pre-call framebuffer's attachment configuration
		gl.framebufferRenderbuffer(fbo_target, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, object_id);
		break;
	}

	case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
	case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
	case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
	case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
	case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
	case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
	{
		const GLenum cm_targets[] = { GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
									  GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, GL_TEXTURE_CUBE_MAP_POSITIVE_X,
									  GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z };
		GLenum		 general_target = getGeneralTargetForDetailedTarget(object_target);
		unsigned int n_cm_target	= 0;

		// Set up base mipmap for our source texture.
		gl.bindTexture(general_target, object_id);

		// Set up *all* faces of a cube-map (as per Bugzilla #9689 & #9807),
		// so that the CM texture is cube complete.
		for (n_cm_target = 0; n_cm_target < sizeof(cm_targets) / sizeof(cm_targets[0]); ++n_cm_target)
		{
			gl.texImage2D(cm_targets[n_cm_target], 0 /* level */, internal_format, TEXTURE_WIDTH, TEXTURE_HEIGHT,
						  0 /* border */, format, type, data);
		}

		gl.texParameterf(general_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		gl.texParameterf(general_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		gl.texParameterf(general_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
		gl.texParameterf(general_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

		// Set up the FBO attachment
		if (is_source_gl_object)
			gl.framebufferTexture2D(fbo_target, GL_COLOR_ATTACHMENT0, object_target, object_id, 0);

		gl.bindTexture(general_target, 0);
		break;
	}

	case GL_TEXTURE_2D:
	{
		// Set up base mipmap for our source texture.
		gl.bindTexture(object_target, object_id);
		gl.texImage2D(object_target, 0 /* level */, internal_format, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0 /* border */,
					  format, type, data);

		gl.texParameterf(object_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		gl.texParameterf(object_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		gl.texParameterf(object_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
		gl.texParameterf(object_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

		// Set up the FBO attachment
		if (is_source_gl_object)
			gl.framebufferTexture2D(fbo_target, GL_COLOR_ATTACHMENT0, object_target, object_id, 0);

		gl.bindTexture(object_target, 0);
		break;
	}

	case GL_TEXTURE_2D_ARRAY:
	case GL_TEXTURE_3D:
	{
		// Set up base mipmap for our source texture.
		gl.bindTexture(object_target, object_id);
		gl.texImage3D(object_target, 0 /* level */, internal_format, TEXTURE_WIDTH, TEXTURE_HEIGHT, TEXTURE_DEPTH,
					  0 /* border */, format, type, NULL);
		gl.texSubImage3D(object_target, 0 /* level */, 0 /* xoffset */, 0 /* yoffset */, 1 /* zoffset */, TEXTURE_WIDTH,
						 TEXTURE_HEIGHT, 1 /* depth */, format, type, data);

		gl.texParameterf(object_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		gl.texParameterf(object_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		gl.texParameterf(object_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
		gl.texParameterf(object_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
		gl.texParameterf(object_target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

		DE_ASSERT(is_source_gl_object);

		// Set up the FBO attachment. Make sure there is an actual difference from gl.framebufferTexture2D()
		// and use the second layer of the texture.
		gl.framebufferTextureLayer(fbo_target, GL_COLOR_ATTACHMENT0, object_id, 0 /* level */, 1 /* layer */);

		gl.bindTexture(object_target, 0);
		break;
	}

	default:
	{
		// ASSERTION FAILURE: unsupported source attachment type
		DE_ASSERT(0);
		result = false;
	}
	} /* switch (source_attachment_type) */

	if (result)
	{
		GLenum error_code = gl.getError();

		if (error_code != GL_NO_ERROR)
		{
			m_testCtx.getLog() << tcu::TestLog::Message << "Could not set up a GL object ["
							   << (is_source_gl_object ? "source" : "destination") << "] of format ["
							   << getInternalformatString(internal_format) << "] to be used as "
							   << getTargetName(object_target) << " attachment for the test. GL reported error ["
							   << error_code << "]";
			return false;
		}
	}

	return result;
}

/** Releases a GL object. If @param target represents a texture,
 *  the object is unbound from the target prior to a gl.deleteTextures()
 *  call.
 *
 *  @param target	Type of the object to release. Allowed values:
 *				   1)  GL_RENDERBUFFER,
 *				   2)  GL_TEXTURE_2D,
 *				   3)  GL_TEXTURE_2D_ARRAY,
 *				   4)  GL_TEXTURE_3D,
 *				   5)  GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
 *				   6)  GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
 *				   7)  GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
 *				   8)  GL_TEXTURE_CUBE_MAP_POSITIVE_X,
 *				   9)  GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
 *				   10) GL_TEXTURE_CUBE_MAP_POSITIVE_Z.
 *
 *  @param object_id GLES ID of the object to release.
 */
void TestBase::destroyGLObject(GLenum target, GLuint object_id)
{
	const Functions& gl = m_context.getRenderContext().getFunctions();
	switch (target)
	{
	case GL_RENDERBUFFER:
	{
		gl.bindRenderbuffer(GL_RENDERBUFFER, 0);
		gl.deleteRenderbuffers(1, &object_id);
		break;
	}

	case GL_TEXTURE_2D:
	case GL_TEXTURE_2D_ARRAY:
	case GL_TEXTURE_3D:
	case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
	case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
	case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
	case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
	case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
	case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
	{
		GLenum general_attachment_type = getGeneralTargetForDetailedTarget(target);
		gl.bindTexture(general_attachment_type, 0);
		gl.deleteTextures(1, &object_id);
		break;
	}

	default:
	{
		TCU_FAIL("Unsupported attachment type.");
	}
	}
}

/** Tells whether @param internalformat can be used for
 *  a gl.renderbufferStorage*() call.
 *
 *  @param internalformat Internalformat to consider.
 *
 *  @return true if the internal format can be used for the call,
 *		  false otherwise.
 **/
bool TestBase::isValidRBOInternalFormat(GLenum internalformat) const
{
	// Internal format can be used for gl.renderbufferStorage()
	// call if it's either color-, depth- or stencil-renderable.
	return isColorRenderableInternalFormat(internalformat) || isDepthRenderableInternalFormat(internalformat) ||
		   isDepthStencilRenderableInternalFormat(internalformat);
}

/** Tells whether internal format @param internalformat is color-renderable.
 *
 *  @param internalformat GLES internal format to consider.
 *
 *  @return true if @param internalformat is color-renderable, false otherwise
 **/
bool TestBase::isColorRenderableInternalFormat(GLenum internalformat) const
{
	const glu::ContextInfo& contextInfo = m_context.getContextInfo();

	bool supports_fp_textures	  = contextInfo.isExtensionSupported("GL_EXT_color_buffer_float");
	bool supports_half_fp_textures = contextInfo.isExtensionSupported("GL_EXT_color_buffer_half_float");

	// Floating-point textures are only supported if
	// implementation supports GL_EXT_color_buffer_float extension
	if (!supports_fp_textures && (internalformat == GL_R32F || internalformat == GL_RG32F ||
								  internalformat == GL_RGB32F || internalformat == GL_RGBA32F))
	{
		return false;
	}

	// Half floating-point textures are only supported if
	// implementation supports GL_EXT_color_buffer_half_float extension
	if (!supports_half_fp_textures && (internalformat == GL_R16F || internalformat == GL_RG16F ||
									   internalformat == GL_RGB16F || internalformat == GL_RGBA16F))
	{
		return false;
	}

	switch (internalformat)
	{
	case GL_RGB:
	case GL_RGBA:
	case GL_R8:
	case GL_RG8:
	case GL_RGB8:
	case GL_RGB565:
	case GL_RGBA4:
	case GL_RGB5_A1:
	case GL_RGBA8:
	case GL_RGB10_A2:
	case GL_RGB10_A2UI:
	case GL_SRGB8_ALPHA8:
	case GL_R8I:
	case GL_R8UI:
	case GL_R16I:
	case GL_R16UI:
	case GL_R32I:
	case GL_R32UI:
	case GL_RG8I:
	case GL_RG8UI:
	case GL_RG16I:
	case GL_RG16UI:
	case GL_RG32I:
	case GL_RG32UI:
	case GL_RGBA8I:
	case GL_RGBA8UI:
	case GL_RGBA16I:
	case GL_RGBA16UI:
	case GL_RGBA32I:
	case GL_RGBA32UI:
		// GLES3.0 color-renderable internalformats
		return true;

	case GL_R16F:
	case GL_R32F:
	case GL_RG16F:
	case GL_RG32F:
	case GL_RGB16F:
	// GL_RGB32F not supported
	case GL_RGBA16F:
	case GL_RGBA32F:
		// Since we passed the above checks, we can assume
		// the internalformats are color-renderable
		return true;

	default:
		return false;
	}

	return false;
}

/** Tells whether internal format @param internalformat is depth-renderable.
 *
 *  @param internalformat GLES internal format to consider.
 *
 *  @return true if @param internalformat is depth-renderable, false otherwise
 **/
bool TestBase::isDepthRenderableInternalFormat(GLenum internalformat) const
{
	switch (internalformat)
	{
	case GL_DEPTH_COMPONENT16:
	case GL_DEPTH_COMPONENT24:
	case GL_DEPTH_COMPONENT32F:
		return true;
	}

	return false;
}

/** Tells whether internal format @param internalformat is depth+stencil-renderable.
 *
 *  @param internalformat GLES internal format to consider.
 *
 *  @return true if @param internalformat is depth+stencil-renderable, false otherwise
 **/
bool TestBase::isDepthStencilRenderableInternalFormat(GLenum internalformat) const
{
	switch (internalformat)
	{
	case GL_DEPTH24_STENCIL8:
	case GL_DEPTH32F_STENCIL8:
		return true;
	}

	return false;
}

/** Tells whether OpenGL ES 3.0 implementations should accept copying texture image data from
 *  a read buffer using @param src_internalformat internalformat-based storage to a texture object
 *  using an internal format @param dst_internalformat.
 *
 *  @param src_internalformat Internal format to be used for source object's data storage.
 *  @param dst_internalformat Internal format to be used for destination texture object's data storage.
 *
 *  @return true if the operation is expected to execute successfully, false otherwise.
 */
bool TestBase::isFBOEffectiveInternalFormatCompatibleWithDestinationInternalFormat(GLenum src_internalformat,
																				   GLenum dst_internalformat) const
{
	const unsigned int n_copyteximage_internalformats = DE_LENGTH_OF_ARRAY(copyTexImage2DInternalFormatOrdering);
	unsigned int	   n_dst_internalformat			  = 0;
	const unsigned int n_effective_internalformats	= DE_LENGTH_OF_ARRAY(fboEffectiveInternalFormatOrdering);
	unsigned int	   n_src_internalformat			  = 0;
	bool			   result						  = false;

	// Find out which index does the source internalformat use
	while (n_src_internalformat < n_effective_internalformats)
	{
		GLenum internalformat_at_n = getFBOEffectiveInternalFormatAtIndex(n_src_internalformat);

		if (internalformat_at_n == src_internalformat)
			break;
		else
			++n_src_internalformat;
	}

	DE_ASSERT(n_src_internalformat != n_effective_internalformats);
	if (n_src_internalformat == n_effective_internalformats)
		return false;

	// Find out which index does the target internalformat use
	while (n_dst_internalformat < n_copyteximage_internalformats)
	{
		GLenum internalformat_at_n = getCopyTexImage2DInternalFormatAtIndex(n_dst_internalformat);

		if (internalformat_at_n == dst_internalformat)
			break;
		else
			++n_dst_internalformat;
	}

	DE_ASSERT(n_dst_internalformat != n_copyteximage_internalformats);
	if (n_dst_internalformat == n_copyteximage_internalformats)
		return false;

	// Find out if the conversion is allowed
	unsigned int conversion_array_index = n_copyteximage_internalformats * n_src_internalformat + n_dst_internalformat;

	DE_ASSERT(conversion_array_index < (sizeof(conversionArray) / sizeof(GLenum)));
	if (conversion_array_index < (sizeof(conversionArray) / sizeof(GLenum)))
		result = (conversionArray[conversion_array_index] != GL_NONE);

	return result;
}

/** Retrieves a string representing name of internal format passed by argument.
 *
 *  @param internalformat GLES internal format to retrieve a string for.
 *
 *  @return A relevant string or "?" (without double quotation marks)
 *          if type is unrecognized.
 **/
const char* TestBase::getInternalformatString(GLenum internalformat)
{
	switch (internalformat)
	{
	case GL_ALPHA:
		return "GL_ALPHA";
	case GL_ALPHA8_OES:
		return "GL_ALPHA8";
	case GL_LUMINANCE:
		return "GL_LUMINANCE";
	case GL_LUMINANCE8_OES:
		return "GL_LUMINANCE8";
	case GL_LUMINANCE8_ALPHA8_OES:
		return "GL_LUMINANCE8_ALPHA8";
	case GL_LUMINANCE_ALPHA:
		return "GL_LUMINANCE_ALPHA";
	case GL_R11F_G11F_B10F:
		return "GL_R11F_G11F_B10F";
	case GL_R16F:
		return "GL_R16F";
	case GL_R16I:
		return "GL_R16I";
	case GL_R16UI:
		return "GL_R16UI";
	case GL_R32F:
		return "GL_R32F";
	case GL_R32I:
		return "GL_R32I";
	case GL_R32UI:
		return "GL_R32UI";
	case GL_R8:
		return "GL_R8";
	case GL_R8I:
		return "GL_R8I";
	case GL_R8UI:
		return "GL_R8UI";
	case GL_R8_SNORM:
		return "GL_R8_SNORM";
	case GL_RG16F:
		return "GL_RG16F";
	case GL_RG16I:
		return "GL_RG16I";
	case GL_RG16UI:
		return "GL_RG16UI";
	case GL_RG32F:
		return "GL_RG32F";
	case GL_RG32I:
		return "GL_RG32I";
	case GL_RG32UI:
		return "GL_RG32UI";
	case GL_RG8:
		return "GL_RG8";
	case GL_RG8I:
		return "GL_RG8I";
	case GL_RG8UI:
		return "GL_RG8UI";
	case GL_RG8_SNORM:
		return "GL_RG8_SNORM";
	case GL_RGB:
		return "GL_RGB";
	case GL_RGB10_A2:
		return "GL_RGB10_A2";
	case GL_RGB10_A2UI:
		return "GL_RGB10_A2UI";
	case GL_RGB16F:
		return "GL_RGB16F";
	case GL_RGB16I:
		return "GL_RGB16I";
	case GL_RGB16UI:
		return "GL_RGB16UI";
	case GL_RGB32F:
		return "GL_RGB32F";
	case GL_RGB32I:
		return "GL_RGB32I";
	case GL_RGB32UI:
		return "GL_RGB32UI";
	case GL_RGB5_A1:
		return "GL_RGB5_A1";
	case GL_RGB8:
		return "GL_RGB8";
	case GL_RGB8I:
		return "GL_RGB8I";
	case GL_RGB8UI:
		return "GL_RGB8UI";
	case GL_RGB8_SNORM:
		return "GL_RGB8_SNORM";
	case GL_RGB9_E5:
		return "GL_RGB9_E5";
	case GL_RGBA:
		return "GL_RGBA";
	case GL_RGBA16I:
		return "GL_RGBA16I";
	case GL_RGBA16UI:
		return "GL_RGBA16UI";
	case GL_RGBA4:
		return "GL_RGBA4";
	case GL_RGBA32I:
		return "GL_RGBA32I";
	case GL_RGBA32UI:
		return "GL_RGBA32UI";
	case GL_RGBA8I:
		return "GL_RGBA8I";
	case GL_RGBA8UI:
		return "GL_RGBA8UI";
	case GL_RGB565:
		return "GL_RGB565";
	case GL_RGBA16F:
		return "GL_RGBA16F";
	case GL_RGBA32F:
		return "GL_RGBA32F";
	case GL_RGBA8:
		return "GL_RGBA8";
	case GL_RGBA8_SNORM:
		return "GL_RGBA8_SNORM";
	case GL_SRGB8:
		return "GL_SRGB8";
	case GL_SRGB8_ALPHA8:
		return "GL_SRGB8_ALPHA8";
	}

	return "GL_NONE";
}

/* SPECIFICATION:
 *
 * This conformance test verifies that glCopyTexImage2D() implementation accepts
 * internalformats that are compatible with effective internalformat of current
 * read buffer.
 *
 * The test starts from creating two framebuffer objects, that it accordingly binds
 * to GL_DRAW_FRAMEBUFFER and GL_READ_FRAMEBUFFER targets. It then enters two-level loop:
 *
 * a) First level determines source attachment type: this could either be a 2D texture/cube-map
 *	face mip-map, a specific mip-map of a slice coming from a 2D texture array OR a 3D texture,
 *	or finally a render-buffer. All of these can be bound to an attachment point that is
 *	later pointed to by read buffer configuration.
 * b) Second level configures attachment type of destination. Since glCopyTexImage2D()
 *	specification limits accepted targets, only 2D texture or cube-map face targets are
 *	accepted.
 *
 * For each viable source/destination configuration, the test then enters another two-level loop:
 *
 * I)  First sub-level determines what internal format should be used for the source attachment.
 *	 All texture formats required from a conformant GLES3.0 implementation are iterated over.
 * II) Second sub-level determines internal format that should be passed as a parameter to
 *	 a glCopyTexImage2D() call.
 *
 * For each internal format pair, the test creates and configures a corresponding GL object and
 * attaches it to the read framebuffer. The test also uses a pre-generated texture object ID that
 * will be re-configured with each glCopyTexImage2D() call.
 *
 * Source data is a 2x2 array consisting of up to 4 channels with different values, represented
 * in an iteration-specific format and type. For more details, please see implementation of
 * ConfigureConversionDatabase() entry-point.
 *
 * The test then loops over all supported format+type combinations for the internal-format considered
 * and feeds them into actual glCopyTexImage2D() call. It is against the specification for the call
 * to fail at this point. Should this be the case, the test is considered to fail but will continue
 * iterating over all the loops to make sure all problems are reported within a single run.
 *
 * Once the call is determined to have finished successfully, the test attempts to read the result data.
 * This needs to be handled in two ways:
 *
 * - if internalformat is color-renderable, we can attach the result texture to the read framebuffer object
 *   and do a glReadPixels() call. For some combinations of internalformat and attachment types the implementations
 *   are allowed to report unsupported framebuffer configuration, in which case the test will proceed with testing
 *   remaining source/destination/internalformat combinations and will not consider this an error.
 * - if internalformat is not color-renderable, we need to bind the result texture to a texture unit and
 *   use a program object to determine whether the data made available are valid. THIS CASE IS NOT IMPLEMENTED
 *   YET!
 *
 * Once the data are downloaded, they are compared against reference texture data. Should the rendered output
 * diverge outside the allowed epsilon, the test will report an error but will continue iterating to make sure
 * all source/destination/internalformat combinations are covered.
 */
class RequiredCase : public TestBase
{
public:
	RequiredCase(deqp::Context& context, de::SharedPtr<ConversionDatabase> database, GLenum sourceAttachmentTypes,
				 GLenum destinationAttachmentTypes);
	virtual ~RequiredCase();

	void						 deinit(void);
	tcu::TestNode::IterateResult iterate(void);

protected:
	bool execute(GLenum src_internalformat, GLenum dst_internalformat,
				 NonRenderableInternalformatSupportObjects* objects_ptr);
	bool bindTextureToTargetToSpecificTextureUnit(GLuint to_id, GLenum texture_target, GLenum texture_unit);
	bool setUniformValues(GLint source_2D_texture_uniform_location, GLenum source_2D_texture_unit,
						  GLint source_2DArray_texture_uniform_location, GLenum source_2DArray_texture_unit,
						  GLint source_3D_texture_uniform_location, GLenum source_3D_texture_unit,
						  GLint source_Cube_texture_uniform_location, GLenum source_Cube_texture_unit,
						  GLint destination_2D_texture_uniform_location, GLenum destination_2D_texture_unit,
						  GLint destination_Cube_texture_uniform_location, GLenum destination_Cube_texture_unit,
						  GLint channels_to_compare_uniform_location, GLint channels_to_compare,
						  GLint samplers_to_use_uniform_location, GLint samplers_to_use);
	bool copyDataFromBufferObject(GLuint bo_id, std::vector<GLint>& retrieved_data);
	bool findEntryInConversionDatabase(unsigned int index, GLenum src_internalformat, GLenum src_type,
									   GLenum copyteximage2d_internalformat, GLenum* out_result_internalformat,
									   GLenum* out_dst_type, PixelData* out_src_topleft, PixelData* out_src_topright,
									   PixelData* out_src_bottomleft, PixelData* out_src_bottomright,
									   PixelData* out_dst_topleft, PixelData* out_dst_topright,
									   PixelData* out_dst_bottomleft, PixelData* out_dst_bottomright,
									   PixelCompareChannel* out_channels_to_compare);
	int getIndexOfCopyTexImage2DInternalFormat(GLenum internalformat);
	int getIndexOfFramebufferEffectiveInternalFormat(GLenum internalformat);
	bool compareExpectedResultsByReadingPixels(PixelData source_tl_pixel_data, PixelData source_tr_pixel_data,
											   PixelData source_bl_pixel_data, PixelData source_br_pixel_data,
											   PixelData reference_tl_pixel_data, PixelData reference_tr_pixel_data,
											   PixelData reference_bl_pixel_data, PixelData reference_br_pixel_data,
											   GLenum read_type, GLenum result_internalformat);
	unsigned int getSizeOfPixel(GLenum format, GLenum type);
	bool getPixelDataFromRawData(void* raw_data, GLenum raw_data_format, GLenum raw_data_type, PixelData* out_result);
	bool comparePixelData(PixelData downloaded_pixel, PixelData reference_pixel, PixelData source_pixel,
						  GLenum result_internalformat, bool has_test_failed_already);
	bool getNumberOfBitsForInternalFormat(GLenum internalformat, int* out_rgba_bits);

	bool getRawDataFromPixelData(std::vector<char>& result, PixelData topleft, PixelData topright, PixelData bottomleft,
								 PixelData bottomright);
	bool getNumberOfBitsForChannelDataType(ChannelDataType channel_data_type, int* out_n_bits);

	bool getChannelOrderForInternalformatAndType(GLenum internalformat, GLenum type, ChannelOrder* out_channel_order);
	bool generateObjectsToSupportNonColorRenderableInternalformats();
	bool prepareSupportForNonRenderableTexture(NonRenderableInternalformatSupportObjects& objects,
											   DataSamplerType							  src_texture_sampler_type,
											   DataSamplerType dst_texture_sampler_type, GLenum source_attachment_type,
											   GLenum destination_attachment_type);
	bool calculateBufferDataSize(DataSamplerType sampler_type, GLuint* buffer_data_size_ptr);
	const float* getTexCoordinates(GLenum attachment_type) const;
	bool prepareProgramAndShaderObjectsToSupportNonRenderableTexture(GLuint			 program_object_id,
																	 GLuint			 fragment_shader_object_id,
																	 GLuint			 vertex_shader_object_id,
																	 DataSamplerType src_texture_sampler_type,
																	 DataSamplerType dst_texture_sampler_type);
	bool setSourceForShaderObjectsUsedForNonRenderableTextureSupport(GLuint			 fragment_shader_object_id,
																	 GLuint			 vertex_shader_object_id,
																	 DataSamplerType src_texture_sampler_type,
																	 DataSamplerType dst_texture_sampler_type);
	bool compileAndCheckShaderCompilationStatus(GLuint shader_object_id);
	bool linkAndCheckProgramLinkStatus(GLuint program_object_id);
	bool getUniformLocations(GLuint program_object_id, GLint* source_2D_texture_uniform_location_ptr,
							 GLint* source_2DArray_texture_uniform_location_ptr,
							 GLint* source_3D_texture_uniform_location_ptr,
							 GLint* source_Cube_texture_uniform_location_ptr,
							 GLint* destination_2D_texture_uniform_location_ptr,
							 GLint* destination_Cube_texture_uniform_location_ptr,
							 GLint* channels_to_compare_uniform_location_ptr,
							 GLint* samplers_to_use_uniform_location_ptr);
	void displayPixelComparisonFailureMessage(GLint source_pixel_r, GLint source_pixel_g, GLint source_pixel_b,
											  GLint source_pixel_a, GLenum source_internalformat, GLenum source_type,
											  GLint reference_pixel_r, GLint reference_pixel_g, GLint reference_pixel_b,
											  GLint reference_pixel_a, GLenum reference_internalformat,
											  GLenum reference_type, GLint result_pixel_r, GLint result_pixel_g,
											  GLint result_pixel_b, GLint result_pixel_a, GLenum result_internalformat,
											  GLenum result_type, GLint max_epsilon_r, GLint max_epsilon_g,
											  GLint max_epsilon_b, GLint max_epsilon_a);
	DataSamplerType getDataSamplerTypeForInternalformat(GLenum internalformat);
	bool isInternalFormatCompatibleWithFPSampler(GLenum internalformat);
	bool isInternalFormatCompatibleWithIntegerSampler(GLenum internalformat);
	bool isInternalFormatCompatibleWithUnsignedIntegerSampler(GLenum internalformat);
	void destroyObjectsSupportingNonRenderableInternalformats(NonRenderableInternalformatSupportObjects& objects);
	void unbindAndDestroyBufferObject(GLuint bo_id);
	void destroyTransformFeedbackObject(GLuint transform_feedback_object_id);
	void destroyProgramAndShaderObjects(GLuint program_object_id, GLuint fragment_shader_id, GLuint vertex_shader_id);
	void unbindColorAttachments();
	void restoreBindings(GLenum src_attachment_point, GLenum dst_attachment_point, GLint bound_draw_fbo_id,
						 GLint bound_read_fbo_id);

private:
	GLuint m_dst_object_id;
	GLuint m_src_object_id;

	de::SharedPtr<ConversionDatabase> m_conversion_database;

	// Some of the internalformats considered during the test are not renderable, meaning
	// we cannot use glReadPixels() to retrieve their contents.
	// Instead, a special program object needs to be used to perform the verification in
	// actual shader.
	// We create a program object for possible each float/int/uint->float/int/uint combination.
	// All objects created during the process are stored in a dedicated
	// _non_renderable_internalformat_support_objects instance and released once the test ends.
	NonRenderableInternalformatSupportObjects m_f_src_f_dst_internalformat;
	NonRenderableInternalformatSupportObjects m_i_src_i_dst_internalformat;
	NonRenderableInternalformatSupportObjects m_ui_src_ui_dst_internalformat;
};

RequiredCase::RequiredCase(deqp::Context& context, de::SharedPtr<ConversionDatabase> database,
						   GLenum sourceAttachmentTypes, GLenum destinationAttachmentTypes)
	: TestBase(context, sourceAttachmentTypes, destinationAttachmentTypes)
	, m_dst_object_id(0)
	, m_src_object_id(0)
	, m_conversion_database(database)
{
	deMemset(&m_f_src_f_dst_internalformat, 0, sizeof(m_f_src_f_dst_internalformat));
	deMemset(&m_i_src_i_dst_internalformat, 0, sizeof(m_i_src_i_dst_internalformat));
	deMemset(&m_ui_src_ui_dst_internalformat, 0, sizeof(m_ui_src_ui_dst_internalformat));
}

RequiredCase::~RequiredCase()
{
}

void RequiredCase::deinit(void)
{
	// free shared pointer
	m_conversion_database.clear();

	// Release the source object before we continue
	if (m_src_object_id != 0)
	{
		destroyGLObject(m_source_attachment_type, m_src_object_id);

		m_src_object_id = 0;
	}

	if (m_dst_object_id != 0)
	{
		destroyGLObject(m_destination_attachment_type, m_dst_object_id);

		m_dst_object_id = 0;
	}

	destroyObjectsSupportingNonRenderableInternalformats(m_f_src_f_dst_internalformat);
	destroyObjectsSupportingNonRenderableInternalformats(m_i_src_i_dst_internalformat);
	destroyObjectsSupportingNonRenderableInternalformats(m_ui_src_ui_dst_internalformat);
}

tcu::TestNode::IterateResult RequiredCase::iterate(void)
{
	glu::RenderContext& renderContext = m_context.getRenderContext();
	const Functions&	gl			  = renderContext.getFunctions();

	GLuint draw_fbo_id = 0;
	GLuint read_fbo_id = 0;
	gl.genFramebuffers(1, &draw_fbo_id);
	gl.genFramebuffers(1, &read_fbo_id);

	gl.bindTexture(GL_TEXTURE_2D, 0);
	gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, draw_fbo_id);
	gl.bindFramebuffer(GL_READ_FRAMEBUFFER, read_fbo_id);

	// We will be reading from zeroth color attachment
	gl.readBuffer(GL_COLOR_ATTACHMENT0);

	// Make sure the pixel storage is configured accordingly to our data sets!
	gl.pixelStorei(GL_UNPACK_ALIGNMENT, 1);
	gl.pixelStorei(GL_PACK_ALIGNMENT, 1);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glPixelStorei");

	m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");

	// Sanity checks
	DE_ASSERT(m_destination_attachment_type == GL_TEXTURE_2D ||
			  m_destination_attachment_type == GL_TEXTURE_CUBE_MAP_NEGATIVE_X ||
			  m_destination_attachment_type == GL_TEXTURE_CUBE_MAP_NEGATIVE_Y ||
			  m_destination_attachment_type == GL_TEXTURE_CUBE_MAP_NEGATIVE_Z ||
			  m_destination_attachment_type == GL_TEXTURE_CUBE_MAP_POSITIVE_X ||
			  m_destination_attachment_type == GL_TEXTURE_CUBE_MAP_POSITIVE_Y ||
			  m_destination_attachment_type == GL_TEXTURE_CUBE_MAP_POSITIVE_Z);

	// Determine general attachment type
	GLenum general_attachment_type = getGeneralTargetForDetailedTarget(m_source_attachment_type);
	if (general_attachment_type == GL_NONE)
		return STOP;

	// Set up source object
	m_src_object_id = generateGLObject(m_source_attachment_type);
	if (m_src_object_id == 0)
		return STOP;

	// Set up destination object
	m_dst_object_id = generateGLObject(m_destination_attachment_type);
	if (m_dst_object_id == 0)
		return STOP;

	// Generate all objects required to execute the non-renderable internalformat tests.
	// Can't use the shader on GL_RENDERBUFFER as source.
	if (m_source_attachment_type != GL_RENDERBUFFER && !generateObjectsToSupportNonColorRenderableInternalformats())
	{
		return STOP;
	}

	m_conversion_database.get()->initializeDatabase();

	// Run through all FBO internal formats.
	bool	  result				 = true;
	const int n_dst_internal_formats = DE_LENGTH_OF_ARRAY(copyTexImage2DInternalFormatOrdering);
	const int n_fbo_internal_formats = DE_LENGTH_OF_ARRAY(fboEffectiveInternalFormatOrdering);
	for (int n_fbo_internal_format = 0; n_fbo_internal_format < n_fbo_internal_formats; ++n_fbo_internal_format)
	{
		GLenum fbo_internalformat = fboEffectiveInternalFormatOrdering[n_fbo_internal_format];

		// Run through all destination internal formats.
		for (int n_dst_internal_format = 0; n_dst_internal_format < n_dst_internal_formats; ++n_dst_internal_format)
		{
			GLenum dst_internalformat = copyTexImage2DInternalFormatOrdering[n_dst_internal_format];

			switch (getDataSamplerTypeForInternalformat(fbo_internalformat))
			{
			case DATA_SAMPLER_FLOAT:
			{
				switch (getDataSamplerTypeForInternalformat(dst_internalformat))
				{
				case DATA_SAMPLER_FLOAT:
				{
					if (!execute(fbo_internalformat, dst_internalformat, &m_f_src_f_dst_internalformat))
					{
						// At least one conversion was invalid or failed. Test should fail,
						// but let's continue iterating over internalformats.
						result = false;
					}

					break;
				}

				case DATA_SAMPLER_INTEGER:
				case DATA_SAMPLER_UNSIGNED_INTEGER:
				{
					// There shouldn't be any valid conversion formats in this case. Just pass NULL for the non-renderable case's objects.
					// The test will fail if we try to verify the copy for different data type formats
					if (!execute(fbo_internalformat, dst_internalformat, NULL))
					{
						// At least one conversion was invalid or failed. Test should
						// fail, but let's continue iterating over internalformats.
						result = false;
					}

					break;
				}

				default:
				{
					// Unrecognized destination internalformat
					DE_ASSERT(0);
					break;
				}
				} // switch (GetDataSamplerTypeForInternalformat(dst_internalformat) )

				break;
			}

			case DATA_SAMPLER_INTEGER:
			{
				switch (getDataSamplerTypeForInternalformat(dst_internalformat))
				{
				case DATA_SAMPLER_INTEGER:
				{
					if (!execute(fbo_internalformat, dst_internalformat, &m_i_src_i_dst_internalformat))
					{
						// At least one conversion was invalid or failed. Test should fail,
						// but let's continue iterating over internalformats.
						result = false;
					}

					break;
				}

				case DATA_SAMPLER_FLOAT:
				case DATA_SAMPLER_UNSIGNED_INTEGER:
				{
					// There shouldn't be any valid conversion formats in this case. Just pass NULL for the non-renderable case's objects.
					// The test will fail if we try to verify the copy for different data type formats
					if (!execute(fbo_internalformat, dst_internalformat, NULL))
					{
						// At least one conversion was invalid or failed. Test should fail,
						// but let's continue iterating over internalformats.
						result = false;
					}

					break;
				}

				default:
				{
					// Unrecognized destination internalformat
					DE_ASSERT(0);

					break;
				}
				} // switch (GetDataSamplerTypeForInternalformat(dst_internalformat) )

				break;
			} // case DATA_SAMPLER_INTEGER:

			case DATA_SAMPLER_UNSIGNED_INTEGER:
			{
				switch (getDataSamplerTypeForInternalformat(dst_internalformat))
				{
				case DATA_SAMPLER_UNSIGNED_INTEGER:
				{
					if (!execute(fbo_internalformat, dst_internalformat, &m_ui_src_ui_dst_internalformat))
					{
						// At least one conversion was invalid or failed. Test should fail,
						// but let's continue iterating over internalformats.
						result = false;
					}

					break;
				}

				case DATA_SAMPLER_FLOAT:
				case DATA_SAMPLER_INTEGER:
				{
					// There shouldn't be any valid conversion formats in this case. Just pass NULL for the non-renderable case's objects.
					// The test will fail if we try to verify the copy for different data type formats
					if (!execute(fbo_internalformat, dst_internalformat, NULL))
					{
						// At least one conversion was invalid or failed. Test should fail,
						// but let's continue iterating over internalformats.
						result = false;
					}

					break;
				}

				default:
				{
					// Unrecognized destination internalformat?
					DE_ASSERT(0);
					break;
				}
				} // switch (GetDataSamplerTypeForInternalformat(dst_internalformat) )

				break;
			} // case DATA_SAMPLER_UNSIGNED_INTEGER

			default:
			{
				// Unrecognized source internalformat
				DE_ASSERT(0);
				break;
			}
			} // switch (GetDataSamplerTypeForInternalformat(fbo_internalformat) )
		}	 // for (all destination internalformats)
	}		  // for (all FBO internalformats)

	if (result)
		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
	return STOP;
}

/** This function verifies if glCopyTexImage2D() implementation performs conversions as
 *  per GLES3.0.3 spec, and that the result data is valid. For more detailed description,
 *  please see specification of copy_tex_image_conversions_required conformance test.
 *
 *  @param conversion_database		 Conversion database handle. Cannot be NULL.
 *  @param source_attachment_type	  Tells what GL object (or which texture target)
 *									 should be used as a read buffer for
 *									 a glCopyTexImage2D) call. Allowed values:
 *									 1) GL_TEXTURE_2D,
 *									 2) GL_TEXTURE_2D_ARRAY,
 *									 3) GL_TEXTURE_3D,
 *									 4) GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
 *									 5) GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
 *									 6) GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
 *									 7) GL_TEXTURE_CUBE_MAP_POSITIVE_X,
 *									 8) GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
 *									 9) GL_TEXTURE_CUBE_MAP_POSITIVE_Z.
 *  @param destination_attachment_type Tells which texture target should be used for
 *									 a glCopyTexImage2D() call. Allowed values:
 *									 1) GL_TEXTURE_2D,
 *									 2) GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
 *									 3) GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
 *									 4) GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
 *									 5) GL_TEXTURE_CUBE_MAP_POSITIVE_X,
 *									 6) GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
 *									 7) GL_TEXTURE_CUBE_MAP_POSITIVE_Z.
 *  @param src_internalformat		  GLES internalformat that read buffer should use.
 *  @param dst_internalformat		  GLES internalformat that should be used for glReadPixels() call.
 *									 This should NOT be the expected effective internalformat!
 *  @param objects_ptr				 Deref where generated object ids are stored
 *									 (objects which were generated to support non-color-renderable internalformats).
 *									 Cannot be NULL.
 *
 *  @return true if successful, false otherwise.
 */
bool RequiredCase::execute(GLenum src_internalformat, GLenum dst_internalformat,
						   NonRenderableInternalformatSupportObjects* objects_ptr)
{
	GLenum fbo_completeness					   = GL_NONE;
	GLenum general_destination_attachment_type = GL_NONE;
	int	n_format_type_pair				   = 0;
	GLenum src_format						   = GL_NONE;
	GLenum src_type							   = GL_NONE;

	glu::RenderContext& renderContext = m_context.getRenderContext();
	const Functions&	gl			  = renderContext.getFunctions();

	// If we're using a renderbuffer as a source, make sure the internalformat
	// we'll try to use to store data in it is actually renderable
	if (m_destination_attachment_type == GL_RENDERBUFFER && !isValidRBOInternalFormat(src_internalformat))
		return true;

	// Only accept source internal formats that are color renderable
	if (!isColorRenderableInternalFormat(src_internalformat))
		return true;

	// Retrieve general destination attachment type before we continue
	if ((general_destination_attachment_type = getGeneralTargetForDetailedTarget(m_destination_attachment_type)) ==
		GL_NONE)
	{
		return false;
	}

	// Good. Check if the conversion is required - if so, we can run the test!
	if (!isFBOEffectiveInternalFormatCompatibleWithDestinationInternalFormat(src_internalformat, dst_internalformat))
		return true;

	bool			  result = true;
	std::vector<char> fbo_data(4);

	// Try using all compatible format+type pairs
	while (getFormatAndTypeCompatibleWithInternalformat(src_internalformat, n_format_type_pair, &src_format, &src_type))
	{
		// Try to find a rule in the conversion database, so that we know what data we should fill
		// the source attachment with.
		// There may be many entries for a single source internal format + type pair, so
		// iterate until the find() function fails.
		GLenum				effective_internalformat = GL_NONE;
		int					n_conversion_rule		 = 0;
		PixelData			result_bottomleft_pixel_data;
		PixelData			result_bottomright_pixel_data;
		PixelData			result_topleft_pixel_data;
		PixelData			result_topright_pixel_data;
		GLenum				result_type = GL_NONE;
		PixelData			src_bottomleft_pixel_data;
		PixelData			src_bottomright_pixel_data;
		PixelData			src_topleft_pixel_data;
		PixelData			src_topright_pixel_data;
		PixelCompareChannel channels_to_compare;

		while (findEntryInConversionDatabase(
			n_conversion_rule, src_internalformat, src_type, dst_internalformat, &effective_internalformat,
			&result_type, &src_topleft_pixel_data, &src_topright_pixel_data, &src_bottomleft_pixel_data,
			&src_bottomright_pixel_data, &result_topleft_pixel_data, &result_topright_pixel_data,
			&result_bottomleft_pixel_data, &result_bottomright_pixel_data, &channels_to_compare))
		{
#if 0
			m_testCtx.getLog() << tcu::TestLog::Message
							   << "Testing [src "
							   << getInternalformatString(src_internalformat)
							   << " " << glu::getTypeStr(src_type).toString()
							   << "]=>[" << getInternalformatString(dst_internalformat) << "effective: "
							   << getInternalformatString(effective_internalformat) << "] read with type: ["
							   << glu::getTypeStr(result_type).toString() << ", src target: [" << GetTargetName(m_source_attachment_type)
							   << "], dst target: " << GetTargetName(m_destination_attachment_type)
							   << tcu::TestLog::EndMessage;
#endif

			// Retrieve source data we can have uploaded to the source attachment
			if (!getRawDataFromPixelData(fbo_data, src_topleft_pixel_data, src_topright_pixel_data,
										 src_bottomleft_pixel_data, src_bottomright_pixel_data))
			{
				unbindColorAttachments();
				return false;
			}

			// Set up source attachment
			if (!configureGLObject(1, m_source_attachment_type, m_src_object_id, src_internalformat, src_format,
								   src_type, &fbo_data[0]))
			{
				unbindColorAttachments();
				return false;
			}

			// Make sure the source FBO configuration is supported.
			fbo_completeness = gl.checkFramebufferStatus(GL_READ_FRAMEBUFFER);

			if (fbo_completeness != GL_FRAMEBUFFER_COMPLETE)
			{
				if (fbo_completeness == GL_FRAMEBUFFER_UNSUPPORTED)
				{
					// The implementation does not allow us to use source data built using this internal-format,
					// using this particular attachment type. Break out of the loop, there's no need to carry on
					// trying.
					break;
				}
				else
				{
					m_testCtx.getLog() << tcu::TestLog::Message << "FBO error - incompleteness reason ["
									   << fbo_completeness << "]" << tcu::TestLog::EndMessage;

					// This should never happen. Consider test failed
					unbindColorAttachments();
					return false;
				}
			}

			// Ask the implementation to perform the conversion!
			switch (m_destination_attachment_type)
			{
			case GL_TEXTURE_2D:
			{
				gl.bindTexture(m_destination_attachment_type, m_dst_object_id);

				gl.copyTexImage2D(m_destination_attachment_type, 0, dst_internalformat, 0 /* x */, 0 /* y */,
								  TEXTURE_WIDTH, TEXTURE_HEIGHT, 0 /* border */);

				gl.texParameterf(m_destination_attachment_type, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
				gl.texParameterf(m_destination_attachment_type, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
				gl.texParameterf(m_destination_attachment_type, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
				gl.texParameterf(m_destination_attachment_type, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

				gl.bindTexture(m_destination_attachment_type, 0);

				break;
			}

			case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
			case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
			case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
			case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
			case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
			case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
			{
				unsigned int j = 0;
				GLuint		 dst_format, dst_type;

				getFormatAndTypeCompatibleWithInternalformat(dst_internalformat, 0, &dst_format, &dst_type);

				gl.bindTexture(general_destination_attachment_type, m_dst_object_id);

				// Initialize all faces so that the texture is CM complete
				// It's needed in case we need to use a shader to verify the copy operation
				for (j = GL_TEXTURE_CUBE_MAP_POSITIVE_X; j <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; j++)
				{
					if (j == m_destination_attachment_type)
					{
						// Do the copy to the destination face
						gl.copyTexImage2D(j, 0, dst_internalformat, 0 /* x */, 0 /* y */, TEXTURE_WIDTH, TEXTURE_HEIGHT,
										  0 /* border */);
					}
					else
					{
						// Clear the remaining faces to catch "copy to the wrong face" errors
						static std::vector<char> zero_data(TEXTURE_WIDTH * TEXTURE_HEIGHT * 4 * sizeof(float), 0);
						gl.texImage2D(j, 0, dst_internalformat, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, dst_format, dst_type,
									  &zero_data[0]);
					}
				}

				gl.texParameterf(general_destination_attachment_type, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
				gl.texParameterf(general_destination_attachment_type, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
				gl.texParameterf(general_destination_attachment_type, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
				gl.texParameterf(general_destination_attachment_type, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

				gl.bindTexture(general_destination_attachment_type, 0);

				break;
			} // cube-map texture target cases

			default:
			{
				// Unsupported destination attachment type
				DE_ASSERT(0);
			}
			} // switch (destination_attachment_type)

			// Has the conversion succeeded as expected?
			GLenum error_code = gl.getError();

			if (error_code != GL_NO_ERROR)
			{
				m_testCtx.getLog() << tcu::TestLog::Message << "glCopyTexImage2D() reported an error for ["
								   << getInternalformatString(src_internalformat) << "]=>["
								   << getInternalformatString(dst_internalformat)
								   << "] internalformat conversion [target=" << getTargetName(m_source_attachment_type)
								   << "], as opposed to ES specification requirements!" << tcu::TestLog::EndMessage;

				// This test is now considered failed
				result = false;
			}
			else
			{
				// Conversion succeeded. We now need to compare the data stored by OpenGL ES with reference data.
				if (isColorRenderableInternalFormat(effective_internalformat))
				{
					gl.framebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_destination_attachment_type,
											m_dst_object_id, 0);

					fbo_completeness = gl.checkFramebufferStatus(GL_READ_FRAMEBUFFER);
					if (fbo_completeness != GL_FRAMEBUFFER_COMPLETE)
					{
						// Per spec:
						// Although the GL defines a wide variety of internal formats for framebuffer-
						// attachable image, such as texture images and renderbuffer images, some imple-
						// mentations may not support rendering to particular combinations of internal for-
						// mats. If the combination of formats of the images attached to a framebuffer object
						// are not supported by the implementation, then the framebuffer is not complete un-
						// der the clause labeled FRAMEBUFFER_UNSUPPORTED.
						if (fbo_completeness != GL_FRAMEBUFFER_UNSUPPORTED)
						{
							m_testCtx.getLog() << tcu::TestLog::Message
											   << "Framebuffer is considered incomplete [reason: " << fbo_completeness
											   << "] - cannot proceed with the test case" << tcu::TestLog::EndMessage;
							result = false;
						}
					}
					else
					{
						if (!compareExpectedResultsByReadingPixels(
								src_topleft_pixel_data, src_topright_pixel_data, src_bottomleft_pixel_data,
								src_bottomright_pixel_data, result_topleft_pixel_data, result_topright_pixel_data,
								result_bottomleft_pixel_data, result_bottomright_pixel_data, result_type,
								effective_internalformat))
						{
							// This test is now considered failed
							result = false;
						}
					}
					gl.framebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_destination_attachment_type, 0,
											0);
				} // if (IsColorRenderableInternalFormat(effective_internalformat) )
				else if (m_source_attachment_type != GL_RENDERBUFFER)
				{
					// We cannot use glReadPixels()-approach to test this internalformat.
					// The approach to be taken for non-color-renderable internalformats will
					// be to use a special vertex shader to verify texture data. Outcome of the
					// comparison will be captured using transform feedback.
					GLint			   bound_draw_fbo_id	= 0;
					GLint			   bound_read_fbo_id	= 0;
					int				   compare_result_index = 0;
					std::vector<GLint> copied_compare_result_data;
					std::vector<GLint> copied_dst_texture_data;
					std::vector<GLint> copied_src_texture_data;
					GLenum			   dst_attachment_point = GL_TEXTURE2;
					GLenum			   src_attachment_point = GL_TEXTURE1;
					GLint			   samplers_to_use		= 0;
					// unique sampler values
					GLint src_2D_texture_attachment		 = GL_TEXTURE3;
					GLint src_2DArray_texture_attachment = GL_TEXTURE4;
					GLint src_3D_texture_attachment		 = GL_TEXTURE5;
					GLint src_Cube_texture_attachment	= GL_TEXTURE6;
					GLint dst_2D_texture_attachment		 = GL_TEXTURE7;
					GLint dst_Cube_texture_attachment	= GL_TEXTURE8;

					if (m_source_attachment_type == GL_TEXTURE_2D_ARRAY)
					{
						samplers_to_use				   = TEXTURE_2D_ARRAY_SAMPLER_TYPE;
						src_2DArray_texture_attachment = src_attachment_point;
					}
					else if (m_source_attachment_type == GL_TEXTURE_3D)
					{
						samplers_to_use			  = TEXTURE_3D_SAMPLER_TYPE;
						src_3D_texture_attachment = src_attachment_point;
					}
					else if (m_source_attachment_type != GL_TEXTURE_2D)
					{
						samplers_to_use				= TEXTURE_CUBE_SAMPLER_TYPE;
						src_Cube_texture_attachment = src_attachment_point;
					}
					else
						src_2D_texture_attachment = src_attachment_point;

					if (m_destination_attachment_type != GL_TEXTURE_2D)
					{
						samplers_to_use				= (samplers_to_use | (TEXTURE_CUBE_SAMPLER_TYPE << 8));
						dst_Cube_texture_attachment = dst_attachment_point;
					}
					else
						dst_2D_texture_attachment = dst_attachment_point;

					// We will get a NULL pointer here if src and dst data type are different
					// (NORM -> INT, UNSIGNED INT -> INT etc.). It's not allowed by the spec.
					if (objects_ptr == NULL)
					{
						m_testCtx.getLog()
							<< tcu::TestLog::Message << "Source and destination should be of the same data type - "
														"cannot proceed with the test case"
							<< tcu::TestLog::EndMessage;
						result = false;
						restoreBindings(src_attachment_point, dst_attachment_point, bound_draw_fbo_id,
										bound_read_fbo_id);
						continue;
					}

					// Retrieve currently bound framebuffer (draw and read) object IDs.
					// If there is any FBO bound, glDraw*() function uses it, which is not wanted in this situation.
					// What we do here is: unbinding FBOs, issue draw calls, bind FBOs again.
					gl.getIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &bound_draw_fbo_id);
					gl.getIntegerv(GL_READ_FRAMEBUFFER_BINDING, &bound_read_fbo_id);

					// Use default framebuffer object for this case purposes.
					gl.bindFramebuffer(GL_FRAMEBUFFER, 0);

					// Bind source texture object to specific texture unit.
					if (!bindTextureToTargetToSpecificTextureUnit(m_src_object_id, m_source_attachment_type,
																  src_attachment_point))
					{
						result = false;
						restoreBindings(src_attachment_point, dst_attachment_point, bound_draw_fbo_id,
										bound_read_fbo_id);
						continue;
					}

					// Bind destination texture object to specific texture unit.
					if (!bindTextureToTargetToSpecificTextureUnit(m_dst_object_id, m_destination_attachment_type,
																  dst_attachment_point))
					{
						result = false;
						restoreBindings(src_attachment_point, dst_attachment_point, bound_draw_fbo_id,
										bound_read_fbo_id);
						continue;
					}

					// Set active program object.
					gl.useProgram(objects_ptr->program_object_id);

					if (!setUniformValues(objects_ptr->src_2D_texture_uniform_location, src_2D_texture_attachment,
										  objects_ptr->src_2DArray_texture_uniform_location,
										  src_2DArray_texture_attachment, objects_ptr->src_3D_texture_uniform_location,
										  src_3D_texture_attachment, objects_ptr->src_Cube_texture_uniform_location,
										  src_Cube_texture_attachment, objects_ptr->dst_2D_texture_uniform_location,
										  dst_2D_texture_attachment, objects_ptr->dst_Cube_texture_uniform_location,
										  dst_Cube_texture_attachment,
										  objects_ptr->channels_to_compare_uniform_location, channels_to_compare,
										  objects_ptr->samplers_to_use_uniform_location, samplers_to_use))
					{
						result = false;
						restoreBindings(src_attachment_point, dst_attachment_point, bound_draw_fbo_id,
										bound_read_fbo_id);
						continue;
					}

					gl.bindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, COMPARISON_RESULT_BUFFER_OBJECT_INDEX,
									  objects_ptr->comparison_result_buffer_object_id);
					gl.bindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, SOURCE_TEXTURE_PIXELS_BUFFER_OBJECT_INDEX,
									  objects_ptr->src_texture_pixels_buffer_object_id);
					gl.bindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, DESTINATION_TEXTURE_PIXELS_BUFFER_OBJECT_INDEX,
									  objects_ptr->dst_texture_pixels_buffer_object_id);

					// Enable texture corrdinates (vertex attribs 0 & 1)
					gl.enableVertexAttribArray(SRC_TEXTURE_COORDS_ATTRIB_INDEX);
					gl.enableVertexAttribArray(DST_TEXTURE_COORDS_ATTRIB_INDEX);

					// Begin transform feedback operations.
					gl.enable(GL_RASTERIZER_DISCARD);

					// Issue transform feedback operations.
					gl.beginTransformFeedback(GL_POINTS);
					error_code = gl.getError();
					if (GL_NO_ERROR != error_code)
					{
						m_testCtx.getLog()
							<< tcu::TestLog::Message << "An error [" << error_code
							<< "] occurred after glBeginTransformFeedback() call." << tcu::TestLog::EndMessage;
						result = false;
						restoreBindings(src_attachment_point, dst_attachment_point, bound_draw_fbo_id,
										bound_read_fbo_id);
						continue;
					}

					gl.drawArrays(GL_POINTS, 0, NUMBER_OF_POINTS_TO_DRAW);

					error_code = gl.getError();
					if (GL_NO_ERROR != error_code)
					{
						m_testCtx.getLog() << tcu::TestLog::Message << "An error [" << error_code
										   << "] occurred after glDrawArrays() call." << tcu::TestLog::EndMessage;
						result = false;
						restoreBindings(src_attachment_point, dst_attachment_point, bound_draw_fbo_id,
										bound_read_fbo_id);
						continue;
					}

					gl.endTransformFeedback();

					error_code = gl.getError();
					if (GL_NO_ERROR != error_code)
					{
						m_testCtx.getLog()
							<< tcu::TestLog::Message << "An error [" << error_code
							<< "] occurred after glEndTransformFeedback() call." << tcu::TestLog::EndMessage;
						result = false;
						restoreBindings(src_attachment_point, dst_attachment_point, bound_draw_fbo_id,
										bound_read_fbo_id);
						continue;
					}

					// Restore default active program object.
					gl.useProgram(0);

					// Make sure no error was generated at this point.
					error_code = gl.getError();
					if (GL_NO_ERROR != error_code)
					{
						m_testCtx.getLog()
							<< tcu::TestLog::Message << "An error [" << error_code
							<< "] occurred while working with transform feedback object." << tcu::TestLog::EndMessage;
						result = false;
						restoreBindings(src_attachment_point, dst_attachment_point, bound_draw_fbo_id,
										bound_read_fbo_id);
						continue;
					}

					gl.disable(GL_RASTERIZER_DISCARD);

					// Let's read the buffer data now.
					copyDataFromBufferObject(objects_ptr->comparison_result_buffer_object_id,
											 copied_compare_result_data);
					copyDataFromBufferObject(objects_ptr->src_texture_pixels_buffer_object_id, copied_src_texture_data);
					copyDataFromBufferObject(objects_ptr->dst_texture_pixels_buffer_object_id, copied_dst_texture_data);

					// Check the results.
					for (compare_result_index = 0; compare_result_index < NUMBER_OF_POINTS_TO_DRAW;
						 compare_result_index++)
					{
						if (copied_compare_result_data[compare_result_index] != 1)
						{
							int index_in_vec4_array = compare_result_index * NUMBER_OF_ELEMENTS_IN_VEC4;

							// Returned result indicates that textures are different.
							// Print texture object contents as well.
							displayPixelComparisonFailureMessage(copied_src_texture_data[index_in_vec4_array],
																 copied_src_texture_data[index_in_vec4_array + 1],
																 copied_src_texture_data[index_in_vec4_array + 2],
																 copied_src_texture_data[index_in_vec4_array + 3],
																 src_internalformat, src_type, 0, 0, 0, 0, GL_NONE,
																 GL_NONE, copied_dst_texture_data[index_in_vec4_array],
																 copied_dst_texture_data[index_in_vec4_array + 1],
																 copied_dst_texture_data[index_in_vec4_array + 2],
																 copied_dst_texture_data[index_in_vec4_array + 3],
																 dst_internalformat, result_type, 0, 0, 0, 0);

							// Report failure.
							result = false;
						}
					}

					fbo_completeness = GL_FRAMEBUFFER_COMPLETE;

					restoreBindings(src_attachment_point, dst_attachment_point, bound_draw_fbo_id, bound_read_fbo_id);
				} // if (source_attachment_type != GL_RENDERBUFFER && destination_attachment_type != GL_RENDERBUFFER)
			}	 // if (no error was reported by GLES)

			n_conversion_rule++;
		}

		// There should be at least ONE conversion rule defined
		// for each valid FBO effective internalformat =>copyteximage2d internalformat defined!
		// NOTE: This assertion can fail IF GLES implementation does not support particular FBO attachment combination.
		//	   Make sure the check is not performed, should GL_FRAMEBUFFER_UNSUPPORTED fbo status be reported.
		if (fbo_completeness != GL_FRAMEBUFFER_UNSUPPORTED)
		{
			if (n_conversion_rule == 0)
			{
				m_testCtx.getLog() << tcu::TestLog::Message << "No conversion rule for [src "
								   << getInternalformatString(src_internalformat) << " "
								   << glu::getTypeStr(src_type).toString() << "]=>["
								   << getInternalformatString(dst_internalformat)
								   << "effective: " << getInternalformatString(effective_internalformat)
								   << "] read with type: [" << glu::getTypeStr(result_type).toString()
								   << ", src target: [" << getTargetName(m_source_attachment_type)
								   << "], dst target: " << getTargetName(m_destination_attachment_type)
								   << tcu::TestLog::EndMessage;
			}
		}

		// Check next format+type combination
		n_format_type_pair++;

		// If we're copying from a renderbuffer, we don't really care about compatible format+type pairs, as
		// the effective internalformat is explicitly configured by glRenderbufferStorage() call.
		if (m_source_attachment_type == GL_RENDERBUFFER)
		{
			break;
		} // if (general_attachment_type == GL_RENDERBUFFER)
	}	 // while (internalformat has n-th legal format+type pair)

	unbindColorAttachments();
	return result;
}

/** Binds texture object to a given texture target of a specified texture unit.
 *
 * @param to_id		  Valid texture object ID to be bound.
 * @param texture_target Valid texture target to which @param to_id will be bound.
 * @param texture_unit   Texture unit to which @param to_id will be bound.
 *
 * @return GTFtrue if successful, GTFfalse otherwise.
 */
bool RequiredCase::bindTextureToTargetToSpecificTextureUnit(GLuint to_id, GLenum texture_target, GLenum texture_unit)
{
	glu::RenderContext& renderContext = m_context.getRenderContext();
	const Functions&	gl			  = renderContext.getFunctions();

	// Set active texture unit.
	gl.activeTexture(texture_unit);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glActiveTexture");

	if (texture_target == GL_TEXTURE_CUBE_MAP_POSITIVE_X || texture_target == GL_TEXTURE_CUBE_MAP_NEGATIVE_X ||
		texture_target == GL_TEXTURE_CUBE_MAP_POSITIVE_Y || texture_target == GL_TEXTURE_CUBE_MAP_NEGATIVE_Y ||
		texture_target == GL_TEXTURE_CUBE_MAP_POSITIVE_Z || texture_target == GL_TEXTURE_CUBE_MAP_NEGATIVE_Z)
	{
		texture_target = GL_TEXTURE_CUBE_MAP;
	}

	// Bind texture object to specific texture target of specified texture unit.
	gl.bindTexture(texture_target, to_id);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture");

	// Restore default active texture unit.
	gl.activeTexture(GL_TEXTURE0);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glActiveTexture");

	return true;
}

/** Sets values of uniforms, that will later be used to perform data check-up for non-renderable internalformats.
 *
 * @param source_2D_texture_uniform_location		Location for source 2D texture sample uniform.
 * @param source_2D_texture_unit					Texture unit which the source 2D texture object is bound to.
 *												  Will be used to set value for @param source_2D_texture_uniform_location.
 * @param source_2DArray_texture_uniform_location   Location for source 2DArray texture sample uniform.
 * @param source_2DArray_texture_unit			   Texture unit which the source 2DArray texture object is bound to.
 *												  Will be used to set value for @param source_2DArray_texture_uniform_location.
 * @param source_3D_texture_uniform_location		Location for source 3D texture sample uniform.
 * @param source_3D_texture_unit					Texture unit which the source 3D texture object is bound to.
 *												  Will be used to set value for @param source_Cube_texture_uniform_location.
 * @param source_Cube_texture_uniform_location	  Location for source Cube texture sample uniform.
 * @param source_Cube_texture_unit				  Texture unit which the source 2D texture object is bound to.
 *												  Will be used to set value for @param source_2D_texture_uniform_location.
 * @param destination_2D_texture_uniform_location   Location for destination texture sample uniform.
 * @param destination_2D_texture_unit			   Texture unit which the destination texture object is bound to.
 *												  Will be used to set value for @param destination_2D_texture_uniform_location.
 * @param destination_Cube_texture_uniform_location Location for destination texture sample uniform.
 * @param destination_Cube_texture_unit			 Texture unit which the destination texture object is bound to.
 *												  Will be used to set value for @param destination_Cube_texture_uniform_location.
 * @param channels_to_compare_uniform_location	  Location for components to compare value uniform.
 * @param channels_to_compare					   Components to compare value.
 * @param samplers_to_use_uniform_location		  Location for samplers to use value uniform.
 * @param samplers_to_use						   samplers to use value.
 *
 * @return GTFtrue if the operation succeeded (no error was generated),
 *		 GTFfalse otherwise.
 */
bool RequiredCase::setUniformValues(GLint source_2D_texture_uniform_location, GLenum source_2D_texture_unit,
									GLint source_2DArray_texture_uniform_location, GLenum source_2DArray_texture_unit,
									GLint source_3D_texture_uniform_location, GLenum source_3D_texture_unit,
									GLint source_Cube_texture_uniform_location, GLenum source_Cube_texture_unit,
									GLint destination_2D_texture_uniform_location, GLenum destination_2D_texture_unit,
									GLint  destination_Cube_texture_uniform_location,
									GLenum destination_Cube_texture_unit, GLint channels_to_compare_uniform_location,
									GLint channels_to_compare, GLint samplers_to_use_uniform_location,
									GLint samplers_to_use)
{
	glu::RenderContext& renderContext = m_context.getRenderContext();
	const Functions&	gl			  = renderContext.getFunctions();

	if (source_2D_texture_uniform_location == -1 || source_2DArray_texture_uniform_location == -1 ||
		source_3D_texture_uniform_location == -1 || source_Cube_texture_uniform_location == -1 ||
		destination_2D_texture_uniform_location == -1 || destination_Cube_texture_uniform_location == -1 ||
		channels_to_compare_uniform_location == -1 || samplers_to_use_uniform_location == -1)
	{
		m_testCtx.getLog() << tcu::TestLog::Message << "Cannot set uniform values for invalid uniform locations."
						   << tcu::TestLog::EndMessage;

		return false;
	} // if (input uniform locations are invalid)

	// We are now ready to set uniform values.
	gl.uniform1i(destination_2D_texture_uniform_location, destination_2D_texture_unit - GL_TEXTURE0);
	gl.uniform1i(destination_Cube_texture_uniform_location, destination_Cube_texture_unit - GL_TEXTURE0);
	gl.uniform1i(source_2D_texture_uniform_location, source_2D_texture_unit - GL_TEXTURE0);
	gl.uniform1i(source_2DArray_texture_uniform_location, source_2DArray_texture_unit - GL_TEXTURE0);
	gl.uniform1i(source_3D_texture_uniform_location, source_3D_texture_unit - GL_TEXTURE0);
	gl.uniform1i(source_Cube_texture_uniform_location, source_Cube_texture_unit - GL_TEXTURE0);
	gl.uniform1i(channels_to_compare_uniform_location, channels_to_compare);
	gl.uniform1i(samplers_to_use_uniform_location, samplers_to_use);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i");

	return true;
}

/** Retrieves and copies data stored in buffer object into allocated memory buffer.
 *  It is user's responsibility to free allocated memory.
 *
 * @param bo_id				  Valid buffer object ID from which data is retrieved.
 * @param retrieved_data_ptr_ptr Deref will be used to store retrieved buffer object data.
 *
 * @return GTFtrue if successful, GTFfalse otherwise.
 */
bool RequiredCase::copyDataFromBufferObject(GLuint bo_id, std::vector<GLint>& retrieved_data)
{
	glu::RenderContext& renderContext = m_context.getRenderContext();
	const Functions&	gl			  = renderContext.getFunctions();

	GLint buffer_size = 0;
	gl.bindBuffer(GL_ARRAY_BUFFER, bo_id);
	gl.getBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &buffer_size);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetBufferParameteriv");

	GLint* buffer_data_ptr = NULL;
	buffer_data_ptr		   = (GLint*)gl.mapBufferRange(GL_ARRAY_BUFFER, 0, buffer_size, GL_MAP_READ_BIT);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glMapBufferRange");

	if (buffer_data_ptr == NULL)
	{
		m_testCtx.getLog() << tcu::TestLog::Message << "Could not map buffer object." << tcu::TestLog::EndMessage;
		return false;
	}

	// Copy retrieved buffer data.
	retrieved_data.resize(buffer_size / sizeof(GLint));
	std::memcpy(&retrieved_data[0], buffer_data_ptr, buffer_size);

	gl.unmapBuffer(GL_ARRAY_BUFFER);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapBuffer");

	return true;
}

/** Allocates a buffer of sufficient size to hold 2x2 texture data represented
 *  with @param read_type GL type, issues a glReadPixels() call and then compares
 *  retrieved data with reference data (provided by the caller using reference_*
 *  arguments).
 *  Should it happen that the call resulted in an indirect conversion, the function
 *  calculates an epsilon, taking differences in amount of bits that were used to
 *  represent the data during any stage of the conversion into consideration.
 *
 *  @param source_tl_pixel_data	Describes pixel data that was used to build source
 *								 object's contents (top-left corner).
 *  @param source_tr_pixel_data	Describes pixel data that was used to build source
 *								 object's contents (top-right corner).
 *  @param source_bl_pixel_data	Describes pixel data that was used to build source
 *								 object's contents (bottom-left corner).
 *  @param source_br_pixel_data	Describes pixel data that was used to build source
 *								 object's contents (bottom-right corner).
 *  @param reference_tl_pixel_data Describes ideal result pixel data. (top-left corner).
 *  @param reference_tr_pixel_data Describes ideal result pixel data. (top-right corner).
 *  @param reference_bl_pixel_data Describes ideal result pixel data. (bottom-left corner).
 *  @param reference_br_pixel_data Describes ideal result pixel data. (bottom-right corner).
 *  @param read_type			   GL type that will be used for glReadPixels() call. This
 *								 type should be directly related with data type used in
 *								 all reference_* pixel data arguments.
 *  @param result_internalformat   Effective internal-format, expected to be used by the
 *								 implementation to hold destination object's data.
 *  @param src_format			  GL format used for source object's data storage.
 *  @param src_type				GL type used for source object's data storage.
 *  @param src_attachment_type	 Object type or texture target of the source object.
 *  @param dst_attachment_type	 Object type or texture target of the destination object.
 *
 *  @return GTFtrue if all read pixels were correct, GTFfalse otherwise
 **/
bool RequiredCase::compareExpectedResultsByReadingPixels(PixelData source_tl_pixel_data, PixelData source_tr_pixel_data,
														 PixelData source_bl_pixel_data, PixelData source_br_pixel_data,
														 PixelData reference_tl_pixel_data,
														 PixelData reference_tr_pixel_data,
														 PixelData reference_bl_pixel_data,
														 PixelData reference_br_pixel_data, GLenum read_type,
														 GLenum result_internalformat)
{
	char*		 data_traveller_ptr		  = NULL;
	int			 n						  = 0;
	unsigned int n_bytes_per_result_pixel = 0;
	GLenum		 read_format			  = GL_NONE;
	bool		 result					  = true;

	PixelData* reference_pixels[] = {
		&reference_bl_pixel_data, &reference_br_pixel_data, &reference_tl_pixel_data, &reference_tr_pixel_data,
	};
	PixelData* source_pixels[] = { &source_bl_pixel_data, &source_br_pixel_data, &source_tl_pixel_data,
								   &source_tr_pixel_data };
	PixelData result_pixels[4];

	// Determine which read format should be used for reading.
	// Note that GLES3 accepts GL_RGBA_INTEGER format for GL_RGB10_A2UI internalformat
	// and GL_RGBA for GL_RGB10_A2 - handle this in a special case.
	if (((read_type == GL_UNSIGNED_INT_2_10_10_10_REV) && (result_internalformat == GL_RGB10_A2UI)) ||
		(read_type == GL_UNSIGNED_INT) || (read_type == GL_INT))
	{
		read_format = GL_RGBA_INTEGER;
	}
	else
	{
		read_format = GL_RGBA;
	}

	// Update read_type for GL_HALF_FLOAT
	if (read_type == GL_HALF_FLOAT)
	{
		read_type = GL_FLOAT;
	}

	// Allocate data buffer
	n_bytes_per_result_pixel = getSizeOfPixel(read_format, read_type);
	std::vector<char> data(TEXTURE_WIDTH * TEXTURE_HEIGHT * n_bytes_per_result_pixel);

	glu::RenderContext& renderContext = m_context.getRenderContext();
	const Functions&	gl			  = renderContext.getFunctions();

	// Retrieve the data.
	gl.readPixels(0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT, read_format, read_type, &data[0]);

	// Was the operation successful?
	GLenum error_code = gl.getError();
	if (error_code != GL_NO_ERROR)
	{
		m_testCtx.getLog() << tcu::TestLog::Message << "glReadPixels() failed with error: [" << error_code << "]"
						   << tcu::TestLog::EndMessage;
		return false;
	}

	// Convert the data we read back to pixel data structures
	data_traveller_ptr = &data[0];

	for (n = 0; n < DE_LENGTH_OF_ARRAY(reference_pixels); ++n)
	{
		PixelData* result_pixel_ptr = result_pixels + n;

		if (!getPixelDataFromRawData(data_traveller_ptr, read_format, read_type, result_pixel_ptr))
		{
			m_testCtx.getLog() << tcu::TestLog::Message << "GetPixelDataFromRawData failed!"
							   << tcu::TestLog::EndMessage;

			// Could not convert raw data to pixel data instance!
			DE_ASSERT(0);
			return false;
		} // if (raw data->pixel data conversion failed)

		// Move the data traveller
		data_traveller_ptr += n_bytes_per_result_pixel;
	} // for (all pixels)

	// Compare each pixel with reference data. For debugging purposes, compare every single pixel,
	// even if at least one comparison has already failed.
	DE_ASSERT(DE_LENGTH_OF_ARRAY(reference_pixels) == DE_LENGTH_OF_ARRAY(result_pixels));

	for (n = 0; n < DE_LENGTH_OF_ARRAY(reference_pixels); ++n)
	{
		result &= comparePixelData(result_pixels[n], *(reference_pixels[n]), *(source_pixels[n]), result_internalformat,
								   (result == 0));
	} // For each pixel

	if (result == false)
	{
		// Log a separator line for clarity
		m_testCtx.getLog() << tcu::TestLog::Message << "<-- Erroneous test case finishes." << tcu::TestLog::EndMessage;
	}

	return result;
}

/** Retrieves size (expressed in bytes) of a single pixel represented by
 *  a @param format format + @param type type pair.
 *
 *  @param format GLES format to consider.
 *  @param type   GLES type to consider.
 *
 *  @return Size of the pixel or 0 if either of the arguments was not recognized.
 **/
unsigned int RequiredCase::getSizeOfPixel(GLenum format, GLenum type)
{
	int result = 0;

	switch (format)
	{
	case GL_RED:
		result = 1;
		break;
	case GL_RED_INTEGER:
		result = 1;
		break;
	case GL_RG:
		result = 2;
		break;
	case GL_RG_INTEGER:
		result = 2;
		break;
	case GL_RGB:
		result = 3;
		break;
	case GL_RGB_INTEGER:
		result = 3;
		break;
	case GL_RGBA:
		result = 4;
		break;
	case GL_RGBA_INTEGER:
		result = 4;
		break;
	case GL_DEPTH_COMPONENT:
		result = 1;
		break;
	case GL_DEPTH_STENCIL:
		result = 2;
		break;
	case GL_LUMINANCE_ALPHA:
		result = 2;
		break;
	case GL_LUMINANCE:
		result = 1;
		break;
	case GL_ALPHA:
		result = 1;
		break;

	default:
	{
		DE_ASSERT(0);
		result = 0;
	}
	}

	switch (type)
	{
	case GL_UNSIGNED_BYTE:
		result *= 1;
		break;
	case GL_BYTE:
		result *= 1;
		break;
	case GL_UNSIGNED_SHORT:
		result *= 2;
		break;
	case GL_SHORT:
		result *= 2;
		break;
	case GL_UNSIGNED_INT:
		result *= 4;
		break;
	case GL_INT:
		result *= 4;
		break;
	case GL_HALF_FLOAT:
		result *= 2;
		break;
	case GL_FLOAT:
		result *= 4;
		break;
	case GL_UNSIGNED_SHORT_5_6_5:
		result = 2;
		break;
	case GL_UNSIGNED_SHORT_4_4_4_4:
		result = 2;
		break;
	case GL_UNSIGNED_SHORT_5_5_5_1:
		result = 2;
		break;
	case GL_UNSIGNED_INT_2_10_10_10_REV:
		result = 4;
		break;
	case GL_UNSIGNED_INT_10F_11F_11F_REV:
		result = 4;
		break;
	case GL_UNSIGNED_INT_5_9_9_9_REV:
		result = 4;
		break;
	case GL_UNSIGNED_INT_24_8:
		result = 4;
		break;
	case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
		result = 8;
		break;

	default:
	{
		DE_ASSERT(0);

		result = 0;
	}
	}

	return result;
}

/** Takes a pointer with raw data representation and converts it to
 *  four instances of _pixel_data corresponding to four corners of a
 *  quad used for verification purposes. Assumes 2x2 resolution.
 *
 *  @param raw_data		Pointer to a buffer storing the data.
 *  @param raw_data_format Format of the data stored under @param raw_data.
 *  @param raw_data_type   Type of the data stored under @param raw_data.
 *  @param out_result	  Deref will be used to store four _pixel_data instances.
 *						 Cannot be NULL, must be capacious enough to hold four
 *						 instances of the structure.
 *
 *  @return GTFtrue if successful, GTFfalse otherwise.
 **/
bool RequiredCase::getPixelDataFromRawData(void* raw_data, GLenum raw_data_format, GLenum raw_data_type,
										   PixelData* out_result)
{
	// Sanity checks: format should be equal to one of the values supported
	//				by glReadPixels()
	DE_ASSERT(raw_data_format == GL_RGBA || raw_data_format == GL_RGBA_INTEGER);

	if (raw_data_format != GL_RGBA && raw_data_format != GL_RGBA_INTEGER)
	{
		return false;
	}

	// Sanity checks: type should be equal to one of the values supported
	//				by glReadPixels()
	DE_ASSERT(raw_data_type == GL_UNSIGNED_BYTE || raw_data_type == GL_UNSIGNED_INT || raw_data_type == GL_INT ||
			  raw_data_type == GL_FLOAT || raw_data_type == GL_UNSIGNED_INT_2_10_10_10_REV_EXT);

	if (raw_data_type != GL_UNSIGNED_BYTE && raw_data_type != GL_UNSIGNED_INT && raw_data_type != GL_INT &&
		raw_data_type != GL_FLOAT && raw_data_type != GL_UNSIGNED_INT_2_10_10_10_REV_EXT)
	{
		return false;
	}

	// Reset the result structure
	deMemset(out_result, 0, sizeof(PixelData));

	out_result->data_internalformat = raw_data_format;
	out_result->data_type			= raw_data_type;

	// Fill the fields, depending on user-provided format+type pair
	if (raw_data_format == GL_RGBA && raw_data_type == GL_UNSIGNED_BYTE)
	{
		char* raw_data_ptr = reinterpret_cast<char*>(raw_data);

		out_result->alpha.data_type = CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		out_result->blue.data_type  = CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		out_result->green.data_type = CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;
		out_result->red.data_type   = CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS;

		out_result->red.unsigned_byte_data   = raw_data_ptr[0];
		out_result->green.unsigned_byte_data = raw_data_ptr[1];
		out_result->blue.unsigned_byte_data  = raw_data_ptr[2];
		out_result->alpha.unsigned_byte_data = raw_data_ptr[3];
	}
	else if (raw_data_format == GL_RGBA_INTEGER && raw_data_type == GL_UNSIGNED_INT)
	{
		unsigned int* raw_data_ptr = reinterpret_cast<unsigned int*>(raw_data);

		out_result->alpha.data_type = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		out_result->blue.data_type  = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		out_result->green.data_type = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;
		out_result->red.data_type   = CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS;

		out_result->red.unsigned_integer_data   = raw_data_ptr[0];
		out_result->green.unsigned_integer_data = raw_data_ptr[1];
		out_result->blue.unsigned_integer_data  = raw_data_ptr[2];
		out_result->alpha.unsigned_integer_data = raw_data_ptr[3];
	}
	else if (raw_data_format == GL_RGBA_INTEGER && raw_data_type == GL_INT)
	{
		signed int* raw_data_ptr = reinterpret_cast<signed int*>(raw_data);

		out_result->alpha.data_type = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		out_result->blue.data_type  = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		out_result->green.data_type = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;
		out_result->red.data_type   = CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS;

		out_result->red.signed_integer_data   = raw_data_ptr[0];
		out_result->green.signed_integer_data = raw_data_ptr[1];
		out_result->blue.signed_integer_data  = raw_data_ptr[2];
		out_result->alpha.signed_integer_data = raw_data_ptr[3];
	}
	else if (raw_data_format == GL_RGBA && raw_data_type == GL_FLOAT)
	{
		float* raw_data_ptr = reinterpret_cast<float*>(raw_data);

		out_result->alpha.data_type = CHANNEL_DATA_TYPE_FLOAT;
		out_result->blue.data_type  = CHANNEL_DATA_TYPE_FLOAT;
		out_result->green.data_type = CHANNEL_DATA_TYPE_FLOAT;
		out_result->red.data_type   = CHANNEL_DATA_TYPE_FLOAT;

		out_result->red.float_data   = raw_data_ptr[0];
		out_result->green.float_data = raw_data_ptr[1];
		out_result->blue.float_data  = raw_data_ptr[2];
		out_result->alpha.float_data = raw_data_ptr[3];
	} /* if (raw_data_format == GL_RGBA && raw_data_type == GL_FLOAT) */
	else
	{
		signed int* raw_data_ptr = (signed int*)raw_data;

		DE_ASSERT(raw_data_format == GL_RGBA && raw_data_type == GL_UNSIGNED_INT_2_10_10_10_REV);

		out_result->alpha.data_type = CHANNEL_DATA_TYPE_UNSIGNED_BYTE_2BITS;
		out_result->blue.data_type  = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_10BITS;
		out_result->green.data_type = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_10BITS;
		out_result->red.data_type   = CHANNEL_DATA_TYPE_UNSIGNED_SHORT_10BITS;

		out_result->alpha.unsigned_byte_data  = ((*raw_data_ptr) >> 30) & ((1 << 2) - 1);
		out_result->blue.unsigned_short_data  = ((*raw_data_ptr) >> 20) & ((1 << 10) - 1);
		out_result->green.unsigned_short_data = ((*raw_data_ptr) >> 10) & ((1 << 10) - 1);
		out_result->red.unsigned_short_data   = ((*raw_data_ptr)) & ((1 << 10) - 1);
	}

	return true;
}

/** Checks if downloaded pixel data is valid. Should the rendered values differ
 *  outside allowed range, the function logs detailed information about the problem.
 *
 *  @param downloaded_pixel		Instance of _pixel_data describing a pixel
 *								 that was rendered by the implementation.
 *  @param reference_pixel		 Instance of _pixel_data describing ideal
 *								 pixel data.
 *  @param source_pixel			Instance of _pixel_data describing the pixel
 *								 prior to conversion.
 *  @param result_internalformat   Internal format the implementation is expected
 *								 to be using for the converted data.
 *  @param src_attachment_type	 Type of the source object used for the conversion.
 *  @param dst_attachment_type	 Type of the destination object used for the conversion.
 *  @param has_test_failed_already 1 if any of the other pixels making up the test 2x2
 *								 data-set has already been determined to be corrupt.
 *								 0 otherwise.
 *  @param src_internalformat	  Internal-format used for source object's data storage.
 *  @param src_datatype			Type used for source object's data storage.
 *
 *  @return 1 if the pixels match, 0 otherwise.
 **/
bool RequiredCase::comparePixelData(PixelData downloaded_pixel, PixelData reference_pixel, PixelData source_pixel,
									GLenum result_internalformat, bool has_test_failed_already)
{
	ChannelData* channel_data[12]	= { 0 };
	int			 max_epsilon[4]		 = { 0 };
	int			 has_pixel_failed	= 0;
	int			 n_channel			 = 0;
	bool		 result				 = true;
	int			 result_rgba_bits[4] = { 0 };
	int			 source_rgba_bits[4] = { 0 };

	// Form channel data so we can later analyse channels one after another in a loop
	channel_data[0]  = &downloaded_pixel.red;
	channel_data[1]  = &reference_pixel.red;
	channel_data[2]  = &source_pixel.red;
	channel_data[3]  = &downloaded_pixel.green;
	channel_data[4]  = &reference_pixel.green;
	channel_data[5]  = &source_pixel.green;
	channel_data[6]  = &downloaded_pixel.blue;
	channel_data[7]  = &reference_pixel.blue;
	channel_data[8]  = &source_pixel.blue;
	channel_data[9]  = &downloaded_pixel.alpha;
	channel_data[10] = &reference_pixel.alpha;
	channel_data[11] = &source_pixel.alpha;

	// Retrieve number of bits used for source and result data.
	getNumberOfBitsForInternalFormat(source_pixel.data_internalformat, source_rgba_bits);
	getNumberOfBitsForInternalFormat(result_internalformat, result_rgba_bits);

	// Time for actual comparison!
	for (unsigned int n = 0; n < sizeof(channel_data) / sizeof(channel_data[0]);
		 n += 3 /* downloaded + reference + source pixel combinations */, ++n_channel)
	{
		ChannelData* downloaded_channel_ptr = channel_data[n];
		ChannelData* reference_channel_ptr  = channel_data[n + 1];

		// Calculate maximum epsilon
		int max_n_bits	 = 0;
		int min_n_bits	 = std::numeric_limits<int>::max();
		int n_dst_bits	 = result_rgba_bits[n_channel];
		int n_reading_bits = 0;
		int n_source_bits  = source_rgba_bits[n_channel];

		getNumberOfBitsForChannelDataType(downloaded_channel_ptr->data_type, &n_reading_bits);

		if (max_n_bits < n_dst_bits && n_dst_bits != 0)
		{
			max_n_bits = n_dst_bits;
		} /* if (max_n_bits < n_dst_bits && n_dst_bits != 0) */
		if (max_n_bits < n_reading_bits && n_reading_bits != 0)
		{
			max_n_bits = n_reading_bits;
		}
		if (max_n_bits < n_source_bits && n_source_bits != 0)
		{
			max_n_bits = n_source_bits;
		}

		if (n_dst_bits != 0)
		{
			min_n_bits = n_dst_bits;
		}

		if (min_n_bits > n_reading_bits && n_reading_bits != 0)
		{
			min_n_bits = n_reading_bits;
		}
		if (min_n_bits > n_source_bits && n_source_bits != 0)
		{
			min_n_bits = n_source_bits;
		}

		if (max_n_bits != min_n_bits && max_n_bits != 0)
		{
			DE_ASSERT(min_n_bits != std::numeric_limits<int>::max());

			// Allow rounding in either direction
			max_epsilon[n_channel] = deCeilFloatToInt32(((1 << max_n_bits) - 1.0f) / ((1 << min_n_bits) - 1));
		}
		else
		{
			max_epsilon[n_channel] = 0;
		}

		// At the moment, we only care about data types that correspond to GL types usable for glReadPixels() calls.
		// Please feel free to expand this switch() with support for data types you need.
		switch (downloaded_channel_ptr->data_type)
		{
		case CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS:
		{
			int delta = (downloaded_channel_ptr->signed_integer_data - reference_channel_ptr->signed_integer_data);

			if (abs(delta) > max_epsilon[n_channel])
			{
				if (result)
				{
					has_pixel_failed = 1;
					result			 = false;
				}
			}

			break;
		}

		case CHANNEL_DATA_TYPE_UNSIGNED_BYTE_2BITS:
		case CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS:
		{
			int delta = (downloaded_channel_ptr->unsigned_byte_data - reference_channel_ptr->unsigned_byte_data);

			if (abs(delta) > max_epsilon[n_channel])
			{
				if (result)
				{
					has_pixel_failed = 1;
					result			 = false;
				}
			}

			break;
		}

		case CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS:
		{
			int delta = static_cast<int>(downloaded_channel_ptr->unsigned_integer_data -
										 reference_channel_ptr->unsigned_integer_data);

			if (abs(delta) > max_epsilon[n_channel])
			{
				if (result)
				{
					has_pixel_failed = 1;
					result			 = false;
				}
			}

			break;
		}

		case CHANNEL_DATA_TYPE_UNSIGNED_SHORT_10BITS:
		{
			int delta = (downloaded_channel_ptr->unsigned_short_data - reference_channel_ptr->unsigned_short_data);

			if (abs(delta) > max_epsilon[n_channel])
			{
				if (result)
				{
					has_pixel_failed = 1;
					result			 = false;
				}
			}

			break;
		} /* case CHANNEL_DATA_TYPE_UNSIGNED_SHORT_10BITS: */

		case CHANNEL_DATA_TYPE_FLOAT:
		{
			int delta = deChopFloatToInt32(downloaded_channel_ptr->float_data - reference_channel_ptr->float_data);

			if (abs(delta) > max_epsilon[n_channel])
			{
				if (result)
				{
					has_pixel_failed = 1;
					result			 = false;
				}
			}

			break;
		}

		default:
		{
			// Unrecognized data type
			DE_ASSERT(0);
		}
		}

		if (has_pixel_failed && !has_test_failed_already)
		{
			m_testCtx.getLog() << tcu::TestLog::Message << "Erroneous test case starts-->" << tcu::TestLog::EndMessage;
			has_test_failed_already = true;
		}
	} // for (all channels)

	if (!result)
	{
		displayPixelComparisonFailureMessage(
			channel_data[2] != NULL ? channel_data[2]->unsigned_integer_data : 0,
			channel_data[5] != NULL ? channel_data[5]->unsigned_integer_data : 0,
			channel_data[8] != NULL ? channel_data[8]->unsigned_integer_data : 0,
			channel_data[11] != NULL ? channel_data[11]->unsigned_integer_data : 0, source_pixel.data_internalformat,
			source_pixel.data_type, channel_data[1] != NULL ? channel_data[1]->unsigned_integer_data : 0,
			channel_data[4] != NULL ? channel_data[4]->unsigned_integer_data : 0,
			channel_data[7] != NULL ? channel_data[7]->unsigned_integer_data : 0,
			channel_data[10] != NULL ? channel_data[10]->unsigned_integer_data : 0, reference_pixel.data_internalformat,
			reference_pixel.data_type, channel_data[0] != NULL ? channel_data[0]->unsigned_integer_data : 0,
			channel_data[3] != NULL ? channel_data[3]->unsigned_integer_data : 0,
			channel_data[6] != NULL ? channel_data[6]->unsigned_integer_data : 0,
			channel_data[9] != NULL ? channel_data[9]->unsigned_integer_data : 0, result_internalformat,
			downloaded_pixel.data_type, max_epsilon[0], max_epsilon[1], max_epsilon[2], max_epsilon[3]);
	}

	return result;
}

/** Retrieves number of bits used for a single pixel, were it
 *  stored in @param internalformat internal format.
 *
 *  @param internalformat GLES internal format to consider.
 *  @param out_rgba_bits  Deref will be used to store 4 integers
 *						describing amount of bits that the internal
 *						format uses for subsequently R, G, B and A
 *						channels. Cannot be NULL.
 *
 *  @return GTFtrue if successful, GTFfalse otherwise.
 **/
bool RequiredCase::getNumberOfBitsForInternalFormat(GLenum internalformat, int* out_rgba_bits)
{
	deMemset(out_rgba_bits, 0, sizeof(int) * 4);

	switch (internalformat)
	{
	case GL_LUMINANCE8_OES:
		out_rgba_bits[0] = 8;
		break;
	case GL_R16I:
		out_rgba_bits[0] = 16;
		break;
	case GL_R16UI:
		out_rgba_bits[0] = 16;
		break;
	case GL_R32I:
		out_rgba_bits[0] = 32;
		break;
	case GL_R32UI:
		out_rgba_bits[0] = 32;
		break;
	case GL_R8:
		out_rgba_bits[0] = 8;
		break;
	case GL_R8_SNORM:
		out_rgba_bits[0] = 8;
		break;
	case GL_R8I:
		out_rgba_bits[0] = 8;
		break;
	case GL_R8UI:
		out_rgba_bits[0] = 8;
		break;
	case GL_RG16UI:
		out_rgba_bits[0] = 16;
		out_rgba_bits[1] = 16;
		break;
	case GL_RG16I:
		out_rgba_bits[0] = 16;
		out_rgba_bits[1] = 16;
		break;
	case GL_RG32I:
		out_rgba_bits[0] = 32;
		out_rgba_bits[1] = 32;
		break;
	case GL_RG32UI:
		out_rgba_bits[0] = 32;
		out_rgba_bits[1] = 32;
		break;
	case GL_RG8:
		out_rgba_bits[0] = 8;
		out_rgba_bits[1] = 8;
		break;
	case GL_RG8_SNORM:
		out_rgba_bits[0] = 8;
		out_rgba_bits[1] = 8;
		break;
	case GL_RG8I:
		out_rgba_bits[0] = 8;
		out_rgba_bits[1] = 8;
		break;
	case GL_RG8UI:
		out_rgba_bits[0] = 8;
		out_rgba_bits[1] = 8;
		break;
	case GL_RGB10_A2:
		out_rgba_bits[0] = 10;
		out_rgba_bits[1] = 10;
		out_rgba_bits[2] = 10;
		out_rgba_bits[3] = 2;
		break;
	case GL_RGB10_A2UI:
		out_rgba_bits[0] = 10;
		out_rgba_bits[1] = 10;
		out_rgba_bits[2] = 10;
		out_rgba_bits[3] = 2;
		break;
	case GL_RGB16I:
		out_rgba_bits[0] = 16;
		out_rgba_bits[1] = 16;
		out_rgba_bits[2] = 16;
		break;
	case GL_RGB16UI:
		out_rgba_bits[0] = 16;
		out_rgba_bits[1] = 16;
		out_rgba_bits[2] = 16;
		break;
	case GL_RGB32I:
		out_rgba_bits[0] = 32;
		out_rgba_bits[1] = 32;
		out_rgba_bits[2] = 32;
		break;
	case GL_RGB32UI:
		out_rgba_bits[0] = 32;
		out_rgba_bits[1] = 32;
		out_rgba_bits[2] = 32;
		break;
	case GL_RGB5_A1:
		out_rgba_bits[0] = 5;
		out_rgba_bits[1] = 5;
		out_rgba_bits[2] = 5;
		out_rgba_bits[3] = 1;
		break;
	case GL_RGB565:
		out_rgba_bits[0] = 5;
		out_rgba_bits[1] = 6;
		out_rgba_bits[2] = 5;
		break;
	case GL_RGB8:
		out_rgba_bits[0] = 8;
		out_rgba_bits[1] = 8;
		out_rgba_bits[2] = 8;
		break;
	case GL_RGB8_SNORM:
		out_rgba_bits[0] = 8;
		out_rgba_bits[1] = 8;
		out_rgba_bits[2] = 8;
		break;
	case GL_RGB8I:
		out_rgba_bits[0] = 8;
		out_rgba_bits[1] = 8;
		out_rgba_bits[2] = 8;
		break;
	case GL_RGB8UI:
		out_rgba_bits[0] = 8;
		out_rgba_bits[1] = 8;
		out_rgba_bits[2] = 8;
		break;
	case GL_RGBA16I:
		out_rgba_bits[0] = 16;
		out_rgba_bits[1] = 16;
		out_rgba_bits[2] = 16;
		out_rgba_bits[3] = 16;
		break;
	case GL_RGBA16UI:
		out_rgba_bits[0] = 16;
		out_rgba_bits[1] = 16;
		out_rgba_bits[2] = 16;
		out_rgba_bits[3] = 16;
		break;
	case GL_RGBA32I:
		out_rgba_bits[0] = 32;
		out_rgba_bits[1] = 32;
		out_rgba_bits[2] = 32;
		out_rgba_bits[3] = 32;
		break;
	case GL_RGBA32UI:
		out_rgba_bits[0] = 32;
		out_rgba_bits[1] = 32;
		out_rgba_bits[2] = 32;
		out_rgba_bits[3] = 32;
		break;
	case GL_RGBA4:
		out_rgba_bits[0] = 4;
		out_rgba_bits[1] = 4;
		out_rgba_bits[2] = 4;
		out_rgba_bits[3] = 4;
		break;
	case GL_RGBA8:
		out_rgba_bits[0] = 8;
		out_rgba_bits[1] = 8;
		out_rgba_bits[2] = 8;
		out_rgba_bits[3] = 8;
		break;
	case GL_RGBA8_SNORM:
		out_rgba_bits[0] = 8;
		out_rgba_bits[1] = 8;
		out_rgba_bits[2] = 8;
		out_rgba_bits[3] = 8;
		break;
	case GL_RGBA8I:
		out_rgba_bits[0] = 8;
		out_rgba_bits[1] = 8;
		out_rgba_bits[2] = 8;
		out_rgba_bits[3] = 8;
		break;
	case GL_RGBA8UI:
		out_rgba_bits[0] = 8;
		out_rgba_bits[1] = 8;
		out_rgba_bits[2] = 8;
		out_rgba_bits[3] = 8;
		break;
	case GL_SRGB8:
		out_rgba_bits[0] = 8;
		out_rgba_bits[1] = 8;
		out_rgba_bits[2] = 8;
		break;
	case GL_SRGB8_ALPHA8:
		out_rgba_bits[0] = 8;
		out_rgba_bits[1] = 8;
		out_rgba_bits[2] = 8;
		out_rgba_bits[3] = 8;
		break;
	case GL_R16F:
		out_rgba_bits[0] = 16;
		break;
	case GL_RG16F:
		out_rgba_bits[0] = 16;
		out_rgba_bits[1] = 16;
		break;
	case GL_RGB16F:
		out_rgba_bits[0] = 16;
		out_rgba_bits[1] = 16;
		out_rgba_bits[2] = 16;
		break;
	case GL_RGBA16F:
		out_rgba_bits[0] = 16;
		out_rgba_bits[1] = 16;
		out_rgba_bits[2] = 16;
		out_rgba_bits[3] = 16;
		break;
	case GL_R32F:
		out_rgba_bits[0] = 32;
		break;
	case GL_RG32F:
		out_rgba_bits[0] = 32;
		out_rgba_bits[1] = 32;
		break;
	case GL_RGB32F:
		out_rgba_bits[0] = 32;
		out_rgba_bits[1] = 32;
		out_rgba_bits[2] = 32;
		break;
	case GL_RGBA32F:
		out_rgba_bits[0] = 32;
		out_rgba_bits[1] = 32;
		out_rgba_bits[2] = 32;
		out_rgba_bits[3] = 32;
		break;

	default:
	{
		DE_ASSERT(0);
		return false;
	}
	}

	return true;
}

/** Browses the conversion database provided by user and looks for conversion rules
 *  that match the following requirements:
 *
 *  1) Source object's data internal format equal to @param src_internalformat.
 *  2) Source object's data type equal to @param src_type.
 *  3) Internal format used for glCopyTexImage2D() call equal to @param copyteximage2d_internalformat.
 *
 *  The function allows to find as many conversion rules matching these requirements as
 *  available. For any triple, caller should use incrementing values of @param index,
 *  starting from 0.
 *
 *  Source dataset corresponds to 2x2 image (using up to 4 channels) that the attachment bound to
 *  read buffer will use prior to glCopyTexImage2D() call.
 *  Destination dataset corresponds to 2x2 image (using up to 4 channels) that the result texture object
 *  should match (within acceptable epsilon).
 *
 *  @param index						 Index of conversion rule the caller is interested in reading.
 *  @param src_internalformat			Source object's data internal format to assume.
 *  @param src_type					  Source object's data type to assume.
 *  @param copyteximage2d_internalformat Internal format to be used for glCopyTexImage2D() call.
 *  @param out_result_internalformat	 Deref will be used to store internal format that GLES implementation
 *									   should use for storage of the converted data. Cannot be NULL.
 *  @param out_dst_type				  Deref will be used to store type that GLES implementation should use
 *									   for storage of the converted data. Cannot be NULL.
 *  @param out_src_topleft			   Deref will be used to store _pixel_data instance describing top-left
 *									   corner of the source dataset. Cannot be NULL.
 *  @param out_src_topright			  Deref will be used to store _pixel_data instance describing top-right
 *									   corner of the source dataset. Cannot be NULL.
 *  @param out_src_bottomleft			Deref will be used to store _pixel_data instance describing bottom-left
 *									   corner of the source dataset. Cannot be NULL.
 *  @param out_src_bottomright		   Deref will be used to store _pixel_data instance describing bottom-right
 *									   corner of the source dataset. Cannot be NULL.
 *  @param out_dst_topleft			   Deref will be used to store _pixel_data instance describing top-left
 *									   corner of the destination dataset.
 *  @param out_dst_topright			  Deref will be used to store _pixel_data instance describing top-right
 *									   corner of the destination dataset.
 *  @param out_dst_bottomleft			Deref will be used to store _pixel_data instance describing bottom-left
 *									   corner of the destination dataset.
 *  @param out_dst_bottomright		   Deref will be used to store _pixel_data instance describing bottom-right
 *									   corner of the destination dataset.
 *
 *  @return GTFtrue if @param index -th conversion rule was found, GTFfalse otherwise.
 **/
bool RequiredCase::findEntryInConversionDatabase(unsigned int index, GLenum src_internalformat, GLenum src_type,
												 GLenum  copyteximage2d_internalformat,
												 GLenum* out_result_internalformat, GLenum* out_dst_type,
												 PixelData* out_src_topleft, PixelData* out_src_topright,
												 PixelData* out_src_bottomleft, PixelData* out_src_bottomright,
												 PixelData* out_dst_topleft, PixelData* out_dst_topright,
												 PixelData* out_dst_bottomleft, PixelData* out_dst_bottomright,
												 PixelCompareChannel* out_channels_to_compare)
{
	const int conversion_array_width =
		sizeof(copyTexImage2DInternalFormatOrdering) / sizeof(copyTexImage2DInternalFormatOrdering[0]);
	int			 copyteximage2d_index				= -1;
	int			 fbo_effective_internalformat_index = -1;
	unsigned int n_entry							= 0;
	unsigned int n_matching_entries					= 0;
	GLenum		 result_internalformat				= GL_NONE;
	int			 result_internalformat_index		= -1;

	/* Sanity checks */
	DE_ASSERT(out_src_topleft != NULL);
	DE_ASSERT(out_src_topright != NULL);
	DE_ASSERT(out_src_bottomleft != NULL);
	DE_ASSERT(out_src_bottomright != NULL);
	DE_ASSERT(out_dst_topleft != NULL);
	DE_ASSERT(out_dst_topright != NULL);
	DE_ASSERT(out_dst_bottomleft != NULL);
	DE_ASSERT(out_dst_bottomright != NULL);

	// Retrieve internalformat that converted data will be stored in
	copyteximage2d_index			   = getIndexOfCopyTexImage2DInternalFormat(copyteximage2d_internalformat);
	fbo_effective_internalformat_index = getIndexOfFramebufferEffectiveInternalFormat(src_internalformat);

	DE_ASSERT(copyteximage2d_index != -1 && fbo_effective_internalformat_index != -1);
	if (copyteximage2d_index == -1 || fbo_effective_internalformat_index == -1)
		return false;

	result_internalformat_index = fbo_effective_internalformat_index * conversion_array_width + copyteximage2d_index;

	DE_ASSERT(result_internalformat_index < DE_LENGTH_OF_ARRAY(conversionArray));
	if (result_internalformat_index >= DE_LENGTH_OF_ARRAY(conversionArray))
		return false;

	result_internalformat = conversionArray[result_internalformat_index];

	DE_ASSERT(result_internalformat != GL_NONE);
	if (result_internalformat == GL_NONE)
		return false;

	// We use the simplest approach possible to keep the code as readable as possible.
	for (n_entry = 0; n_entry < m_conversion_database->n_entries_added; ++n_entry)
	{
		ConversionDatabaseEntry& entry_ptr = m_conversion_database->entries[n_entry];

		if (entry_ptr.src_bottomleft_corner.data_internalformat == src_internalformat &&
			entry_ptr.src_bottomleft_corner.data_type == src_type &&
			entry_ptr.dst_bottomleft_corner.data_internalformat == result_internalformat)
		{
			/* Is it the n-th match we're being asked for? */
			if (index == n_matching_entries)
			{
				/* Indeed! */
				*out_src_topleft	 = entry_ptr.src_topleft_corner;
				*out_src_topright	= entry_ptr.src_topright_corner;
				*out_src_bottomleft  = entry_ptr.src_bottomleft_corner;
				*out_src_bottomright = entry_ptr.src_bottomright_corner;
				*out_dst_topleft	 = entry_ptr.dst_topleft_corner;
				*out_dst_topright	= entry_ptr.dst_topright_corner;
				*out_dst_bottomleft  = entry_ptr.dst_bottomleft_corner;
				*out_dst_bottomright = entry_ptr.dst_bottomright_corner;

				*out_result_internalformat = entry_ptr.dst_topleft_corner.data_internalformat;
				*out_dst_type			   = entry_ptr.dst_topleft_corner.data_type;

				*out_channels_to_compare = entry_ptr.channels_to_compare;

				return true;
			}
			else
			{
				++n_matching_entries;
			}
		}
	}

	return false;
}

/** Retrieves index under which user-specified internalformat can be found in
 *  copy_tex_image_2d_internal_format_ordering array.
 *
 *  @param internalformat GLES internal format to look for.
 *
 *  @return Index >= 0 if successful, -1 otherwise.
 **/
int RequiredCase::getIndexOfCopyTexImage2DInternalFormat(GLenum internalformat)
{
	int max_index = DE_LENGTH_OF_ARRAY(copyTexImage2DInternalFormatOrdering);
	for (int index = 0; index < max_index; ++index)
	{
		if (copyTexImage2DInternalFormatOrdering[index] == internalformat)
			return index;
	}

	return -1;
}

/** Retrieves index under which user-specified internalformat can be found in
 *  fbo_effective_internal_format_ordering array.
 *
 *  @param internalformat GLES internal format to look for.
 *
 *  @return Index >= 0 if successful, -1 otherwise.
 **/
int RequiredCase::getIndexOfFramebufferEffectiveInternalFormat(GLenum internalformat)
{
	int max_index = DE_LENGTH_OF_ARRAY(fboEffectiveInternalFormatOrdering);
	for (int index = 0; index < max_index; ++index)
	{
		if (fboEffectiveInternalFormatOrdering[index] == internalformat)
			return index;
	}

	return -1;
}

/** Takes four pixels (described by _pixel_data structures) making up
 *  the 2x2 texture used for source objects, and converts the representation
 *  to raw data that can later be fed to glTexImage2D(), glTexImage3D() etc.
 *  calls.
 *
 *  NOTE: It is caller's responsibility to free the returned buffer when no
 *		longer used. Use free() function to deallocate the resource.
 *
 *  @param topleft	 Instance of _pixel_data describing top-left corner.
 *  @param topright	Instance of _pixel_data describing top-right corner.
 *  @param bottomleft  Instance of _pixel_data describing bottom-left corner.
 *  @param bottomright Instance of _pixel_data describing bottom-right corner.
 *
 *  @return Pointer to the buffer or NULL if failed.
 **/
bool RequiredCase::getRawDataFromPixelData(std::vector<char>& result, PixelData topleft, PixelData topright,
										   PixelData bottomleft, PixelData bottomright)
{
	ChannelOrder	 channel_order	 = CHANNEL_ORDER_UNKNOWN;
	GLenum			 format			   = GL_NONE;
	GLenum			 internalformat	= topleft.data_internalformat;
	unsigned int	 n_bytes_needed	= 0;
	unsigned int	 n_bytes_per_pixel = 0;
	unsigned int	 n_pixel		   = 0;
	const PixelData* pixels[]		   = { &bottomleft, &bottomright, &topleft, &topright };
	char*			 result_traveller  = DE_NULL;
	GLenum			 type			   = topleft.data_type;

	// Sanity checks
	DE_ASSERT(topleft.data_internalformat == topright.data_internalformat);
	DE_ASSERT(topleft.data_internalformat == bottomleft.data_internalformat);
	DE_ASSERT(topleft.data_internalformat == bottomright.data_internalformat);
	DE_ASSERT(topleft.data_type == topright.data_type);
	DE_ASSERT(topleft.data_type == bottomleft.data_type);
	DE_ASSERT(topleft.data_type == bottomright.data_type);

	// Allocate the buffer
	if (!getFormatForInternalformat(internalformat, &format))
	{
		DE_ASSERT(0);
		return false;
	} // if (no format known for requested internalformat)

	if (!getChannelOrderForInternalformatAndType(internalformat, type, &channel_order))
	{
		DE_ASSERT(0);
		return false;
	} // if (no channel order known for internalformat+type combination)

	// special case for GL_HALF_FLOAT, treat it as a FLOAT
	if (type == GL_HALF_FLOAT)
		n_bytes_per_pixel = getSizeOfPixel(format, GL_FLOAT);
	else
		n_bytes_per_pixel = getSizeOfPixel(format, type);
	n_bytes_needed		  = TEXTURE_WIDTH * TEXTURE_HEIGHT * n_bytes_per_pixel;

	if (n_bytes_needed == 0)
	{
		DE_ASSERT(0);
		return false;
	}

	result.resize(n_bytes_needed);

	// Fill the raw data buffer with data.
	result_traveller = &result[0];

	for (n_pixel = 0; n_pixel < sizeof(pixels) / sizeof(pixels[0]); ++n_pixel)
	{
		const ChannelData* channels[]			= { NULL, NULL, NULL, NULL }; /* We need up to four channels */
		int				   n_bits_for_channel_0 = 0;
		int				   n_bits_for_channel_1 = 0;
		int				   n_bits_for_channel_2 = 0;
		int				   n_bits_for_channel_3 = 0;
		const PixelData*   pixel_ptr			= pixels[n_pixel];

		switch (channel_order)
		{
		case CHANNEL_ORDER_ABGR:
		{
			channels[0] = &pixel_ptr->alpha;
			channels[1] = &pixel_ptr->blue;
			channels[2] = &pixel_ptr->green;
			channels[3] = &pixel_ptr->red;
			break;
		}

		case CHANNEL_ORDER_BGR:
		{
			channels[0] = &pixel_ptr->blue;
			channels[1] = &pixel_ptr->green;
			channels[2] = &pixel_ptr->red;
			break;
		}

		case CHANNEL_ORDER_BGRA:
		{
			channels[0] = &pixel_ptr->blue;
			channels[1] = &pixel_ptr->green;
			channels[2] = &pixel_ptr->red;
			channels[3] = &pixel_ptr->alpha;
			break;
		}

		case CHANNEL_ORDER_R:
		{
			channels[0] = &pixel_ptr->red;
			break;
		}

		case CHANNEL_ORDER_RG:
		{
			channels[0] = &pixel_ptr->red;
			channels[1] = &pixel_ptr->green;
			break;
		}

		case CHANNEL_ORDER_RGB:
		{
			channels[0] = &pixel_ptr->red;
			channels[1] = &pixel_ptr->green;
			channels[2] = &pixel_ptr->blue;
			break;
		}

		case CHANNEL_ORDER_RGBA:
		{
			channels[0] = &pixel_ptr->red;
			channels[1] = &pixel_ptr->green;
			channels[2] = &pixel_ptr->blue;
			channels[3] = &pixel_ptr->alpha;
			break;
		}

		default:
		{
			// Unrecognized channel order
			DE_ASSERT(0);
		}
		}

		// Pack the channel data, depending on channel sizes
		if (((channels[0] != NULL) &&
			 !getNumberOfBitsForChannelDataType(channels[0]->data_type, &n_bits_for_channel_0)) ||
			((channels[1] != NULL) &&
			 !getNumberOfBitsForChannelDataType(channels[1]->data_type, &n_bits_for_channel_1)) ||
			((channels[2] != NULL) &&
			 !getNumberOfBitsForChannelDataType(channels[2]->data_type, &n_bits_for_channel_2)) ||
			((channels[3] != NULL) &&
			 !getNumberOfBitsForChannelDataType(channels[3]->data_type, &n_bits_for_channel_3)))
		{
			// Unrecognized data type
			DE_ASSERT(0);
			return false;
		} // if (could not determine number of bits making up any of the channels)

		// NOTE: We will read HALF_FLOAT data as FLOAT data (32 bit) to avoid conversion before passing the data to GL
		if (channels[0] != NULL && channels[1] != NULL && channels[2] != NULL && channels[3] != NULL)
		{
			// RGBA32
			if (type == GL_HALF_FLOAT || ((n_bits_for_channel_0 == 32) && (n_bits_for_channel_1 == 32) &&
										  (n_bits_for_channel_2 == 32) && (n_bits_for_channel_3 == 32)))
			{
				unsigned int* result_traveller32 = (unsigned int*)result_traveller;

				*result_traveller32 = channels[0]->unsigned_integer_data;
				result_traveller32++;
				*result_traveller32 = channels[1]->unsigned_integer_data;
				result_traveller32++;
				*result_traveller32 = channels[2]->unsigned_integer_data;
				result_traveller32++;
				*result_traveller32 = channels[3]->unsigned_integer_data;

				result_traveller += 4 * 4;
			}
			else
				// RGBA16
				if (n_bits_for_channel_0 == 16 && n_bits_for_channel_1 == 16 && n_bits_for_channel_2 == 16 &&
					n_bits_for_channel_3 == 16)
			{
				unsigned short* result_traveller16 = (unsigned short*)result_traveller;

				*result_traveller16 = channels[0]->unsigned_short_data;
				result_traveller16++;
				*result_traveller16 = channels[1]->unsigned_short_data;
				result_traveller16++;
				*result_traveller16 = channels[2]->unsigned_short_data;
				result_traveller16++;
				*result_traveller16 = channels[3]->unsigned_short_data;

				result_traveller += 8;
			}
			else
				// RGBA4
				if (n_bits_for_channel_0 == 4 && n_bits_for_channel_1 == 4 && n_bits_for_channel_2 == 4 &&
					n_bits_for_channel_3 == 4)
			{
				unsigned short* result_traveller16 = (unsigned short*)result_traveller;

				*result_traveller16 = (channels[0]->unsigned_byte_data << 12) + (channels[1]->unsigned_byte_data << 8) +
									  (channels[2]->unsigned_byte_data << 4) + channels[3]->unsigned_byte_data;

				result_traveller += 2;
			}
			else
				// RGBA8
				if (n_bits_for_channel_0 == 8 && n_bits_for_channel_1 == 8 && n_bits_for_channel_2 == 8 &&
					n_bits_for_channel_3 == 8)
			{
				*result_traveller = channels[0]->unsigned_byte_data;
				result_traveller++;
				*result_traveller = channels[1]->unsigned_byte_data;
				result_traveller++;
				*result_traveller = channels[2]->unsigned_byte_data;
				result_traveller++;
				*result_traveller = channels[3]->unsigned_byte_data;
				result_traveller++;
			}
			else
				// RGB5A1
				if (n_bits_for_channel_0 == 5 && n_bits_for_channel_1 == 5 && n_bits_for_channel_2 == 5 &&
					n_bits_for_channel_3 == 1)
			{
				unsigned short* result_traveller16 = (unsigned short*)result_traveller;

				*result_traveller16 = (channels[0]->unsigned_byte_data << 11) + (channels[1]->unsigned_byte_data << 6) +
									  (channels[2]->unsigned_byte_data << 1) + channels[3]->unsigned_byte_data;

				result_traveller += 2;
			}
			else
				// RGB10A2_REV
				if (n_bits_for_channel_0 == 2 && n_bits_for_channel_1 == 10 && n_bits_for_channel_2 == 10 &&
					n_bits_for_channel_3 == 10)
			{
				unsigned int* result_traveller32 = (unsigned int*)result_traveller;

				DE_ASSERT(channels[0]->data_type == CHANNEL_DATA_TYPE_UNSIGNED_BYTE_2BITS);
				DE_ASSERT(channels[1]->data_type == CHANNEL_DATA_TYPE_UNSIGNED_SHORT_10BITS);
				DE_ASSERT(channels[2]->data_type == CHANNEL_DATA_TYPE_UNSIGNED_SHORT_10BITS);
				DE_ASSERT(channels[3]->data_type == CHANNEL_DATA_TYPE_UNSIGNED_SHORT_10BITS);

				*result_traveller32 = (channels[0]->unsigned_byte_data << 30) +
									  (channels[1]->unsigned_short_data << 20) +
									  (channels[2]->unsigned_short_data << 10) + channels[3]->unsigned_short_data;

				result_traveller += 4;
			}
			else
			{
				// Unsupported bit layout
				DE_ASSERT(0);
				return false;
			}
		}
		else if (channels[0] != NULL && channels[1] != NULL && channels[2] != NULL)
		{
			// RGB32
			if ((type == GL_HALF_FLOAT) ||
				((n_bits_for_channel_0 == 32) && (n_bits_for_channel_1 == 32) && (n_bits_for_channel_2 == 32)))
			{
				unsigned int* result_traveller32 = (unsigned int*)result_traveller;

				*result_traveller32 = channels[0]->unsigned_integer_data;
				result_traveller32++;
				*result_traveller32 = channels[1]->unsigned_integer_data;
				result_traveller32++;
				*result_traveller32 = channels[2]->unsigned_integer_data;

				result_traveller += 3 * 4;
			}
			else
				// RGB8
				if (n_bits_for_channel_0 == 8 && n_bits_for_channel_1 == 8 && n_bits_for_channel_2 == 8)
			{
				*result_traveller = channels[0]->unsigned_byte_data;
				result_traveller++;
				*result_traveller = channels[1]->unsigned_byte_data;
				result_traveller++;
				*result_traveller = channels[2]->unsigned_byte_data;
				result_traveller++;
			}
			else
				// RGB565
				if (n_bits_for_channel_0 == 5 && n_bits_for_channel_1 == 6 && n_bits_for_channel_2 == 5)
			{
				unsigned short* result_traveller16 = (unsigned short*)result_traveller;

				*result_traveller16 = (channels[0]->unsigned_byte_data << 11) + (channels[1]->unsigned_byte_data << 5) +
									  (channels[2]->unsigned_byte_data);

				result_traveller += 2;
			}
			else
			{
				// Unsupported bit layout
				DE_ASSERT(0);
				return false;
			}
		}
		else if (channels[0] != NULL && channels[1] != NULL)
		{
			// RG32
			if ((type == GL_HALF_FLOAT) || ((n_bits_for_channel_0 == 32) && (n_bits_for_channel_1 == 32)))
			{
				unsigned int* result_traveller32 = (unsigned int*)result_traveller;

				*result_traveller32 = channels[0]->unsigned_integer_data;
				result_traveller32++;
				*result_traveller32 = channels[1]->unsigned_integer_data;

				result_traveller += 8;
			}
			else
				// RG16
				if (n_bits_for_channel_0 == 16 && n_bits_for_channel_1 == 16)
			{
				unsigned short* result_traveller16 = (unsigned short*)result_traveller;

				*result_traveller16 = channels[0]->unsigned_short_data;
				result_traveller16++;
				*result_traveller16 = channels[1]->unsigned_short_data;

				result_traveller += 4;
			}
			else
				// RG8
				if (n_bits_for_channel_0 == 8 && n_bits_for_channel_1 == 8)
			{
				*result_traveller = channels[0]->unsigned_byte_data;
				result_traveller++;
				*result_traveller = channels[1]->unsigned_byte_data;
				result_traveller++;
			}
			else
			{
				// Unsupported bit layout
				DE_ASSERT(0);
				return false;
			}
		}
		else if (channels[0] != NULL)
		{
			// R32
			if (type == GL_HALF_FLOAT || n_bits_for_channel_0 == 32)
			{
				unsigned int* result_traveller32 = (unsigned int*)result_traveller;

				*result_traveller32 = channels[0]->unsigned_integer_data;
				result_traveller += 4;
			}
			else
				// R16
				if (n_bits_for_channel_0 == 16)
			{
				unsigned short* result_traveller16 = (unsigned short*)result_traveller;

				*result_traveller16 = channels[0]->unsigned_short_data;
				result_traveller += 2;
			}
			else
				// R8
				if (n_bits_for_channel_0 == 8)
			{
				*result_traveller = channels[0]->unsigned_byte_data;
				result_traveller++;
			}
			else
			{
				// Unsupported bit layout
				DE_ASSERT(0);
				return false;
			}
		}
		else
		{
			// Unrecognized channel data layout.
			DE_ASSERT(0);
			return false;
		}
	} // for (all pixels)

	return true;
}

/** Retrieves number of bits used for a single channel, were it stored in
 *  @param channel_data_type internal channel data type.
 *
 *  @param channel_data_type Channel data type to consider.
 *  @param out_n_bits		Deref will be used to store the amount of bits.
 *						   Cannot be NULL.
 *
 *  @return GTFtrue if successful, GTFfalse otherwise.
 **/
bool RequiredCase::getNumberOfBitsForChannelDataType(ChannelDataType channel_data_type, int* out_n_bits)
{
	DE_ASSERT(out_n_bits != NULL);
	switch (channel_data_type)
	{
	case CHANNEL_DATA_TYPE_SIGNED_BYTE_8BITS:
		*out_n_bits = 8;
		return true;

	case CHANNEL_DATA_TYPE_SIGNED_INTEGER_32BITS:
		*out_n_bits = 32;
		return true;

	case CHANNEL_DATA_TYPE_SIGNED_SHORT_16BITS:
		*out_n_bits = 16;
		return true;

	case CHANNEL_DATA_TYPE_UNSIGNED_BYTE_1BIT:
		*out_n_bits = 1;
		return true;

	case CHANNEL_DATA_TYPE_UNSIGNED_BYTE_2BITS:
		*out_n_bits = 2;
		return true;

	case CHANNEL_DATA_TYPE_UNSIGNED_BYTE_4BITS:
		*out_n_bits = 4;
		return true;

	case CHANNEL_DATA_TYPE_UNSIGNED_BYTE_5BITS:
		*out_n_bits = 5;
		return true;

	case CHANNEL_DATA_TYPE_UNSIGNED_BYTE_6BITS:
		*out_n_bits = 6;
		return true;

	case CHANNEL_DATA_TYPE_UNSIGNED_BYTE_8BITS:
		*out_n_bits = 8;
		return true;

	case CHANNEL_DATA_TYPE_UNSIGNED_INTEGER_32BITS:
		*out_n_bits = 32;
		return true;

	case CHANNEL_DATA_TYPE_UNSIGNED_SHORT_10BITS:
		*out_n_bits = 10;
		return true;

	case CHANNEL_DATA_TYPE_UNSIGNED_SHORT_16BITS:
		*out_n_bits = 16;
		return true;

	case CHANNEL_DATA_TYPE_FLOAT:
		*out_n_bits = 32;
		return true;

	case CHANNEL_DATA_TYPE_NONE:
		return true;
	}

	// Unrecognized channel data type
	DE_ASSERT(0);
	return false;
}

/** Retrieves information on channel order for user-specified internal format+type
 *  combination.
 *
 *  @param internalformat	GLES internal format to consider.
 *  @param type			  GLES type to consider.
 *  @param out_channel_order Deref will be used to store requested information.
 *						   Cannot be NULL.
 *
 *  @return GTFtrue if successful, GTFfalse otherwise.
 **/
bool RequiredCase::getChannelOrderForInternalformatAndType(GLenum internalformat, GLenum type,
														   ChannelOrder* out_channel_order)
{
	GLenum format = GL_NONE;
	DE_ASSERT(out_channel_order != NULL);

	// Determine the order
	if (!getFormatForInternalformat(internalformat, &format))
	{
		DE_ASSERT(0);
		return false;
	}

	switch (format)
	{
	case GL_RED:
	case GL_RED_INTEGER:
		// Only one order is sane
		*out_channel_order = CHANNEL_ORDER_R;
		return true;

	case GL_RG:
	case GL_RG_INTEGER:
		// Only one order is sane
		*out_channel_order = CHANNEL_ORDER_RG;
		return true;

	case GL_RGB:
	case GL_RGB_INTEGER:
		// Two options here
		if (type == GL_UNSIGNED_INT_10F_11F_11F_REV || type == GL_UNSIGNED_INT_5_9_9_9_REV)
			*out_channel_order = CHANNEL_ORDER_BGR;
		else
			*out_channel_order = CHANNEL_ORDER_RGB;
		return true;

	case GL_RGBA:
	case GL_RGBA_INTEGER:
		// Two options here
		if (type == GL_UNSIGNED_INT_2_10_10_10_REV)
			*out_channel_order = CHANNEL_ORDER_ABGR;
		else
			*out_channel_order = CHANNEL_ORDER_RGBA;
		return true;

	default:
		// Unrecognized format?
		DE_ASSERT(0);
		return false;
	}

	return false;
}

/** Creates objects required to support non color-renderable internalformats of texture objects.
 * There are different objects created for each combination of float/integer/unsigned integer internalformats
 * of source and destination texture objects created.
 *
 * @param f_src_f_dst_internalformat_ptr	Deref will be used to store created object IDs for
 *										  float source and float destination texture object.
 *										  Cannot be NULL.
 * @param i_src_i_dst_internalformat_ptr	Deref will be used to store created object IDs for
 *										  integer source and integer destination texture object.
 *										  Cannot be NULL.
 * @param ui_src_ui_dst_internalformat_ptr  Deref will be used to store created object IDs for
 *										  unsigned integer source and unsigned integer destination texture object.
 *										  Cannot be NULL.
 * @param source_attachment_type			Tells what GL object (or which texture target)
 *										  should be used as a read buffer for a glCopyTexImage2D call.
 * @param destination_attachment_type	   Tells which texture target should be used for
 *										  a glCopyTexImage2D() call.
 *
 * @return true if successful, false otherwise.
 */
bool RequiredCase::generateObjectsToSupportNonColorRenderableInternalformats()
{
	// if (failed to prepare objects for float->float shader-based checks)
	if (!prepareSupportForNonRenderableTexture(m_f_src_f_dst_internalformat, DATA_SAMPLER_FLOAT, DATA_SAMPLER_FLOAT,
											   m_source_attachment_type, m_destination_attachment_type))
	{
		return false;
	}

	// if (failed to prepare objects for int->int shader-based checks)
	if (!prepareSupportForNonRenderableTexture(m_i_src_i_dst_internalformat, DATA_SAMPLER_INTEGER, DATA_SAMPLER_INTEGER,
											   m_source_attachment_type, m_destination_attachment_type))
	{
		return false;
	}

	// if (failed to prepare objects for uint->uint shader-based checks)
	if (!prepareSupportForNonRenderableTexture(m_ui_src_ui_dst_internalformat, DATA_SAMPLER_UNSIGNED_INTEGER,
											   DATA_SAMPLER_UNSIGNED_INTEGER, m_source_attachment_type,
											   m_destination_attachment_type))
	{
		return false;
	}

	return true;
}

/** Creates and prepares buffer and program objects to be used for non-renderable texture support.
 * In case the destination texture's internalformat is not renderable,
 * glReadPixels() cannot be issued to retrieve texture object data.
 * Instead, a program object is used to retrieve and compare source and destination texture data.
 * This function creates and prepares all objects needed to support this approach.
 *
 * @param objects_ptr				 Deref will be used for storing generated object ids. Cannot be NULL.
 * @param src_texture_sampler_type	Type of the sampler to be used for sampling source texture (float/int/uint).
 * @param dst_texture_sampler_type	Type of the sampler to be used for sampling destination texture (float/int/uint).
 * @param source_attachment_type
 * @param destination_attachment_type
 *
 * @return true if the operation succeeded (no error was generated),
 *		 false otherwise.
 */
bool RequiredCase::prepareSupportForNonRenderableTexture(NonRenderableInternalformatSupportObjects& objects,
														 DataSamplerType src_texture_sampler_type,
														 DataSamplerType dst_texture_sampler_type,
														 GLenum			 source_attachment_type,
														 GLenum			 destination_attachment_type)
{
	glu::RenderContext& renderContext = m_context.getRenderContext();
	const Functions&	gl			  = renderContext.getFunctions();

	const GLuint  compare_result_size		   = NUMBER_OF_POINTS_TO_DRAW * sizeof(GLint);
	GLuint		  destination_buffer_data_size = 0;
	GLuint		  source_buffer_data_size	  = 0;
	const GLchar* varying_names[]	 = { "compare_result", "src_texture_pixel_values", "dst_texture_pixel_values" };
	const GLsizei varying_names_count = DE_LENGTH_OF_ARRAY(varying_names);

	// Create program and shader objects.
	objects.program_object_id		  = gl.createProgram();
	objects.fragment_shader_object_id = gl.createShader(GL_FRAGMENT_SHADER);
	objects.vertex_shader_object_id   = gl.createShader(GL_VERTEX_SHADER);

	// Generate buffer and transform feedback objects.
	gl.genTransformFeedbacks(1, &objects.transform_feedback_object_id);
	gl.genBuffers(1, &objects.comparison_result_buffer_object_id);
	gl.genBuffers(1, &objects.src_texture_pixels_buffer_object_id);
	gl.genBuffers(1, &objects.dst_texture_pixels_buffer_object_id);
	gl.genBuffers(1, &objects.src_texture_coordinates_buffer_object_id);
	gl.genBuffers(1, &objects.dst_texture_coordinates_buffer_object_id);

	// Calculate texture data size depending on source and destination sampler types.
	if (!calculateBufferDataSize(src_texture_sampler_type, &source_buffer_data_size))
		return false;
	if (!calculateBufferDataSize(dst_texture_sampler_type, &destination_buffer_data_size))
		return false;

	// Initialize buffer objects storage.
	gl.bindBuffer(GL_ARRAY_BUFFER, objects.comparison_result_buffer_object_id);
	gl.bufferData(GL_ARRAY_BUFFER, compare_result_size, NULL, GL_STATIC_DRAW);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData");

	gl.bindBuffer(GL_ARRAY_BUFFER, objects.src_texture_pixels_buffer_object_id);
	gl.bufferData(GL_ARRAY_BUFFER, source_buffer_data_size, NULL, GL_STATIC_DRAW);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData");

	gl.bindBuffer(GL_ARRAY_BUFFER, objects.dst_texture_pixels_buffer_object_id);
	gl.bufferData(GL_ARRAY_BUFFER, destination_buffer_data_size, NULL, GL_STATIC_DRAW);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData");

	// Initialize texture coordinates
	gl.bindBuffer(GL_ARRAY_BUFFER, objects.src_texture_coordinates_buffer_object_id);
	gl.bufferData(GL_ARRAY_BUFFER, TEXTURE_COORDINATES_ARRAY_SIZE, getTexCoordinates(source_attachment_type),
				  GL_STATIC_DRAW);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData");

	gl.vertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer");

	gl.bindBuffer(GL_ARRAY_BUFFER, objects.dst_texture_coordinates_buffer_object_id);
	gl.bufferData(GL_ARRAY_BUFFER, TEXTURE_COORDINATES_ARRAY_SIZE, getTexCoordinates(destination_attachment_type),
				  GL_STATIC_DRAW);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData");

	gl.vertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer");

	gl.bindBuffer(GL_ARRAY_BUFFER, 0);

	// Bind buffer objects to GL_TRANSFORM_FEEDBACK target at specific indices.
	gl.bindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, COMPARISON_RESULT_BUFFER_OBJECT_INDEX,
					   objects.comparison_result_buffer_object_id, 0, compare_result_size);
	gl.bindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, SOURCE_TEXTURE_PIXELS_BUFFER_OBJECT_INDEX,
					   objects.src_texture_pixels_buffer_object_id, 0, source_buffer_data_size);
	gl.bindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, DESTINATION_TEXTURE_PIXELS_BUFFER_OBJECT_INDEX,
					   objects.dst_texture_pixels_buffer_object_id, 0, destination_buffer_data_size);

	// Specify values for transform feedback.
	gl.transformFeedbackVaryings(objects.program_object_id, varying_names_count, varying_names, GL_SEPARATE_ATTRIBS);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glTransformFeedbackVaryings");

	// Prepare program and shader objects.
	if (!prepareProgramAndShaderObjectsToSupportNonRenderableTexture(
			objects.program_object_id, objects.fragment_shader_object_id, objects.vertex_shader_object_id,
			src_texture_sampler_type, dst_texture_sampler_type))
	{
		return false;
	}

	// Retrieve uniform locations.
	if (!getUniformLocations(objects.program_object_id, &objects.src_2D_texture_uniform_location,
							 &objects.src_2DArray_texture_uniform_location, &objects.src_3D_texture_uniform_location,
							 &objects.src_Cube_texture_uniform_location, &objects.dst_2D_texture_uniform_location,
							 &objects.dst_Cube_texture_uniform_location, &objects.channels_to_compare_uniform_location,
							 &objects.samplers_to_use_uniform_location))
	{
		return false;
	}

	return true;
}

/** Calculate size needed for texture object data storage to successfully
 *  capture all the data needed.
 *  For simplicity, we assume all internalformats of our concern use four
 *  components. It's not a dreadful waste of memory, given amount of data
 *  we will be checking for later on anyway.
 *
 * @param _data_sampler_type	 Type of the sampler used to read the data.
 * @param texture_data_size_ptr  Deref will be used to stored calculated result.
 *							   Cannot be NULL.
 *
 * @return true if successful, false otherwise.
 */
bool RequiredCase::calculateBufferDataSize(DataSamplerType sampler_type, GLuint* buffer_data_size_ptr)
{
	if (buffer_data_size_ptr == NULL)
	{
		m_testCtx.getLog() << tcu::TestLog::Message << "NULL pointer passed as a deref to store calculated result."
						   << tcu::TestLog::EndMessage;
		return false;
	}

	switch (sampler_type)
	{
	case DATA_SAMPLER_FLOAT:
		*buffer_data_size_ptr = NUMBER_OF_POINTS_TO_DRAW * NUMBER_OF_ELEMENTS_IN_VEC4 * sizeof(GLfloat);
		return true;

	case DATA_SAMPLER_INTEGER:
		*buffer_data_size_ptr = NUMBER_OF_POINTS_TO_DRAW * NUMBER_OF_ELEMENTS_IN_VEC4 * sizeof(GLint);
		return true;

	case DATA_SAMPLER_UNSIGNED_INTEGER:
		*buffer_data_size_ptr = NUMBER_OF_POINTS_TO_DRAW * NUMBER_OF_ELEMENTS_IN_VEC4 * sizeof(GLuint);
		return true;

	default:
		m_testCtx.getLog() << tcu::TestLog::Message << "Unrecognized data sampler type." << tcu::TestLog::EndMessage;
		return false;
	}

	return true;
}

/** Texture coordinates to use when glReadPixels can't be used to read back the data.
 *  Different coordinates for different attachment types.
 *
 *  @param attachment_type Texture attachment type
 *
 *  @return Array of 4 3-tuples of texture coordinates to use
 */
const float* RequiredCase::getTexCoordinates(GLenum attachment_type) const
{
	static const float texture_coordinates[7][NUMBER_OF_POINTS_TO_DRAW * 4] = {
		// 2D texture, 3D texture and 2D array
		{ 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0 },
		// Cube Map NEGATIVE_X
		{ -1, .99f, -.99f, 0, -1, .99f, .99f, 0, -1, -.99f, .99f, 0, -1, -.99f, -.99f, 0 },
		// Cube Map NEGATIVE_Y
		{ -.99f, -1, .99f, 0, .99f, -1, .99f, 0, .99f, -1, -.99f, 0, -.99f, -1, -.99f, 0 },
		// Cube Map NEGATIVE_Z
		{ .99f, .99f, -1, 0, -.99f, .99f, -1, 0, -.99f, -.99f, -1, 0, .99f, -.99f, -1, 0 },
		// Cube Map POSITIVE_X
		{ 1, .99f, .99f, 0, 1, .99f, -.99f, 0, 1, -.99f, -.99f, 0, 1, -.99f, .99f, 0 },
		// Cube Map POSITIVE_Y
		{ -.99f, 1, -.99f, 0, .99f, 1, -.99f, 0, .99f, 1, .99f, 0, -.99f, 1, .99f, 0 },
		// Cube Map POSITIVE_Z
		{ -.99f, .99f, 1, 0, .99f, .99f, 1, 0, .99f, -.99f, 1, 0, -.99f, -.99f, 1, 0 },
	};

	switch (attachment_type)
	{
	case GL_TEXTURE_2D:
	case GL_TEXTURE_2D_ARRAY:
	case GL_TEXTURE_3D:
		return texture_coordinates[0];
	case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
		return texture_coordinates[1];
	case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
		return texture_coordinates[2];
	case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
		return texture_coordinates[3];
	case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
		return texture_coordinates[4];
	case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
		return texture_coordinates[5];
	case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
		return texture_coordinates[6];
	default:
		DE_ASSERT(!"Invalid attachment type!");
		return NULL;
	}
}

/** Sets source for shader objects, compiles them and attaches to program object.
 * Program object can be used to verify whether copying texture image works correctly if
 * non-renderable internalformats are considered.
 * If all the operations succeeded, the program object is activated.
 *
 * @param program_object_id		 ID of a program object to be initialized.
 *								  The value must be a valid program object ID.
 * @param fragment_shader_object_id ID of a fragment shader object to be initialized.
 *								  The value must be a valid fragment shader object ID.
 * @param vertex_shader_object_id   ID of a vertex shader object to be initialized.
 *								  The value must be a valid vertex shader object ID.
 * @param src_texture_sampler_type  Sampler to be used for sampling source texture object.
 * @param dst_texture_sampler_type  Sampler to be used for sampling destination texture object.
 *
 * @return true if the operation succeeded, false otherwise.
 */
bool RequiredCase::prepareProgramAndShaderObjectsToSupportNonRenderableTexture(GLuint program_object_id,
																			   GLuint fragment_shader_object_id,
																			   GLuint vertex_shader_object_id,
																			   DataSamplerType src_texture_sampler_type,
																			   DataSamplerType dst_texture_sampler_type)
{
	glu::RenderContext& renderContext = m_context.getRenderContext();
	const Functions&	gl			  = renderContext.getFunctions();

	// Attach shader objects to program object.
	gl.attachShader(program_object_id, fragment_shader_object_id);
	gl.attachShader(program_object_id, vertex_shader_object_id);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glAttachShader");

	if (!setSourceForShaderObjectsUsedForNonRenderableTextureSupport(
			fragment_shader_object_id, vertex_shader_object_id, src_texture_sampler_type, dst_texture_sampler_type))
	{
		return false;
	}

	if (!compileAndCheckShaderCompilationStatus(fragment_shader_object_id))
		return false;

	if (!compileAndCheckShaderCompilationStatus(vertex_shader_object_id))
		return false;

	if (!linkAndCheckProgramLinkStatus(program_object_id))
		return false;

	return true;
}

/** Assigns source code to fragment/vertex shaders which will then be used to verify texture data..
 *
 * @param fragment_shader_object_id ID of an already created fragment shader.
 * @param vertex_shader_object_id   ID of an already created vertex shader.
 * @param src_texture_sampler_type  Type of sampler to be used for sampling source texture object (float/int/uint).
 * @param dst_texture_sampler_type  Type of sampler to be used for sampling destination texture object (float/int/uint).
 *
 * @return true if successful, false otherwise.
 */
bool RequiredCase::setSourceForShaderObjectsUsedForNonRenderableTextureSupport(GLuint fragment_shader_object_id,
																			   GLuint vertex_shader_object_id,
																			   DataSamplerType src_texture_sampler_type,
																			   DataSamplerType dst_texture_sampler_type)
{
	glu::RenderContext& renderContext = m_context.getRenderContext();
	const Functions&	gl			  = renderContext.getFunctions();

	std::map<std::string, std::string> specializationMap;

	const GLchar* fragment_shader_source = { "#version 300 es\n"
											 "void main()\n"
											 "{}\n" };
	static std::string shader_source[3];
	const GLchar* vertex_shader_source = NULL;
	const GLchar*	  source				= "#version 300 es\n"
						   "\n"
						   "	 uniform highp ${SAMPLER_PREFIX}sampler2D	  dst_texture2D;\n"
						   "	 uniform highp ${SAMPLER_PREFIX}samplerCube	dst_textureCube;\n"
						   "	 uniform highp ${SAMPLER_PREFIX}sampler2D	  src_texture2D;\n"
						   "	 uniform highp ${SAMPLER_PREFIX}sampler3D	  src_texture3D;\n"
						   "	 uniform highp ${SAMPLER_PREFIX}sampler2DArray src_texture2DArray;\n"
						   "	 uniform highp ${SAMPLER_PREFIX}samplerCube	src_textureCube;\n"
						   "	 uniform int			  channels_to_compare;\n"
						   "	 uniform int			  samplers_to_use;\n"
						   "layout(location = 0) in vec4  dst_texture_coord;\n"
						   "layout(location = 1) in vec4  src_texture_coord;\n"
						   "${OUT_QUALIFIER}   out	 ${OUT_TYPE}		   dst_texture_pixel_values;\n"
						   "${OUT_QUALIFIER}   out	 ${OUT_TYPE}		   src_texture_pixel_values;\n"
						   "flat out	 int			  compare_result;\n"
						   "\n"
						   "void main()\n"
						   "{\n"
						   "	${OUT_TYPE}	  src_texture_data;\n"
						   "	${OUT_TYPE}	  dst_texture_data;\n"
						   "	const ${EPSILON_TYPE}	epsilon		  = ${EPSILON_VALUE};\n"
						   "	int		 result		   = 1;\n"
						   "	bool		compare_red	  = (channels_to_compare & 0x1) != 0;\n"
						   "	bool		compare_green	= (channels_to_compare & 0x2) != 0;\n"
						   "	bool		compare_blue	 = (channels_to_compare & 0x4) != 0;\n"
						   "	bool		compare_alpha	= (channels_to_compare & 0x8) != 0;\n"
						   "	int		 src_sampler	  = samplers_to_use & 0xff;\n"
						   "	int		 dst_sampler	  = samplers_to_use >> 8;\n"
						   "\n"
						   "	if (src_sampler == 0)\n"
						   "	{\n"
						   "		src_texture_data = texture(src_texture2D, src_texture_coord.xy);\n"
						   "	}\n"
						   "	else if (src_sampler == 1)\n"
						   "	{\n"
						   "		src_texture_data = texture(src_texture3D, src_texture_coord.xyz);\n"
						   "	}\n"
						   "	else if (src_sampler == 2)\n"
						   "	{\n"
						   "		src_texture_data = texture(src_texture2DArray, src_texture_coord.xyz);\n"
						   "	}\n"
						   "	else\n"
						   "	{\n"
						   "		src_texture_data = texture(src_textureCube, src_texture_coord.xyz);\n"
						   "	}\n"
						   "\n"
						   "	if (dst_sampler == 0)\n"
						   "	{\n"
						   "		dst_texture_data = texture(dst_texture2D, dst_texture_coord.xy);\n"
						   "	}\n"
						   "	else\n"
						   "	{\n"
						   "		dst_texture_data = texture(dst_textureCube, dst_texture_coord.xyz);\n"
						   "	}\n"
						   "\n"
						   "	if (compare_red && ${FN}(src_texture_data.x - dst_texture_data.x) > epsilon)\n"
						   "	{\n"
						   "		result = 0;\n"
						   "	}\n"
						   "	if (compare_green && ${FN}(src_texture_data.y - dst_texture_data.y) > epsilon)\n"
						   "	{\n"
						   "		result = 0;\n"
						   "	}\n"
						   "	if (compare_blue && ${FN}(src_texture_data.z - dst_texture_data.z) > epsilon)\n"
						   "	{\n"
						   "		result = 0;\n"
						   "	}\n"
						   "	if (compare_alpha && ${FN}(src_texture_data.w - dst_texture_data.w) > epsilon)\n"
						   "	{\n"
						   "		result = 0;\n"
						   "	}\n"
						   "\n"
						   "	compare_result		   = result;\n"
						   "	dst_texture_pixel_values = dst_texture_data;\n"
						   "	src_texture_pixel_values = src_texture_data;\n"
						   "}\n";

	switch (src_texture_sampler_type)
	{
	case DATA_SAMPLER_FLOAT:
	{
		switch (dst_texture_sampler_type)
		{
		case DATA_SAMPLER_FLOAT:
		{
			specializationMap["SAMPLER_PREFIX"] = "  ";
			specializationMap["OUT_QUALIFIER"]  = "  ";
			specializationMap["OUT_TYPE"]		= "  vec4";
			specializationMap["EPSILON_TYPE"]   = "float";
			specializationMap["EPSILON_VALUE"]  = "(1.0/255.0)";
			specializationMap["FN"]				= "abs";
			shader_source[0]					= tcu::StringTemplate(source).specialize(specializationMap);

			vertex_shader_source = shader_source[0].c_str();
			break;
		}

		default:
		{
			m_testCtx.getLog() << tcu::TestLog::Message << "Unrecognized sampler type for destination texture object."
							   << tcu::TestLog::EndMessage;
			return false;
		}
		}

		break;
	}

	case DATA_SAMPLER_INTEGER:
	{
		switch (dst_texture_sampler_type)
		{
		case DATA_SAMPLER_INTEGER:
		{
			specializationMap["SAMPLER_PREFIX"] = "i";
			specializationMap["OUT_QUALIFIER"]  = "flat";
			specializationMap["OUT_TYPE"]		= "ivec4";
			specializationMap["EPSILON_TYPE"]   = "int";
			specializationMap["EPSILON_VALUE"]  = "0";
			specializationMap["FN"]				= "abs";

			shader_source[1]	 = tcu::StringTemplate(source).specialize(specializationMap);
			vertex_shader_source = shader_source[1].c_str();
			break;
		}

		default:
		{
			m_testCtx.getLog() << tcu::TestLog::Message
							   << "Unrecognized type of internalformat of destination texture object."
							   << tcu::TestLog::EndMessage;
			return false;
		}
		}

		break;
	}

	case DATA_SAMPLER_UNSIGNED_INTEGER:
	{
		switch (dst_texture_sampler_type)
		{
		case DATA_SAMPLER_UNSIGNED_INTEGER:
		{
			specializationMap["SAMPLER_PREFIX"] = "u";
			specializationMap["OUT_QUALIFIER"]  = "flat";
			specializationMap["OUT_TYPE"]		= "uvec4";
			specializationMap["EPSILON_TYPE"]   = "uint";
			specializationMap["EPSILON_VALUE"]  = "0u";
			specializationMap["FN"]				= "";

			shader_source[2]	 = tcu::StringTemplate(source).specialize(specializationMap);
			vertex_shader_source = shader_source[2].c_str();
			break;
		}

		default:
		{
			m_testCtx.getLog() << tcu::TestLog::Message
							   << "Unrecognized type of internalformat of destination texture object."
							   << tcu::TestLog::EndMessage;
			return false;
		}
		}

		break;
	}

	default:
	{
		m_testCtx.getLog() << tcu::TestLog::Message << "Unrecognized type of internalformat of source texture object."
						   << tcu::TestLog::EndMessage;
		return false;
	}
	}

	// Set shader source for fragment shader object.
	gl.shaderSource(fragment_shader_object_id, 1 /* part */, &fragment_shader_source, NULL);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource");

	// Set shader source for vertex shader object.
	gl.shaderSource(vertex_shader_object_id, 1 /* part */, &vertex_shader_source, NULL);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource");

	return true;
}

/** Compiles a shader object and returns compilation status.
 *
 * @param shader_object_id ID of a shader object to be compiled.
 *
 * @return true in case operation succeeded (no error was generated and compilation was successful),
 *		 false otherwise.
 */
bool RequiredCase::compileAndCheckShaderCompilationStatus(GLuint shader_object_id)
{
	glu::RenderContext& renderContext = m_context.getRenderContext();
	const Functions&	gl			  = renderContext.getFunctions();

	// Compile shader object.
	gl.compileShader(shader_object_id);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glCompileShader");

	// Check if compilation was successful.
	GLint shader_compile_status = GL_FALSE;
	gl.getShaderiv(shader_object_id, GL_COMPILE_STATUS, &shader_compile_status);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv");

	if (GL_FALSE == shader_compile_status)
	{
		m_testCtx.getLog() << tcu::TestLog::Message << "Shader object compilation failed." << tcu::TestLog::EndMessage;

		// Retrieve shader info log in case of failed compilation.
		GLint info_log_length = 0;
		gl.getShaderiv(shader_object_id, GL_INFO_LOG_LENGTH, &info_log_length);
		if (info_log_length != 0)
		{
			std::vector<char> log(info_log_length + 1, 0);
			gl.getShaderInfoLog(shader_object_id, info_log_length, NULL, &log[0]);
			m_testCtx.getLog() << tcu::TestLog::Message << "Shader info log = [" << &log[0] << "]"
							   << tcu::TestLog::EndMessage;
		}

		return false;
	}

	return true;
}

/** Links a program object and returns link status.
 *
 * @param program_object_id ID of a program object to be linked.
 *
 * @return true in case of the operation succeeded (no error was generated and linking end up with success),
 *		 false otherwise.
 */
bool RequiredCase::linkAndCheckProgramLinkStatus(GLuint program_object_id)
{
	glu::RenderContext& renderContext = m_context.getRenderContext();
	const Functions&	gl			  = renderContext.getFunctions();

	gl.linkProgram(program_object_id);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram");

	// Check if link opearation was successful.
	GLint program_link_status = GL_FALSE;
	gl.getProgramiv(program_object_id, GL_LINK_STATUS, &program_link_status);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramiv");
	if (GL_FALSE == program_link_status)
	{
		m_testCtx.getLog() << tcu::TestLog::Message << "Program object linking failed." << tcu::TestLog::EndMessage;

		// Retrieve program info log in case of failed linking.
		GLint info_log_length = 0;
		gl.getProgramiv(program_object_id, GL_INFO_LOG_LENGTH, &info_log_length);
		if (info_log_length != 0)
		{
			std::vector<char> log(info_log_length + 1, 0);
			gl.getProgramInfoLog(program_object_id, info_log_length, NULL, &log[0]);
			m_testCtx.getLog() << tcu::TestLog::Message << "Program info log = [" << &log[0] << "]"
							   << tcu::TestLog::EndMessage;
		}

		return false;
	}

	return true;
}

/** Retrieve locations of uniforms (source and destination texture samples)
 * and store them in derefs.
 *
 * @param program_object_id							 ID of a program object for which uniform locations are to be retrieved.
 * @param source_2D_texture_uniform_location_ptr		Deref used to store uniform location for a 2D source texture.
 *													  Cannot be NULL.
 * @param source_2DArray_texture_uniform_location_ptr   Deref used to store uniform location for a 2DArray source texture.
 *													  Cannot be NULL.
 * @param source_3D_texture_uniform_location_ptr		Deref used to store uniform location for a 3D source texture.
 *													  Cannot be NULL.
 * @param source_Cube_texture_uniform_location_ptr	  Deref used to store uniform location for a Cube source texture.
 *													  Cannot be NULL.
 * @param destination_2D_texture_uniform_location_ptr   Deref used to store uniform location for a 2D destination texture.
 *													  Cannot be NULL.
 * @param destination_Cube_texture_uniform_location_ptr Deref used to store uniform location for a Cube destination texture.
 *													  Cannot be NULL.
 * @param channels_to_compare_uniform_location_ptr	  Deref used to store uniform location for a channels_to_compare.
 *													  Cannot be NULL.
 * @param samplers_to_use_uniform_location_ptr		  Deref used to store uniform location for a samplers_to_use.
 *													  Cannot be NULL.
 *
 * @return true if the operation succeeded (no error was generated and valid uniform locations were returned),
 *		 false otherwise.
 */
bool RequiredCase::getUniformLocations(GLuint program_object_id, GLint* source_2D_texture_uniform_location_ptr,
									   GLint* source_2DArray_texture_uniform_location_ptr,
									   GLint* source_3D_texture_uniform_location_ptr,
									   GLint* source_Cube_texture_uniform_location_ptr,
									   GLint* destination_2D_texture_uniform_location_ptr,
									   GLint* destination_Cube_texture_uniform_location_ptr,
									   GLint* channels_to_compare_uniform_location_ptr,
									   GLint* samplers_to_use_uniform_location_ptr)
{
	if (source_2D_texture_uniform_location_ptr == NULL || source_2DArray_texture_uniform_location_ptr == NULL ||
		source_3D_texture_uniform_location_ptr == NULL || source_Cube_texture_uniform_location_ptr == NULL ||
		destination_2D_texture_uniform_location_ptr == NULL || destination_Cube_texture_uniform_location_ptr == NULL ||
		channels_to_compare_uniform_location_ptr == NULL || samplers_to_use_uniform_location_ptr == NULL)
	{
		m_testCtx.getLog() << tcu::TestLog::Message << "NULL pointers passed." << tcu::TestLog::EndMessage;
		return false;
	}

	glu::RenderContext& renderContext = m_context.getRenderContext();
	const Functions&	gl			  = renderContext.getFunctions();

	// Set active program object.
	gl.useProgram(program_object_id);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram");

	GLint destination_2D_texture_uniform_location = -1;
	destination_2D_texture_uniform_location		  = gl.getUniformLocation(program_object_id, "dst_texture2D");
	if (destination_2D_texture_uniform_location == -1)
		return false;

	GLint destination_Cube_texture_uniform_location = -1;
	destination_Cube_texture_uniform_location		= gl.getUniformLocation(program_object_id, "dst_textureCube");
	if (destination_Cube_texture_uniform_location == -1)
		return false;

	GLint source_2D_texture_uniform_location = -1;
	source_2D_texture_uniform_location		 = gl.getUniformLocation(program_object_id, "src_texture2D");
	if (source_2D_texture_uniform_location == -1)
		return false;

	GLint source_2DArray_texture_uniform_location = -1;
	source_2DArray_texture_uniform_location		  = gl.getUniformLocation(program_object_id, "src_texture2DArray");
	if (source_2DArray_texture_uniform_location == -1)
		return false;

	GLint source_3D_texture_uniform_location = -1;
	source_3D_texture_uniform_location		 = gl.getUniformLocation(program_object_id, "src_texture3D");
	if (source_3D_texture_uniform_location == -1)
		return false;

	GLint source_Cube_texture_uniform_location = -1;
	source_Cube_texture_uniform_location	   = gl.getUniformLocation(program_object_id, "src_textureCube");
	if (source_Cube_texture_uniform_location == -1)
		return false;

	GLint channels_to_compare_uniform_location = -1;
	channels_to_compare_uniform_location	   = gl.getUniformLocation(program_object_id, "channels_to_compare");
	if (channels_to_compare_uniform_location == -1)
		return false;

	GLint samplers_to_use_uniform_location = -1;
	samplers_to_use_uniform_location	   = gl.getUniformLocation(program_object_id, "samplers_to_use");
	if (samplers_to_use_uniform_location == -1)
		return false;

	// We are now ready to store retrieved locations.
	*source_2D_texture_uniform_location_ptr		   = source_2D_texture_uniform_location;
	*source_2DArray_texture_uniform_location_ptr   = source_2DArray_texture_uniform_location;
	*source_3D_texture_uniform_location_ptr		   = source_3D_texture_uniform_location;
	*source_Cube_texture_uniform_location_ptr	  = source_Cube_texture_uniform_location;
	*destination_2D_texture_uniform_location_ptr   = destination_2D_texture_uniform_location;
	*destination_Cube_texture_uniform_location_ptr = destination_Cube_texture_uniform_location;
	*channels_to_compare_uniform_location_ptr	  = channels_to_compare_uniform_location;
	*samplers_to_use_uniform_location_ptr		   = samplers_to_use_uniform_location;

	// Restore default settings.
	gl.useProgram(0);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram");

	return true;
}

/** Display error message with detailed information.
 *  The function should be issued only when pixel comparison failed.
 *
 * @param src_attachment_type	  Source attachment type.
 * @param dst_attachment_type	  Destination attachment type.
 * @param source_pixel_r		   R channel source pixel value.
 * @param source_pixel_g		   G channel source pixel value.
 * @param source_pixel_b		   B channel source pixel value.
 * @param source_pixel_a		   A channel source pixel value.
 * @param source_internalformat	Source internalformat.
 * @param source_type			  Source type.
 * @param reference_pixel_r		R channel reference pixel value.
 * @param reference_pixel_g		G channel reference pixel value.
 * @param reference_pixel_b		B channel reference pixel value.
 * @param reference_pixel_a		A channel reference pixel value.
 * @param reference_internalformat Reference internalformat.
 * @param reference_type		   Reference type.
 * @param result_pixel_r		   R channel result pixel value.
 * @param result_pixel_g		   G channel result pixel value.
 * @param result_pixel_b		   B channel result pixel value.
 * @param result_pixel_a		   A channel result pixel value.
 * @param result_internalformat	Result internalformat.
 * @param result_type			  Type internalformat.
 * @param max_epsilon_r			Maximum value for an epsilon used for comparison R channel pixel values.
 * @param max_epsilon_g			Maximum value for an epsilon used for comparison G channel pixel values.
 * @param max_epsilon_b			Maximum value for an epsilon used for comparison B channel pixel values.
 * @param max_epsilon_a			Maximum value for an epsilon used for comparison A channel pixel values.
 */
void RequiredCase::displayPixelComparisonFailureMessage(
	GLint source_pixel_r, GLint source_pixel_g, GLint source_pixel_b, GLint source_pixel_a,
	GLenum source_internalformat, GLenum source_type, GLint reference_pixel_r, GLint reference_pixel_g,
	GLint reference_pixel_b, GLint reference_pixel_a, GLenum reference_internalformat, GLenum reference_type,
	GLint result_pixel_r, GLint result_pixel_g, GLint result_pixel_b, GLint result_pixel_a,
	GLenum result_internalformat, GLenum result_type, GLint max_epsilon_r, GLint max_epsilon_g, GLint max_epsilon_b,
	GLint max_epsilon_a)
{
	m_testCtx.getLog() << tcu::TestLog::Message << "Conversion failed for source  ["
					   << getTargetName(m_source_attachment_type) << "] and destination ["
					   << getTargetName(m_destination_attachment_type) << "FBO attachment types."
					   << "\nSource pixel:				 [" << source_pixel_r << ", " << source_pixel_g << ", "
					   << source_pixel_b << ", " << source_pixel_a << "]\nSource internalformat:		["
					   << getInternalformatString(source_internalformat) << "]\nSource type:				  ["
					   << glu::getTypeStr(source_type).toString() << "]\nReference pixel:			  ["
					   << reference_pixel_r << ", " << reference_pixel_g << ", " << reference_pixel_b << ", "
					   << reference_pixel_a << "]\nReference internalformat:	 ["
					   << getInternalformatString(reference_internalformat) << "]\nReference type:			   ["
					   << glu::getTypeStr(reference_type).toString() << "]\nResult pixel:				 ["
					   << result_pixel_r << ", " << result_pixel_g << ", " << result_pixel_b << ", " << result_pixel_a
					   << "]\nResult internalformat:		[" << getInternalformatString(result_internalformat)
					   << "]\nType used for glReadPixels(): [" << glu::getTypeStr(result_type).toString()
					   << "]\nMaximum epsilon:			  [" << max_epsilon_r << ", " << max_epsilon_g << ", "
					   << max_epsilon_b << ", " << max_epsilon_a << "]" << tcu::TestLog::EndMessage;
}

/** Returns sampler type (float/integer/unsigned integer) that should be used for
 *  sampling a texture using data stored in specific internalformat.
 *
 * @param internalformat Internalformat to use for the query.
 *
 * @return Sampler type to9 be used..
 */
DataSamplerType RequiredCase::getDataSamplerTypeForInternalformat(GLenum internalformat)
{
	if (isInternalFormatCompatibleWithFPSampler(internalformat))
		return DATA_SAMPLER_FLOAT;
	else if (isInternalFormatCompatibleWithIntegerSampler(internalformat))
		return DATA_SAMPLER_INTEGER;
	else if (isInternalFormatCompatibleWithUnsignedIntegerSampler(internalformat))
		return DATA_SAMPLER_UNSIGNED_INTEGER;
	else
	{
		// Unrecognized internal format
		DE_ASSERT(0);
	}

	return DATA_SAMPLER_FLOAT;
}

/** Tells whether internal format @param internalformat is compatible with a floating-point
 *  texture sampling function.
 *
 *  @param internalformat GLES internal format to consider.
 *
 *  @return true if yes, false otherwise.
 **/
bool RequiredCase::isInternalFormatCompatibleWithFPSampler(GLenum internalformat)
{
	switch (internalformat)
	{
	// FP texture() GLSL function should be used for sampling textures using
	// the following internalformats
	case GL_ALPHA:
	case GL_ALPHA8_OES:
	case GL_DEPTH_COMPONENT16:
	case GL_DEPTH_COMPONENT24:
	case GL_DEPTH24_STENCIL8:
	case GL_LUMINANCE:
	case GL_LUMINANCE8_OES:
	case GL_LUMINANCE_ALPHA:
	case GL_LUMINANCE8_ALPHA8_OES:
	case GL_R8:
	case GL_R8_SNORM:
	case GL_RG8:
	case GL_RG8_SNORM:
	case GL_RGB:
	case GL_RGB5_A1:
	case GL_RGB10_A2:
	case GL_RGB565:
	case GL_RGB8:
	case GL_RGB8_SNORM:
	case GL_RGBA:
	case GL_RGBA4:
	case GL_RGBA8:
	case GL_RGBA8_SNORM:
	case GL_SRGB8:
	case GL_SRGB8_ALPHA8:

	// These are strictly floating-point internal formats
	case GL_DEPTH_COMPONENT32F:
	case GL_DEPTH32F_STENCIL8:
	case GL_R11F_G11F_B10F:
	case GL_R16F:
	case GL_R32F:
	case GL_RG16F:
	case GL_RG32F:
	case GL_RGB16F:
	case GL_RGB32F:
	case GL_RGB9_E5:
	case GL_RGBA16F:
	case GL_RGBA32F:
		return true;
	}

	return false;
}

/** Tells whether internal format @param internalformat is compatible with integer
 *  texture sampling function.
 *
 *  @param internalformat GLES internal format to consider.
 *
 *  @return true if yes, false otherwise.
 **/
bool RequiredCase::isInternalFormatCompatibleWithIntegerSampler(GLenum internalformat)
{
	switch (internalformat)
	{
	case GL_R16I:
	case GL_R32I:
	case GL_R8I:
	case GL_RG16I:
	case GL_RG32I:
	case GL_RG8I:
	case GL_RGB16I:
	case GL_RGB32I:
	case GL_RGB8I:
	case GL_RGBA16I:
	case GL_RGBA32I:
	case GL_RGBA8I:
		return true;
	}

	return false;
}

/** Tells whether internal format @param internalformat is compatible with unsigned integer
 *  texture sampling function.
 *
 *  @param internalformat GLES internal format to consider.
 *
 *  @return true if yes, false otherwise.
 **/
bool RequiredCase::isInternalFormatCompatibleWithUnsignedIntegerSampler(GLenum internalformat)
{
	switch (internalformat)
	{
	case GL_R16UI:
	case GL_R32UI:
	case GL_R8UI:
	case GL_RG16UI:
	case GL_RG32UI:
	case GL_RG8UI:
	case GL_RGB10_A2UI:
	case GL_RGB16UI:
	case GL_RGB32UI:
	case GL_RGB8UI:
	case GL_RGBA16UI:
	case GL_RGBA32UI:
	case GL_RGBA8UI:
		return true;
	}

	return false;
}

/** Deletes all objects which were created to support non-renderable texture internalformats.
 *
 * @param objects Reference to generated object.
 */
void RequiredCase::destroyObjectsSupportingNonRenderableInternalformats(
	NonRenderableInternalformatSupportObjects& objects)
{
	unbindAndDestroyBufferObject(objects.comparison_result_buffer_object_id);
	unbindAndDestroyBufferObject(objects.src_texture_pixels_buffer_object_id);
	unbindAndDestroyBufferObject(objects.dst_texture_pixels_buffer_object_id);
	unbindAndDestroyBufferObject(objects.src_texture_coordinates_buffer_object_id);
	unbindAndDestroyBufferObject(objects.dst_texture_coordinates_buffer_object_id);
	destroyTransformFeedbackObject(objects.transform_feedback_object_id);
	destroyProgramAndShaderObjects(objects.program_object_id, objects.fragment_shader_object_id,
								   objects.vertex_shader_object_id);

	objects.comparison_result_buffer_object_id		 = 0;
	objects.dst_texture_pixels_buffer_object_id		 = 0;
	objects.dst_2D_texture_uniform_location			 = -1;
	objects.dst_Cube_texture_uniform_location		 = -1;
	objects.fragment_shader_object_id				 = 0;
	objects.transform_feedback_object_id			 = 0;
	objects.program_object_id						 = 0;
	objects.src_2D_texture_uniform_location			 = -1;
	objects.src_2DArray_texture_uniform_location	 = -1;
	objects.src_3D_texture_uniform_location			 = -1;
	objects.src_Cube_texture_uniform_location		 = -1;
	objects.src_texture_pixels_buffer_object_id		 = 0;
	objects.vertex_shader_object_id					 = 0;
	objects.channels_to_compare_uniform_location	 = -1;
	objects.samplers_to_use_uniform_location		 = -1;
	objects.src_texture_coordinates_buffer_object_id = 0;
	objects.dst_texture_coordinates_buffer_object_id = 0;
}

/** Unbind and destroy buffer object which was created for transform feedback purposes.
 *
 * @param bo_id ID of a buffer object (which was created for transform feedback purposes) to be deleted.
 *			  If not zero, it is assumed that the value corresponds to valid buffer object ID.
 */
void RequiredCase::unbindAndDestroyBufferObject(GLuint bo_id)
{
	glu::RenderContext& renderContext = m_context.getRenderContext();
	const Functions&	gl			  = renderContext.getFunctions();

	// Set zero buffer object to be used for GL_TRANSFORM_FEEDBACK_BUFFER.
	gl.bindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, COMPARISON_RESULT_BUFFER_OBJECT_INDEX, 0);
	gl.bindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, SOURCE_TEXTURE_PIXELS_BUFFER_OBJECT_INDEX, 0);
	gl.bindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, DESTINATION_TEXTURE_PIXELS_BUFFER_OBJECT_INDEX, 0);
	gl.bindBuffer(GL_ARRAY_BUFFER, 0);

	if (bo_id != 0)
	{
		gl.deleteBuffers(1, &bo_id);
		GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteBuffers");
	}
}

/** Unbind and destroy transform feedback object.
 *
 * @param transform_feedback_object_id ID of a transform feedback object to be deleted.
 *									 If not zero, it is assumed that the value corresponds
 *									 to valid transform feedback object ID.
 */
void RequiredCase::destroyTransformFeedbackObject(GLuint transform_feedback_object_id)
{
	glu::RenderContext& renderContext = m_context.getRenderContext();
	const Functions&	gl			  = renderContext.getFunctions();

	// Set zero transform feedback object to be used.
	gl.bindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);

	if (transform_feedback_object_id != 0)
	{
		gl.deleteTransformFeedbacks(1, &transform_feedback_object_id);
		GLU_EXPECT_NO_ERROR(gl.getError(), "glDestroyTransformFeedbackObject");
	}
}

/** Destroy program and shader objects.
 *
 * @param program_object_id  ID of a program object to be deleted.
 *						   If not zero, it is assumed that the value corresponds to valid program object ID.
 * @param fragment_shader_id ID of a fragment shader object to be deleted.
 *						   If not zero, it is assumed that the value corresponds to valid shader object ID.
 * @param vertex_shader_id   ID of a vertex shader object to be deleted.
 *						   If not zero, it is assumed that the value corresponds to valid shader object ID.
 */
void RequiredCase::destroyProgramAndShaderObjects(GLuint program_object_id, GLuint fragment_shader_id,
												  GLuint vertex_shader_id)
{
	glu::RenderContext& renderContext = m_context.getRenderContext();
	const Functions&	gl			  = renderContext.getFunctions();

	// Use zero program object.
	gl.useProgram(0);

	// Try to destroy fragment shader object.
	if (fragment_shader_id != 0)
	{
		gl.deleteShader(fragment_shader_id);
		GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteShader");
	}

	// Try to destroy vertex shader object.
	if (vertex_shader_id != 0)
	{
		gl.deleteShader(vertex_shader_id);
		GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteShader");
	}

	// Try to destroy program object.
	if (program_object_id != 0)
	{
		gl.deleteProgram(program_object_id);
		GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteProgram");
	}
}

void RequiredCase::unbindColorAttachments()
{
	glu::RenderContext& renderContext = m_context.getRenderContext();
	const Functions&	gl			  = renderContext.getFunctions();

	switch (m_source_attachment_type)
	{
	case GL_RENDERBUFFER:
		gl.framebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0);
		break;
	case GL_TEXTURE_2D_ARRAY:
	case GL_TEXTURE_3D:
		gl.framebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 0, 0, 0);
		break;
	default:
		gl.framebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_source_attachment_type, 0, 0);
		break;
	}

	if (gl.getError() != GL_NO_ERROR)
	{
		m_testCtx.getLog() << tcu::TestLog::Message << "Could not unbind texture objects from read/draw framebuffers"
						   << tcu::TestLog::EndMessage;
	}
}

void RequiredCase::restoreBindings(GLenum src_attachment_point, GLenum dst_attachment_point, GLint bound_draw_fbo_id,
								   GLint bound_read_fbo_id)
{
	glu::RenderContext& renderContext = m_context.getRenderContext();
	const Functions&	gl			  = renderContext.getFunctions();

	gl.disableVertexAttribArray(SRC_TEXTURE_COORDS_ATTRIB_INDEX);
	gl.disableVertexAttribArray(DST_TEXTURE_COORDS_ATTRIB_INDEX);

	gl.activeTexture(src_attachment_point);
	gl.bindTexture(getGeneralTargetForDetailedTarget(m_source_attachment_type), 0);
	gl.activeTexture(dst_attachment_point);
	gl.bindTexture(getGeneralTargetForDetailedTarget(m_destination_attachment_type), 0);
	gl.activeTexture(GL_TEXTURE0);

	// Restore previous framebuffer bindings.
	gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, bound_draw_fbo_id);
	gl.bindFramebuffer(GL_READ_FRAMEBUFFER, bound_read_fbo_id);
}

/* SPECIFICATION:
 *
 * This conformance test verifies that glCopyTexImage2D() implementation does NOT
 * accept internalformats that are incompatible with effective internalformat of
 * current read buffer.
 *
 * The test starts from creating a framebuffer object, which is then bound to
 * GL_READ_FRAMEBUFFER target. It then enters two-level loop:
 *
 * a) First level determines source attachment type: this could either be a 2D texture/cube-map
 *	face mip-map, a specific mip-map of a slice coming from a 2D texture array OR a 3D texture,
 *	or finally a render-buffer. All of these can be bound to an attachment point that is
 *	later pointed to by read buffer configuration.
 * b) Second level configures attachment type of destination. Since glCopyTexImage2D()
 *	specification limits accepted targets, only 2D texture or cube-map face targets are
 *	accepted.
 *
 * For each viable source/destination configuration, the test then enters another two-level loop:
 *
 * I)  First sub-level determines what internal format should be used for the source attachment.
 *	 All texture formats required from a conformant GLES3.0 implementation are iterated over.
 * II) Second sub-level determines internal format that should be passed as a parameter to
 *	 a glCopyTexImage2D() call.
 *
 * For each internal format pair, the test creates and configures a corresponding GL object and
 * attaches it to the read framebuffer. The test also uses a pre-generated texture object that
 * should be re-configured with each glCopyTexImage2D) call.
 *
 * The test then loops over all supported format+type combinations for the internal-format considered
 * and feeds them into actual glCopyTexImage2D() call. Since we're dealing with a negative test, these
 * calls are only made if a source/destination internalformat combination is spec-wise invalid and
 * should result in an error. If the implementation accepts a pair that would require indirect
 * conversions outside scope of the specification, the test should fail.
 */
class ForbiddenCase : public TestBase
{
public:
	ForbiddenCase(deqp::Context& context, GLenum source_attachment_types, GLenum destination_attachment_types);
	virtual ~ForbiddenCase();

	virtual tcu::TestNode::IterateResult iterate(void);

protected:
	bool execute(GLenum src_internal_format, GLenum dst_internal_format, GLuint src_object_id, GLuint dst_object_id);
};

ForbiddenCase::ForbiddenCase(deqp::Context& context, GLenum source_attachment_types,
							 GLenum destination_attachment_types)
	: TestBase(context, source_attachment_types, destination_attachment_types)
{
}

ForbiddenCase::~ForbiddenCase()
{
}

tcu::TestNode::IterateResult ForbiddenCase::iterate(void)
{
	glu::RenderContext& renderContext = m_context.getRenderContext();
	const Functions&	gl			  = renderContext.getFunctions();

	// Create a FBO we will be using throughout the test
	GLuint fbo_id = 0;
	gl.genFramebuffers(1, &fbo_id);

	gl.bindFramebuffer(GL_READ_FRAMEBUFFER, fbo_id);

	// We will be reading from zeroth color attachment
	gl.readBuffer(GL_COLOR_ATTACHMENT0);

	// Make sure the pixel storage is configured accordingly to our data sets
	gl.pixelStorei(GL_UNPACK_ALIGNMENT, 1);
	GLU_EXPECT_NO_ERROR(gl.getError(), "glPixelStorei");

	// Sanity checks
	DE_ASSERT(m_destination_attachment_type == GL_TEXTURE_2D ||
			  m_destination_attachment_type == GL_TEXTURE_CUBE_MAP_NEGATIVE_X ||
			  m_destination_attachment_type == GL_TEXTURE_CUBE_MAP_NEGATIVE_Y ||
			  m_destination_attachment_type == GL_TEXTURE_CUBE_MAP_NEGATIVE_Z ||
			  m_destination_attachment_type == GL_TEXTURE_CUBE_MAP_POSITIVE_X ||
			  m_destination_attachment_type == GL_TEXTURE_CUBE_MAP_POSITIVE_Y ||
			  m_destination_attachment_type == GL_TEXTURE_CUBE_MAP_POSITIVE_Z);

	// Determine general attachment type
	GLenum general_attachment_type = getGeneralTargetForDetailedTarget(m_source_attachment_type);
	if (general_attachment_type == GL_NONE)
	{
		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
		return STOP;
	}

	// Set up source object
	GLuint src_object_id = generateGLObject(m_source_attachment_type);
	if (src_object_id == 0)
	{
		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
		return STOP;
	}

	// Set up destination object
	GLuint dst_object_id = generateGLObject(m_destination_attachment_type);
	if (dst_object_id == 0)
	{
		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
		return STOP;
	}

	// Run through all FBO internal formats
	bool	  result				  = true;
	int		  dstInternalFormatsCount = DE_LENGTH_OF_ARRAY(copyTexImage2DInternalFormatOrdering);
	const int fboInternalFormatsCount = DE_LENGTH_OF_ARRAY(fboEffectiveInternalFormatOrdering);
	for (int fboInternalFormatIndex = 0; fboInternalFormatIndex < fboInternalFormatsCount; ++fboInternalFormatIndex)
	{
		GLenum fboInternalIormat = fboEffectiveInternalFormatOrdering[fboInternalFormatIndex];

		// Run through all destination internal formats
		for (int dstInternalFormatUndex = 0; dstInternalFormatUndex < dstInternalFormatsCount; ++dstInternalFormatUndex)
		{
			GLenum dstInternalFormat = copyTexImage2DInternalFormatOrdering[dstInternalFormatUndex];

			if (!execute(fboInternalIormat, dstInternalFormat, src_object_id, dst_object_id))
			{
				// At least one conversion was invalid or failed. Test should
				// fail, but let's continue iterating over internalformats.
				result = false;
			}
		}
	}

	// Release GL objects before we continue
	if (dst_object_id != 0)
		destroyGLObject(m_destination_attachment_type, dst_object_id);

	if (src_object_id != 0)
		destroyGLObject(m_source_attachment_type, src_object_id);

	if (result)
		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
	else
		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");

	return STOP;
}

/** This function verifies if glCopyTexImage2D() implementation forbids conversions that
 *  are considered forbidden by GLES3.0.3 spec. For more detailed description, please
 *  consult specification of copy_tex_image_conversions_forbidden conformance test.
 *
 *  @param src_internalformat		  GLES internalformat that read buffer should use.
 *  @param src_object_id			   ID of the source GL object of @param source_attachment_type
 *									 type.
 *  @param dst_internalformat		  GLES internalformat that should be used for gl.readPixels() call.
 *									 This should NOT be the expected effective internalformat!
 *  @param dst_object_id			   ID of the destination GL object of
 *									 @param destination_attachment_type type.
 *
 *  @return true if successful, false otherwise.
 */
bool ForbiddenCase::execute(GLenum src_internal_format, GLenum dst_internal_format, GLuint src_object_id,
							GLuint dst_object_id)
{
	// Allocate the max possible size for the texture data (4 compoenents of 4 bytes each)
	static char fbo_data[TEXTURE_WIDTH * TEXTURE_HEIGHT * 4 * 4];
	GLenum		fbo_format							= GL_NONE;
	GLenum		fbo_type							= GL_NONE;
	GLenum		general_destination_attachment_type = getGeneralTargetForDetailedTarget(m_destination_attachment_type);
	int			n_src_pair							= 0;
	bool		result								= true;

	// Sanity checks
	DE_ASSERT(m_destination_attachment_type == GL_TEXTURE_2D ||
			  m_destination_attachment_type == GL_TEXTURE_CUBE_MAP_NEGATIVE_X ||
			  m_destination_attachment_type == GL_TEXTURE_CUBE_MAP_NEGATIVE_Y ||
			  m_destination_attachment_type == GL_TEXTURE_CUBE_MAP_NEGATIVE_Z ||
			  m_destination_attachment_type == GL_TEXTURE_CUBE_MAP_POSITIVE_X ||
			  m_destination_attachment_type == GL_TEXTURE_CUBE_MAP_POSITIVE_Y ||
			  m_destination_attachment_type == GL_TEXTURE_CUBE_MAP_POSITIVE_Z);

	// Skip the internalformat if it's non-renderable and we're trying to set up a renderbuffer source.
	if (m_source_attachment_type == GL_RENDERBUFFER && !isValidRBOInternalFormat(src_internal_format))
		return true;

	// Try using all compatible format+type pairs for
	const Functions& gl = m_context.getRenderContext().getFunctions();
	while (getFormatAndTypeCompatibleWithInternalformat(src_internal_format, n_src_pair, &fbo_format, &fbo_type))
	{
		// Do not test internal formats that are not deemed renderable by GLES implementation we're testing
		if (!isColorRenderableInternalFormat(src_internal_format))
			break;

		// Set up data to be used for source. Note we don't really care much about the data anyway because we want to run
		// negative tests, but in case the conversion is incorrectly allowed, we do not want this fact to be covered by
		// missing source attachment data
		if (!configureGLObject(1, m_source_attachment_type, src_object_id, src_internal_format, fbo_format, fbo_type,
							   fbo_data))
			return false;

		// Good. Check if the conversion is forbidden - if so, we can run a negative test! */
		if (!isFBOEffectiveInternalFormatCompatibleWithDestinationInternalFormat(src_internal_format,
																				 dst_internal_format))
		{
#if 0
				m_testCtx.getLog() << tcu::TestLog::Message
								   << "Testing conversion [" << getInternalformatString(src_internal_format)
								   << "]=>[" << getInternalformatString(dst_internal_format)
								   << "] for source target [" << GetTargetName(m_source_attachment_type)
								   << "] and destination target [" << GetTargetName(m_destination_attachment_type) << "]",
								   << tcu::TestLog::EndMessage;
#endif

			// Ask the implementation to perform the conversion!
			gl.bindTexture(general_destination_attachment_type, dst_object_id);
			gl.copyTexImage2D(m_destination_attachment_type, 0, dst_internal_format, 0 /* x */, 0 /* y */,
							  TEXTURE_WIDTH, TEXTURE_HEIGHT, 0 /* border */);
			gl.bindTexture(general_destination_attachment_type, 0);

			// Has the conversion failed as expected?
			GLenum error_code = gl.getError();
			if (error_code == GL_NO_ERROR)
			{
				m_testCtx.getLog() << tcu::TestLog::Message << "[" << getInternalformatString(src_internal_format)
								   << "]=>[" << getInternalformatString(dst_internal_format)
								   << "] conversion [src target=" << getTargetName(m_source_attachment_type)
								   << ", dst target=" << getTargetName(m_destination_attachment_type)
								   << "] supported contrary to GLES3.0 spec." << tcu::TestLog::EndMessage;
				// This test is now considered failed
				result = false;
			}
			else if (error_code != GL_INVALID_OPERATION)
			{
				m_testCtx.getLog() << tcu::TestLog::Message << "[" << getInternalformatString(src_internal_format)
								   << "]=>[" << getInternalformatString(dst_internal_format)
								   << "] conversion [src target=" << getTargetName(m_source_attachment_type)
								   << ", dst target=" << getTargetName(m_destination_attachment_type) << "] caused ["
								   << error_code << "] error instead of GL_INVALID_OPERATION."
								   << tcu::TestLog::EndMessage;
				// This test is now considered failed
				result = false;
			}
		}

		n_src_pair++;

		// If we're copying from a renderbuffer, we don't really care about compatible format+type pairs, as
		// the effective internalformat is explicitly configured by gl.renderbufferStorage() call.
		if (m_source_attachment_type == GL_RENDERBUFFER)
			break;
	} // for (all compatible format+type pairs)

	return result;
}

CopyTexImageConversionsTests::CopyTexImageConversionsTests(deqp::Context& context)
	: TestCaseGroup(context, "copy_tex_image_conversions", "")
{
}

void CopyTexImageConversionsTests::init()
{
	// Types of objects that can be used as source attachments for conversion process
	const GLenum sourceAttachmentTypes[] = { GL_TEXTURE_2D,
											 GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
											 GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
											 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
											 GL_TEXTURE_CUBE_MAP_POSITIVE_X,
											 GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
											 GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
											 GL_TEXTURE_2D_ARRAY,
											 GL_TEXTURE_3D,
											 GL_RENDERBUFFER };

	// Types of objects that can be used as destination attachments for conversion process
	const GLenum destinationAttachmentTypes[] = {
		GL_TEXTURE_2D,
		GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
		GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
		GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
		GL_TEXTURE_CUBE_MAP_POSITIVE_X,
		GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
		GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
	};

	// Set up conversion database
	de::SharedPtr<ConversionDatabase> conversionDatabase(new ConversionDatabase());

	TestCaseGroup* requiredGroup  = new deqp::TestCaseGroup(m_context, "required", "");
	TestCaseGroup* forbiddenGroup = new deqp::TestCaseGroup(m_context, "forbidden", "");
	for (int srcAttachmentIndex = 0; srcAttachmentIndex < DE_LENGTH_OF_ARRAY(sourceAttachmentTypes);
		 ++srcAttachmentIndex)
	{
		GLenum srcAttachmentType = sourceAttachmentTypes[srcAttachmentIndex];
		for (int dstAttachmentIndex = 0; dstAttachmentIndex < DE_LENGTH_OF_ARRAY(destinationAttachmentTypes);
			 ++dstAttachmentIndex)
		{
			GLenum dstAttachmentType = destinationAttachmentTypes[dstAttachmentIndex];
			requiredGroup->addChild(
				new RequiredCase(m_context, conversionDatabase, srcAttachmentType, dstAttachmentType));
			forbiddenGroup->addChild(new ForbiddenCase(m_context, srcAttachmentType, dstAttachmentType));
		}
	}

	addChild(forbiddenGroup);
	addChild(requiredGroup);
}

} // es3cts namespace
