148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/*-------------------------------------------------------------------------
248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * OpenGL Conformance Test Suite
348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * -----------------------------
448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Copyright (c) 2015-2016 The Khronos Group Inc.
648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * you may not use this file except in compliance with the License.
948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * You may obtain a copy of the License at
1048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
1148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
1248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
1348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Unless required by applicable law or agreed to in writing, software
1448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
1548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * See the License for the specific language governing permissions and
1748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * limitations under the License.
1848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
1984322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*!
2048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \file
2148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \brief
2284322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*-------------------------------------------------------------------*/
2348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
2448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/**
2548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ /*!
2648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \file  gl4cGetTextureSubImageTests.cpp
2748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \brief Get Texture Sub Image Tests Suite Implementation
2884322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*-------------------------------------------------------------------*/
2948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* Includes. */
3148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gl4cGetTextureSubImageTests.hpp"
3248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluContextInfo.hpp"
3348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluDefs.hpp"
3448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluRenderContext.hpp"
3548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluStrUtil.hpp"
3648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuTestLog.hpp"
3748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <cstdlib>
3848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* Implementation */
4048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
4148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/**************************************************************************************************
4248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Tests Group Implementation                                                                     *
4348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **************************************************************************************************/
4448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
4548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosgl4cts::GetTextureSubImage::Tests::Tests(deqp::Context& context)
4648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCaseGroup(context, "get_texture_sub_image", "Get Texture Sub Image Tests Suite")
4748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
4848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new GetTextureSubImage::Errors(m_context));
4948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new GetTextureSubImage::Functional(m_context));
5048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
5148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
5248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosgl4cts::GetTextureSubImage::Tests::~Tests(void)
5348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
5448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
5548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
5648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid gl4cts::GetTextureSubImage::Tests::init(void)
5748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
5848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
5948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
6048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/**************************************************************************************************
6148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Errors Tests Implementation                                                                    *
6248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **************************************************************************************************/
6348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
6448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor of API Errors tests.
6548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
6648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return [in] context    OpenGL context in which test shall run.
6748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
6848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosgl4cts::GetTextureSubImage::Errors::Errors(deqp::Context& context)
6948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: deqp::TestCase(context, "errors_test", "Get Texture SubImage Errors Test")
7048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_context(context)
7148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_texture_1D(0)
7248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_texture_1D_array(0)
7348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_texture_2D(0)
7448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_texture_rectangle(0)
7548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_texture_2D_compressed(0)
7648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_texture_2D_multisampled(0)
7748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_destination_buffer(DE_NULL)
7848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_gl_GetTextureSubImage(DE_NULL)
7948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_gl_GetCompressedTextureSubImage(DE_NULL)
8048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
8148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
8248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
8348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Destructor of API Errors tests.
8448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
8548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosgl4cts::GetTextureSubImage::Errors::~Errors(void)
8648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
8748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
8848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
8948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** This function iterate over API Errors tests.
9048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
9148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult gl4cts::GetTextureSubImage::Errors::iterate(void)
9248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
9348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_ok		= true;
9448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool test_error = false;
9548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
9648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
9748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_arb_get_texture_sub_image = m_context.getContextInfo().isExtensionSupported("GL_ARB_get_texture_sub_image");
9848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
9948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
10048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
10148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (is_at_least_gl_45 || is_arb_get_texture_sub_image)
10248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
10348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Prepare texture objects */
10448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			prepare();
10548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
10648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Do tests. */
10748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok &= testExistingTextureObjectError();
10848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
10948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok &= testBufferOrMultisampledTargetError();
11048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
11148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok &= testNegativeOffsetError();
11248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
11348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok &= testBoundsError();
11448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
11548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok &= testOneDimmensionalTextureErrors();
11648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
11748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok &= testTwoDimmensionalTextureErrors();
11848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
11948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok &= testBufferSizeError();
12048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
12148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
12248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (...)
12348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
12448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_ok	  = false;
12548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_error = true;
12648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
12748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
12848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Clean up */
12948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	clean();
13048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
13148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Result's setup. */
13248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_ok)
13348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
13448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
13548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
13648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
13748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
13848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (test_error)
13948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
14048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
14148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
14248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
14348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
14448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
14548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
14648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
14748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
14848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return STOP;
14948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
15048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
15148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Preparation of source textures and destination buffer.
15248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
15348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid gl4cts::GetTextureSubImage::Errors::prepare()
15448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
15548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* OpenGL functions access point. */
15648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
15748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
15848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* If already initialized throw exception. */
15948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_texture_1D || m_texture_1D_array || m_texture_2D || m_texture_rectangle || m_texture_2D_compressed ||
16058c8f690e918d5b7b1c91babce93697327294cf3Eduardo Lima Mitev		m_texture_2D_multisampled)
16148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
16248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw 0;
16348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
16448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
16548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Generate texture ids. */
16648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genTextures(1, &m_texture_1D);
16748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genTextures(1, &m_texture_1D_array);
16848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genTextures(1, &m_texture_2D);
16948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genTextures(1, &m_texture_rectangle);
17048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genTextures(1, &m_texture_2D_compressed);
17148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genTextures(1, &m_texture_2D_multisampled);
17248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
17348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures call failed.");
17448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
17548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* If one is not initialized throw exception. */
17648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!(m_texture_1D && m_texture_1D_array && m_texture_2D))
17748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
17848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw 0;
17948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
18048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
18148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Upload texture data. */
18248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindTexture(GL_TEXTURE_1D, m_texture_1D);
18348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed.");
18448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
18548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.texImage1D(GL_TEXTURE_1D, 0, GL_RGBA8, s_texture_data_width, 0, GL_RGBA, GL_UNSIGNED_BYTE, s_texture_data);
18648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed.");
18748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
18848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindTexture(GL_TEXTURE_1D_ARRAY, m_texture_1D_array);
18948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed.");
19048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
19148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.texImage2D(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0, GL_RGBA,
19248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				  GL_UNSIGNED_BYTE, s_texture_data);
19348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed.");
19448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
19548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindTexture(GL_TEXTURE_2D, m_texture_2D);
19648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed.");
19748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
19848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
19948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				  s_texture_data);
20048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed.");
20148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
20248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindTexture(GL_TEXTURE_RECTANGLE, m_texture_rectangle);
20348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed.");
20448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
20548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.texImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0, GL_RGBA,
20648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				  GL_UNSIGNED_BYTE, s_texture_data);
20748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed.");
20848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
20948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Upload compressed texture data. */
21048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindTexture(GL_TEXTURE_2D, m_texture_2D_compressed);
21148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed.");
21248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
21348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.compressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, s_texture_data_compressed_width,
21448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							s_texture_data_compressed_height, 0, s_texture_data_compressed_size,
21548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							s_texture_data_compressed);
21648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed.");
21748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
21848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Prepare multisampled texture storage. */
21948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, m_texture_2D_multisampled);
22048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed.");
22148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
22248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.texImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_R8, s_texture_data_width, s_texture_data_height, GL_TRUE);
22348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed.");
22448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
22548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Prepare function pointers. */
22648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_gl_GetTextureSubImage =
22748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		(PFNGLGETTEXTURESUBIMAGEPROC)m_context.getRenderContext().getProcAddress("glGetTextureSubImage");
22848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_gl_GetCompressedTextureSubImage =
22948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		(PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)m_context.getRenderContext().getProcAddress(
23048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"glGetCompressedTextureSubImage");
23148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
23248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if ((DE_NULL == m_gl_GetTextureSubImage) || (DE_NULL == m_gl_GetCompressedTextureSubImage))
23348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
23448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw 0;
23548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
23648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
23748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Allocate destination buffer. */
23848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_destination_buffer = (glw::GLubyte*)malloc(s_destination_buffer_size);
23948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
24048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (DE_NULL == m_destination_buffer)
24148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
24248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw 0;
24348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
24448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
24548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
2466e1b81eef515fdd8e61fc7b53c7d6d2e8f3dc9c4James Helferty/** The function checks that GL_INVALID_OPERATION error is generated by GetTextureSubImage if
2476e1b81eef515fdd8e61fc7b53c7d6d2e8f3dc9c4James Helferty *  texture is not the name of an existing texture object. It also checks that
2486e1b81eef515fdd8e61fc7b53c7d6d2e8f3dc9c4James Helferty *  GL_INVALID_OPERATION error is generated by GetCompressedTextureSubImage if texture is not
2496e1b81eef515fdd8e61fc7b53c7d6d2e8f3dc9c4James Helferty *  the name of an existing texture object. For reference see the OpenGL 4.5 Core Specification
2506e1b81eef515fdd8e61fc7b53c7d6d2e8f3dc9c4James Helferty *  chapter 8.11.4.
25148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
25248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if proper error values are generated, false otherwise.
25348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
25448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool gl4cts::GetTextureSubImage::Errors::testExistingTextureObjectError()
25548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
25648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* OpenGL functions access point. */
25748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
25848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
25948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Prepare invalid texture name. */
26048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint invalid_texture = m_texture_2D_multisampled;
26148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
26248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	while (gl.isTexture(++invalid_texture))
26348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		;
26448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
26548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_gl_GetTextureSubImage(invalid_texture, 0, 0, 0, 0, s_texture_data_width, s_texture_data_height, 1, GL_RGBA,
26648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							GL_UNSIGNED_BYTE, s_destination_buffer_size, m_destination_buffer);
26748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
26848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint error_value	 = gl.getError();
2696e1b81eef515fdd8e61fc7b53c7d6d2e8f3dc9c4James Helferty	glw::GLint is_proper_error = (GL_INVALID_OPERATION == error_value);
27048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
27148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!is_proper_error)
27248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
2736e1b81eef515fdd8e61fc7b53c7d6d2e8f3dc9c4James Helferty		m_testCtx.getLog() << tcu::TestLog::Message << "GL_INVALID_OPERATION error is expected to be generated by "
27448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													   "glGetTextureSubImage if texture is not the name of an existing "
27548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													   "texture object (OpenGL 4.5 Core Specification chapter 8.11.4)."
27648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   << " However, the error value " << glu::getErrorName(error_value) << " was generated."
27748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   << tcu::TestLog::EndMessage;
27848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
27948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
28048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_gl_GetCompressedTextureSubImage(invalid_texture, 0, 0, 0, 0, s_texture_data_compressed_width,
28148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  s_texture_data_compressed_height, 1, s_destination_buffer_size,
28248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  m_destination_buffer);
28348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
28448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	error_value = gl.getError();
28548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
2866e1b81eef515fdd8e61fc7b53c7d6d2e8f3dc9c4James Helferty	glw::GLint is_proper_error_compressed = (GL_INVALID_OPERATION == error_value);
28748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
28848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!is_proper_error_compressed)
28948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
29048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.getLog() << tcu::TestLog::Message
2916e1b81eef515fdd8e61fc7b53c7d6d2e8f3dc9c4James Helferty						   << "GL_INVALID_OPERATION error is expected to be generated by glGetCompressedTextureSubImage "
2926e1b81eef515fdd8e61fc7b53c7d6d2e8f3dc9c4James Helferty							  "if texture is not the name of an existing texture object (OpenGL 4.5 Core Specification "
29348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  "chapter 8.11.4)."
29448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   << " However, the error value " << glu::getErrorName(error_value) << " was generated."
29548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   << tcu::TestLog::EndMessage;
29648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
29748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
29848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_proper_error && is_proper_error_compressed)
29948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
30048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return true;
30148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
30248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
30348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return false;
30448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
30548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3066e1b81eef515fdd8e61fc7b53c7d6d2e8f3dc9c4James Helferty/** The function checks that GL_INVALID_OPERATION error is generated if texture is the
30748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  name of a buffer or multisample texture. For reference see OpenGL 4.5 Core Specification
30848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  chapter 8.11.4.
30948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
31048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if proper error values are generated, false otherwise.
31148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
31248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool gl4cts::GetTextureSubImage::Errors::testBufferOrMultisampledTargetError()
31348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
31448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* OpenGL functions access point. */
31548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
31648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
31748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Test. */
31848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_gl_GetTextureSubImage(m_texture_2D_multisampled, 0, 0, 0, 0, s_texture_data_width, s_texture_data_height, 1,
31948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							GL_RGBA, GL_UNSIGNED_BYTE, s_destination_buffer_size, m_destination_buffer);
32048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
32148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint error_value	 = gl.getError();
32248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint is_proper_error = (GL_INVALID_OPERATION == error_value);
32348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
32448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!is_proper_error)
32548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
32648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.getLog() << tcu::TestLog::Message << "GL_INVALID_OPERATION error is expected to be generated by "
32748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													   "glGetTextureSubImage if texture is the name of multisample "
32848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													   "texture (OpenGL 4.5 Core Specification chapter 8.11.4)."
32948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   << " However, the error value " << glu::getErrorName(error_value) << " was generated."
33048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   << tcu::TestLog::EndMessage;
33148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
33248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
33348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_proper_error)
33448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
33548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return true;
33648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
33748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
33848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return false;
33948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
34048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
34148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** The functions checks that GL_INVALID_VALUE is generated if xoffset, yoffset or
34248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  zoffset are negative. For reference see OpenGL 4.5 Core Specification
34348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  chapter 8.11.4.
34448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
34548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if proper error values are generated, false otherwise.
34648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
34748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool gl4cts::GetTextureSubImage::Errors::testNegativeOffsetError()
34848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
34948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* OpenGL functions access point. */
35048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
35148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
35248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Test. */
35348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_gl_GetTextureSubImage(m_texture_2D, 0, -1, 0, 0, s_texture_data_width, s_texture_data_height, 1, GL_RGBA,
35448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							GL_UNSIGNED_BYTE, s_destination_buffer_size, m_destination_buffer);
35548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
35648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint error_value	 = gl.getError();
35748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint is_proper_error = (GL_INVALID_VALUE == error_value);
35848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
35948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!is_proper_error)
36048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
36148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.getLog() << tcu::TestLog::Message
36248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   << "GL_INVALID_VALUE error is expected to be generated by glGetTextureSubImage if xoffset, "
36348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  "yoffset or zoffset are negative (OpenGL 4.5 Core Specification chapter 8.11.4)."
36448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   << " However, the error value " << glu::getErrorName(error_value) << " was generated."
36548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   << tcu::TestLog::EndMessage;
36648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
36748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
36848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_gl_GetCompressedTextureSubImage(m_texture_2D_compressed, 0, -1, 0, 0, s_texture_data_compressed_width,
36948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  s_texture_data_compressed_height, 1, s_destination_buffer_size,
37048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  m_destination_buffer);
37148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
37248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	error_value = gl.getError();
37348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
37448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint is_proper_error_compressed = (GL_INVALID_VALUE == error_value);
37548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
37648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!is_proper_error_compressed)
37748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
37848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.getLog() << tcu::TestLog::Message
37948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   << "GL_INVALID_VALUE error is expected to be generated by glGetCompressedTextureSubImage if "
38048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  "xoffset, yoffset or zoffset are negative (OpenGL 4.5 Core Specification chapter 8.11.4)."
38148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   << " However, the error value " << glu::getErrorName(error_value) << " was generated."
38248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   << tcu::TestLog::EndMessage;
38348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
38448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
38548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_proper_error && is_proper_error_compressed)
38648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
38748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return true;
38848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
38948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
39048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return false;
39148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
39248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
39348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** The functions checks that GL_INVALID_VALUE is generated if xoffset + width is
39448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  greater than the texture's width, yoffset + height is greater than
39548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  the texture's height, or zoffset + depth is greater than the
39648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  texture's depth. For reference see OpenGL 4.5 Core Specification
39748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  chapter 8.11.4.
39848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
39948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if proper error values are generated, false otherwise.
40048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
40148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool gl4cts::GetTextureSubImage::Errors::testBoundsError()
40248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
40348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* OpenGL functions access point. */
40448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
40548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
40648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Uncompresse texture test. */
40748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_gl_GetTextureSubImage(m_texture_2D, 0, s_texture_data_width, s_texture_data_height, 0, s_texture_data_width * 2,
40848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							s_texture_data_height * 2, 1, GL_RGBA, GL_UNSIGNED_BYTE, s_destination_buffer_size,
40948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							m_destination_buffer);
41048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
41148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint error_value	 = gl.getError();
41248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint is_proper_error = (GL_INVALID_VALUE == error_value);
41348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
41448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!is_proper_error)
41548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
41648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.getLog()
41748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::Message
41848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< "GL_INVALID_VALUE error is expected to be generated by glGetTextureSubImage if xoffset + width is"
41948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			   " greater than the texture's width, yoffset + height is greater than"
42048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			   " the texture's height, or zoffset + depth is greater than the"
42148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			   " texture's depth. (OpenGL 4.5 Core Specification chapter 8.11.4)."
42248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			   " However, the error value "
42348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage;
42448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
42548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
42648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Compresse texture test. */
42748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_gl_GetCompressedTextureSubImage(m_texture_2D_compressed, 0, s_texture_data_compressed_width,
42848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  s_texture_data_compressed_height, 0, s_texture_data_compressed_width * 2,
42948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  s_texture_data_compressed_height * 2, 1, s_destination_buffer_size,
43048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  m_destination_buffer);
43148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
43248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	error_value = gl.getError();
43348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
43448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint is_proper_error_compressed = (GL_INVALID_VALUE == error_value);
43548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
43648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!is_proper_error_compressed)
43748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
43848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.getLog() << tcu::TestLog::Message
43948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   << "GL_INVALID_VALUE error is expected to be generated by glGetCompressedTextureSubImage if "
44048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  "xoffset + width is"
44148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  " greater than the texture's width, yoffset + height is greater than"
44248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  " the texture's height, or zoffset + depth is greater than the"
44348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  " texture's depth. (OpenGL 4.5 Core Specification chapter 8.11.4)."
44448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  " However, the error value "
44548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   << glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage;
44648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
44748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
44848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_proper_error && is_proper_error_compressed)
44948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
45048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return true;
45148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
45248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
45348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return false;
45448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
45548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
45648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** The functions checks that GL_INVALID_VALUE error is generated if the effective
45748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  target is GL_TEXTURE_1D and either yoffset is not zero, or height
45848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  is not one. For reference see OpenGL 4.5 Core Specification
45948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  chapter 8.11.4.
46048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
46148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if proper error values are generated, false otherwise.
46248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
46348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool gl4cts::GetTextureSubImage::Errors::testOneDimmensionalTextureErrors()
46448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
46548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* OpenGL functions access point. */
46648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
46748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
46848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Test. */
46948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_gl_GetTextureSubImage(m_texture_1D, 0, 0, 1, 0, s_texture_data_width, 2, 1, GL_RGBA, GL_UNSIGNED_BYTE,
47048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							s_destination_buffer_size, m_destination_buffer);
47148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
47248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint error_value	 = gl.getError();
47348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint is_proper_error = (GL_INVALID_VALUE == error_value);
47448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
47548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!is_proper_error)
47648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
47748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.getLog()
47848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::Message
47948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< "GL_INVALID_VALUE error is expected to be generated by glGetTextureSubImage if the effective"
48048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			   " target is GL_TEXTURE_1D and either yoffset is not zero, or height"
48148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			   " is not one (OpenGL 4.5 Core Specification chapter 8.11.4)."
48248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			   " However, the error value "
48348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage;
48448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
48548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
48648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_proper_error)
48748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
48848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return true;
48948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
49048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
49148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return false;
49248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
49348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
49448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** The functions checks that GL_INVALID_VALUE error is generated if the effective
49548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  target is GL_TEXTURE_1D, GL_TEXTURE_1D_ARRAY, GL_TEXTURE_2D or
49648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  GL_TEXTURE_RECTANGLE and either zoffset is not zero, or depth
49748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  is not one. For reference see OpenGL 4.5 Core Specification
49848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  chapter 8.11.4.
49948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
50048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if proper error values are generated, false otherwise.
50148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
50248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool gl4cts::GetTextureSubImage::Errors::testTwoDimmensionalTextureErrors()
50348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
50448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* OpenGL functions access point. */
50548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
50648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
50748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Test. */
50848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const struct
50948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
51048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLuint		   id;
51148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const glw::GLchar* target_name;
51248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} test_textures[] = { { m_texture_1D, "GL_TEXTURE_1D" },
51348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  { m_texture_1D_array, "GL_TEXTURE_1D_ARRAY" },
51458c8f690e918d5b7b1c91babce93697327294cf3Eduardo Lima Mitev						  { m_texture_2D, "GL_TEXTURE_2D" } };
51548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
51648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const glw::GLuint test_textures_size = sizeof(test_textures) / sizeof(test_textures[0]);
51748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
51848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint is_error = true;
51948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
52048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (glw::GLuint i = 0; i < test_textures_size; ++i)
52148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
52248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_gl_GetTextureSubImage(test_textures[i].id, 0, 0, 0, 1, s_texture_data_width,
52348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								(test_textures[i].id == GL_TEXTURE_1D) ? 1 : s_texture_data_height, 2, GL_RGBA,
52448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								GL_UNSIGNED_BYTE, s_destination_buffer_size, m_destination_buffer);
52548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
52648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLint error_value	 = gl.getError();
52748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLint is_proper_error = (GL_INVALID_VALUE == error_value);
52848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
52948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!is_proper_error)
53048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
53148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_error = false;
53248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
53348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_testCtx.getLog()
53448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
53548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "GL_INVALID_VALUE error is expected to be generated by glGetTextureSubImage if the effective"
53648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				   " target is "
53748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< test_textures[i].target_name << " and either zoffset is not zero, or depth"
53848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												   " is not one. (OpenGL 4.5 Core Specification chapter 8.11.4)."
53948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												   " However, the error value "
54048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage;
54148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
54248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
54348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
54448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Test (compressed textures). */
54548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const struct
54648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
54748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLuint		   id;
54848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const glw::GLchar* target_name;
54958c8f690e918d5b7b1c91babce93697327294cf3Eduardo Lima Mitev	} test_compressed_textures[] = { { m_texture_2D_compressed, "GL_TEXTURE_2D" } };
55048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
55148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const glw::GLuint test_compressed_textures_size =
55248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		sizeof(test_compressed_textures) / sizeof(test_compressed_textures[0]);
55348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
55448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (glw::GLuint i = 0; i < test_compressed_textures_size; ++i)
55548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
55648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_gl_GetCompressedTextureSubImage(test_compressed_textures[i].id, 0, 0, 0, 1, s_texture_data_compressed_width,
55748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										  s_texture_data_compressed_height, 2, s_destination_buffer_size,
55848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										  m_destination_buffer);
55948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
56048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLint error_value = gl.getError();
56148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
56248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLint is_proper_error_compressed = (GL_INVALID_VALUE == error_value);
56348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
56448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!is_proper_error_compressed)
56548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
56648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_error = false;
56748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
56848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_testCtx.getLog() << tcu::TestLog::Message << "GL_INVALID_VALUE error is expected to be generated by "
56948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														   "glGetCompressedTextureSubImage if the effective"
57048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														   " target is "
57148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							   << test_compressed_textures[i].target_name
57248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							   << " and either zoffset is not zero, or depth"
57348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								  " is not one. (OpenGL 4.5 Core Specification chapter 8.11.4)."
57448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								  " However, the error value "
57548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							   << glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage;
57648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
57748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
57848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
57948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_error)
58048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
58148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return true;
58248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
58348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
58448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return false;
58548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
58648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
58748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** The functions checks that GL_INVALID_OPERATION error is generated if the buffer
58848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  size required to store the requested data is greater than bufSize.
58948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  For reference see OpenGL 4.5 Core Specification chapter 8.11.4.
59048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
59148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if proper error values are generated, false otherwise.
59248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
59348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool gl4cts::GetTextureSubImage::Errors::testBufferSizeError()
59448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
59548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* OpenGL functions access point. */
59648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
59748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
59848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Test for uncompressed texture. */
59948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_gl_GetTextureSubImage(m_texture_2D, 0, 0, 0, 0, s_texture_data_width, s_texture_data_height, 1, GL_RGBA,
60048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							GL_UNSIGNED_BYTE, 1, m_destination_buffer);
60148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
60248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint error_value	 = gl.getError();
60348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint is_proper_error = (GL_INVALID_OPERATION == error_value);
60448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
60548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!is_proper_error)
60648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
60748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.getLog()
60848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::Message
60948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< "GL_INVALID_OPERATION error is expected to be generated by glGetTextureSubImage if the buffer"
61048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			   " size required to store the requested data is greater than bufSize. (OpenGL 4.5 Core Specification "
61148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			   "chapter 8.11.4)."
61248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			   " However, the error value "
61348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage;
61448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
61548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
61648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Test for compressed texture. */
61748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_gl_GetCompressedTextureSubImage(m_texture_2D_compressed, 0, 0, 0, 0, s_texture_data_compressed_width,
61848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  s_texture_data_compressed_height, 1, 1, m_destination_buffer);
61948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
62048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	error_value = gl.getError();
62148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
62248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint is_proper_error_compressed = (GL_INVALID_OPERATION == error_value);
62348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
62448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!is_proper_error_compressed)
62548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
62648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.getLog()
62748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::Message
62848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< "GL_INVALID_OPERATION error is expected to be generated by glGetCompressedTextureSubImage if the buffer"
62948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			   " size required to store the requested data is greater than bufSize. (OpenGL 4.5 Core Specification "
63048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			   "chapter 8.11.4)."
63148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			   " However, the error value "
63248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage;
63348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
63448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
63548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Return results. */
63648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_proper_error && is_proper_error_compressed)
63748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
63848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return true;
63948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
64048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
64148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return false;
64248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
64348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
64448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid gl4cts::GetTextureSubImage::Errors::clean()
64548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
64648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* OpenGL functions access point. */
64748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
64848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
64948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/*Textures cleanup. */
65048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_texture_1D)
65148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
65248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteTextures(1, &m_texture_1D);
65348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_texture_1D = 0;
65448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
65548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
65648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_texture_1D_array)
65748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
65848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteTextures(1, &m_texture_1D_array);
65948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_texture_1D_array = 0;
66048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
66148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
66248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_texture_2D)
66348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
66448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteTextures(1, &m_texture_2D);
66548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_texture_2D = 0;
66648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
66748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_texture_rectangle)
66848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
66948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteTextures(1, &m_texture_rectangle);
67048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_texture_rectangle = 0;
67148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
67248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
67348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_texture_2D_compressed)
67448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
67548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteTextures(1, &m_texture_2D_compressed);
67648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_texture_2D_compressed = 0;
67748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
67848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
67948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_texture_2D_multisampled)
68048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
68148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteTextures(1, &m_texture_2D_multisampled);
68248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_texture_2D_multisampled = 0;
68348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
68448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
68548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* CPU buffers */
68648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_destination_buffer)
68748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
68848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		free(m_destination_buffer);
68948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_destination_buffer = DE_NULL;
69048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
69148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
69248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
69348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* Uncompressed source texture 2x2 pixels */
69448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
69548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLubyte gl4cts::GetTextureSubImage::Errors::s_texture_data[] = {
69648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
69748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; //<! uncompressed texture
69848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
69948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLuint gl4cts::GetTextureSubImage::Errors::s_texture_data_size =
70048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	sizeof(s_texture_data); //<! uncompressed texture size
70148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
70248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLuint gl4cts::GetTextureSubImage::Errors::s_texture_data_width = 2; //<! uncompressed texture width
70348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
70448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLuint gl4cts::GetTextureSubImage::Errors::s_texture_data_height = 2; //<! uncompressed texture height
70548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
70648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* ETC2 compressed texture (4x4 pixels === 1 block) */
70748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
70848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLubyte gl4cts::GetTextureSubImage::Errors::s_texture_data_compressed[] = {
70948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	0x15, 0x90, 0x33, 0x6f, 0xaf, 0xcc, 0x16, 0x98
71048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; //<! ETC2 compressed texture
71148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
71248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLuint gl4cts::GetTextureSubImage::Errors::s_texture_data_compressed_size =
71348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	sizeof(s_texture_data_compressed); //<! ETC2 compressed texture size
71448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
71548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLuint gl4cts::GetTextureSubImage::Errors::s_texture_data_compressed_width =
71648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	4; //<! ETC2 compressed texture width
71748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
71848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLuint gl4cts::GetTextureSubImage::Errors::s_texture_data_compressed_height =
71948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	4; //<! ETC2 compressed texture height
72048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
72148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLuint gl4cts::GetTextureSubImage::Errors::s_destination_buffer_size =
72248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	(s_texture_data_size > s_texture_data_compressed_size) ?
72348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		s_texture_data_size :
72448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		s_texture_data_compressed_size; //<! size of the destination buffer (for fetched data)
72548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
72648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/*****************************************************************************************************
72748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Functional Test Implementation                                                                    *
72848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *****************************************************************************************************/
72948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
73048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor of the functional test.
73148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
73248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] context     OpenGL context in which test shall run.
73348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
73448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosgl4cts::GetTextureSubImage::Functional::Functional(deqp::Context& context)
73548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: deqp::TestCase(context, "functional_test", "Get Texture SubImage Functional Test")
73648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_context(context)
73748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_texture(0)
73848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
73948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
74048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
74148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Destructor of the functional test.
74248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
74348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosgl4cts::GetTextureSubImage::Functional::~Functional(void)
74448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
74548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
74648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
74748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Iterate over functional test cases.
74848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
74948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult gl4cts::GetTextureSubImage::Functional::iterate(void)
75048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
75148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_ok		= true;
75248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool test_error = false;
75348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
75448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
75548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_arb_get_texture_sub_image = m_context.getContextInfo().isExtensionSupported("GL_ARB_get_texture_sub_image");
75648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
75748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Bind function pointers. */
75848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_gl_GetCompressedTextureSubImage =
75948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		(PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)m_context.getRenderContext().getProcAddress(
76048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"glGetCompressedTextureSubImage");
76148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_gl_GetTextureSubImage =
76248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		(PFNGLGETTEXTURESUBIMAGEPROC)m_context.getRenderContext().getProcAddress("glGetTextureSubImage");
76348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
76448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
76548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
76648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Report error when function pointers are not available. */
76748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if ((DE_NULL == m_gl_GetCompressedTextureSubImage) || (DE_NULL == m_gl_GetTextureSubImage))
76848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
76948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_testCtx.getLog()
77048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
77148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "Cannot obtain glGetCompressedTextureSubImage or glGetTextureSubImage function pointer."
77248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
77348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			throw 0;
77448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
77548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
77648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Run tests. */
77748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (is_at_least_gl_45 || is_arb_get_texture_sub_image)
77848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
77948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Tested targets. */
78048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glw::GLenum targets[] = { GL_TEXTURE_1D,		GL_TEXTURE_1D_ARRAY, GL_TEXTURE_2D,
78148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  GL_TEXTURE_RECTANGLE, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_CUBE_MAP_ARRAY,
78248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  GL_TEXTURE_2D_ARRAY,  GL_TEXTURE_3D };
78348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
78448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glw::GLuint targets_count = sizeof(targets) / sizeof(targets[0]);
78548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
78648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (glw::GLuint i = 0; i < targets_count; ++i)
78748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
78848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				prepare(targets[i], false);
78948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
79048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_ok &= check(targets[i], false);
79148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
79248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				clean();
79348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
79448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
79548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Compressed textures tested targets. */
79648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glw::GLenum compressed_targets[] = { GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_CUBE_MAP_ARRAY,
79748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												 GL_TEXTURE_2D_ARRAY };
79848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
79948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glw::GLuint compressed_targets_count = sizeof(compressed_targets) / sizeof(compressed_targets[0]);
80048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
80148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (glw::GLuint i = 0; i < compressed_targets_count; ++i)
80248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
80348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				prepare(compressed_targets[i], true);
80448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
80548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_ok &= check(compressed_targets[i], true);
80648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
80748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				clean();
80848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
80948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
81048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
81148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (...)
81248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
81348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.getLog() << tcu::TestLog::Message << "Test error has occured." << tcu::TestLog::EndMessage;
81448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
81548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_ok	  = false;
81648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_error = true;
81748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
81848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		clean();
81948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
82048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
82148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Result's setup. */
82248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_ok)
82348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
82448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
82548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
82648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
82748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
82848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (test_error)
82948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
83048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
83148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
83248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
83348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
83448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
83548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
83648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
83748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
83848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return STOP;
83948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
84048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
84148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Prepare source texture for the test.
84248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
84348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] target          Target of the texture to be prepared.
84448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] is_compressed   Flag indicating that texture shall be compressed (true) or uncompressed (false).
84548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
84648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid gl4cts::GetTextureSubImage::Functional::prepare(glw::GLenum target, bool is_compressed)
84748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
84848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* OpenGL functions access point. */
84948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
85048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
85148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Generate and bind texture. */
85248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genTextures(1, &m_texture);
85348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures call failed.");
85448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
85548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindTexture(target, m_texture);
85648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed.");
85748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
85848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Upload data to the texture. */
85948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_compressed)
86048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
86148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Upload compressed texture. */
86248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		switch (target)
86348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
86448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		case GL_TEXTURE_2D:
8658752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton			gl.compressedTexImage2D(target, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height, 0,
86648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									s_texture_data_compressed_size / s_texture_data_depth, s_texture_data_compressed);
86748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glCompressedTexImage2D call failed.");
86848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			break;
86948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		case GL_TEXTURE_CUBE_MAP:
87048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.compressedTexImage2D(
8718752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton				GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height,
87248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				0, s_texture_data_compressed_size / s_texture_data_depth,
87348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				&s_texture_data_compressed[0 * s_texture_data_compressed_size / s_texture_data_depth]);
87448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.compressedTexImage2D(
8758752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton				GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height,
87648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				0, s_texture_data_compressed_size / s_texture_data_depth,
87748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				&s_texture_data_compressed[1 * s_texture_data_compressed_size / s_texture_data_depth]);
87848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.compressedTexImage2D(
8798752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton				GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height,
88048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				0, s_texture_data_compressed_size / s_texture_data_depth,
88148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				&s_texture_data_compressed[2 * s_texture_data_compressed_size / s_texture_data_depth]);
88248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.compressedTexImage2D(
8838752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton				GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height,
88448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				0, s_texture_data_compressed_size / s_texture_data_depth,
88548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				&s_texture_data_compressed[3 * s_texture_data_compressed_size / s_texture_data_depth]);
88648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.compressedTexImage2D(
8878752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton				GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height,
88848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				0, s_texture_data_compressed_size / s_texture_data_depth,
88948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				&s_texture_data_compressed[4 * s_texture_data_compressed_size / s_texture_data_depth]);
89048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.compressedTexImage2D(
8918752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton				GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height,
89248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				0, s_texture_data_compressed_size / s_texture_data_depth,
89348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				&s_texture_data_compressed[5 * s_texture_data_compressed_size / s_texture_data_depth]);
89448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glCompressedTexImage2D call failed.");
89548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			break;
89648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		case GL_TEXTURE_CUBE_MAP_ARRAY:
8978752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton			gl.compressedTexImage3D(target, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height, 6,
89848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									0, s_texture_data_compressed_size / s_texture_data_depth * 6,
89948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									s_texture_data_compressed);
90048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glCompressedTexImage3D call failed.");
90148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			break;
90248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		case GL_TEXTURE_2D_ARRAY:
9038752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton			gl.compressedTexImage3D(target, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height,
90448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									s_texture_data_depth, 0, s_texture_data_compressed_size, s_texture_data_compressed);
90548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glCompressedTexImage3D call failed.");
90648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			break;
90748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		default:
90848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			throw 0;
90948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		};
91048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
91148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
91248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
91348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Upload uncompressed texture. */
91448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		switch (target)
91548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
91648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		case GL_TEXTURE_1D:
91748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.texImage1D(target, 0, GL_RGBA8, s_texture_data_width, 0, GL_RGBA, GL_UNSIGNED_BYTE, s_texture_data);
91848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed.");
91948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			break;
92048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		case GL_TEXTURE_1D_ARRAY:
92148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		case GL_TEXTURE_2D:
92248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		case GL_TEXTURE_RECTANGLE:
92348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.texImage2D(target, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0, GL_RGBA,
92448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  GL_UNSIGNED_BYTE, s_texture_data);
92548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage2D call failed.");
92648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			break;
92748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		case GL_TEXTURE_CUBE_MAP:
92848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0,
92948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  GL_RGBA, GL_UNSIGNED_BYTE,
93048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  &s_texture_data[0 * s_texture_data_width * s_texture_data_height * 4 /* RGBA */]);
93148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0,
93248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  GL_RGBA, GL_UNSIGNED_BYTE,
93348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  &s_texture_data[1 * s_texture_data_width * s_texture_data_height * 4 /* RGBA */]);
93448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0,
93548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  GL_RGBA, GL_UNSIGNED_BYTE,
93648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  &s_texture_data[2 * s_texture_data_width * s_texture_data_height * 4 /* RGBA */]);
93748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0,
93848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  GL_RGBA, GL_UNSIGNED_BYTE,
93948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  &s_texture_data[3 * s_texture_data_width * s_texture_data_height * 4 /* RGBA */]);
94048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0,
94148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  GL_RGBA, GL_UNSIGNED_BYTE,
94248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  &s_texture_data[4 * s_texture_data_width * s_texture_data_height * 4 /* RGBA */]);
94348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0,
94448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  GL_RGBA, GL_UNSIGNED_BYTE,
94548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  &s_texture_data[5 * s_texture_data_width * s_texture_data_height * 4 /* RGBA */]);
94648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage2D call failed.");
94748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			break;
94848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		case GL_TEXTURE_CUBE_MAP_ARRAY:
94948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.texImage3D(target, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 6, 0, GL_RGBA,
95048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  GL_UNSIGNED_BYTE, s_texture_data);
95148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage3D call failed.");
95248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			break;
95348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		case GL_TEXTURE_2D_ARRAY:
95448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		case GL_TEXTURE_3D:
95548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.texImage3D(target, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, s_texture_data_depth, 0,
95648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  GL_RGBA, GL_UNSIGNED_BYTE, s_texture_data);
95748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage3D call failed.");
95848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			break;
95948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		default:
96048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			throw 0;
96148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		};
96248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
96348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
96448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
96548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Test that Get(Compressed)TextureSubImage resturns expected texture data.
96648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
96748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] target          Target of the texture to be prepared.
96848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] is_compressed   Flag indicating that texture shall be compressed (true) or uncompressed (false).
96948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
97048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if test succeeded, false otherwise.
97148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
97248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool gl4cts::GetTextureSubImage::Functional::check(glw::GLenum target, bool is_compressed)
97348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
97448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* OpenGL functions access point. */
97548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
97648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
97748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Arguments setup (depends on dimmension) */
97848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint x_offset = s_texture_data_width / 2 /* half */;
97948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint width	= s_texture_data_width / 2 /* half */;
98048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
98148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint y_offset = 0;
98248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint height   = 1;
98348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
98448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint z_offset = 0;
98548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint depth	= 1;
98648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
98748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* For 2 and 3 -dimensional textures setup y-direction. */
98848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (GL_TEXTURE_1D != target)
98948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
99048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		y_offset = s_texture_data_height / 2 /* half */;
99148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		height   = s_texture_data_height / 2 /* half */;
99248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
99348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
99448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* For 3-dimensional textures setup z-direction. */
99548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if ((GL_TEXTURE_3D == target) || (GL_TEXTURE_2D_ARRAY == target))
99648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
99748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		z_offset = s_texture_data_depth / 2 /* half */;
99848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		depth	= s_texture_data_depth / 2 /* half */;
99948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
100048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
100148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* For cube-map texture stup 6-cube faces. */
100248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if ((GL_TEXTURE_CUBE_MAP == target) || (GL_TEXTURE_CUBE_MAP_ARRAY == target))
100348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
100448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		z_offset = 3; /* half of cube map */
100548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		depth	= 3; /* half of cube map */
100648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
100748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
100848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Setup number of components. */
100948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint number_of_components = 0;
101048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
101148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_compressed)
101248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
10138752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton		number_of_components = 16; /* 128 bit block of 4x4 compressed pixels. */
101448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
101548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
101648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
101748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		number_of_components = 4; /* RGBA components. */
101848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
101948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
102048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Setup size. */
102148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLsizei size = 0;
102248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
102348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Iterate over pixels. */
102448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint x_block = 1;
102548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint y_block = 1;
102648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
102748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_compressed)
102848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
102948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Iterate over 4x4 compressed pixel block. */
103048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		x_block = 4;
103148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		y_block = 4;
103248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
103348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		size = static_cast<glw::GLsizei>((width / x_block) * (height / y_block) * depth * number_of_components *
103448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										 sizeof(glw::GLubyte));
103548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
103648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
103748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
103848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		size = static_cast<glw::GLsizei>(width * height * depth * number_of_components * sizeof(glw::GLubyte));
103948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
104048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
104148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Storage for fetched texturte. */
104248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLubyte* texture_data = new glw::GLubyte[size];
104348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
104448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (DE_NULL == texture_data)
104548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
104648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw 0;
104748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
104848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
104948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Fetching texture. */
105048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_compressed)
105148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
105248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_gl_GetCompressedTextureSubImage(m_texture, 0, x_offset, y_offset, z_offset, width, height, depth, size,
105348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										  texture_data);
105448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
105548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
105648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
105748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_gl_GetTextureSubImage(m_texture, 0, x_offset, y_offset, z_offset, width, height, depth, GL_RGBA,
105848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								GL_UNSIGNED_BYTE, size, texture_data);
105948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
106048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
106148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Comprae fetched texture with reference. */
106248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint error = gl.getError();
106348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
106448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_ok = true;
106548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
106648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (GL_NO_ERROR == error)
106748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
106848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (glw::GLint k = 0; k < depth; ++k)
106948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
107048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (glw::GLint j = 0; j < height / y_block; ++j)
107148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
107248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				for (glw::GLint i = 0; i < width / x_block; ++i)
107348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
107448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					for (glw::GLint c = 0; c < number_of_components; ++c) /* RGBA components iterating */
107548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					{
107648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						glw::GLuint reference_data_position =
107748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							(i + (x_offset / x_block)) * number_of_components +
107848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							(j + (y_offset / y_block)) * s_texture_data_width / x_block * number_of_components +
107948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							(k + z_offset) * s_texture_data_width / x_block * s_texture_data_height / y_block *
108048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								number_of_components +
108148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							c;
108248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
108348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						glw::GLuint tested_data_position =
108448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							i * number_of_components + j * width / x_block * number_of_components +
108548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							k * width / x_block * height / y_block * number_of_components + c;
108648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
108748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						glw::GLubyte reference_value = (is_compressed) ?
108848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														   s_texture_data_compressed[reference_data_position] :
108948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														   s_texture_data[reference_data_position];
109048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						glw::GLubyte tested_value = texture_data[tested_data_position];
109148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
109248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						if (reference_value != tested_value)
109348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						{
109448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							is_ok = false;
109548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							break;
109648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						}
109748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					}
109848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
109948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
110048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
110148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
110248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
110348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
110448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* GL error. */
110548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		delete[] texture_data;
110648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw 0;
110748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
110848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
110948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Cleanup. */
111048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	delete[] texture_data;
111148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
111248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Error reporting. */
111348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!is_ok)
111448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
111548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.getLog() << tcu::TestLog::Message << "Functional test of "
111648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   << ((is_compressed) ? "glGetCompressedTextureSubImage " : "glGetTextureSubImage ")
111748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   << "function has failed with target " << glu::getTextureTargetStr(target) << "."
111848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   << tcu::TestLog::EndMessage;
111948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
112048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
112148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Return result. */
112248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return is_ok;
112348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
112448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
112548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Clean texture. */
112648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid gl4cts::GetTextureSubImage::Functional::clean()
112748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
112848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* OpenGL functions access point. */
112948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
113048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
113148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_texture)
113248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
113348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteTextures(1, &m_texture);
113448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
113548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_texture = 0;
113648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
113748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
113848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
113948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** RGBA 8x8x8 pixels in size source texture for testing GetTextureSubImage. */
114048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLubyte gl4cts::GetTextureSubImage::Functional::s_texture_data[] = {
114148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	0,   0,   0,   0,  0,   0,   32,  1,  0,   0,   64,  2,  0,   0,   96,  3,
114248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	0,   0,   128, 4,  0,   0,   160, 5,  0,   0,   192, 6,  0,   0,   224, 7,
114348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
114448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	0,   32,  0,   1,  0,   32,  32,  2,  0,   32,  64,  3,  0,   32,  96,  4,
114548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	0,   32,  128, 5,  0,   32,  160, 6,  0,   32,  192, 7,  0,   32,  224, 8,
114648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
114748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	0,   64,  0,   2,  0,   64,  32,  3,  0,   64,  64,  4,  0,   64,  96,  5,
114848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	0,   64,  128, 6,  0,   64,  160, 7,  0,   64,  192, 8,  0,   64,  224, 9,
114948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
115048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	0,   96,  0,   3,  0,   96,  32,  4,  0,   96,  64,  5,  0,   96,  96,  6,
115148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	0,   96,  128, 7,  0,   96,  160, 8,  0,   96,  192, 9,  0,   96,  224, 10,
115248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
115348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	0,   128, 0,   4,  0,   128, 32,  5,  0,   128, 64,  6,  0,   128, 96,  7,
115448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	0,   128, 128, 8,  0,   128, 160, 9,  0,   128, 192, 10, 0,   128, 224, 11,
115548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
115648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	0,   160, 0,   5,  0,   160, 32,  6,  0,   160, 64,  7,  0,   160, 96,  8,
115748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	0,   160, 128, 9,  0,   160, 160, 10, 0,   160, 192, 11, 0,   160, 224, 12,
115848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
115948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	0,   192, 0,   6,  0,   192, 32,  7,  0,   192, 64,  8,  0,   192, 96,  9,
116048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	0,   192, 128, 10, 0,   192, 160, 11, 0,   192, 192, 12, 0,   192, 224, 13,
116148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
116248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	0,   224, 0,   7,  0,   224, 32,  8,  0,   224, 64,  9,  0,   224, 96,  10,
116348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	0,   224, 128, 11, 0,   224, 160, 12, 0,   224, 192, 13, 0,   224, 224, 14,
116448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
116548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	32,  0,   0,   1,  32,  0,   32,  2,  32,  0,   64,  3,  32,  0,   96,  4,
116648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	32,  0,   128, 5,  32,  0,   160, 6,  32,  0,   192, 7,  32,  0,   224, 8,
116748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
116848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	32,  32,  0,   2,  32,  32,  32,  3,  32,  32,  64,  4,  32,  32,  96,  5,
116948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	32,  32,  128, 6,  32,  32,  160, 7,  32,  32,  192, 8,  32,  32,  224, 9,
117048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
117148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	32,  64,  0,   3,  32,  64,  32,  4,  32,  64,  64,  5,  32,  64,  96,  6,
117248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	32,  64,  128, 7,  32,  64,  160, 8,  32,  64,  192, 9,  32,  64,  224, 10,
117348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
117448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	32,  96,  0,   4,  32,  96,  32,  5,  32,  96,  64,  6,  32,  96,  96,  7,
117548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	32,  96,  128, 8,  32,  96,  160, 9,  32,  96,  192, 10, 32,  96,  224, 11,
117648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
117748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	32,  128, 0,   5,  32,  128, 32,  6,  32,  128, 64,  7,  32,  128, 96,  8,
117848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	32,  128, 128, 9,  32,  128, 160, 10, 32,  128, 192, 11, 32,  128, 224, 12,
117948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
118048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	32,  160, 0,   6,  32,  160, 32,  7,  32,  160, 64,  8,  32,  160, 96,  9,
118148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	32,  160, 128, 10, 32,  160, 160, 11, 32,  160, 192, 12, 32,  160, 224, 13,
118248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
118348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	32,  192, 0,   7,  32,  192, 32,  8,  32,  192, 64,  9,  32,  192, 96,  10,
118448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	32,  192, 128, 11, 32,  192, 160, 12, 32,  192, 192, 13, 32,  192, 224, 14,
118548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
118648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	32,  224, 0,   8,  32,  224, 32,  9,  32,  224, 64,  10, 32,  224, 96,  11,
118748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	32,  224, 128, 12, 32,  224, 160, 13, 32,  224, 192, 14, 32,  224, 224, 15,
118848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
118948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	64,  0,   0,   2,  64,  0,   32,  3,  64,  0,   64,  4,  64,  0,   96,  5,
119048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	64,  0,   128, 6,  64,  0,   160, 7,  64,  0,   192, 8,  64,  0,   224, 9,
119148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
119248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	64,  32,  0,   3,  64,  32,  32,  4,  64,  32,  64,  5,  64,  32,  96,  6,
119348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	64,  32,  128, 7,  64,  32,  160, 8,  64,  32,  192, 9,  64,  32,  224, 10,
119448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
119548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	64,  64,  0,   4,  64,  64,  32,  5,  64,  64,  64,  6,  64,  64,  96,  7,
119648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	64,  64,  128, 8,  64,  64,  160, 9,  64,  64,  192, 10, 64,  64,  224, 11,
119748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
119848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	64,  96,  0,   5,  64,  96,  32,  6,  64,  96,  64,  7,  64,  96,  96,  8,
119948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	64,  96,  128, 9,  64,  96,  160, 10, 64,  96,  192, 11, 64,  96,  224, 12,
120048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
120148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	64,  128, 0,   6,  64,  128, 32,  7,  64,  128, 64,  8,  64,  128, 96,  9,
120248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	64,  128, 128, 10, 64,  128, 160, 11, 64,  128, 192, 12, 64,  128, 224, 13,
120348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
120448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	64,  160, 0,   7,  64,  160, 32,  8,  64,  160, 64,  9,  64,  160, 96,  10,
120548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	64,  160, 128, 11, 64,  160, 160, 12, 64,  160, 192, 13, 64,  160, 224, 14,
120648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
120748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	64,  192, 0,   8,  64,  192, 32,  9,  64,  192, 64,  10, 64,  192, 96,  11,
120848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	64,  192, 128, 12, 64,  192, 160, 13, 64,  192, 192, 14, 64,  192, 224, 15,
120948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
121048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	64,  224, 0,   9,  64,  224, 32,  10, 64,  224, 64,  11, 64,  224, 96,  12,
121148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	64,  224, 128, 13, 64,  224, 160, 14, 64,  224, 192, 15, 64,  224, 224, 16,
121248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
121348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	96,  0,   0,   3,  96,  0,   32,  4,  96,  0,   64,  5,  96,  0,   96,  6,
121448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	96,  0,   128, 7,  96,  0,   160, 8,  96,  0,   192, 9,  96,  0,   224, 10,
121548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
121648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	96,  32,  0,   4,  96,  32,  32,  5,  96,  32,  64,  6,  96,  32,  96,  7,
121748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	96,  32,  128, 8,  96,  32,  160, 9,  96,  32,  192, 10, 96,  32,  224, 11,
121848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
121948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	96,  64,  0,   5,  96,  64,  32,  6,  96,  64,  64,  7,  96,  64,  96,  8,
122048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	96,  64,  128, 9,  96,  64,  160, 10, 96,  64,  192, 11, 96,  64,  224, 12,
122148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
122248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	96,  96,  0,   6,  96,  96,  32,  7,  96,  96,  64,  8,  96,  96,  96,  9,
122348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	96,  96,  128, 10, 96,  96,  160, 11, 96,  96,  192, 12, 96,  96,  224, 13,
122448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
122548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	96,  128, 0,   7,  96,  128, 32,  8,  96,  128, 64,  9,  96,  128, 96,  10,
122648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	96,  128, 128, 11, 96,  128, 160, 12, 96,  128, 192, 13, 96,  128, 224, 14,
122748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
122848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	96,  160, 0,   8,  96,  160, 32,  9,  96,  160, 64,  10, 96,  160, 96,  11,
122948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	96,  160, 128, 12, 96,  160, 160, 13, 96,  160, 192, 14, 96,  160, 224, 15,
123048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
123148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	96,  192, 0,   9,  96,  192, 32,  10, 96,  192, 64,  11, 96,  192, 96,  12,
123248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	96,  192, 128, 13, 96,  192, 160, 14, 96,  192, 192, 15, 96,  192, 224, 16,
123348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
123448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	96,  224, 0,   10, 96,  224, 32,  11, 96,  224, 64,  12, 96,  224, 96,  13,
123548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	96,  224, 128, 14, 96,  224, 160, 15, 96,  224, 192, 16, 96,  224, 224, 17,
123648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
123748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	128, 0,   0,   4,  128, 0,   32,  5,  128, 0,   64,  6,  128, 0,   96,  7,
123848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	128, 0,   128, 8,  128, 0,   160, 9,  128, 0,   192, 10, 128, 0,   224, 11,
123948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
124048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	128, 32,  0,   5,  128, 32,  32,  6,  128, 32,  64,  7,  128, 32,  96,  8,
124148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	128, 32,  128, 9,  128, 32,  160, 10, 128, 32,  192, 11, 128, 32,  224, 12,
124248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
124348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	128, 64,  0,   6,  128, 64,  32,  7,  128, 64,  64,  8,  128, 64,  96,  9,
124448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	128, 64,  128, 10, 128, 64,  160, 11, 128, 64,  192, 12, 128, 64,  224, 13,
124548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
124648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	128, 96,  0,   7,  128, 96,  32,  8,  128, 96,  64,  9,  128, 96,  96,  10,
124748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	128, 96,  128, 11, 128, 96,  160, 12, 128, 96,  192, 13, 128, 96,  224, 14,
124848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
124948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	128, 128, 0,   8,  128, 128, 32,  9,  128, 128, 64,  10, 128, 128, 96,  11,
125048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	128, 128, 128, 12, 128, 128, 160, 13, 128, 128, 192, 14, 128, 128, 224, 15,
125148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
125248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	128, 160, 0,   9,  128, 160, 32,  10, 128, 160, 64,  11, 128, 160, 96,  12,
125348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	128, 160, 128, 13, 128, 160, 160, 14, 128, 160, 192, 15, 128, 160, 224, 16,
125448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
125548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	128, 192, 0,   10, 128, 192, 32,  11, 128, 192, 64,  12, 128, 192, 96,  13,
125648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	128, 192, 128, 14, 128, 192, 160, 15, 128, 192, 192, 16, 128, 192, 224, 17,
125748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
125848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	128, 224, 0,   11, 128, 224, 32,  12, 128, 224, 64,  13, 128, 224, 96,  14,
125948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	128, 224, 128, 15, 128, 224, 160, 16, 128, 224, 192, 17, 128, 224, 224, 18,
126048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
126148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	160, 0,   0,   5,  160, 0,   32,  6,  160, 0,   64,  7,  160, 0,   96,  8,
126248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	160, 0,   128, 9,  160, 0,   160, 10, 160, 0,   192, 11, 160, 0,   224, 12,
126348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
126448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	160, 32,  0,   6,  160, 32,  32,  7,  160, 32,  64,  8,  160, 32,  96,  9,
126548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	160, 32,  128, 10, 160, 32,  160, 11, 160, 32,  192, 12, 160, 32,  224, 13,
126648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
126748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	160, 64,  0,   7,  160, 64,  32,  8,  160, 64,  64,  9,  160, 64,  96,  10,
126848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	160, 64,  128, 11, 160, 64,  160, 12, 160, 64,  192, 13, 160, 64,  224, 14,
126948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
127048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	160, 96,  0,   8,  160, 96,  32,  9,  160, 96,  64,  10, 160, 96,  96,  11,
127148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	160, 96,  128, 12, 160, 96,  160, 13, 160, 96,  192, 14, 160, 96,  224, 15,
127248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
127348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	160, 128, 0,   9,  160, 128, 32,  10, 160, 128, 64,  11, 160, 128, 96,  12,
127448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	160, 128, 128, 13, 160, 128, 160, 14, 160, 128, 192, 15, 160, 128, 224, 16,
127548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
127648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	160, 160, 0,   10, 160, 160, 32,  11, 160, 160, 64,  12, 160, 160, 96,  13,
127748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	160, 160, 128, 14, 160, 160, 160, 15, 160, 160, 192, 16, 160, 160, 224, 17,
127848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
127948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	160, 192, 0,   11, 160, 192, 32,  12, 160, 192, 64,  13, 160, 192, 96,  14,
128048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	160, 192, 128, 15, 160, 192, 160, 16, 160, 192, 192, 17, 160, 192, 224, 18,
128148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
128248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	160, 224, 0,   12, 160, 224, 32,  13, 160, 224, 64,  14, 160, 224, 96,  15,
128348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	160, 224, 128, 16, 160, 224, 160, 17, 160, 224, 192, 18, 160, 224, 224, 19,
128448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
128548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	192, 0,   0,   6,  192, 0,   32,  7,  192, 0,   64,  8,  192, 0,   96,  9,
128648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	192, 0,   128, 10, 192, 0,   160, 11, 192, 0,   192, 12, 192, 0,   224, 13,
128748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
128848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	192, 32,  0,   7,  192, 32,  32,  8,  192, 32,  64,  9,  192, 32,  96,  10,
128948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	192, 32,  128, 11, 192, 32,  160, 12, 192, 32,  192, 13, 192, 32,  224, 14,
129048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
129148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	192, 64,  0,   8,  192, 64,  32,  9,  192, 64,  64,  10, 192, 64,  96,  11,
129248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	192, 64,  128, 12, 192, 64,  160, 13, 192, 64,  192, 14, 192, 64,  224, 15,
129348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
129448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	192, 96,  0,   9,  192, 96,  32,  10, 192, 96,  64,  11, 192, 96,  96,  12,
129548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	192, 96,  128, 13, 192, 96,  160, 14, 192, 96,  192, 15, 192, 96,  224, 16,
129648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
129748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	192, 128, 0,   10, 192, 128, 32,  11, 192, 128, 64,  12, 192, 128, 96,  13,
129848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	192, 128, 128, 14, 192, 128, 160, 15, 192, 128, 192, 16, 192, 128, 224, 17,
129948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
130048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	192, 160, 0,   11, 192, 160, 32,  12, 192, 160, 64,  13, 192, 160, 96,  14,
130148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	192, 160, 128, 15, 192, 160, 160, 16, 192, 160, 192, 17, 192, 160, 224, 18,
130248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
130348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	192, 192, 0,   12, 192, 192, 32,  13, 192, 192, 64,  14, 192, 192, 96,  15,
130448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	192, 192, 128, 16, 192, 192, 160, 17, 192, 192, 192, 18, 192, 192, 224, 19,
130548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
130648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	192, 224, 0,   13, 192, 224, 32,  14, 192, 224, 64,  15, 192, 224, 96,  16,
130748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	192, 224, 128, 17, 192, 224, 160, 18, 192, 224, 192, 19, 192, 224, 224, 20,
130848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
130948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	224, 0,   0,   7,  224, 0,   32,  8,  224, 0,   64,  9,  224, 0,   96,  10,
131048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	224, 0,   128, 11, 224, 0,   160, 12, 224, 0,   192, 13, 224, 0,   224, 14,
131148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
131248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	224, 32,  0,   8,  224, 32,  32,  9,  224, 32,  64,  10, 224, 32,  96,  11,
131348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	224, 32,  128, 12, 224, 32,  160, 13, 224, 32,  192, 14, 224, 32,  224, 15,
131448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
131548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	224, 64,  0,   9,  224, 64,  32,  10, 224, 64,  64,  11, 224, 64,  96,  12,
131648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	224, 64,  128, 13, 224, 64,  160, 14, 224, 64,  192, 15, 224, 64,  224, 16,
131748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
131848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	224, 96,  0,   10, 224, 96,  32,  11, 224, 96,  64,  12, 224, 96,  96,  13,
131948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	224, 96,  128, 14, 224, 96,  160, 15, 224, 96,  192, 16, 224, 96,  224, 17,
132048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
132148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	224, 128, 0,   11, 224, 128, 32,  12, 224, 128, 64,  13, 224, 128, 96,  14,
132248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	224, 128, 128, 15, 224, 128, 160, 16, 224, 128, 192, 17, 224, 128, 224, 18,
132348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
132448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	224, 160, 0,   12, 224, 160, 32,  13, 224, 160, 64,  14, 224, 160, 96,  15,
132548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	224, 160, 128, 16, 224, 160, 160, 17, 224, 160, 192, 18, 224, 160, 224, 19,
132648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
132748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	224, 192, 0,   13, 224, 192, 32,  14, 224, 192, 64,  15, 224, 192, 96,  16,
132848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	224, 192, 128, 17, 224, 192, 160, 18, 224, 192, 192, 19, 224, 192, 224, 20,
132948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
133048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	224, 224, 0,   14, 224, 224, 32,  15, 224, 224, 64,  16, 224, 224, 96,  17,
133148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	224, 224, 128, 18, 224, 224, 160, 19, 224, 224, 192, 20, 224, 224, 224, 21
133248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
133348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
133448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLsizei gl4cts::GetTextureSubImage::Functional::s_texture_data_size =
133548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	sizeof(s_texture_data); //!< Size of the uncompressed texture.
133648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
133748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLsizei gl4cts::GetTextureSubImage::Functional::s_texture_data_width =
133848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	8; //!< Width  of compressed and uncompressed textures.
133948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLsizei gl4cts::GetTextureSubImage::Functional::s_texture_data_height =
134048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	8; //!< Height of compressed and uncompressed textures.
134148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLsizei gl4cts::GetTextureSubImage::Functional::s_texture_data_depth =
134248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	8; //!< Depth  of compressed and uncompressed textures.
134348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
134448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** ETC2 8x8x8(layers) pixels in size source texture for testing GetCompressedTextureSubImage. */
134548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLubyte gl4cts::GetTextureSubImage::Functional::s_texture_data_compressed[] = {
134648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Layer 0 */
13478752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x80, 0x80, 0x4, 0x2, 0x1, 0x0, 0x10, 0x0, 0x80, 0x81, 0x4, 0x2, 0x1, 0xf8, 0x10, 0x20,
13488752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x81, 0x80, 0x4, 0x2, 0x81,	0x0, 0x1f, 0xc0, 0x81, 0x81, 0x4, 0x2, 0x81, 0xf8, 0x1f, 0xe0,
13498752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x80, 0x80, 0x5, 0x2, 0x1, 0x0, 0x10, 0x0, 0x80, 0x81, 0x5, 0x2, 0x1, 0xf8, 0x10, 0x20,
13508752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x81, 0x80, 0x5, 0x2, 0x81,	0x0, 0x1f, 0xc0, 0x81, 0x81, 0x5, 0x2, 0x81, 0xf8, 0x1f, 0xe0,
135148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
135248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Layer 1 */
13538752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x90, 0x80, 0x4, 0x12, 0x1, 0x1, 0x10, 0x0, 0x90, 0x81, 0x4, 0x12, 0x1, 0xf9, 0x10, 0x20,
13548752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x91, 0x80, 0x4, 0x12, 0x81, 0x1, 0x1f, 0xc0, 0x91, 0x81, 0x4, 0x12, 0x81, 0xf9, 0x1f, 0xe0,
13558752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x90, 0x80, 0x5, 0x12, 0x1, 0x1, 0x10, 0x0, 0x90, 0x81, 0x5, 0x12, 0x1, 0xf9, 0x10, 0x20,
13568752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x91, 0x80, 0x5, 0x12, 0x81, 0x1, 0x1f, 0xc0, 0x91, 0x81, 0x5, 0x12, 0x81, 0xf9, 0x1f, 0xe0,
135748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
135848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Layer 2 */
13598752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0xa0, 0x80, 0x4, 0x22, 0x1, 0x2, 0x10, 0x0, 0xa0, 0x81, 0x4, 0x22, 0x1, 0xfa, 0x10, 0x20,
13608752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0xa1, 0x80, 0x4, 0x22, 0x81, 0x2, 0x1f, 0xc0, 0xa1, 0x81, 0x4, 0x22, 0x81, 0xfa, 0x1f, 0xe0,
13618752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0xa0, 0x80, 0x5, 0x22, 0x1, 0x2, 0x10, 0x0, 0xa0, 0x81, 0x5, 0x22, 0x1, 0xfa, 0x10, 0x20,
13628752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0xa1, 0x80, 0x5, 0x22, 0x81, 0x2, 0x1f, 0xc0, 0xa1, 0x81, 0x5, 0x22, 0x81, 0xfa, 0x1f, 0xe0,
136348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
136448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Layer 3 */
13658752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0xb0, 0x80, 0x4, 0x32, 0x1, 0x3, 0x10, 0x0, 0xb0, 0x81, 0x4, 0x32, 0x1, 0xfb, 0x10, 0x20,
13668752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0xb1, 0x80, 0x4, 0x32, 0x81, 0x3, 0x1f, 0xc0, 0xb1, 0x81, 0x4, 0x32, 0x81, 0xfb, 0x1f, 0xe0,
13678752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0xb0, 0x80, 0x5, 0x32, 0x1, 0x3, 0x10, 0x0, 0xb0, 0x81, 0x5, 0x32, 0x1, 0xfb, 0x10, 0x20,
13688752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0xb1, 0x80, 0x5, 0x32, 0x81, 0x3, 0x1f, 0xc0, 0xb1, 0x81, 0x5, 0x32, 0x81, 0xfb, 0x1f, 0xe0,
136948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
137048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Layer 4 */
13718752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x40, 0x80, 0x4, 0x42, 0x1, 0x4, 0x10, 0x0, 0x40, 0x81, 0x4, 0x42, 0x1, 0xfc, 0x10, 0x20,
13728752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x41, 0x80, 0x4, 0x42, 0x81, 0x4, 0x1f, 0xc0, 0x41, 0x81, 0x4, 0x42, 0x81, 0xfc, 0x1f, 0xe0,
13738752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x40, 0x80, 0x5, 0x42, 0x1, 0x4, 0x10, 0x0, 0x40, 0x81, 0x5, 0x42, 0x1, 0xfc, 0x10, 0x20,
13748752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x41, 0x80, 0x5, 0x42, 0x81, 0x4, 0x1f, 0xc0, 0x41, 0x81, 0x5, 0x42, 0x81, 0xfc, 0x1f, 0xe0,
137548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
137648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Layer 5 */
13778752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x50, 0x80, 0x4, 0x52, 0x1, 0x5, 0x10, 0x0, 0x50, 0x81, 0x4, 0x52, 0x1, 0xfd, 0x10, 0x20,
13788752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x51, 0x80, 0x4, 0x52, 0x81, 0x5, 0x1f, 0xc0, 0x51, 0x81, 0x4, 0x52, 0x81, 0xfd, 0x1f, 0xe0,
13798752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x50, 0x80, 0x5, 0x52, 0x1, 0x5, 0x10, 0x0, 0x50, 0x81, 0x5, 0x52, 0x1, 0xfd, 0x10, 0x20,
13808752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x51, 0x80, 0x5, 0x52, 0x81, 0x5, 0x1f, 0xc0, 0x51, 0x81, 0x5, 0x52, 0x81, 0xfd, 0x1f, 0xe0,
138148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
138248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Layer 6 */
13838752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x5e, 0x80, 0x4, 0x5f, 0x1, 0x5, 0xf0, 0x0, 0x5e, 0x81, 0x4, 0x5f, 0x1, 0xfd, 0xf0, 0x20,
13848752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x5f, 0x80, 0x4, 0x5f, 0x81, 0x5, 0xff, 0xc0, 0x5f, 0x81, 0x4, 0x5f, 0x81, 0xfd, 0xff, 0xe0,
13858752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x5e, 0x80, 0x5, 0x5f, 0x1, 0x5, 0xf0, 0x0, 0x5e, 0x81, 0x5, 0x5f, 0x1, 0xfd, 0xf0, 0x20,
13868752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x5f, 0x80, 0x5, 0x5f, 0x81, 0x5, 0xff, 0xc0, 0x5f, 0x81, 0x5, 0x5f, 0x81, 0xfd, 0xff, 0xe0,
138748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
138848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Layer 7 */
13898752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x6e, 0x80, 0x4, 0x6f, 0x1, 0x6, 0xf0, 0x0, 0x6e, 0x81, 0x4, 0x6f, 0x1, 0xfe, 0xf0, 0x20,
13908752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x6f, 0x80, 0x4, 0x6f, 0x81, 0x6, 0xff, 0xc0, 0x6f, 0x81, 0x4, 0x6f, 0x81, 0xfe, 0xff, 0xe0,
13918752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x6e, 0x80, 0x5, 0x6f, 0x1, 0x6, 0xf0, 0x0, 0x6e, 0x81, 0x5, 0x6f, 0x1, 0xfe, 0xf0, 0x20,
13928752cc2e13623004dfe804734bb4670b11cb8063Jeannot Breton	0x6f, 0x80, 0x5, 0x6f, 0x81, 0x6, 0xff, 0xc0, 0x6f, 0x81, 0x5, 0x6f, 0x81, 0xfe, 0xff, 0xe0
139348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
139448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
139548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLsizei gl4cts::GetTextureSubImage::Functional::s_texture_data_compressed_size =
139648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	sizeof(s_texture_data_compressed); //!< Size of compressed texture.
1397