gl4cCopyImageTests.cpp revision fef80039ff875a51806b54d151c5f2d0c12daf12
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#include "gl4cCopyImageTests.hpp"
2548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
2648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluDefs.hpp"
2748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluStrUtil.hpp"
2848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glwEnums.hpp"
2948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glwFunctions.hpp"
3048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuFloat.hpp"
3148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuTestLog.hpp"
3248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <algorithm>
3448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <iomanip>
3548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <sstream>
3648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "deMath.h"
3848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* There are far too much combinations specified for FunctionalTest.
4048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
4148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Following flags controls what is enabled. Set as 1 to enable
4248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * all test case from given category, 0 otherwise.
4348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
4448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * By default everything is disabled - which still gives 14560 test cases.
4548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
4648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * ALL_FORMAT  - selects all internal formats, 61 x 61
4748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * ALL_TARGETS - selects all valid targets, 10 x 10
4848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * ALL_IMG_DIM - selects all image dimmensions, 9 x 9
4948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * ALL_REG_DIM - selects all region dimmensions, 7 x 7
5048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * ALL_REG_POS - selects all region positions, like left-top corner, 8 x 8
5148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
5248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_FORMATS 0
5348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_TARGETS 0
5448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_IMG_DIM 0
5548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_DIM 0
5648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS 0
5748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
5848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* The following flags controls if workarounds are enabled */
5948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define COPY_IMAGE_WRKARD_FORMATS 0
6048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
6148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing namespace glw;
6248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
6348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace gl4cts
6448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
6548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace CopyImage
6648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
6748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Various utilities used by all tests
6848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
6948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
7048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass Utils
7148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
7248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic:
7348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Routines */
7448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static bool areFormatsCompatible(glw::GLenum src, glw::GLenum dst);
7548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
7648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static bool comparePixels(glw::GLenum left_internal_format, const glw::GLdouble& left_red,
7748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  const glw::GLdouble& left_green, const glw::GLdouble& left_blue,
7848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  const glw::GLdouble& left_alpha, glw::GLenum right_internal_format,
7948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  const glw::GLdouble& right_red, const glw::GLdouble& right_green,
8048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  const glw::GLdouble& right_blue, const glw::GLdouble& right_alpha);
8148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
8248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static bool comparePixels(glw::GLuint left_pixel_size, const glw::GLubyte* left_pixel_data,
8348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  glw::GLuint right_pixel_size, const glw::GLubyte* right_pixel_data,
8448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  const glw::GLenum format);
8548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
8648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static void deleteTexture(deqp::Context& context, glw::GLenum target, glw::GLuint name);
8748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
8848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static bool isTargetMultilayer(glw::GLenum target);
8948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static bool isTargetMultilevel(glw::GLenum target);
9048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static bool isTargetMultisampled(glw::GLenum target);
9148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
9248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static glw::GLuint generateTexture(deqp::Context& context, glw::GLenum target);
9348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
9448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static void maskPixelForFormat(glw::GLenum internal_format, glw::GLubyte* pixel);
9548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
9648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static glw::GLdouble getEpsilon(glw::GLenum internal_format);
9748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static glw::GLuint getPixelSizeForFormat(glw::GLenum internal_format);
9848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static glw::GLenum getFormat(glw::GLenum internal_format);
9948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static glw::GLuint getNumberOfChannels(glw::GLenum internal_format);
10048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
10148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static std::string getPixelString(glw::GLenum internal_format, const glw::GLubyte* pixel);
10248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
10348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static glw::GLenum getType(glw::GLenum internal_format);
10448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static void makeTextureComplete(deqp::Context& context, glw::GLenum target, glw::GLuint id, glw::GLint base_level,
10548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									glw::GLint max_level);
10648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
10748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static glw::GLuint prepareCompressedTex(deqp::Context& context, glw::GLenum target, glw::GLenum internal_format);
10848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
10948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static glw::GLuint prepareMultisampleTex(deqp::Context& context, glw::GLenum target, glw::GLsizei n_samples);
11048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
11148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static glw::GLuint prepareRenderBuffer(deqp::Context& context, glw::GLenum internal_format);
11248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
11348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static glw::GLuint prepareTex16x16x6(deqp::Context& context, glw::GLenum target, glw::GLenum internal_format,
11448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										 glw::GLenum format, glw::GLenum type, glw::GLuint& out_buf_id);
11548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
11648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static void prepareTexture(deqp::Context& context, glw::GLuint name, glw::GLenum target,
11748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							   glw::GLenum internal_format, glw::GLenum format, glw::GLenum type, glw::GLuint level,
11848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							   glw::GLuint width, glw::GLuint height, glw::GLuint depth, const glw::GLvoid* pixels,
11948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							   glw::GLuint& out_buf_id);
12048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
12148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static glw::GLenum transProxyToRealTarget(glw::GLenum target);
12248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static glw::GLenum transRealToBindTarget(glw::GLenum target);
12348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
12448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static void readChannel(glw::GLenum type, glw::GLuint channel, const glw::GLubyte* pixel, glw::GLdouble& out_value);
12548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
12648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static void writeChannel(glw::GLenum type, glw::GLuint channel, glw::GLdouble value, glw::GLubyte* pixel);
12748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
12848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static void packPixel(glw::GLenum internal_format, glw::GLenum type, glw::GLdouble red, glw::GLdouble green,
12948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  glw::GLdouble blue, glw::GLdouble alpha, glw::GLubyte* out_pixel);
13048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
13148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static void unpackPixel(glw::GLenum format, glw::GLenum type, const glw::GLubyte* pixel, glw::GLdouble& out_red,
13248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							glw::GLdouble& out_green, glw::GLdouble& out_blue, glw::GLdouble& out_alpha);
13348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
13448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static bool unpackAndComaprePixels(glw::GLenum left_format, glw::GLenum left_type, glw::GLenum left_internal_format,
13548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									   const glw::GLubyte* left_pixel, glw::GLenum right_format, glw::GLenum right_type,
13648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									   glw::GLenum right_internal_format, const glw::GLubyte* right_pixel);
13748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
13848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static inline bool roundComponent(glw::GLenum internal_format, glw::GLenum component, glw::GLdouble& value);
13948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
14048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
14148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* Global constants */
14248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstatic const GLenum s_internal_formats[] = {
14348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* R8 */
14448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_R8, GL_R8I, GL_R8UI, GL_R8_SNORM,
14548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
14648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* R16 */
14748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_R16, GL_R16F, GL_R16I, GL_R16UI, GL_R16_SNORM,
14848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
14948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* R32 */
15048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_R32F, GL_R32I, GL_R32UI,
15148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
15248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RG8 */
15348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_RG8, GL_RG8I, GL_RG8UI, GL_RG8_SNORM,
15448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
15548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RG16 */
15648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_RG16, GL_RG16F, GL_RG16I, GL_RG16UI, GL_RG16_SNORM,
15748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
15848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RG32 */
15948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_RG32F, GL_RG32I, GL_RG32UI,
16048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
16148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RGB8 */
16248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_RGB8, GL_RGB8I, GL_RGB8UI, GL_RGB8_SNORM,
16348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
16448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RGB16 */
16548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_RGB16, GL_RGB16F, GL_RGB16I, GL_RGB16UI, GL_RGB16_SNORM,
16648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
16748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RGB32 */
16848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_RGB32F, GL_RGB32I, GL_RGB32UI,
16948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
17048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RGBA8 */
17148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_RGBA8, GL_RGBA8I, GL_RGBA8UI, GL_RGBA8_SNORM,
17248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
17348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RGBA16 */
17448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_RGBA16, GL_RGBA16F, GL_RGBA16I, GL_RGBA16UI, GL_RGBA16_SNORM,
17548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
17648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RGBA32 */
17748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_RGBA32F, GL_RGBA32I, GL_RGBA32UI,
17848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
17948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 8 */
18048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_R3_G3_B2, GL_RGBA2,
18148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
18248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 12 */
18348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_RGB4,
18448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
18548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 15 */
18648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_RGB5,
18748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
18848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 16 */
18948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_RGBA4, GL_RGB5_A1,
19048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
19148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 30 */
19248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_RGB10,
19348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
19448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 32 */
19548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_RGB10_A2, GL_RGB10_A2UI, GL_R11F_G11F_B10F, GL_RGB9_E5,
19648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
19748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 36 */
19848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_RGB12,
19948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
20048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 48 */
20148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_RGBA12,
20248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
20348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
20448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstatic const GLenum s_invalid_targets[] = {
20548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TEXTURE_BUFFER,
20648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
20748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
20848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
20948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TEXTURE_CUBE_MAP_POSITIVE_X,
21048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
21148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
21248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_PROXY_TEXTURE_1D,
21348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_PROXY_TEXTURE_1D_ARRAY,
21448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_PROXY_TEXTURE_2D,
21548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_PROXY_TEXTURE_2D_ARRAY,
21648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_PROXY_TEXTURE_2D_MULTISAMPLE,
21748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY,
21848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_PROXY_TEXTURE_3D,
21948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_PROXY_TEXTURE_CUBE_MAP,
22048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_PROXY_TEXTURE_CUBE_MAP_ARRAY,
22148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_PROXY_TEXTURE_RECTANGLE,
22248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
22348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
22448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstatic const GLenum s_valid_targets[] = {
22548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_RENDERBUFFER,
22648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TEXTURE_1D,
22748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TEXTURE_1D_ARRAY,
22848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TEXTURE_2D,
22948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TEXTURE_2D_ARRAY,
23048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TEXTURE_2D_MULTISAMPLE,
23148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TEXTURE_2D_MULTISAMPLE_ARRAY,
23248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TEXTURE_3D,
23348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TEXTURE_CUBE_MAP,
23448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TEXTURE_CUBE_MAP_ARRAY,
23548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TEXTURE_RECTANGLE,
23648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
23748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
23848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstatic const GLuint s_n_internal_formats = sizeof(s_internal_formats) / sizeof(s_internal_formats[0]);
23948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstatic const GLuint s_n_invalid_targets  = sizeof(s_invalid_targets) / sizeof(s_invalid_targets[0]);
24048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstatic const GLuint s_n_valid_targets	= sizeof(s_valid_targets) / sizeof(s_valid_targets[0]);
24148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
24248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/**
24348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Pixel compatibility depends on pixel size. However value returned by getPixelSizeForFormat
24448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * needs some refinements
24548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
24648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format of image
24748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
24848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Size of pixel for compatibility checks
24948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
25048087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLuint getPixelSizeForCompatibilityVerification(GLenum internal_format)
25148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
25248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint size = Utils::getPixelSizeForFormat(internal_format);
25348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
25448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (internal_format)
25548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
25648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA2:
25748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		size = 1;
25848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
25948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
26048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
26148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
26248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
26348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return size;
26448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
26548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
26648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_FORMATS == 0
26748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
26848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Filters out formats that should not be tested by FunctionalTest
26948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
27048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param format Internal format
27148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
27248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if format should be tested, false otherwise
27348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
27448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool filterFormats(GLenum format)
27548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
27648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool result = true;
27748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
27848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (format)
27948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
28048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* R8 */
28148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8I:
28248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8UI:
28348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8_SNORM:
28448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
28548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* R16 */
28648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16:
28748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16F:
28848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16I:
28948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16UI:
29048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16_SNORM:
29148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
29248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* R32 */
29348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32F:
29448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32I:
29548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32UI:
29648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
29748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RG8 */
29848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8:
29948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8I:
30048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8UI:
30148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8_SNORM:
30248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
30348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RG16 */
30448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16:
30548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16F:
30648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16I:
30748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16UI:
30848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16_SNORM:
30948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
31048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RG32 */
31148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32F:
31248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32I:
31348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32UI:
31448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
31548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RGB8 */
31648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8:
31748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8I:
31848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8UI:
31948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8_SNORM:
32048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
32148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RGB16 */
32248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16:
32348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16F:
32448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16I:
32548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16UI:
32648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16_SNORM:
32748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
32848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RGB32 */
32948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32I:
33048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32UI:
33148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
33248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RGBA8 */
33348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8:
33448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8I:
33548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8UI:
33648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8_SNORM:
33748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
33848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RGBA16 */
33948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16:
34048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16F:
34148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16I:
34248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16UI:
34348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16_SNORM:
34448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
34548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RGBA32 */
34648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32F:
34748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32I:
34848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32UI:
34948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = false;
35048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
35148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
35248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
35348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = true;
35448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
35548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
35648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
35748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
35848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
35948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
36048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_FORMATS */
36148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
36248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Checks if two internal_formats are compatible
36348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
36448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param src Internal format of source image
36548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param dst Internal format of destination image
36648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
36748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true for compatible formats, false otherwise
36848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
36948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool Utils::areFormatsCompatible(glw::GLenum src, glw::GLenum dst)
37048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
37148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint dst_size = getPixelSizeForCompatibilityVerification(dst);
37248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint src_size = getPixelSizeForCompatibilityVerification(src);
37348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
37448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (dst_size != src_size)
37548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
37648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return false;
37748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
37848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
37948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_FORMATS == 0
38048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
38148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if ((false == filterFormats(src)) || (false == filterFormats(dst)))
38248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
38348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return false;
38448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
38548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
38648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_FORMATS */
38748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
38848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (src != dst)
38948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
39048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if ((GL_R3_G3_B2 == dst) || (GL_R3_G3_B2 == src) || (GL_RGBA2 == dst) || (GL_RGBA2 == src) ||
39148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			(GL_RGBA4 == dst) || (GL_RGBA4 == src) || (GL_RGB5_A1 == dst) || (GL_RGB5_A1 == src) || (GL_RGB10 == dst) ||
39248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			(GL_RGB10 == src))
39348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
39448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return false;
39548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
39648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
39748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
39848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_WRKARD_FORMATS
39948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
40048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if ((GL_RGB10_A2 == src) && (GL_R11F_G11F_B10F == dst) || (GL_RGB10_A2 == src) && (GL_RGB9_E5 == dst) ||
40148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		(GL_RGB10_A2UI == src) && (GL_R11F_G11F_B10F == dst) || (GL_RGB10_A2UI == src) && (GL_RGB9_E5 == dst) ||
40248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		(GL_RGB9_E5 == src) && (GL_RGB10_A2 == dst) || (GL_RGB9_E5 == src) && (GL_RGB10_A2UI == dst) ||
40348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		(GL_R11F_G11F_B10F == src) && (GL_RGB10_A2 == dst) || (GL_R11F_G11F_B10F == src) && (GL_RGB10_A2UI == dst))
40448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
40548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return false;
40648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
40748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
40848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_WRKARD_FORMATS */
40948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
41048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (2 == dst_size)
41148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
41248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (src == dst)
41348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
41448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return true;
41548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
41648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
41748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (((GL_RGB4 == src) && (GL_RGB4 != dst)) || ((GL_RGB4 != src) && (GL_RGB4 == dst)) ||
41848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			((GL_RGB5 == src) && (GL_RGB5 != dst)) || ((GL_RGB5 != src) && (GL_RGB5 == dst)))
41948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
42048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return false;
42148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
42248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
42348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return true;
42448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
42548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
42648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (4 == dst_size)
42748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
42848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (src == dst)
42948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
43048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return true;
43148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
43248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
43348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return true;
43448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
43548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
43648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
43748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
43848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
43948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Compare two pixels
44048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
44148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_internal_format  Internal format of left image
44248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_red              Red channel of left image
44348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_green            Green channel of left image
44448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_blue             Blue channel of left image
44548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_alpha            Alpha channel of left image
44648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_internal_format Internal format of right image
44748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_red             Red channel of right image
44848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_green           Green channel of right image
44948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_blue            Blue channel of right image
45048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_alpha           Alpha channel of right image
45148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
45248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if pixels match, false otherwise
45348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
45448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool Utils::comparePixels(GLenum left_internal_format, const GLdouble& left_red, const GLdouble& left_green,
45548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  const GLdouble& left_blue, const GLdouble& left_alpha, GLenum right_internal_format,
45648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  const GLdouble& right_red, const GLdouble& right_green, const GLdouble& right_blue,
45748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  const GLdouble& right_alpha)
45848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
45948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint left_n_channels  = getNumberOfChannels(left_internal_format);
46048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint right_n_channels = getNumberOfChannels(right_internal_format);
46148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint n_channels		  = (left_n_channels >= right_n_channels) ? right_n_channels : left_n_channels;
46248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
46348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble left_channels[4] = { left_red, left_green, left_blue, left_alpha };
46448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
46548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble right_channels[4] = { right_red, right_green, right_blue, right_alpha };
46648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
46748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint i = 0; i < n_channels; ++i)
46848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
46948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLdouble left		 = left_channels[i];
47048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLdouble right	 = right_channels[i];
47148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLdouble left_eps  = getEpsilon(left_internal_format);
47248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLdouble right_eps = getEpsilon(right_internal_format);
47348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLdouble eps		 = fabs(std::max(left_eps, right_eps));
47448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
47548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (eps < fabs(left - right))
47648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
47748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return false;
47848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
47948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
48048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
48148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
48248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
48348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
48448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define RGB9E5_EXPONENT_BITS 5
48548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define RGB9E5_MANTISSA_BITS 9
48648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define RGB9E5_EXP_BIAS 15
48748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define R11FG11FB10F_EXP_BIAS 15
48848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
48948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostypedef struct
49048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
49148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int r : RGB9E5_MANTISSA_BITS;
49248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int g : RGB9E5_MANTISSA_BITS;
49348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int b : RGB9E5_MANTISSA_BITS;
49448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int biasedexponent : RGB9E5_EXPONENT_BITS;
49548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} BitsOfRGB9E5;
49648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
49748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostypedef struct
49848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
49948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int r : 11;
50048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int g : 11;
50148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int b : 10;
50248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} BitsOfR11FG11FB10F;
50348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
50448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostypedef union {
50548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int raw;
50648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	BitsOfRGB9E5 field;
50748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} rgb9e5;
50848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
50948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostypedef union {
51048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int	   raw;
51148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	BitsOfR11FG11FB10F field;
51248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} r11fg11fb10f;
51348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
51448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid rgb9e5_to_float3(rgb9e5 v, float retval[3])
51548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
51648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	int   exponent = v.field.biasedexponent - RGB9E5_EXP_BIAS - RGB9E5_MANTISSA_BITS;
51748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	float scale	= (float)pow(2.0, (double)exponent);
51848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
51948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	retval[0] = v.field.r * scale;
52048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	retval[1] = v.field.g * scale;
52148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	retval[2] = v.field.b * scale;
52248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
52348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
52448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// This function will expand a 10-bit or 11-bit float
52548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// based on the rules described in 2.3.4.3 and 2.3.4.4
52648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosfloat expandFloat(const unsigned int compressed, const unsigned int numMantissaBits)
52748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
52848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int divisor = (unsigned int)deFloatPow(2, (float)numMantissaBits);
52948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	float		 retval  = 0.0;
53048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unsigned int exponent, mantissa;
53148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
53248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	exponent = compressed / divisor;
53348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	mantissa = compressed % divisor;
53448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (exponent == 0 && mantissa == 0)
53548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		retval = 0.0;
53648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else if (exponent == 0 && mantissa != 0)
53748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		retval = deFloatPow(2.f, -14.f) * ((float)mantissa / (float)divisor);
53848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else if (0 < exponent && exponent < 31)
53948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		retval = deFloatPow(2.f, (float)exponent - 15.f) * (1.f + (float)mantissa / (float)divisor);
54048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else if (exponent == 31 && mantissa == 0)
54148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		retval = INFINITY;
54248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else if (exponent == 31 && mantissa != 0)
54348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		retval = NAN;
54448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
54548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		DE_ASSERT(DE_FALSE && "Invalid exponent and mantissa");
54648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
54748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return retval;
54848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
54948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
55048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid r11fg11fb10f_to_float3(r11fg11fb10f v, float retval[3])
55148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
55248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	retval[0] = expandFloat(v.field.r, 6);
55348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	retval[1] = expandFloat(v.field.g, 6);
55448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	retval[2] = expandFloat(v.field.b, 5);
55548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
55648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
55748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool compareRGB9E5(const void* ptr1, const void* ptr2, int num)
55848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
55948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	rgb9e5* data1 = (rgb9e5*)ptr1;
56048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	rgb9e5* data2 = (rgb9e5*)ptr2;
56148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
56248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	float value1[3];
56348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	float value2[3];
56448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
56548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (int i = 0; i<num>> 2; ++i)
56648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
56748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		rgb9e5_to_float3(data1[i], value1);
56848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		rgb9e5_to_float3(data2[i], value2);
56948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
57048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (int j = 0; j < 3; ++j)
57148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
57248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (value1[j] != value2[j])
57348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
57448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return false;
57548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
57648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
57748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
57848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
57948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
58048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
58148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool compareR11FG11FB10F(const void* ptr1, const void* ptr2, int num)
58248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
58348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	r11fg11fb10f* data1 = (r11fg11fb10f*)ptr1;
58448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	r11fg11fb10f* data2 = (r11fg11fb10f*)ptr2;
58548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
58648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	float value1[3];
58748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	float value2[3];
58848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
58948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (int i = 0; i<num>> 2; ++i)
59048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
59148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		r11fg11fb10f_to_float3(data1[i], value1);
59248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		r11fg11fb10f_to_float3(data2[i], value2);
59348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
59448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (int j = 0; j < 3; ++j)
59548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
59648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (value1[j] != value2[j])
59748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
59848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return false;
59948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
60048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
60148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
60248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
60348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
60448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
60548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Compare two pixels with memcmp
60648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
60748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_pixel_size  Size of left pixel
60848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_pixel_data  Data of left pixel
60948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_pixel_size Size of right pixel
61048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_pixel_data Data of right pixel
61148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
61248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if memory match, false otherwise
61348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
61448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool Utils::comparePixels(GLuint left_pixel_size, const GLubyte* left_pixel_data, GLuint right_pixel_size,
61548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  const GLubyte* right_pixel_data, const GLenum format)
61648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
61748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint pixel_size = (left_pixel_size >= right_pixel_size) ? left_pixel_size : right_pixel_size;
61848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
61948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (format == GL_RGB9_E5)
62048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
62148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return compareRGB9E5(left_pixel_data, right_pixel_data, pixel_size);
62248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
62348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else if (format == GL_R11F_G11F_B10F)
62448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
62548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return compareR11FG11FB10F(left_pixel_data, right_pixel_data, pixel_size);
62648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
62748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
62848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return 0 == memcmp(left_pixel_data, right_pixel_data, pixel_size);
62948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
63048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
63148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Delete texture or renderbuffer
63248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
63348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
63448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target  Image target
63548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param name    Name of image
63648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
63748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid Utils::deleteTexture(deqp::Context& context, GLenum target, GLuint name)
63848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
63948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions& gl = context.getRenderContext().getFunctions();
64048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
64148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (GL_RENDERBUFFER == target)
64248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
64348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteRenderbuffers(1, &name);
64448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
64548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
64648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
64748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteTextures(1, &name);
64848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
64948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
65048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
65148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Get epsilon for given internal_format
65248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
65348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format of image
65448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
65548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Epsilon value
65648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
65748087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLdouble Utils::getEpsilon(GLenum internal_format)
65848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
65948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLdouble epsilon;
66048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
66148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (internal_format)
66248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
66348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8:
66448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8_SNORM:
66548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16:
66648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16F:
66748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16_SNORM:
66848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32F:
66948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8I:
67048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8UI:
67148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16I:
67248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16UI:
67348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32I:
67448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32UI:
67548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8:
67648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8_SNORM:
67748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16:
67848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16F:
67948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16_SNORM:
68048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32F:
68148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8I:
68248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8UI:
68348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16I:
68448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16UI:
68548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32I:
68648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32UI:
68748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R3_G3_B2:
68848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB4:
68948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB5:
69048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8:
69148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8_SNORM:
69248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R11F_G11F_B10F:
69348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16:
69448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16F:
69548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16_SNORM:
69648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32F:
69748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8I:
69848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8UI:
69948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB10:
70048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16I:
70148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16UI:
70248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32I:
70348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32UI:
70448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB9_E5:
70548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA2:
70648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA4:
70748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB5_A1:
70848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8:
70948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8_SNORM:
71048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB10_A2:
71148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16:
71248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16F:
71348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16_SNORM:
71448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32F:
71548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8I:
71648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8UI:
71748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB10_A2UI:
71848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16I:
71948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16UI:
72048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32I:
72148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32UI:
72248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		epsilon = 0.0;
72348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
72448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB12:
72548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA12:
72648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		epsilon = 0.00390625;
72748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
72848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
72948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Invalid enum");
73048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
73148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
73248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
73348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return epsilon;
73448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
73548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
73648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Get format for given internal format
73748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
73848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format
73948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
74048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Format
74148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
74248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLenum Utils::getFormat(GLenum internal_format)
74348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
74448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLenum format = 0;
74548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
74648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (internal_format)
74748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
74848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* R */
74948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8:
75048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8_SNORM:
75148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16:
75248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16F:
75348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16_SNORM:
75448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32F:
75548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		format = GL_RED;
75648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
75748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
75848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8I:
75948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8UI:
76048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16I:
76148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16UI:
76248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32I:
76348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32UI:
76448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		format = GL_RED_INTEGER;
76548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
76648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
76748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RG */
76848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8:
76948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8_SNORM:
77048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16:
77148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16F:
77248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16_SNORM:
77348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32F:
77448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		format = GL_RG;
77548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
77648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
77748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8I:
77848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8UI:
77948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16I:
78048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16UI:
78148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32I:
78248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32UI:
78348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		format = GL_RG_INTEGER;
78448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
78548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
78648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RGB */
78748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R3_G3_B2:
78848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB4:
78948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB5:
79048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8:
79148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8_SNORM:
79248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R11F_G11F_B10F:
79348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB12:
79448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16:
79548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16F:
79648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16_SNORM:
79748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32F:
79848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB9_E5:
79948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		format = GL_RGB;
80048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
80148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
80248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8I:
80348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8UI:
80448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16I:
80548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16UI:
80648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32I:
80748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32UI:
80848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		format = GL_RGB_INTEGER;
80948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
81048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
81148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RGBA */
81248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB10:
81348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA2:
81448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA4:
81548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB5_A1:
81648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8:
81748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8_SNORM:
81848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB10_A2:
81948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA12:
82048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16:
82148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16F:
82248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16_SNORM:
82348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32F:
82448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		format = GL_RGBA;
82548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
82648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
82748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8I:
82848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8UI:
82948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB10_A2UI:
83048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16I:
83148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16UI:
83248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32I:
83348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32UI:
83448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		format = GL_RGBA_INTEGER;
83548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
83648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
83748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
83848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Invalid enum");
83948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
84048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
84148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
84248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return format;
84348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
84448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
84548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Get number of channels for given internal_format
84648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
84748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format
84848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
84948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Number of channels
85048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
85148087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLuint Utils::getNumberOfChannels(GLenum internal_format)
85248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
85348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint result = 0;
85448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
85548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (internal_format)
85648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
85748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8:
85848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8_SNORM:
85948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16:
86048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16F:
86148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16_SNORM:
86248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32F:
86348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8I:
86448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8UI:
86548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16I:
86648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16UI:
86748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32I:
86848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32UI:
86948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = 1;
87048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
87148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
87248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8:
87348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8_SNORM:
87448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16:
87548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16F:
87648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16_SNORM:
87748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32F:
87848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8I:
87948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8UI:
88048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16I:
88148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16UI:
88248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32I:
88348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32UI:
88448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = 2;
88548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
88648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
88748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R3_G3_B2:
88848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB4:
88948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB5:
89048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8:
89148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8_SNORM:
89248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB10:
89348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R11F_G11F_B10F:
89448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB12:
89548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16:
89648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16F:
89748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16_SNORM:
89848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32F:
89948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB9_E5:
90048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8I:
90148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8UI:
90248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16I:
90348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16UI:
90448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32I:
90548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32UI:
90648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = 3;
90748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
90848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
90948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA2:
91048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA4:
91148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB5_A1:
91248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8:
91348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8_SNORM:
91448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB10_A2:
91548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA12:
91648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16:
91748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16F:
91848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16_SNORM:
91948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32F:
92048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8I:
92148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8UI:
92248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB10_A2UI:
92348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16I:
92448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16UI:
92548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32I:
92648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32UI:
92748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = 4;
92848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
92948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
93048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
93148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Invalid enum");
93248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
93348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
93448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
93548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
93648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
93748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
93848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Get type for given internal format
93948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
94048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format
94148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
94248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Type
94348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
94448087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLenum Utils::getType(GLenum internal_format)
94548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
94648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLenum type = 0;
94748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
94848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (internal_format)
94948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
95048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8:
95148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8UI:
95248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8:
95348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8UI:
95448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8:
95548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8UI:
95648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8:
95748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8UI:
95848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		type = GL_UNSIGNED_BYTE;
95948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
96048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
96148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8_SNORM:
96248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8I:
96348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8_SNORM:
96448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8I:
96548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8_SNORM:
96648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8I:
96748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8_SNORM:
96848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8I:
96948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		type = GL_BYTE;
97048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
97148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
97248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R3_G3_B2:
97348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		type = GL_UNSIGNED_BYTE_3_3_2;
97448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
97548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
97648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB4:
97748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB5:
97848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		type = GL_UNSIGNED_SHORT_5_6_5;
97948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
98048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
98148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA2:
98248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA4:
98348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		type = GL_UNSIGNED_SHORT_4_4_4_4;
98448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
98548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
98648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB5_A1:
98748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		type = GL_UNSIGNED_SHORT_5_5_5_1;
98848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
98948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
99048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB10:
99148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB10_A2:
99248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB10_A2UI:
99348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		type = GL_UNSIGNED_INT_2_10_10_10_REV;
99448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
99548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
99648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16F:
99748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16F:
99848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16F:
99948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16F:
100048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		type = GL_HALF_FLOAT;
100148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
100248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
100348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16:
100448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16UI:
100548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16:
100648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16UI:
100748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB12:
100848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16:
100948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16UI:
101048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA12:
101148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16:
101248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16UI:
101348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		type = GL_UNSIGNED_SHORT;
101448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
101548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
101648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16_SNORM:
101748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16I:
101848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16_SNORM:
101948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16I:
102048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16_SNORM:
102148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16I:
102248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16_SNORM:
102348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16I:
102448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		type = GL_SHORT;
102548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
102648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
102748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32UI:
102848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32UI:
102948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32UI:
103048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32UI:
103148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		type = GL_UNSIGNED_INT;
103248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
103348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
103448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB9_E5:
103548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		type = GL_UNSIGNED_INT_5_9_9_9_REV;
103648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
103748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
103848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32I:
103948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32I:
104048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32I:
104148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32I:
104248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		type = GL_INT;
104348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
104448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
104548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32F:
104648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32F:
104748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32F:
104848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32F:
104948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		type = GL_FLOAT;
105048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
105148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
105248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R11F_G11F_B10F:
105348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		type = GL_UNSIGNED_INT_10F_11F_11F_REV;
105448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
105548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
105648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
105748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Invalid enum");
105848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
105948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
106048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
106148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return type;
106248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
106348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
106448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Returns mask that should be applied to pixel value
106548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
106648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format of texture
106748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel           Pixel data
106848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
106948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Mask
107048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
107148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid Utils::maskPixelForFormat(GLenum internal_format, GLubyte* pixel)
107248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
107348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (internal_format)
107448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
107548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB10:
107648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* UINT_10_10_10_2 - ALPHA will be set to 3*/
107748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		pixel[0] |= 0x03;
107848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
107948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
108048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
108148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
108248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
108348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
108448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
108548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Get size of pixel for given internal format
108648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
108748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format
108848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
108948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Number of bytes used by given format
109048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
109148087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLuint Utils::getPixelSizeForFormat(GLenum internal_format)
109248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
109348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint size = 0;
109448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
109548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (internal_format)
109648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
109748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 8 */
109848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8:
109948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8I:
110048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8UI:
110148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8_SNORM:
110248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R3_G3_B2:
110348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		size = 1;
110448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
110548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
110648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 8 */
110748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA2:
110848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		size = 2;
110948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
111048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
111148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 12 */
111248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB4:
111348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		size = 2;
111448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
111548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
111648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 15 */
111748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB5:
111848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		size = 2;
111948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
112048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
112148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 16 */
112248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8:
112348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8I:
112448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8UI:
112548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8_SNORM:
112648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16:
112748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16F:
112848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16I:
112948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16UI:
113048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16_SNORM:
113148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA4:
113248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB5_A1:
113348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		size = 2;
113448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
113548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
113648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 24 */
113748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8:
113848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8I:
113948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8UI:
114048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8_SNORM:
114148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		size = 3;
114248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
114348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
114448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 30 */
114548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB10:
114648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		size = 4;
114748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
114848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
114948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 32 */
115048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8:
115148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8I:
115248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8UI:
115348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8_SNORM:
115448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16:
115548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16F:
115648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16I:
115748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16UI:
115848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16_SNORM:
115948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32F:
116048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32I:
116148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32UI:
116248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB10_A2:
116348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB10_A2UI:
116448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R11F_G11F_B10F:
116548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB9_E5:
116648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		size = 4;
116748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
116848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
116948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 36 */
117048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB12:
117148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		size = 6;
117248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
117348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
117448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 48 */
117548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16:
117648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16F:
117748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16I:
117848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16UI:
117948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16_SNORM:
118048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		size = 6;
118148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
118248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
118348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 64 */
118448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA12:
118548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16:
118648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16F:
118748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16I:
118848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16UI:
118948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16_SNORM:
119048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32F:
119148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32I:
119248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32UI:
119348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		size = 8;
119448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
119548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
119648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 96 */
119748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32F:
119848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32I:
119948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32UI:
120048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		size = 12;
120148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
120248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
120348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 128 */
120448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32F:
120548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32I:
120648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32UI:
120748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		size = 16;
120848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
120948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
121048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
121148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Invalid enum");
121248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
121348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
121448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
121548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return size;
121648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
121748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
121848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Prepare string that represents bytes of pixel
121948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
122048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Format
122148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel           Pixel data
122248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
122348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return String
122448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
122548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string Utils::getPixelString(GLenum internal_format, const GLubyte* pixel)
122648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
122748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint	  pixel_size = Utils::getPixelSizeForFormat(internal_format);
122848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::stringstream stream;
122948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
123048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	stream << "0x";
123148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
123248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLint i = pixel_size - 1; i >= 0; --i)
123348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
123448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		stream << std::setbase(16) << std::setw(2) << std::setfill('0') << (GLuint)pixel[i];
123548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
123648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
123748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return stream.str();
123848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
123948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
124048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Check if target supports multiple layers
124148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
124248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target Texture target
124348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
124448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if target is multilayered
124548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
124648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool Utils::isTargetMultilayer(GLenum target)
124748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
124848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool result = false;
124948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
125048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (target)
125148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
125248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_1D_ARRAY:
125348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_2D_ARRAY:
125448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
125548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_3D:
125648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_CUBE_MAP_ARRAY:
125748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = true;
125848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
125948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
126048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
126148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
126248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
126348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
126448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
126548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
126648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
126748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Check if target supports multiple level
126848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
126948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target Texture target
127048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
127148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if target supports mipmaps
127248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
127348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool Utils::isTargetMultilevel(GLenum target)
127448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
127548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool result = true;
127648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
127748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (target)
127848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
127948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_2D_MULTISAMPLE:
128048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
128148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_RECTANGLE:
128248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RENDERBUFFER:
128348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = false;
128448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
128548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
128648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
128748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
128848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
128948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
129048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
129148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
129248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Check if target is multisampled
129348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
129448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target Texture target
129548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
129648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true when for multisampled formats, false otherwise
129748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
129848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool Utils::isTargetMultisampled(GLenum target)
129948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
130048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool result = false;
130148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
130248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (target)
130348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
130448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_2D_MULTISAMPLE:
130548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
130648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = true;
130748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
130848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
130948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
131048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
131148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
131248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
131348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
131448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
131548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Generate texture object
131648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
131748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
131848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target  Target of texture
131948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
132048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Generated name
132148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
132248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosglw::GLuint Utils::generateTexture(deqp::Context& context, GLenum target)
132348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
132448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions& gl   = context.getRenderContext().getFunctions();
132548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint			 name = 0;
132648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
132748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (target)
132848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
132948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RENDERBUFFER:
133048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.genRenderbuffers(1, &name);
133148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "GenRenderbuffers");
133248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
133348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
133448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
133548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.genTextures(1, &name);
133648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "GenTextures");
133748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
133848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
133948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
134048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return name;
134148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
134248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
134348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Sets base and max level parameters of texture to make it complete
134448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
134548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context    Test context
134648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target     GLenum representing target of texture that should be created
134748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param id         Id of texture
134848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param base_level Base level value, eg 0
134948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param max_level  Max level value, eg 0
135048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
135148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid Utils::makeTextureComplete(deqp::Context& context, GLenum target, GLuint id, GLint base_level, GLint max_level)
135248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
135348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions& gl = context.getRenderContext().getFunctions();
135448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
135548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (GL_RENDERBUFFER == target)
135648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
135748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return;
135848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
135948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
136048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Translate proxies into real targets */
136148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	target = transRealToBindTarget(transProxyToRealTarget(target));
136248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
136348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindTexture(target, id);
136448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture");
136548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
136648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set levels */
136748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (GL_TEXTURE_BUFFER != target)
136848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
136948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.texParameteri(target, GL_TEXTURE_BASE_LEVEL, base_level);
137048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "TexParameteri");
137148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
137248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.texParameteri(target, GL_TEXTURE_MAX_LEVEL, max_level);
137348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "TexParameteri");
1374fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke
1375fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke		/* Integer textures won't be complete with the default min filter
1376fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke		 * of GL_NEAREST_MIPMAP_LINEAR (or GL_LINEAR for rectangle textures)
1377fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke		 * and default mag filter of GL_LINEAR, so switch to nearest.
1378fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke		 */
1379fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke		if (GL_TEXTURE_2D_MULTISAMPLE != target && GL_TEXTURE_2D_MULTISAMPLE_ARRAY != target)
1380fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke		{
1381fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke			gl.texParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1382fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke			if (GL_TEXTURE_RECTANGLE != target)
1383fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke			{
1384fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke				gl.texParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
1385fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke				GLU_EXPECT_NO_ERROR(gl.getError(), "TexParameteri");
1386fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke			}
1387fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke			else
1388fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke			{
1389fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke				gl.texParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1390fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke				GLU_EXPECT_NO_ERROR(gl.getError(), "TexParameteri");
1391fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke			}
1392fef80039ff875a51806b54d151c5f2d0c12daf12Kenneth Graunke		}
139348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
139448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
139548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Clean binding point */
139648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindTexture(target, 0);
139748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture");
139848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
139948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
140048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Generate and initialize texture for given target
140148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
140248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context   Test context
140348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target    GLenum representing target of texture that should be created
140448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param n_samples Number of samples
140548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
140648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return "name" of texture
140748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
140848087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLuint Utils::prepareMultisampleTex(deqp::Context& context, GLenum target, GLsizei n_samples)
140948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
141048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint depth			= 6;
141148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions&	gl				= context.getRenderContext().getFunctions();
141248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint height			= 16;
141348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLenum internal_format = GL_RGBA8;
141448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint				name			= 0;
141548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint width			= 16;
141648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
141748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genTextures(1, &name);
141848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "GenTextures");
141948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
142048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Initialize */
142148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (target)
142248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
142348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_2D_MULTISAMPLE:
142448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bindTexture(target, name);
142548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture");
142648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
142748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.texImage2DMultisample(target, n_samples, internal_format, width, height, GL_FALSE /* fixedsamplelocation */);
142848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "TexImage2DMultisample");
142948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
143048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
143148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
143248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
143348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bindTexture(target, name);
143448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture");
143548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
143648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.texImage3DMultisample(target, n_samples, internal_format, width, height, depth,
143748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 GL_FALSE /* fixedsamplelocation */);
143848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "TexImage3DMultisample");
143948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
144048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
144148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
144248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
144348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Invalid enum");
144448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
144548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
144648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
144748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Clean binding point */
144848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindTexture(target, 0);
144948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture");
145048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
145148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return name;
145248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
145348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
145448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Generate and initialize texture for given target
145548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
145648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context         Test context
145748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format of render buffer
145848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
145948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return "name" of texture
146048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
146148087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLuint Utils::prepareRenderBuffer(deqp::Context& context, GLenum internal_format)
146248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
146348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions&	gl	 = context.getRenderContext().getFunctions();
146448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint height = 16;
146548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint				name   = 0;
146648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint width  = 16;
146748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
146848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genRenderbuffers(1, &name);
146948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "GenRenderbuffers");
147048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
147148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Initialize */
147248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindRenderbuffer(GL_RENDERBUFFER, name);
147348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "BindRenderbuffer");
147448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
147548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.renderbufferStorage(GL_RENDERBUFFER, internal_format, width, height);
147648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "RenderbufferStorage");
147748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
147848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Clean binding point */
147948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindRenderbuffer(GL_RENDERBUFFER, 0);
148048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "BindRenderbuffer");
148148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
148248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return name;
148348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
148448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
148548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Generate and initialize texture for given target
148648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
148748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context         Test context
148848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target          GLenum representing target of texture that should be created
148948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format <internalformat>
149048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param format          <format>
149148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param type            <type>
149248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_buf_id      ID of buffer that will be used for TEXTURE_BUFFER
149348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
149448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return "name" of texture
149548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
149648087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLuint Utils::prepareTex16x16x6(deqp::Context& context, GLenum target, GLenum internal_format, GLenum format,
149748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								GLenum type, GLuint& out_buf_id)
149848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
149948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint  depth  = 6;
150048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint  height = 16;
150148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint  level  = 0;
150248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint				 name   = 0;
150348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLchar* pixels = 0;
150448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint  width  = 16;
150548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
150648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	name = generateTexture(context, target);
150748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
150848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	prepareTexture(context, name, target, internal_format, format, type, level, width, height, depth, pixels,
150948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				   out_buf_id);
151048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
151148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return name;
151248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
151348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
151448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Initialize texture
151548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
151648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context         Test context
151748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param name            Name of texture object
151848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target          GLenum representing target of texture that should be created
151948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format <internalformat>
152048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param format          <format>
152148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param type            <type>
152248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param level           <level>
152348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param width           <width>
152448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param height          <height>
152548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param depth           <depth>
152648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixels          <pixels>
152748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_buf_id      ID of buffer that will be used for TEXTURE_BUFFER
152848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
152948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return "name" of texture
153048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
153148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid Utils::prepareTexture(deqp::Context& context, GLuint name, GLenum target, GLenum internal_format, GLenum format,
153248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   GLenum type, GLuint level, GLuint width, GLuint height, GLuint depth, const GLvoid* pixels,
153348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						   GLuint& out_buf_id)
153448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
153548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLint   border		   = 0;
153648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLenum				 error		   = 0;
153748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLchar*		 function_name = "unknown";
153848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions&	 gl			   = context.getRenderContext().getFunctions();
153948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLsizei samples	   = 1;
154048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
154148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Translate proxies into real targets */
154248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	target = transProxyToRealTarget(target);
154348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
154448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Initialize */
154548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (target)
154648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
154748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RENDERBUFFER:
154848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bindRenderbuffer(target, name);
154948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "BindRenderbuffer");
155048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
155148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.renderbufferStorage(target, internal_format, width, height);
155248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "RenderbufferStorage");
155348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
155448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bindRenderbuffer(target, 0);
155548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "BindRenderbuffer");
155648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
155748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
155848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
155948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_1D:
156048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bindTexture(target, name);
156148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture");
156248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
156348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.texImage1D(target, level, internal_format, width, border, format, type, pixels);
156448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error		  = gl.getError();
156548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		function_name = "TexImage1D";
156648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
156748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
156848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
156948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_1D_ARRAY:
157048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_2D:
157148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_RECTANGLE:
157248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bindTexture(target, name);
157348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
157448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture");
157548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
157648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.texImage2D(target, level, internal_format, width, height, border, format, type, pixels);
157748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error		  = gl.getError();
157848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		function_name = "TexImage2D";
157948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
158048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
158148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
158248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_2D_MULTISAMPLE:
158348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bindTexture(target, name);
158448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture");
158548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
158648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.texImage2DMultisample(target, samples, internal_format, width, height, GL_FALSE /* fixedsamplelocation */);
158748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error		  = gl.getError();
158848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		function_name = "TexImage2DMultisample";
158948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
159048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
159148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
159248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
159348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bindTexture(target, name);
159448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture");
159548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
159648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.texImage3DMultisample(target, samples, internal_format, width, height, depth,
159748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 GL_FALSE /* fixedsamplelocation */);
159848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error		  = gl.getError();
159948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		function_name = "TexImage3DMultisample";
160048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
160148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
160248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
160348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_2D_ARRAY:
160448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_3D:
160548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_CUBE_MAP_ARRAY:
160648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bindTexture(target, name);
160748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
160848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture");
160948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
161048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.texImage3D(target, level, internal_format, width, height, depth, border, format, type, pixels);
161148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error		  = gl.getError();
161248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		function_name = "TexImage3D";
161348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
161448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
161548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
161648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_BUFFER:
161748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.genBuffers(1, &out_buf_id);
161848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "GenBuffers");
161948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
162048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bindBuffer(GL_TEXTURE_BUFFER, out_buf_id);
162148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "BindBuffer");
162248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
162348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
162448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLsizei		  size = 16;
162548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLvoid* data = 0;
162648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
162748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (0 != pixels)
162848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
162948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				size = width;
163048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				data = pixels;
163148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
163248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
163348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.bufferData(GL_TEXTURE_BUFFER, size, data, GL_DYNAMIC_COPY);
163448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "BufferData");
163548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
163648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
163748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bindTexture(GL_TEXTURE_BUFFER, name);
163848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture");
163948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
164048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.texBuffer(GL_TEXTURE_BUFFER, internal_format, out_buf_id);
164148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "TexBuffer");
164248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
164348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
164448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
164548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_CUBE_MAP:
164648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
164748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
164848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
164948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
165048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
165148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
165248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Change target to CUBE_MAP, it will be used later to change base and max level */
165348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		target = GL_TEXTURE_CUBE_MAP;
165448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bindTexture(target, name);
165548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture");
165648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
165748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, level, internal_format, width, height, border, format, type,
165848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  pixels);
165948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, level, internal_format, width, height, border, format, type,
166048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  pixels);
166148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, level, internal_format, width, height, border, format, type,
166248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  pixels);
166348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, level, internal_format, width, height, border, format, type,
166448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  pixels);
166548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, level, internal_format, width, height, border, format, type,
166648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  pixels);
166748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, level, internal_format, width, height, border, format, type,
166848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  pixels);
166948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error		  = gl.getError();
167048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		function_name = "TexImage2D";
167148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
167248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
167348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
167448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
167548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Invalid enum");
167648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
167748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
167848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
167948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (GL_NO_ERROR != error)
168048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
168148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		context.getTestContext().getLog()
168248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::Message << "Error: " << glu::getErrorStr(error) << ". Function: " << function_name
168348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ". Target: " << glu::getTextureTargetStr(target)
168448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ". Format: " << glu::getInternalFormatParameterStr(internal_format) << ", "
168548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< glu::getTextureFormatName(format) << ", " << glu::getTypeStr(type) << tcu::TestLog::EndMessage;
168648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Failed to create texture");
168748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
168848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
168948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (GL_RENDERBUFFER != target)
169048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
169148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Clean binding point */
169248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bindTexture(target, 0);
169348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture");
169448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
169548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
169648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
169748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Translate proxies into real targets
169848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
169948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target Target to be converted
170048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
170148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Converted target for proxies, <target> otherwise
170248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
170348087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLenum Utils::transProxyToRealTarget(GLenum target)
170448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
170548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (target)
170648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
170748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_PROXY_TEXTURE_1D:
170848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		target = GL_TEXTURE_1D;
170948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
171048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_PROXY_TEXTURE_1D_ARRAY:
171148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		target = GL_TEXTURE_1D_ARRAY;
171248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
171348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_PROXY_TEXTURE_2D:
171448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		target = GL_TEXTURE_2D;
171548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
171648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_PROXY_TEXTURE_2D_ARRAY:
171748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		target = GL_TEXTURE_2D_ARRAY;
171848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
171948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_PROXY_TEXTURE_2D_MULTISAMPLE:
172048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		target = GL_TEXTURE_2D_MULTISAMPLE;
172148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
172248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY:
172348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		target = GL_TEXTURE_2D_MULTISAMPLE_ARRAY;
172448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
172548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_PROXY_TEXTURE_3D:
172648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		target = GL_TEXTURE_3D;
172748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
172848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_PROXY_TEXTURE_CUBE_MAP:
172948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		target = GL_TEXTURE_CUBE_MAP;
173048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
173148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_PROXY_TEXTURE_CUBE_MAP_ARRAY:
173248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		target = GL_TEXTURE_CUBE_MAP_ARRAY;
173348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
173448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_PROXY_TEXTURE_RECTANGLE:
173548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		target = GL_TEXTURE_RECTANGLE;
173648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
173748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
173848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
173948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
174048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
174148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return target;
174248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
174348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
174448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Translate real targets into binding targets
174548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
174648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target Target to be converted
174748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
174848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Converted target for cube map faces, <target> otherwise
174948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
175048087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLenum Utils::transRealToBindTarget(GLenum target)
175148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
175248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (target)
175348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
175448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
175548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		target = GL_TEXTURE_CUBE_MAP;
175648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
175748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
175848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		target = GL_TEXTURE_CUBE_MAP;
175948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
176048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
176148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		target = GL_TEXTURE_CUBE_MAP;
176248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
176348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
176448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		target = GL_TEXTURE_CUBE_MAP;
176548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
176648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
176748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		target = GL_TEXTURE_CUBE_MAP;
176848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
176948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
177048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		target = GL_TEXTURE_CUBE_MAP;
177148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
177248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
177348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
177448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
177548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
177648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return target;
177748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
177848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
177948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Read value of channel
178048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
178148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T Type used to store channel value
178248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
178348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel   Channel index
178448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel     Pixel data
178548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_value Read value
178648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
178748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <typename T>
178848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid readBaseTypeFromUnsignedChannel(GLuint channel, const GLubyte* pixel, GLdouble& out_value)
178948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
179048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const T max = -1;
179148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
179248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble d_max   = (GLdouble)max;
179348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const T*	   ptr	 = (T*)pixel;
179448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const T		   t_value = ptr[channel];
179548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble d_value = (GLdouble)t_value;
179648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
179748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	out_value = d_value / d_max;
179848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
179948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
180048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Read value of channel
180148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
180248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T Type used to store channel value
180348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
180448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel   Channel index
180548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel     Pixel data
180648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_value Read value
180748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
180848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <typename T>
180948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid readBaseTypeFromSignedChannel(GLuint channel, const GLubyte* pixel, GLdouble& out_value)
181048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
181148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint n_bytes = sizeof(T);
181248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint n_bits  = 8u * n_bytes;
181348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const T		max		= (T)((1u << (n_bits - 1u)) - 1u);
181448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
181548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble d_max   = (GLdouble)max;
181648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const T*	   ptr	 = (T*)pixel;
181748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const T		   t_value = ptr[channel];
181848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble d_value = (GLdouble)t_value;
181948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
182048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	out_value = d_value / d_max;
182148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
182248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
182348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Read value of channel
182448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
182548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T Type used to store channel value
182648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
182748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel   Channel index
182848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel     Pixel data
182948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_value Read value
183048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
183148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid readBaseTypeFromFloatChannel(GLuint channel, const GLubyte* pixel, GLdouble& out_value)
183248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
183348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLfloat* ptr	 = (const GLfloat*)pixel;
183448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLfloat  t_value = ptr[channel];
183548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble d_value = (GLdouble)t_value;
183648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
183748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	out_value = d_value;
183848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
183948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
184048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Read value of channel
184148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
184248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T Type used to store channel value
184348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
184448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel   Channel index
184548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel     Pixel data
184648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_value Read value
184748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
184848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid readBaseTypeFromHalfFloatChannel(GLuint channel, const GLubyte* pixel, GLdouble& out_value)
184948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
185048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const deUint16* ptr  = (const deUint16*)pixel;
185148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const deUint16  bits = ptr[channel];
185248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	tcu::Float16	val(bits);
185348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble  d_value = val.asDouble();
185448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
185548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	out_value = d_value;
185648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
185748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
185848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Read value of channel
185948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
186048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T      Type used to store pixel
186148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_1 Size of channel in bits
186248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_2 Size of channel in bits
186348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_3 Size of channel in bits
186448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_1  Offset of channel in bits
186548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_2  Offset of channel in bits
186648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_3  Offset of channel in bits
186748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
186848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel   Channel index
186948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel     Pixel data
187048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_value Read value
187148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
187248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <typename T, unsigned int size_1, unsigned int size_2, unsigned int size_3, unsigned int off_1,
187348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		  unsigned int off_2, unsigned int off_3>
187448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid read3Channel(GLuint channel, const GLubyte* pixel, GLdouble& out_value)
187548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
187648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T		 mask	= 0;
187748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T		 max	 = 0;
187848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T		 off	 = 0;
187948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const T* ptr	 = (T*)pixel;
188048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T		 result  = 0;
188148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const T  t_value = ptr[0];
188248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
188348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const T max_1 = (1 << size_1) - 1;
188448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const T max_2 = (1 << size_2) - 1;
188548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const T max_3 = (1 << size_3) - 1;
188648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
188748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (channel)
188848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
188948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 0:
189048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		mask = max_1;
189148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		max  = max_1;
189248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		off  = off_1;
189348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
189448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 1:
189548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		mask = max_2;
189648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		max  = max_2;
189748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		off  = off_2;
189848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
189948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 2:
190048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		mask = max_3;
190148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		max  = max_3;
190248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		off  = off_3;
190348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
190448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
190548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Invalid channel");
190648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
190748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
190848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
190948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	result = (T)((t_value >> off) & mask);
191048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
191148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble d_max   = (GLdouble)max;
191248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble d_value = (GLdouble)result;
191348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
191448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	out_value = d_value / d_max;
191548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
191648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
191748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Read value of channel
191848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
191948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T      Type used to store pixel
192048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_1 Size of channel in bits
192148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_2 Size of channel in bits
192248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_3 Size of channel in bits
192348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_4 Size of channel in bits
192448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_1  Offset of channel in bits
192548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_2  Offset of channel in bits
192648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_3  Offset of channel in bits
192748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_4  Offset of channel in bits
192848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
192948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel   Channel index
193048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel     Pixel data
193148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_value Read value
193248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
193348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <typename T, unsigned int size_1, unsigned int size_2, unsigned int size_3, unsigned int size_4,
193448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		  unsigned int off_1, unsigned int off_2, unsigned int off_3, unsigned int off_4>
193548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid read4Channel(GLuint channel, const GLubyte* pixel, GLdouble& out_value)
193648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
193748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T		 mask	= 0;
193848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T		 max	 = 0;
193948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T		 off	 = 0;
194048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const T* ptr	 = (T*)pixel;
194148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T		 result  = 0;
194248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const T  t_value = ptr[0];
194348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
194448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const T max_1 = (1 << size_1) - 1;
194548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const T max_2 = (1 << size_2) - 1;
194648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const T max_3 = (1 << size_3) - 1;
194748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const T max_4 = (1 << size_4) - 1;
194848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
194948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (channel)
195048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
195148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 0:
195248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		mask = max_1;
195348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		max  = max_1;
195448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		off  = off_1;
195548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
195648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 1:
195748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		mask = max_2;
195848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		max  = max_2;
195948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		off  = off_2;
196048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
196148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 2:
196248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		mask = max_3;
196348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		max  = max_3;
196448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		off  = off_3;
196548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
196648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 3:
196748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		mask = max_4;
196848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		max  = max_4;
196948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		off  = off_4;
197048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
197148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
197248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Invalid channel");
197348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
197448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
197548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
197648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	result = (T)((t_value >> off) & mask);
197748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
197848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble d_max   = (GLdouble)max;
197948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble d_value = (GLdouble)result;
198048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
198148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	out_value = d_value / d_max;
198248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
198348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
198448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Read value of channel
198548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
198648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel   Channel index
198748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel     Pixel data
198848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_value Read value
198948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
199048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid read11F_11F_10F_Channel(GLuint channel, const GLubyte* pixel, GLdouble& out_value)
199148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
199248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const deUint32* ptr = (deUint32*)pixel;
199348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	deUint32		val = *ptr;
199448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
199548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (channel)
199648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
199748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 0:
199848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
199948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		deUint32 bits = (val & 0x000007ff);
200048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		tcu::Float<deUint32, 5, 6, 15, tcu::FLOAT_SUPPORT_DENORM> temp_val(bits);
200148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
200248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_value = temp_val.asDouble();
200348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
200448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	break;
200548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 1:
200648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
200748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		deUint32 bits = ((val >> 11) & 0x000007ff);
200848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		tcu::Float<deUint32, 5, 6, 15, tcu::FLOAT_SUPPORT_DENORM> temp_val(bits);
200948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
201048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_value = temp_val.asDouble();
201148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
201248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	break;
201348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 2:
201448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
201548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		deUint32 bits = ((val >> 22) & 0x000003ff);
201648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		tcu::Float<deUint32, 5, 5, 15, tcu::FLOAT_SUPPORT_DENORM> temp_val(bits);
201748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
201848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_value = temp_val.asDouble();
201948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
202048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	break;
202148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
202248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Invalid channel");
202348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
202448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
202548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
202648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
202748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Write value of channel
202848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
202948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T Type used to store pixel
203048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
203148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index
203248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param value   Value to write
203348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel   Pixel data
203448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
203548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <typename T>
203648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid writeBaseTypeToUnsignedChannel(GLuint channel, GLdouble value, GLubyte* pixel)
203748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
203848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const T max = -1;
203948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
204048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble d_max   = (GLdouble)max;
204148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble d_value = value * d_max;
204248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const T		   t_value = (T)d_value;
204348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
204448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T* ptr = (T*)pixel;
204548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
204648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	ptr[channel] = t_value;
204748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
204848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
204948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Write value of channel
205048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
205148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T Type used to store pixel
205248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
205348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index
205448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param value   Value to write
205548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel   Pixel data
205648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
205748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <typename T>
205848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid writeBaseTypeToSignedChannel(GLuint channel, GLdouble value, GLubyte* pixel)
205948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
206048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint n_bytes = sizeof(T);
206148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint n_bits  = 8u * n_bytes;
206248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const T		max		= (T)((1u << (n_bits - 1u)) - 1u);
206348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
206448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble d_max   = (GLdouble)max;
206548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble d_value = value * d_max;
206648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const T		   t_value = (T)d_value;
206748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
206848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T* ptr = (T*)pixel;
206948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
207048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	ptr[channel] = t_value;
207148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
207248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
207348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Write value of channel
207448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
207548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index
207648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param value   Value to write
207748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel   Pixel data
207848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
207948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid writeBaseTypeToFloatChannel(GLuint channel, GLdouble value, GLubyte* pixel)
208048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
208148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLfloat t_value = (GLfloat)value;
208248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
208348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLfloat* ptr = (GLfloat*)pixel;
208448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
208548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	ptr[channel] = t_value;
208648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
208748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
208848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Write value of channel
208948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
209048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index
209148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param value   Value to write
209248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel   Pixel data
209348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
209448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid writeBaseTypeToHalfFloatChannel(GLuint channel, GLdouble value, GLubyte* pixel)
209548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
209648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	deUint16* ptr = (deUint16*)pixel;
209748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
209848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	tcu::Float16 val(value);
209948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
210048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	ptr[channel] = val.bits();
210148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
210248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
210348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Write value of channel
210448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
210548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T      Type used to store pixel
210648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_1 Size of channel in bits
210748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_2 Size of channel in bits
210848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_3 Size of channel in bits
210948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_1  Offset of channel in bits
211048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_2  Offset of channel in bits
211148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_3  Offset of channel in bits
211248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
211348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index
211448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param value   Value to write
211548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel   Pixel data
211648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
211748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <typename T, unsigned int size_1, unsigned int size_2, unsigned int size_3, unsigned int off_1,
211848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		  unsigned int off_2, unsigned int off_3>
211948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid write3Channel(GLuint channel, GLdouble value, GLubyte* pixel)
212048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
212148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T  mask   = 0;
212248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T  max	= 0;
212348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T  off	= 0;
212448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T* ptr	= (T*)pixel;
212548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T  result = 0;
212648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
212748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const T max_1 = (1 << size_1) - 1;
212848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const T max_2 = (1 << size_2) - 1;
212948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const T max_3 = (1 << size_3) - 1;
213048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
213148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (channel)
213248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
213348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 0:
213448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		mask = max_1;
213548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		max  = max_1;
213648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		off  = off_1;
213748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
213848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 1:
213948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		mask = max_2;
214048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		max  = max_2;
214148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		off  = off_2;
214248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
214348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 2:
214448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		mask = max_3;
214548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		max  = max_3;
214648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		off  = off_3;
214748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
214848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
214948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Invalid channel");
215048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
215148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
215248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
215348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble d_max   = (GLdouble)max;
215448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble d_value = value * d_max;
215548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const T		   t_value = (T)d_value;
215648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
215748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	result = (T)((t_value & mask) << off);
215848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
215948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	*ptr |= result;
216048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
216148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
216248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Write value of channel
216348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
216448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam T      Type used to store pixel
216548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_1 Size of channel in bits
216648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_2 Size of channel in bits
216748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_3 Size of channel in bits
216848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam size_4 Size of channel in bits
216948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_1  Offset of channel in bits
217048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_2  Offset of channel in bits
217148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_3  Offset of channel in bits
217248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @tparam off_4  Offset of channel in bits
217348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
217448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index
217548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param value   Value to write
217648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel   Pixel data
217748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
217848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <typename T, unsigned int size_1, unsigned int size_2, unsigned int size_3, unsigned int size_4,
217948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		  unsigned int off_1, unsigned int off_2, unsigned int off_3, unsigned int off_4>
218048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid write4Channel(GLuint channel, GLdouble value, GLubyte* pixel)
218148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
218248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T  mask   = 0;
218348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T  max	= 0;
218448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T  off	= 0;
218548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T* ptr	= (T*)pixel;
218648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T  result = 0;
218748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
218848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const T max_1 = (1 << size_1) - 1;
218948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const T max_2 = (1 << size_2) - 1;
219048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const T max_3 = (1 << size_3) - 1;
219148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const T max_4 = (1 << size_4) - 1;
219248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
219348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (channel)
219448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
219548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 0:
219648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		mask = max_1;
219748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		max  = max_1;
219848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		off  = off_1;
219948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
220048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 1:
220148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		mask = max_2;
220248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		max  = max_2;
220348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		off  = off_2;
220448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
220548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 2:
220648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		mask = max_3;
220748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		max  = max_3;
220848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		off  = off_3;
220948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
221048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 3:
221148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		mask = max_4;
221248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		max  = max_4;
221348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		off  = off_4;
221448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
221548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
221648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Invalid channel");
221748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
221848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
221948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
222048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble d_max   = (GLdouble)max;
222148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLdouble d_value = value * d_max;
222248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const T		   t_value = (T)d_value;
222348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
222448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	result = (T)((t_value & mask) << off);
222548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
222648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	*ptr |= result;
222748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
222848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
222948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Write value of channel
223048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
223148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index
223248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param value   Value to write
223348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel   Pixel data
223448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
223548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid write11F_11F_10F_Channel(GLuint channel, GLdouble value, GLubyte* pixel)
223648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
223748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	deUint32* ptr = (deUint32*)pixel;
223848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
223948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (channel)
224048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
224148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 0:
224248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
224348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		tcu::Float<deUint32, 5, 6, 15, tcu::FLOAT_SUPPORT_DENORM> val(value);
224448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		deUint32 bits = val.bits();
224548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
224648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		*ptr |= bits;
224748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
224848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	break;
224948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 1:
225048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
225148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		tcu::Float<deUint32, 5, 6, 15, tcu::FLOAT_SUPPORT_DENORM> val(value);
225248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		deUint32 bits = val.bits();
225348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
225448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		*ptr |= (bits << 11);
225548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
225648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	break;
225748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case 2:
225848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
225948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		tcu::Float<deUint32, 5, 5, 15, tcu::FLOAT_SUPPORT_DENORM> val(value);
226048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		deUint32 bits = val.bits();
226148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
226248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		*ptr |= (bits << 22);
226348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
226448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	break;
226548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
226648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Invalid channel");
226748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
226848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
226948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
227048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
227148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Read value of channel
227248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
227348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param type    Type used by pixel
227448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index
227548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel   Pixel data
227648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param value   Read value
227748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
227848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid Utils::readChannel(GLenum type, GLuint channel, const GLubyte* pixel, GLdouble& value)
227948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
228048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (type)
228148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
228248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Base types */
228348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_BYTE:
228448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		readBaseTypeFromUnsignedChannel<GLubyte>(channel, pixel, value);
228548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
228648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_SHORT:
228748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		readBaseTypeFromUnsignedChannel<GLushort>(channel, pixel, value);
228848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
228948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_INT:
229048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		readBaseTypeFromUnsignedChannel<GLuint>(channel, pixel, value);
229148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
229248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_BYTE:
229348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		readBaseTypeFromSignedChannel<GLbyte>(channel, pixel, value);
229448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
229548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_SHORT:
229648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		readBaseTypeFromSignedChannel<GLshort>(channel, pixel, value);
229748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
229848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_INT:
229948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		readBaseTypeFromSignedChannel<GLint>(channel, pixel, value);
230048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
230148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_HALF_FLOAT:
230248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		readBaseTypeFromHalfFloatChannel(channel, pixel, value);
230348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
230448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_FLOAT:
230548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		readBaseTypeFromFloatChannel(channel, pixel, value);
230648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
230748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
230848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Complicated */
230948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 3 channles */
231048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_BYTE_3_3_2:
231148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		read3Channel<GLubyte, 3, 3, 2, 5, 2, 0>(channel, pixel, value);
231248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
231348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_SHORT_5_6_5:
231448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		read3Channel<GLushort, 5, 6, 5, 11, 5, 0>(channel, pixel, value);
231548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
231648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
231748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 4 channels */
231848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_SHORT_4_4_4_4:
231948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		read4Channel<GLushort, 4, 4, 4, 4, 12, 8, 4, 0>(channel, pixel, value);
232048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
232148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_SHORT_5_5_5_1:
232248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		read4Channel<GLushort, 5, 5, 5, 1, 11, 6, 1, 0>(channel, pixel, value);
232348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
232448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_INT_2_10_10_10_REV:
232548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		read4Channel<GLuint, 2, 10, 10, 10, 30, 20, 10, 0>(3 - channel, pixel, value);
232648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
232748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_INT_5_9_9_9_REV:
232848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		read4Channel<GLuint, 5, 9, 9, 9, 27, 18, 9, 0>(3 - channel, pixel, value);
232948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
233048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
233148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* R11F_G11F_B10F - uber complicated */
233248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_INT_10F_11F_11F_REV:
233348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		read11F_11F_10F_Channel(channel, pixel, value);
233448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
233548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
233648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
233748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Invalid enum");
233848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
233948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
234048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
234148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
234248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Write value of channel
234348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
234448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param type    Type used by pixel
234548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param channel Channel index
234648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param value   Value to write
234748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel   Pixel data
234848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
234948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid Utils::writeChannel(GLenum type, GLuint channel, GLdouble value, GLubyte* pixel)
235048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
235148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (type)
235248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
235348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Base types */
235448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_BYTE:
235548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		writeBaseTypeToUnsignedChannel<GLubyte>(channel, value, pixel);
235648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
235748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_SHORT:
235848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		writeBaseTypeToUnsignedChannel<GLushort>(channel, value, pixel);
235948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
236048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_INT:
236148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		writeBaseTypeToUnsignedChannel<GLuint>(channel, value, pixel);
236248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
236348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_BYTE:
236448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		writeBaseTypeToSignedChannel<GLbyte>(channel, value, pixel);
236548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
236648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_SHORT:
236748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		writeBaseTypeToSignedChannel<GLshort>(channel, value, pixel);
236848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
236948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_INT:
237048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		writeBaseTypeToSignedChannel<GLint>(channel, value, pixel);
237148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
237248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_HALF_FLOAT:
237348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		writeBaseTypeToHalfFloatChannel(channel, value, pixel);
237448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
237548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_FLOAT:
237648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		writeBaseTypeToFloatChannel(channel, value, pixel);
237748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
237848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
237948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Complicated */
238048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
238148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 3 channles */
238248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_BYTE_3_3_2:
238348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		write3Channel<GLubyte, 3, 3, 2, 5, 2, 0>(channel, value, pixel);
238448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
238548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_SHORT_5_6_5:
238648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		write3Channel<GLushort, 5, 6, 5, 11, 5, 0>(channel, value, pixel);
238748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
238848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
238948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 4 channels */
239048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_SHORT_4_4_4_4:
239148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		write4Channel<GLushort, 4, 4, 4, 4, 12, 8, 4, 0>(channel, value, pixel);
239248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
239348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_SHORT_5_5_5_1:
239448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		write4Channel<GLushort, 5, 5, 5, 1, 11, 6, 1, 0>(channel, value, pixel);
239548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
239648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_INT_2_10_10_10_REV:
239748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		write4Channel<GLuint, 2, 10, 10, 10, 30, 20, 10, 0>(3 - channel, value, pixel);
239848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
239948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_INT_5_9_9_9_REV:
240048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		write4Channel<GLuint, 5, 9, 9, 9, 27, 18, 9, 0>(3 - channel, value, pixel);
240148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
240248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
240348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* R11F_G11F_B10F - uber complicated */
240448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_UNSIGNED_INT_10F_11F_11F_REV:
240548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		write11F_11F_10F_Channel(channel, value, pixel);
240648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
240748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
240848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
240948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Invalid enum");
241048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
241148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
241248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
241348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
241448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Packs given channels to pixel
241548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
241648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format of image
241748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param type            Type used by image
241848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param red             Red channel
241948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param green           Green channel
242048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param blue            Blue channel
242148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param alpha           Alpha channel
242248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_pixel       Pixel data
242348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
242448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid Utils::packPixel(GLenum internal_format, GLenum type, GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha,
242548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  GLubyte* out_pixel)
242648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
242748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (internal_format)
242848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
242948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8:
243048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8_SNORM:
243148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16:
243248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16F:
243348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16_SNORM:
243448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32F:
243548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8I:
243648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R8UI:
243748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16I:
243848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R16UI:
243948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32I:
244048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R32UI:
244148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		writeChannel(type, 0, red, out_pixel);
244248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
244348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
244448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8:
244548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8_SNORM:
244648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16:
244748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16F:
244848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16_SNORM:
244948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32F:
245048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8I:
245148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG8UI:
245248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16I:
245348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG16UI:
245448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32I:
245548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG32UI:
245648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		writeChannel(type, 0, red, out_pixel);
245748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		writeChannel(type, 1, green, out_pixel);
245848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
245948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
246048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R3_G3_B2:
246148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB4:
246248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB5:
246348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8:
246448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8_SNORM:
246548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB10:
246648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_R11F_G11F_B10F:
246748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB12:
246848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16:
246948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16F:
247048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16_SNORM:
247148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32F:
247248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8I:
247348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB8UI:
247448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16I:
247548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB16UI:
247648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32I:
247748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB32UI:
247848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		writeChannel(type, 0, red, out_pixel);
247948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		writeChannel(type, 1, green, out_pixel);
248048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		writeChannel(type, 2, blue, out_pixel);
248148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
248248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
248348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB9_E5:
248448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA2:
248548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA4:
248648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB5_A1:
248748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8:
248848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8_SNORM:
248948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB10_A2:
249048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA12:
249148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16:
249248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16F:
249348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16_SNORM:
249448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32F:
249548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8I:
249648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA8UI:
249748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB10_A2UI:
249848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16I:
249948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA16UI:
250048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32I:
250148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA32UI:
250248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		writeChannel(type, 0, red, out_pixel);
250348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		writeChannel(type, 1, green, out_pixel);
250448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		writeChannel(type, 2, blue, out_pixel);
250548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		writeChannel(type, 3, alpha, out_pixel);
250648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
250748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
250848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
250948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Invalid enum");
251048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
251148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
251248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
251348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
251448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Unpacks channels from pixel
251548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
251648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param internal_format Internal format of image
251748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param type            Type used by image
251848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixel           Pixel data
251948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param red             Red channel
252048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param green           Green channel
252148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param blue            Blue channel
252248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param alpha           Alpha channel
252348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
252448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid Utils::unpackPixel(GLenum format, GLenum type, const GLubyte* pixel, GLdouble& out_red, GLdouble& out_green,
252548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						GLdouble& out_blue, GLdouble& out_alpha)
252648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
252748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (format)
252848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
252948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RED:
253048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RED_INTEGER:
253148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		readChannel(type, 0, pixel, out_red);
253248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_green = 1.0;
253348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_blue  = 1.0;
253448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_alpha = 1.0;
253548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
253648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG:
253748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RG_INTEGER:
253848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		readChannel(type, 0, pixel, out_red);
253948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		readChannel(type, 1, pixel, out_green);
254048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_blue  = 1.0;
254148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_alpha = 1.0;
254248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
254348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB:
254448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGB_INTEGER:
254548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		switch (type)
254648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
254748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		case GL_UNSIGNED_INT_5_9_9_9_REV:
254848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			readChannel(type, 0, pixel, out_red);
254948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			readChannel(type, 1, pixel, out_green);
255048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			readChannel(type, 2, pixel, out_blue);
255148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			readChannel(type, 3, pixel, out_alpha);
255248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			break;
255348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		default:
255448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			readChannel(type, 0, pixel, out_red);
255548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			readChannel(type, 1, pixel, out_green);
255648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			readChannel(type, 2, pixel, out_blue);
255748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_alpha = 1.0;
255848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			break;
255948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
256048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
256148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA:
256248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case GL_RGBA_INTEGER:
256348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		readChannel(type, 0, pixel, out_red);
256448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		readChannel(type, 1, pixel, out_green);
256548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		readChannel(type, 2, pixel, out_blue);
256648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		readChannel(type, 3, pixel, out_alpha);
256748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
256848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
256948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Invalid enum");
257048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
257148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
257248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
257348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
257448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosinline bool Utils::roundComponent(GLenum internal_format, GLenum component, GLdouble& value)
257548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
257648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	int exponent = (internal_format == GL_RGB4 ? 4 : (internal_format == GL_RGB5 ? 5 : 0));
257748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!exponent)
257848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return false; //Currently this only happens with GL_RGB4 and GL_RGB5 when stored as 565 type.
257948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
258048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	int rounded_value = static_cast<int>(floor((pow(2, exponent) - 1) * value + 0.5));
258148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	int multiplier	= (component == GL_GREEN ? 2 : 1);
258248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (internal_format == GL_RGB4)
258348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
258448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		multiplier *= 2;
258548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
258648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	value = rounded_value * multiplier;
258748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
258848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
258948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
259048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Unpacks pixels and compars them
259148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
259248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_format           Format of left image
259348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_type             Type of left image
259448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_internal_format  Internal format of left image
259548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_pixel            Data of left pixel
259648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_format          Format of right image
259748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_type            Type of right image
259848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_internal_format Internal format of right image
259948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_pixel           Data of right pixel
260048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
260148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if pixels match, false otherwise
260248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
260348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool Utils::unpackAndComaprePixels(GLenum left_format, GLenum left_type, GLenum left_internal_format,
260448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   const GLubyte* left_pixel, GLenum right_format, GLenum right_type,
260548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   GLenum right_internal_format, const GLubyte* right_pixel)
260648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
260748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLdouble left_red;
260848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLdouble left_green;
260948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLdouble left_blue;
261048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLdouble left_alpha;
261148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLdouble right_red;
261248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLdouble right_green;
261348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLdouble right_blue;
261448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLdouble right_alpha;
261548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
261648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unpackPixel(left_format, left_type, left_pixel, left_red, left_green, left_blue, left_alpha);
261748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
261848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	unpackPixel(right_format, right_type, right_pixel, right_red, right_green, right_blue, right_alpha);
261948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
262048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	roundComponent(left_internal_format, GL_RED, left_red);
262148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	roundComponent(left_internal_format, GL_GREEN, left_green);
262248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	roundComponent(left_internal_format, GL_BLUE, left_blue);
262348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
262448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	roundComponent(right_internal_format, GL_RED, right_red);
262548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	roundComponent(right_internal_format, GL_GREEN, right_green);
262648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	roundComponent(right_internal_format, GL_BLUE, right_blue);
262748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
262848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return comparePixels(left_internal_format, left_red, left_green, left_blue, left_alpha, right_internal_format,
262948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						 right_red, right_green, right_blue, right_alpha);
263048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
263148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
263248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* FunctionalTest */
263348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define FUNCTIONAL_TEST_N_LAYERS 12
263448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define FUNCTIONAL_TEST_N_LEVELS 3
263548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
263648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
263748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
263848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context
263948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
264048087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosFunctionalTest::FunctionalTest(deqp::Context& context)
264148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCase(context, "functional", "Test verifies CopySubImageData copy data as requested")
264248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_dst_buf_name(0)
264348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_dst_tex_name(0)
264448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_rb_name(0)
264548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_src_buf_name(0)
264648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_src_tex_name(0)
264748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_test_case_index(0)
264848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
264948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint src_tgt_id = 0; src_tgt_id < s_n_valid_targets; ++src_tgt_id)
265048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
265148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLenum src_target = s_valid_targets[src_tgt_id];
265248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
265348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_TARGETS == 0
265448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if ((GL_TEXTURE_1D == src_target) || (GL_TEXTURE_1D_ARRAY == src_target) || (GL_TEXTURE_2D == src_target) ||
265548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			(GL_TEXTURE_CUBE_MAP == src_target) || (GL_TEXTURE_CUBE_MAP_ARRAY == src_target))
265648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
265748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			continue;
265848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
265948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_TARGETS == 0 */
266048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
266148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint dst_tgt_id = 0; dst_tgt_id < s_n_valid_targets; ++dst_tgt_id)
266248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
266348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLenum dst_target = s_valid_targets[dst_tgt_id];
266448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
266548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_TARGETS == 0
266648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if ((GL_TEXTURE_1D == dst_target) || (GL_TEXTURE_1D_ARRAY == dst_target) || (GL_TEXTURE_2D == dst_target) ||
266748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				(GL_TEXTURE_CUBE_MAP == dst_target) || (GL_TEXTURE_CUBE_MAP_ARRAY == dst_target))
266848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
266948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				continue;
267048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
267148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_TARGETS == 0 */
267248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
267348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Skip render buffer as destination */
267448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (GL_RENDERBUFFER == dst_target)
267548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
267648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				continue;
267748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
267848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
267948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Skip multisampled */
268048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if ((true == Utils::isTargetMultisampled(src_target)) || (true == Utils::isTargetMultisampled(dst_target)))
268148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
268248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				continue;
268348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
268448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
268548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (GLuint src_frmt_id = 0; src_frmt_id < s_n_internal_formats; ++src_frmt_id)
268648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
268748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				const GLenum src_format = s_internal_formats[src_frmt_id];
268848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
268948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (src_format == GL_RGB9_E5 && src_target == GL_RENDERBUFFER)
269048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
269148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					continue;
269248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
269348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
269448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				for (GLuint dst_frmt_id = 0; dst_frmt_id < s_n_internal_formats; ++dst_frmt_id)
269548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
269648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLenum dst_format = s_internal_formats[dst_frmt_id];
269748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
269848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					/* Skip not compatible formats */
269948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					if (false == Utils::areFormatsCompatible(src_format, dst_format))
270048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					{
270148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						continue;
270248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					}
270348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
270448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					prepareTestCases(dst_format, dst_target, src_format, src_target);
270548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
270648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
270748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
270848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
270948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
271048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
271148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test
271248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
271348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise
271448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
271548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult FunctionalTest::iterate()
271648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
271748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLubyte*					 dst_pixels[FUNCTIONAL_TEST_N_LEVELS] = { 0 };
271848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions&			 gl									  = m_context.getRenderContext().getFunctions();
271948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	tcu::TestNode::IterateResult it_result							  = tcu::TestNode::STOP;
272048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool						 result								  = false;
272148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLubyte*					 src_pixels[FUNCTIONAL_TEST_N_LEVELS] = { 0 };
272248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const testCase&				 test_case							  = m_test_cases[m_test_case_index];
272348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
272448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.pixelStorei(GL_PACK_ALIGNMENT, 1);
272548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.pixelStorei(GL_UNPACK_ALIGNMENT, 1);
272648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "PixelStorei");
272748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
272848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
272948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
273048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Prepare pixels */
273148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		prepareDstPxls(test_case.m_dst, dst_pixels);
273248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		prepareSrcPxls(test_case.m_src, test_case.m_dst.m_internal_format, src_pixels);
273348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
273448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Prepare textures */
273548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_dst_tex_name = prepareTexture(test_case.m_dst, (const GLubyte**)dst_pixels, m_dst_buf_name);
273648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
273748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_RENDERBUFFER == test_case.m_src.m_target)
273848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
273948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			targetDesc desc = test_case.m_src;
274048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			desc.m_target   = GL_TEXTURE_2D;
274148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
274248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_rb_name	  = prepareTexture(test_case.m_src, (const GLubyte**)src_pixels, m_src_buf_name);
274348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_src_tex_name = prepareTexture(desc, (const GLubyte**)src_pixels, m_src_buf_name);
274448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
274548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
274648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
274748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_src_tex_name = prepareTexture(test_case.m_src, (const GLubyte**)src_pixels, m_src_buf_name);
274848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
274948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
275048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Copy images and verify results */
275148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = copyAndVerify(test_case, (const GLubyte**)dst_pixels, (const GLubyte**)src_pixels);
275248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
275348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (tcu::Exception& exc)
275448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
275548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		clean();
275648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		cleanPixels((GLubyte**)dst_pixels);
275748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		cleanPixels((GLubyte**)src_pixels);
275848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw exc;
275948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
276048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
276148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Free resources */
276248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	clean();
276348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	cleanPixels((GLubyte**)dst_pixels);
276448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	cleanPixels((GLubyte**)src_pixels);
276548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
276648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set result */
276748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (true == result)
276848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
276948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass");
277048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
277148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Increase index */
277248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_case_index += 1;
277348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
277448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Are there any test cases left */
277548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (m_test_cases.size() > m_test_case_index)
277648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
277748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			it_result = tcu::TestNode::CONTINUE;
277848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
277948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
278048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
278148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
278248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().getLog() << tcu::TestLog::Message << "Failure. " << tcu::TestLog::EndMessage;
278348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
278448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail");
278548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
278648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
278748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Done */
278848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return it_result;
278948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
279048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
279148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Calculate dimmensions of all levels based on size of specific level
279248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
279348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param target      Target of image
279448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param level       Level index
279548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param width       Width of image at <level>
279648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param height      Height of image at <level>
279748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_widths  Calcualted widths, array of FUNCTIONAL_TEST_N_LEVELS'th elements
279848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_heights Calculated heights, array of FUNCTIONAL_TEST_N_LEVELS'th elements
279948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_depths  Calculated dephts, array of FUNCTIONAL_TEST_N_LEVELS'th elements
280048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
280148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::calculateDimmensions(GLenum target, GLuint level, GLuint width, GLuint height, GLuint* out_widths,
280248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										  GLuint* out_heights, GLuint* out_depths) const
280348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
280448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint		 divide = 100;
280548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint		 factors[FUNCTIONAL_TEST_N_LEVELS];
280648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint		 factor			= divide;
280748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const bool   is_multi_layer = Utils::isTargetMultilayer(target);
280848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint n_layers		= (true == is_multi_layer) ? FUNCTIONAL_TEST_N_LAYERS : 1;
280948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
281048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLint i = (GLint)level; i >= 0; --i)
281148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
281248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		factors[i] = factor;
281348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		factor *= 2;
281448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
281548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
281648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	factor = divide / 2;
281748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint i = level + 1; i < FUNCTIONAL_TEST_N_LEVELS; ++i)
281848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
281948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		factors[i] = factor;
282048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		factor /= 2;
282148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
282248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
282348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint i = 0; i < FUNCTIONAL_TEST_N_LEVELS; ++i)
282448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
282548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_widths[i]  = width * factors[i] / divide;
282648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_heights[i] = height * factors[i] / divide;
282748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
282848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_TEXTURE_3D == target)
282948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
283048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_depths[i] = FUNCTIONAL_TEST_N_LAYERS * factors[i] / divide;
283148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
283248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
283348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
283448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			out_depths[i] = n_layers;
283548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
283648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
283748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
283848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
283948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute copyImageSubData for given test case and verify results
284048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
284148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param test_case  Test case
284248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param dst_pixels Data of destination image
284348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param src_pixels Data of source image
284448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
284548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if there is no error and results match expectations, false otherwise
284648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
284748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool FunctionalTest::copyAndVerify(const testCase& test_case, const GLubyte** dst_pixels, const GLubyte** src_pixels)
284848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
284948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLenum			 error				= GL_NO_ERROR;
285048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions& gl					= m_context.getRenderContext().getFunctions();
285148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint			 region_depth		= 1;
285248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint			 dst_layer_step		= 0;
285348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const bool		 is_dst_multi_layer = Utils::isTargetMultilayer(test_case.m_dst.m_target);
285448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const bool		 is_src_multi_layer = Utils::isTargetMultilayer(test_case.m_src.m_target);
285548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool			 result				= false;
285648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint			 src_layer_step		= 0;
285748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint			 n_layers			= 1;
285848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
285948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Configure layers */
286048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if ((true == is_dst_multi_layer) || (true == is_src_multi_layer))
286148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
286248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (is_src_multi_layer == is_dst_multi_layer)
286348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
286448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Both objects are multilayered, copy all layers at once, verify at once */
286548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			region_depth = FUNCTIONAL_TEST_N_LAYERS;
286648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
286748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else if (true == is_dst_multi_layer)
286848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
286948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Destination is multilayered, copy each layer separetly, verify at once */
287048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			n_layers	   = FUNCTIONAL_TEST_N_LAYERS;
287148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			dst_layer_step = 1;
287248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
287348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
287448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
287548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Destination is multilayered, copy and verify each layer separetly */
287648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			n_layers	   = FUNCTIONAL_TEST_N_LAYERS;
287748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			src_layer_step = 1;
287848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
287948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
288048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
288148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Copy and verification */
288248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
288348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLuint dst_layer = 0;
288448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLuint src_layer = 0;
288548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
288648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* For each layer */
288748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint layer = 0; layer < n_layers; ++layer)
288848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
288948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (0 == m_rb_name)
289048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
289148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				gl.copyImageSubData(m_src_tex_name, test_case.m_src.m_target, test_case.m_src.m_level,
289248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									test_case.m_src_x, test_case.m_src_y, src_layer, m_dst_tex_name,
289348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									test_case.m_dst.m_target, test_case.m_dst.m_level, test_case.m_dst_x,
289448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									test_case.m_dst_y, dst_layer, test_case.m_width, test_case.m_height, region_depth);
289548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
289648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			else /* Copy from src to rb and from rb to dst */
289748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
289848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* Src and rb shares differs only on target */
289948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				gl.copyImageSubData(m_src_tex_name, GL_TEXTURE_2D, test_case.m_src.m_level, test_case.m_src_x,
290048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									test_case.m_src_y, src_layer, m_rb_name, test_case.m_src.m_target,
290148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									test_case.m_src.m_level, test_case.m_src_x, test_case.m_src_y, src_layer,
290248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									test_case.m_width, test_case.m_height, region_depth);
290348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
290448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				gl.copyImageSubData(m_rb_name, test_case.m_src.m_target, test_case.m_src.m_level, test_case.m_src_x,
290548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									test_case.m_src_y, src_layer, m_dst_tex_name, test_case.m_dst.m_target,
290648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									test_case.m_dst.m_level, test_case.m_dst_x, test_case.m_dst_y, dst_layer,
290748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									test_case.m_width, test_case.m_height, region_depth);
290848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
290948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
291048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Verify generated error */
291148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			error = gl.getError();
291248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
291348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (GL_NO_ERROR == error)
291448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
291548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* Verify copy results */
291648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				result = verify(test_case, dst_layer, dst_pixels, src_layer, src_pixels, region_depth);
291748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
291848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
291948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if ((GL_NO_ERROR != error) || (false == result))
292048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
292148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				m_context.getTestContext().getLog()
292248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< tcu::TestLog::Message
292348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< "Failure. Targets src: " << glu::getTextureTargetStr(test_case.m_src.m_target)
292448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< ", dst: " << glu::getTextureTargetStr(test_case.m_dst.m_target)
292548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< ". Levels src: " << test_case.m_src.m_level << ", dst: " << test_case.m_dst.m_level
292648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< ". Dimmensions src [" << test_case.m_src.m_width << ", " << test_case.m_src.m_height
292748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< "], dst [" << test_case.m_dst.m_width << ", " << test_case.m_dst.m_height << "]. Region ["
292848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< test_case.m_width << " x " << test_case.m_height << " x " << region_depth << "] from ["
292948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< test_case.m_src_x << ", " << test_case.m_src_y << ", " << src_layer << "] to ["
293048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< test_case.m_dst_x << ", " << test_case.m_dst_y << ", " << dst_layer
293148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< "]. Format src: " << glu::getInternalFormatParameterStr(test_case.m_src.m_internal_format)
293248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< ", dst: " << glu::getInternalFormatParameterStr(test_case.m_dst.m_internal_format)
293348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< tcu::TestLog::EndMessage;
293448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
293548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (GL_NO_ERROR != error)
293648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
293748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_context.getTestContext().getLog() << tcu::TestLog::Message
293848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														<< "Failed due to error: " << glu::getErrorStr(error)
293948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														<< tcu::TestLog::EndMessage;
294048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
294148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					TCU_FAIL("Copy operation failed");
294248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
294348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
294448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return false;
294548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
294648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
294748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Step one layer */
294848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			dst_layer += dst_layer_step;
294948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			src_layer += src_layer_step;
295048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
295148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
295248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
295348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
295448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
295548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
295648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources
295748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
295848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
295948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::clean()
296048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
296148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions& gl = m_context.getRenderContext().getFunctions();
296248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
296348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Clean textures and buffers. Errors ignored */
296448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteTextures(1, &m_dst_tex_name);
296548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteTextures(1, &m_src_tex_name);
296648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
296748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_dst_tex_name = 0;
296848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_src_tex_name = 0;
296948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
297048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 != m_dst_buf_name)
297148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
297248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &m_dst_buf_name);
297348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_dst_buf_name = 0;
297448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
297548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
297648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 != m_rb_name)
297748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
297848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteRenderbuffers(1, &m_rb_name);
297948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_rb_name = 0;
298048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
298148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
298248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 != m_src_buf_name)
298348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
298448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &m_src_buf_name);
298548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_src_buf_name = 0;
298648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
298748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
298848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
298948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Free memory allocated for images
299048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
299148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixels Array of pointers to image data
299248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
299348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::cleanPixels(GLubyte** pixels) const
299448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
299548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint i = 0; i < FUNCTIONAL_TEST_N_LEVELS; ++i)
299648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
299748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (0 != pixels[i])
299848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
299948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			delete[] pixels[i];
300048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			pixels[i] = 0;
300148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
300248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
300348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
300448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
300548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Compare two images
300648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_desc     Descriptor of left image
300748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_data     Data of left image
300848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_x        X of left image
300948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_y        Y of left image
301048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_layer    Layer of left image
301148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_level    Level of left image
301248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_desc    Descriptor of right image
301348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_data    Data of right image
301448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_x       X of right image
301548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_y       Y of right image
301648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_layer   Layer of right image
301748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_level   Level of right image
301848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param region_width  Width of region to compare
301948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param region_height Height of region to compare
302048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
302148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if images are considered idenctial, false otherwise
302248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
302348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool FunctionalTest::compareImages(const targetDesc& left_desc, const GLubyte* left_data, GLuint left_x, GLuint left_y,
302448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   GLuint left_layer, GLuint left_level, const targetDesc& right_desc,
302548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   const glw::GLubyte* right_data, GLuint right_x, GLuint right_y, GLuint right_layer,
302648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   GLuint right_level, GLuint region_width, GLuint region_height) const
302748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
302848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Get level dimmensions */
302948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint left_heights[FUNCTIONAL_TEST_N_LEVELS];
303048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint left_widths[FUNCTIONAL_TEST_N_LEVELS];
303148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint left_depths[FUNCTIONAL_TEST_N_LEVELS];
303248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint right_heights[FUNCTIONAL_TEST_N_LEVELS];
303348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint right_widths[FUNCTIONAL_TEST_N_LEVELS];
303448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint right_depths[FUNCTIONAL_TEST_N_LEVELS];
303548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
303648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	calculateDimmensions(left_desc.m_target, left_desc.m_level, left_desc.m_width, left_desc.m_height, left_widths,
303748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						 left_heights, left_depths);
303848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
303948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	calculateDimmensions(right_desc.m_target, right_desc.m_level, right_desc.m_width, right_desc.m_height, right_widths,
304048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						 right_heights, right_depths);
304148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
304248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Constants */
304348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Dimmensions */
304448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint left_height  = left_heights[left_level];
304548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint left_width   = left_widths[left_level];
304648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint right_height = right_heights[right_level];
304748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint right_width  = right_widths[right_level];
304848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Sizes */
304948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint left_pixel_size  = Utils::getPixelSizeForFormat(left_desc.m_internal_format);
305048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint left_line_size   = left_pixel_size * left_width;
305148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint left_layer_size  = left_line_size * left_height;
305248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint right_pixel_size = Utils::getPixelSizeForFormat(right_desc.m_internal_format);
305348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint right_line_size  = right_pixel_size * right_width;
305448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint right_layer_size = right_line_size * right_height;
305548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
305648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Offsets */
305748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint left_layer_offset	 = left_layer_size * left_layer;
305848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint left_reg_line_offset  = left_line_size * left_y;
305948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint left_reg_pix_offset   = left_pixel_size * left_x;
306048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint right_layer_offset	= right_layer_size * right_layer;
306148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint right_reg_line_offset = right_line_size * right_y;
306248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint right_reg_pix_offset  = right_pixel_size * right_x;
306348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
306448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Pointers */
306548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLubyte* left_layer_data  = left_data + left_layer_offset;
306648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLubyte* right_layer_data = right_data + right_layer_offset;
306748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
306848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* For each line of region */
306948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint y = 0; y < region_height; ++y)
307048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
307148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Offsets */
307248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLuint left_line_offset  = left_reg_line_offset + y * left_line_size;
307348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLuint right_line_offset = right_reg_line_offset + y * right_line_size;
307448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
307548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Pointers */
307648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLubyte* left_line_data  = left_layer_data + left_line_offset;
307748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLubyte* right_line_data = right_layer_data + right_line_offset;
307848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
307948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* For each pixel of region */
308048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint x = 0; x < region_width; ++x)
308148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
308248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Offsets */
308348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLuint left_pixel_offset  = left_reg_pix_offset + x * left_pixel_size;
308448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLuint right_pixel_offset = right_reg_pix_offset + x * right_pixel_size;
308548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
308648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Pointers */
308748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLubyte* left_pixel_data  = left_line_data + left_pixel_offset;
308848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLubyte* right_pixel_data = right_line_data + right_pixel_offset;
308948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
309048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Compare */
309148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (false == Utils::comparePixels(left_pixel_size, left_pixel_data, right_pixel_size, right_pixel_data,
309248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos											  left_desc.m_internal_format))
309348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
309448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (false == Utils::unpackAndComaprePixels(left_desc.m_format, left_desc.m_type,
309548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														   left_desc.m_internal_format, left_pixel_data,
309648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														   right_desc.m_format, right_desc.m_type,
309748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														   right_desc.m_internal_format, right_pixel_data))
309848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
309948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_context.getTestContext().getLog()
310048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< tcu::TestLog::Message << "Not matching pixels found. Left: [" << x + left_x << ", "
310148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< y + left_y << ", " << left_layer << "] lvl:" << left_level
310248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< ", off: " << left_pixel_data - left_data
310348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< ", data: " << Utils::getPixelString(left_desc.m_internal_format, left_pixel_data)
310448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< ". Right: [" << x + right_x << ", " << y + right_y << ", " << right_layer
310548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< "] lvl: " << right_level << ", off: " << right_pixel_data - right_data
310648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< ", data: " << Utils::getPixelString(right_desc.m_internal_format, right_pixel_data)
310748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< tcu::TestLog::EndMessage;
310848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
310948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					return false;
311048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
311148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
311248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
311348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
311448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
311548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
311648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
311748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
311848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Prepare regions that should not be modified during test case
311948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
312048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param test_case     Test case descriptor
312148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param dst_level     Level of destination image
312248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_regions   Number of regions
312348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_n_regions Regions
312448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
312548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::getCleanRegions(const testCase& test_case, GLuint dst_level, GLuint out_regions[4][4],
312648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									 GLuint& out_n_regions) const
312748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
312848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint dst_heights[FUNCTIONAL_TEST_N_LEVELS];
312948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint dst_widths[FUNCTIONAL_TEST_N_LEVELS];
313048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint dst_depths[FUNCTIONAL_TEST_N_LEVELS];
313148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
313248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	out_n_regions = 0;
313348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
313448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	calculateDimmensions(test_case.m_dst.m_target, dst_level, test_case.m_dst.m_width, test_case.m_dst.m_height,
313548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						 dst_widths, dst_heights, dst_depths);
313648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
313748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Constants */
313848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Copied region */
313948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint reg_x = test_case.m_dst_x;
314048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint reg_y = test_case.m_dst_y;
314148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint reg_w = test_case.m_width;
314248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint reg_h = test_case.m_height;
314348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint reg_r = reg_x + reg_w;
314448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint reg_t = reg_y + reg_h;
314548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
314648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Image */
314748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint img_w = dst_widths[dst_level];
314848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint img_h = dst_heights[dst_level];
314948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
315048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Bottom row */
315148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 != reg_y)
315248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
315348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_regions[out_n_regions][0] = 0;
315448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_regions[out_n_regions][1] = 0;
315548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_regions[out_n_regions][2] = img_w;
315648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_regions[out_n_regions][3] = reg_y;
315748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_n_regions += 1;
315848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
315948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
316048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left edge */
316148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 != reg_x)
316248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
316348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_regions[out_n_regions][0] = 0;
316448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_regions[out_n_regions][1] = reg_y;
316548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_regions[out_n_regions][2] = reg_x;
316648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_regions[out_n_regions][3] = reg_h;
316748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_n_regions += 1;
316848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
316948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
317048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Right edge */
317148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (img_w != reg_r)
317248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
317348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_regions[out_n_regions][0] = reg_r;
317448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_regions[out_n_regions][1] = reg_y;
317548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_regions[out_n_regions][2] = img_w - reg_r;
317648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_regions[out_n_regions][3] = reg_h;
317748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_n_regions += 1;
317848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
317948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
318048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Top row */
318148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (img_h != reg_t)
318248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
318348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_regions[out_n_regions][0] = 0;
318448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_regions[out_n_regions][1] = reg_t;
318548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_regions[out_n_regions][2] = img_w;
318648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_regions[out_n_regions][3] = img_h - reg_t;
318748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_n_regions += 1;
318848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
318948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
319048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
319148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Get pixel data for image
319248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
319348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param name       Name of image
319448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param desc       Descriptor of image
319548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param level      Level to capture
319648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_pixels Pixels
319748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
319848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::getPixels(GLuint name, const targetDesc& desc, GLuint level, GLubyte* out_pixels) const
319948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
320048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions& gl = m_context.getRenderContext().getFunctions();
320148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
320248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindTexture(desc.m_target, name);
320348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture");
320448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
320548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.getTexImage(desc.m_target, level, desc.m_format, desc.m_type, out_pixels);
320648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "GetTexImage");
320748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
320848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindTexture(desc.m_target, 0);
320948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture");
321048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
321148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
321248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Prepare data for destination image
321348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
321448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param desc       Descriptor
321548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_pixels Array of pointer to image data
321648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
321748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::prepareDstPxls(const FunctionalTest::targetDesc& desc, GLubyte** out_pixels) const
321848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
321948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLenum internal_format = desc.m_internal_format;
322048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const bool   is_multi_level  = Utils::isTargetMultilevel(desc.m_target);
322148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint		 n_levels		 = 1;
322248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint pixel_size		 = Utils::getPixelSizeForFormat(desc.m_internal_format);
322348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLenum type			 = desc.m_type;
322448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
322548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Configure levels */
322648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (true == is_multi_level)
322748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
322848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		n_levels = FUNCTIONAL_TEST_N_LEVELS;
322948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
323048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
323148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Calculate dimmensions */
323248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint heights[FUNCTIONAL_TEST_N_LEVELS];
323348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint widths[FUNCTIONAL_TEST_N_LEVELS];
323448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint depths[FUNCTIONAL_TEST_N_LEVELS];
323548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
323648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	calculateDimmensions(desc.m_target, desc.m_level, desc.m_width, desc.m_height, widths, heights, depths);
323748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
323848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Prepare storage */
323948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint i = 0; i < n_levels; ++i)
324048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
324148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLuint req_memory_per_layer = pixel_size * widths[i] * heights[i];
324248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLuint req_memory_for_level = req_memory_per_layer * depths[i];
324348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
324448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_pixels[i] = new GLubyte[req_memory_for_level];
324548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
324648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (0 == out_pixels[i])
324748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
324848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			TCU_FAIL("Memory allocation failed");
324948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
325048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
325148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		memset(out_pixels[i], 0, req_memory_for_level);
325248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
325348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
325448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Fill pixels */
325548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint i = 0; i < n_levels; ++i)
325648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
325748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLuint n_layers = depths[i];
325848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLuint n_pixels = widths[i] * heights[i];
325948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLubyte*	 ptr	  = (GLubyte*)out_pixels[i];
326048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
326148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint j = 0; j < n_pixels * n_layers; ++j)
326248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
326348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLubyte* pixel_data = ptr + j * pixel_size;
326448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
326548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			Utils::packPixel(internal_format, type, 1.0, 1.0, 1.0, 1.0, pixel_data);
326648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
326748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
326848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
326948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
327048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Prepare data for source image
327148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
327248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param desc                Descriptor
327348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param dst_internal_format Internal format of destination image
327448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_pixels          Array of pointer to image data
327548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
327648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::prepareSrcPxls(const FunctionalTest::targetDesc& desc, GLenum /* dst_internal_format */,
327748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									GLubyte**						  out_pixels) const
327848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
327948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLenum internal_format = desc.m_internal_format;
328048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const bool   is_multi_level  = Utils::isTargetMultilevel(desc.m_target);
328148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint		 n_levels		 = 1;
328248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint pixel_size		 = Utils::getPixelSizeForFormat(desc.m_internal_format);
328348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLenum type			 = desc.m_type;
328448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
328548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Configure levels */
328648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (true == is_multi_level)
328748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
328848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		n_levels = FUNCTIONAL_TEST_N_LEVELS;
328948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
329048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
329148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Calculate dimmensions */
329248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint heights[FUNCTIONAL_TEST_N_LEVELS];
329348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint widths[FUNCTIONAL_TEST_N_LEVELS];
329448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint depths[FUNCTIONAL_TEST_N_LEVELS];
329548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
329648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	calculateDimmensions(desc.m_target, desc.m_level, desc.m_width, desc.m_height, widths, heights, depths);
329748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
329848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Prepare storage */
329948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint i = 0; i < n_levels; ++i)
330048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
330148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLuint req_memory_per_layer = pixel_size * widths[i] * heights[i];
330248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLuint req_memory_for_level = req_memory_per_layer * depths[i];
330348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
330448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		out_pixels[i] = new GLubyte[req_memory_for_level];
330548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
330648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (0 == out_pixels[i])
330748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
330848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			TCU_FAIL("Memory allocation failed");
330948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
331048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
331148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		memset(out_pixels[i], 0, req_memory_for_level);
331248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
331348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
331448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint lvl = 0; lvl < n_levels; ++lvl)
331548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
331648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLuint n_layers			  = depths[lvl];
331748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLuint line_size			  = pixel_size * widths[lvl];
331848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLuint req_memory_per_layer = line_size * heights[lvl];
331948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLubyte*	 level				  = (GLubyte*)out_pixels[lvl];
332048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
332148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint lay = 0; lay < n_layers; ++lay)
332248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
332348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLuint layer_offset = lay * req_memory_per_layer;
332448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
332548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLubyte* layer = ((GLubyte*)level) + layer_offset;
332648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
332748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (GLuint y = 0; y < heights[lvl]; ++y)
332848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
332948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				const GLuint line_offset = line_size * y;
333048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
333148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				GLubyte* line = layer + line_offset;
333248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
333348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				for (GLuint x = 0; x < widths[lvl]; ++x)
333448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
333548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLuint pixel_offset = x * pixel_size;
333648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
333748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					GLubyte* pixel = line + pixel_offset;
333848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
333948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					/* 255 is max ubyte. 1/15.9375 = 16/255 */
334048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLdouble red   = ((GLdouble)x) / 255.0 + (((GLdouble)y) / 15.9375);
334148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLdouble green = ((GLdouble)lay) / 255.0 + (((GLdouble)lvl) / 15.9375);
334248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLdouble blue  = 0.125;
334348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLdouble alpha = 1.0; /* This value has special meaning for some internal_formats */
334448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
334548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					Utils::packPixel(internal_format, type, red, green, blue, alpha, pixel);
334648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
334748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
334848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
334948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
335048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
335148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
335248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Prepare test cases for given targets and internal formats
335348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
335448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param dst_internal_format Internal format of destination image
335548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param dst_target          Target of destination image
335648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param src_internal_format Internal format of source image
335748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param src_target          Target of source image
335848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
335948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::prepareTestCases(GLenum dst_internal_format, GLenum dst_target, GLenum src_internal_format,
336048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  GLenum src_target)
336148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
336248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint image_dimmensions[] = {
336348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		7,
336448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_IMG_DIM
336548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		8,
336648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		9,
336748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		10,
336848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		11,
336948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		12,
337048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		13,
337148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		14,
337248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_IMG_DIM */
337348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		15
337448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	};
337548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
337648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint region_dimmensions[] = {
337748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		1,
337848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_DIM
337948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		2,
338048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		3,
338148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		4,
338248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		5,
338348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		6,
338448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_DIM */
338548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		7
338648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	};
338748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
338848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint n_image_dimmensions  = sizeof(image_dimmensions) / sizeof(image_dimmensions[0]);
338948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint n_region_dimmensions = sizeof(region_dimmensions) / sizeof(region_dimmensions[0]);
339048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
339148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const bool   is_dst_multi_level = Utils::isTargetMultilevel(dst_target);
339248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const bool   is_src_multi_level = Utils::isTargetMultilevel(src_target);
339348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLenum dst_format			= Utils::getFormat(dst_internal_format);
339448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint dst_n_levels		= (true == is_dst_multi_level) ? FUNCTIONAL_TEST_N_LEVELS : 1;
339548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLenum dst_type			= Utils::getType(dst_internal_format);
339648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLenum src_format			= Utils::getFormat(src_internal_format);
339748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint src_n_levels		= (true == is_src_multi_level) ? FUNCTIONAL_TEST_N_LEVELS : 1;
339848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLenum src_type			= Utils::getType(src_internal_format);
339948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
340048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint src_level = 0; src_level < src_n_levels; ++src_level)
340148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
340248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint dst_level = 0; dst_level < dst_n_levels; ++dst_level)
340348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
340448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (GLuint src_img_dim_id = 0; src_img_dim_id < n_image_dimmensions; ++src_img_dim_id)
340548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
340648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				const GLuint src_image_dimmension = image_dimmensions[src_img_dim_id];
340748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
340848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				for (GLuint dst_img_dim_id = 0; dst_img_dim_id < n_image_dimmensions; ++dst_img_dim_id)
340948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
341048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLuint dst_image_dimmension = image_dimmensions[dst_img_dim_id];
341148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
341248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					for (GLuint reg_dim_id = 0; reg_dim_id < n_region_dimmensions; ++reg_dim_id)
341348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					{
341448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						const GLuint region_dimmension = region_dimmensions[reg_dim_id];
341548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						GLuint		 dst_coord[3]	  = { 0, 0, 0 };
341648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						const GLuint dst_dim_diff	  = dst_image_dimmension - region_dimmension;
341748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						GLuint		 n_dst_coords	  = 1;
341848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS
341948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						GLuint n_src_coords = 1;
342048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS */
342148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						GLuint		 src_coord[3] = { 0, 0, 0 };
342248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						const GLuint src_dim_diff = src_image_dimmension - region_dimmension;
342348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
342448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						/* Calculate coords */
342548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						if (1 == dst_dim_diff)
342648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						{
342748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							dst_coord[1] = 1;
342848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							n_dst_coords = 2;
342948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						}
343048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						else if (1 < dst_dim_diff)
343148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						{
343248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							dst_coord[1] = dst_dim_diff / 2;
343348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							dst_coord[2] = dst_dim_diff;
343448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							n_dst_coords = 3;
343548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						}
343648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
343748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						if (1 == src_dim_diff)
343848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						{
343948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							src_coord[1] = 1;
344048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS
344148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							n_src_coords = 2;
344248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS */
344348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						}
344448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						else if (1 < src_dim_diff)
344548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						{
344648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							src_coord[1] = src_dim_diff / 2;
344748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							src_coord[2] = src_dim_diff;
344848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS
344948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							n_src_coords = 3;
345048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS */
345148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						}
345248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
345348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						testCase test_case = {
345448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							{									/* m_dst */
345548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  dst_target, dst_image_dimmension, /* width */
345648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  dst_image_dimmension,				/* height */
345748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  dst_level, dst_internal_format, dst_format, dst_type },
345848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							0,									/* dst_x */
345948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							0,									/* dst_y */
346048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							{									/* m_src */
346148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  src_target, src_image_dimmension, /* width */
346248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  src_image_dimmension,				/* height */
346348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  src_level, src_internal_format, src_format, src_type },
346448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							0,				   /* src_x */
346548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							0,				   /* src_y */
346648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							region_dimmension, /* width */
346748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							region_dimmension, /* height */
346848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						};
346948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
347048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS
347148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						for (GLuint src_x = 0; src_x < n_src_coords; ++src_x)
347248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						{
347348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							for (GLuint src_y = 0; src_y < n_src_coords; ++src_y)
347448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							{
347548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								for (GLuint dst_x = 0; dst_x < n_dst_coords; ++dst_x)
347648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								{
347748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									for (GLuint dst_y = 0; dst_y < n_dst_coords; ++dst_y)
347848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									{
347948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										test_case.m_dst_x = dst_coord[dst_x];
348048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										test_case.m_dst_y = dst_coord[dst_y];
348148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										test_case.m_src_x = src_coord[src_x];
348248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										test_case.m_src_y = src_coord[src_y];
348348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
348448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										m_test_cases.push_back(test_case);
348548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									}
348648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								}
348748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							}
348848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						}
348948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#else  /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS */
349048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						test_case.m_dst_x = dst_coord[n_dst_coords - 1];
349148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						test_case.m_dst_y = dst_coord[n_dst_coords - 1];
349248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						test_case.m_src_x = src_coord[0];
349348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						test_case.m_src_y = src_coord[0];
349448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
349548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						m_test_cases.push_back(test_case);
349648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif /* COPY_IMAGE_FUNCTIONAL_TEST_ENABLE_ALL_REG_POS */
349748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
349848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						/* Whole image, for non 7x7 */
349948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						if ((dst_image_dimmension == src_image_dimmension) &&
350048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							(image_dimmensions[0] != dst_image_dimmension))
350148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						{
350248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							test_case.m_dst_x  = 0;
350348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							test_case.m_dst_y  = 0;
350448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							test_case.m_src_x  = 0;
350548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							test_case.m_src_y  = 0;
350648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							test_case.m_width  = dst_image_dimmension;
350748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							test_case.m_height = dst_image_dimmension;
350848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
350948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							m_test_cases.push_back(test_case);
351048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						}
351148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					}
351248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
351348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
351448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
351548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
351648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
351748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
351848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Prepare texture
351948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
352048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param desc       Descriptor
352148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixels     Image data
352248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_buf_id Id of buffer used by texture buffer
352348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
352448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Name of iamge
352548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
352648087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLuint FunctionalTest::prepareTexture(const targetDesc& desc, const GLubyte** pixels, GLuint& out_buf_id)
352748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
352848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint name = Utils::generateTexture(m_context, desc.m_target);
352948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
353048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (false == Utils::isTargetMultilevel(desc.m_target))
353148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
353248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Utils::prepareTexture(m_context, name, desc.m_target, desc.m_internal_format, desc.m_format, desc.m_type,
353348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  0 /* level */, desc.m_width, desc.m_height,
353448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  FUNCTIONAL_TEST_N_LAYERS /* depth - 12 for multilayered, 1D and 2D will ignore that */,
353548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							  pixels[0], out_buf_id);
353648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
353748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Utils::makeTextureComplete(m_context, desc.m_target, name, 0 /* base */, 0 /* max */);
353848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
353948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
354048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
354148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Calculate dimmensions */
354248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLuint heights[FUNCTIONAL_TEST_N_LEVELS];
354348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLuint widths[FUNCTIONAL_TEST_N_LEVELS];
354448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLuint depths[FUNCTIONAL_TEST_N_LEVELS];
354548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
354648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		calculateDimmensions(desc.m_target, desc.m_level, desc.m_width, desc.m_height, widths, heights, depths);
354748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
354848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint level = 0; level < FUNCTIONAL_TEST_N_LEVELS; ++level)
354948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
355048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			Utils::prepareTexture(m_context, name, desc.m_target, desc.m_internal_format, desc.m_format, desc.m_type,
355148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								  level, widths[level], heights[level], depths[level], pixels[level], out_buf_id);
355248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
355348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			Utils::makeTextureComplete(m_context, desc.m_target, name, 0 /* base */, 2 /* max */);
355448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
355548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
355648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
355748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return name;
355848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
355948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
356048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Verify copy operation
356148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
356248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param test_case  Test case
356348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param dst_layer  First layer modified by copy
356448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param dst_pixels Origiranl data of destination image
356548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param src_layer  First layer read by copy
356648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param src_pixels Original data of source image
356748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param depth      Number of copied layers
356848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
356948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if everything is as expected, false otherwise
357048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
357148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool FunctionalTest::verify(const testCase& test_case, GLuint dst_layer, const GLubyte** dst_pixels, GLuint src_layer,
357248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							const GLubyte** src_pixels, GLuint depth)
357348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
357448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const bool			 is_dst_multi_level = Utils::isTargetMultilevel(test_case.m_dst.m_target);
357548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const bool			 is_src_multi_level = Utils::isTargetMultilevel(test_case.m_src.m_target);
357648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint		 dst_level			= test_case.m_dst.m_level;
357748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::vector<GLubyte> dst_level_data;
357848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint		 dst_pixel_size = Utils::getPixelSizeForFormat(test_case.m_dst.m_internal_format);
357948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	targetDesc			 src_desc		= test_case.m_src;
358048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint		 src_level		= src_desc.m_level;
358148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::vector<GLubyte> src_level_data;
358248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint		 src_pixel_size = Utils::getPixelSizeForFormat(src_desc.m_internal_format);
358348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
358448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 != m_rb_name)
358548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
358648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		src_desc.m_target = GL_TEXTURE_2D;
358748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
358848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
358948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Calculate storage requirements */
359048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint dst_req_mem_per_layer[FUNCTIONAL_TEST_N_LEVELS];
359148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint dst_heights[FUNCTIONAL_TEST_N_LEVELS];
359248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint dst_widths[FUNCTIONAL_TEST_N_LEVELS];
359348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint dst_depths[FUNCTIONAL_TEST_N_LEVELS];
359448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint src_req_mem_per_layer[FUNCTIONAL_TEST_N_LEVELS];
359548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint src_heights[FUNCTIONAL_TEST_N_LEVELS];
359648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint src_widths[FUNCTIONAL_TEST_N_LEVELS];
359748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint src_depths[FUNCTIONAL_TEST_N_LEVELS];
359848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
359948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	calculateDimmensions(test_case.m_dst.m_target, dst_level, test_case.m_dst.m_width, test_case.m_dst.m_height,
360048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						 dst_widths, dst_heights, dst_depths);
360148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
360248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	calculateDimmensions(src_desc.m_target, src_level, src_desc.m_width, src_desc.m_height, src_widths, src_heights,
360348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						 src_depths);
360448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
360548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint i = 0; i < FUNCTIONAL_TEST_N_LEVELS; ++i)
360648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
360748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		dst_req_mem_per_layer[i] = dst_widths[i] * dst_heights[i] * dst_pixel_size;
360848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		src_req_mem_per_layer[i] = src_widths[i] * src_heights[i] * src_pixel_size;
360948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
361048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
361148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Prepare storage, use 0 level as it is the biggest one */
361248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	dst_level_data.resize(dst_req_mem_per_layer[0] * dst_depths[0]);
361348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	src_level_data.resize(src_req_mem_per_layer[0] * src_depths[0]);
361448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
361548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Verification of contents
361648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * - source image                                           - expect no modification
361748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * - destination image, mipmap before and after dst_level   - expect no modification
361848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * - destination image, mipmap at dst_level:
361948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 *   * layers after dst_layer + depth                       - expect no modification
362048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 *   * layers <0, dst_layer + depth>                        - expect that contents at selected region were copied
362148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 */
362248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
362348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Check if source image was not modified */
362448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
362548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLuint n_levels = (true == is_src_multi_level) ? FUNCTIONAL_TEST_N_LEVELS : 1;
362648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
362748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint level = 0; level < n_levels; ++level)
362848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
362948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			getPixels(m_src_tex_name, src_desc, level, &src_level_data[0]);
363048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
363148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (GLuint layer = 0; layer < src_depths[level]; ++layer)
363248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
363348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (false == compareImages(src_desc, src_pixels[level], 0, 0, layer, level, src_desc,
363448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   &src_level_data[0], 0, 0, layer, level, src_widths[level],
363548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   src_heights[level]))
363648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
363748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_context.getTestContext().getLog()
363848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< tcu::TestLog::Message
363948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< "CopyImageSubData modified contents of source image. Original data: left."
364048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< tcu::TestLog::EndMessage;
364148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					return false;
364248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
364348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
364448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
364548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
364648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
364748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Check if contents of destination at levels != dst_level were not modified */
364848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
364948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLuint n_levels = (true == is_dst_multi_level) ? FUNCTIONAL_TEST_N_LEVELS : 1;
365048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
365148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint level = 0; level < n_levels; ++level)
365248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
365348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (dst_level == level)
365448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
365548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				continue;
365648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
365748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
365848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			getPixels(m_dst_tex_name, test_case.m_dst, level, &dst_level_data[0]);
365948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
366048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (GLuint layer = 0; layer < dst_depths[level]; ++layer)
366148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
366248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (false == compareImages(test_case.m_dst, dst_pixels[level], 0, 0, layer, level, test_case.m_dst,
366348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   &dst_level_data[0], 0, 0, layer, level, dst_widths[level],
366448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   dst_heights[level]))
366548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
366648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_context.getTestContext().getLog()
366748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< tcu::TestLog::Message
366848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< "CopyImageSubData modified contents of wrong mipmap level. Original data: left."
366948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< tcu::TestLog::EndMessage;
367048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
367148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					return false;
367248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
367348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
367448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
367548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
367648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
367748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Check contents of modified level */
367848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
367948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		getPixels(m_dst_tex_name, test_case.m_dst, dst_level, &dst_level_data[0]);
368048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
368148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Check anything after dst_layer + depth */
368248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
368348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (GLuint layer = dst_layer + depth; layer < dst_depths[dst_level]; ++layer)
368448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
368548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (false == compareImages(test_case.m_dst, dst_pixels[dst_level], 0, 0, layer, dst_level,
368648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   test_case.m_dst, &dst_level_data[0], 0, 0, layer, dst_level,
368748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   dst_widths[dst_level], dst_heights[dst_level]))
368848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
368948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_context.getTestContext().getLog()
369048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< tcu::TestLog::Message
369148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< "CopyImageSubData modified contents of wrong layer. Original data: left."
369248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< tcu::TestLog::EndMessage;
369348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
369448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					return false;
369548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
369648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
369748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
369848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
369948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Check modified layers */
370048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint layer = 0; layer < depth; ++layer)
370148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
370248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Check contents outside of copied region */
370348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
370448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				GLuint n_regions	 = 0;
370548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				GLuint regions[4][4] = { { 0 } };
370648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
370748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				getCleanRegions(test_case, dst_level, regions, n_regions);
370848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
370948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				for (GLuint region = 0; region < n_regions; ++region)
371048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
371148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLuint x = regions[region][0];
371248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLuint y = regions[region][1];
371348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLuint w = regions[region][2];
371448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLuint h = regions[region][3];
371548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
371648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					if (false == compareImages(test_case.m_dst, dst_pixels[dst_level], x, y, layer + dst_layer,
371748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos											   dst_level, test_case.m_dst, &dst_level_data[0], x, y, layer + dst_layer,
371848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos											   dst_level, w, h))
371948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					{
372048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						m_context.getTestContext().getLog()
372148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							<< tcu::TestLog::Message
372248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							<< "CopyImageSubData modified contents outside of copied region. Original data: left."
372348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							<< tcu::TestLog::EndMessage;
372448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						return false;
372548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					}
372648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
372748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
372848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
372948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Check contents of copied region */
373048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (false == compareImages(test_case.m_dst, &dst_level_data[0], test_case.m_dst_x, test_case.m_dst_y,
373148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									   layer + dst_layer, dst_level, src_desc, src_pixels[src_level], test_case.m_src_x,
373248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									   test_case.m_src_y, layer + src_layer, src_level, test_case.m_width,
373348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									   test_case.m_height))
373448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
373548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				m_context.getTestContext().getLog()
373648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< tcu::TestLog::Message
373748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< "CopyImageSubData stored invalid data in copied region. Destination data: left."
373848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< tcu::TestLog::EndMessage;
373948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return false;
374048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
374148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
374248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
374348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
374448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
374548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
374648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
374748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* SmokeTest */
374848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* Constants */
374948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst GLuint SmokeTest::m_width  = 16;
375048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst GLuint SmokeTest::m_height = 16;
375148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst GLuint SmokeTest::m_depth  = 1;
375248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
375348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
375448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
375548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context
375648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
375748087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSmokeTest::SmokeTest(deqp::Context& context)
375848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCase(context, "smoke_test", "Test tries all formats and targets")
375948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_dst_buf_name(0)
376048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_dst_tex_name(0)
376148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_rb_name(0)
376248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_src_buf_name(0)
376348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_src_tex_name(0)
376448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_test_case_index(0)
376548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
376648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Iterate over valid targets */
376748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint tgt_id = 0; tgt_id < s_n_valid_targets; ++tgt_id)
376848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
376948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLenum target = s_valid_targets[tgt_id];
377048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
377148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (true == Utils::isTargetMultisampled(target))
377248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
377348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			continue;
377448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
377548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
377648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const testCase test_case = { target, GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT };
377748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
377848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_cases.push_back(test_case);
377948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
378048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
378148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Iterate over internal formats */
378248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint fmt_id = 0; fmt_id < s_n_internal_formats; ++fmt_id)
378348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
378448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLenum internal_format = s_internal_formats[fmt_id];
378548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLenum format			 = Utils::getFormat(internal_format);
378648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLenum type			 = Utils::getType(internal_format);
378748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
378848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const testCase test_case = { GL_TEXTURE_2D, internal_format, format, type };
378948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
379048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_cases.push_back(test_case);
379148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
379248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
379348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
379448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources
379548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
379648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
379748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid SmokeTest::clean()
379848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
379948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions& gl = m_context.getRenderContext().getFunctions();
380048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
380148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Clean textures and buffers. Errors ignored */
380248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteTextures(1, &m_dst_tex_name);
380348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteTextures(1, &m_src_tex_name);
380448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
380548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_dst_tex_name = 0;
380648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_src_tex_name = 0;
380748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
380848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 != m_dst_buf_name)
380948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
381048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &m_dst_buf_name);
381148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_dst_buf_name = 0;
381248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
381348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
381448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 != m_rb_name)
381548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
381648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteRenderbuffers(1, &m_rb_name);
381748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_rb_name = 0;
381848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
381948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
382048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 != m_src_buf_name)
382148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
382248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &m_src_buf_name);
382348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_src_buf_name = 0;
382448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
382548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
382648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
382748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Free memory allocated for images
382848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
382948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixels Pointers to image data
383048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
383148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid SmokeTest::cleanPixels(GLubyte*& pixels) const
383248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
383348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 == pixels)
383448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
383548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return;
383648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
383748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
383848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	delete[] pixels;
383948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	pixels = 0;
384048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
384148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
384248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Compare two images
384348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param test_case     Test case descriptor
384448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param left_data     Data of left image
384548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param right_data    Data of right image
384648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
384748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if images are considered idenctial, false otherwise
384848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
384948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool SmokeTest::compareImages(const testCase& test_case, const GLubyte* left_data, const GLubyte* right_data) const
385048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
385148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Constants */
385248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Sizes */
385348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint pixel_size = Utils::getPixelSizeForFormat(test_case.m_internal_format);
385448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint line_size  = pixel_size * m_width;
385548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
385648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint height = m_height;
385748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
385848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if ((GL_TEXTURE_1D == test_case.m_target) || (GL_TEXTURE_1D_ARRAY == test_case.m_target))
385948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
386048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		height = 1;
386148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
386248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
386348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* For each line */
386448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint y = 0; y < height; ++y)
386548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
386648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Offsets */
386748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLuint line_offset = y * line_size;
386848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
386948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Pointers */
387048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLubyte* left_line_data  = left_data + line_offset;
387148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLubyte* right_line_data = right_data + line_offset;
387248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
387348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* For each pixel of region */
387448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint x = 0; x < m_width; ++x)
387548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
387648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Offsets */
387748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLuint pixel_offset = x * pixel_size;
387848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
387948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Pointers */
388048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLubyte* left_pixel_data  = left_line_data + pixel_offset;
388148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLubyte* right_pixel_data = right_line_data + pixel_offset;
388248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
388348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Compare */
388448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (false == Utils::comparePixels(pixel_size, left_pixel_data, pixel_size, right_pixel_data,
388548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos											  test_case.m_internal_format))
388648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
388748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (false == Utils::unpackAndComaprePixels(
388848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 test_case.m_format, test_case.m_type, test_case.m_internal_format, left_pixel_data,
388948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 test_case.m_format, test_case.m_type, test_case.m_internal_format, right_pixel_data))
389048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
389148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_context.getTestContext().getLog()
389248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< tcu::TestLog::Message << "Not matching pixels found. "
389348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< "[" << x << ", " << y << "], off: " << left_pixel_data - left_data
389448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< ". Data left: " << Utils::getPixelString(test_case.m_internal_format, left_pixel_data)
389548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< ", right: " << Utils::getPixelString(test_case.m_internal_format, right_pixel_data)
389648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						<< tcu::TestLog::EndMessage;
389748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
389848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					return false;
389948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
390048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
390148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
390248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
390348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
390448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
390548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
390648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
390748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute copyImageSubData for given test case and verify results
390848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
390948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param test_case  Test case
391048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param src_pixels Data of source image
391148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
391248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if there is no error and results match expectations, false otherwise
391348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
391448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool SmokeTest::copyAndVerify(const testCase& test_case, const GLubyte* src_pixels)
391548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
391648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLenum			 error  = GL_NO_ERROR;
391748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions& gl		= m_context.getRenderContext().getFunctions();
391848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool			 result = false;
391948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
392048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Copy and verification */
392148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
392248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (0 == m_rb_name)
392348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
392448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLuint height = m_height;
392548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
392648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if ((GL_TEXTURE_1D == test_case.m_target) || (GL_TEXTURE_1D_ARRAY == test_case.m_target))
392748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
392848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				height = 1;
392948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
393048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
393148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.copyImageSubData(m_src_tex_name, test_case.m_target, 0 /* srcLevel */, 0 /* srcX */, 0 /* srcY */,
393248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								0 /* srcZ */, m_dst_tex_name, test_case.m_target, 0 /* dstLevel */, 0 /* dstX */,
393348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								0 /* dstY */, 0 /* dstZ */, m_width, height, m_depth);
393448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
393548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else /* Copy from src to rb and from rb to dst */
393648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
393748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Src and rb shares differs only on target */
393848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.copyImageSubData(m_src_tex_name, GL_TEXTURE_2D, 0 /* srcLevel */, 0 /* srcX */, 0 /* srcY */,
393948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								0 /* srcZ */, m_rb_name, test_case.m_target, 0 /* dstLevel */, 0 /* dstX */,
394048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								0 /* dstY */, 0 /* dstZ */, m_width, m_height, m_depth);
394148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
394248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.copyImageSubData(m_rb_name, test_case.m_target, 0 /* dstLevel */, 0 /* dstX */, 0 /* dstY */,
394348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								0 /* dstZ */, m_dst_tex_name, GL_TEXTURE_2D, 0 /* dstLevel */, 0 /* dstX */,
394448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								0 /* dstY */, 0 /* dstZ */, m_width, m_height, m_depth);
394548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
394648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
394748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Verify generated error */
394848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
394948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
395048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_NO_ERROR == error)
395148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
395248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Verify copy results */
395348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result = verify(test_case, src_pixels);
395448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
395548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
395648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if ((GL_NO_ERROR != error) || (false == result))
395748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
395848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
395948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message << "Failure. Target: " << glu::getTextureTargetStr(test_case.m_target)
396048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< ". Format: " << glu::getInternalFormatParameterStr(test_case.m_internal_format)
396148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
396248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
396348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (GL_NO_ERROR != error)
396448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
396548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				m_context.getTestContext().getLog() << tcu::TestLog::Message
396648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													<< "Failed due to error: " << glu::getErrorStr(error)
396748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													<< tcu::TestLog::EndMessage;
396848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
396948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				TCU_FAIL("Copy operation failed");
397048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
397148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
397248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return false;
397348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
397448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
397548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
397648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
397748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
397848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
397948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Get pixel data for image
398048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
398148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param name       Name of image
398248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param test_case  Test case descriptor
398348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_pixels Pixels
398448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
398548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid SmokeTest::getPixels(GLuint name, const SmokeTest::testCase& test_case, GLubyte* out_pixels) const
398648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
398748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions& gl		  = m_context.getRenderContext().getFunctions();
398848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLenum			 tgt_bind = test_case.m_target;
398948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLenum			 tgt_get  = test_case.m_target;
399048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
399148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (GL_RENDERBUFFER == test_case.m_target)
399248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
399348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		tgt_bind = GL_TEXTURE_2D;
399448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		tgt_get  = GL_TEXTURE_2D;
399548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
399648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else if (GL_TEXTURE_CUBE_MAP == test_case.m_target)
399748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
399848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		tgt_get = GL_TEXTURE_CUBE_MAP_POSITIVE_X;
399948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
400048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
400148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindTexture(tgt_bind, name);
400248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture");
400348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
400448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.getTexImage(tgt_get, 0 /* level */, test_case.m_format, test_case.m_type, out_pixels);
400548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "GetTexImage");
400648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
400748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindTexture(tgt_bind, 0);
400848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture");
400948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
401048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
401148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test
401248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
401348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise
401448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
401548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult SmokeTest::iterate()
401648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
401748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLubyte*					 dst_pixels = 0;
401848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions&			 gl			= m_context.getRenderContext().getFunctions();
401948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	tcu::TestNode::IterateResult it_result  = tcu::TestNode::STOP;
402048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool						 result		= false;
402148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLubyte*					 src_pixels = 0;
402248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const testCase&				 test_case  = m_test_cases[m_test_case_index];
402348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
402448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.pixelStorei(GL_PACK_ALIGNMENT, 1);
402548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.pixelStorei(GL_UNPACK_ALIGNMENT, 1);
402648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "PixelStorei");
402748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
402848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
402948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
403048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Prepare pixels */
403148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		prepareDstPxls(test_case, dst_pixels);
403248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		prepareSrcPxls(test_case, src_pixels);
403348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
403448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Prepare textures */
403548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_RENDERBUFFER == test_case.m_target)
403648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
403748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			testCase desc	= test_case;
403848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLuint   ignored = 0;
403948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
404048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			desc.m_target = GL_TEXTURE_2D;
404148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
404248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_rb_name	  = prepareTexture(test_case, 0 /* pixels */, ignored /* buffer name */);
404348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_dst_tex_name = prepareTexture(desc, dst_pixels, m_dst_buf_name);
404448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_src_tex_name = prepareTexture(desc, src_pixels, m_src_buf_name);
404548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
404648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
404748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
404848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_dst_tex_name = prepareTexture(test_case, dst_pixels, m_dst_buf_name);
404948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_src_tex_name = prepareTexture(test_case, src_pixels, m_src_buf_name);
405048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
405148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
405248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Copy images and verify results */
405348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = copyAndVerify(test_case, src_pixels);
405448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
405548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (tcu::Exception& exc)
405648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
405748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		clean();
405848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		cleanPixels(dst_pixels);
405948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		cleanPixels(src_pixels);
406048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw exc;
406148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
406248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
406348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Free resources */
406448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	clean();
406548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	cleanPixels(dst_pixels);
406648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	cleanPixels(src_pixels);
406748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
406848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set result */
406948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (true == result)
407048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
407148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass");
407248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
407348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Increase index */
407448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_case_index += 1;
407548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
407648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Are there any test cases left */
407748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (m_test_cases.size() > m_test_case_index)
407848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
407948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			it_result = tcu::TestNode::CONTINUE;
408048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
408148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
408248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
408348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
408448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().getLog() << tcu::TestLog::Message << "Failure. " << tcu::TestLog::EndMessage;
408548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
408648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail");
408748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
408848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
408948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Done */
409048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return it_result;
409148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
409248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
409348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Prepare data for destination image
409448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
409548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param test_case  Test case descriptor
409648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_pixels Pointer to image data
409748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
409848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid SmokeTest::prepareDstPxls(const SmokeTest::testCase& test_case, GLubyte*& out_pixels) const
409948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
410048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint n_pixels_per_layer = m_width * m_height;
410148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
410248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLenum internal_format = test_case.m_internal_format;
410348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint n_layers		 = (GL_TEXTURE_CUBE_MAP_ARRAY != test_case.m_target) ? m_depth : 6;
410448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint n_pixels		 = n_pixels_per_layer * n_layers;
410548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint pixel_size		 = Utils::getPixelSizeForFormat(internal_format);
410648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint req_memory		 = pixel_size * n_pixels;
410748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLenum type			 = test_case.m_type;
410848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
410948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Prepare storage */
411048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	out_pixels = new GLubyte[req_memory];
411148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
411248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 == out_pixels)
411348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
411448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Memory allocation failed");
411548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
411648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
411748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	memset(out_pixels, 0, req_memory);
411848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
411948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Fill pixels */
412048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint j = 0; j < n_pixels; ++j)
412148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
412248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLubyte* pixel_data = out_pixels + j * pixel_size;
412348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
412448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Utils::packPixel(internal_format, type, 1.0, 1.0, 1.0, 1.0, pixel_data);
412548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
412648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
412748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
412848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Prepare data for source image
412948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
413048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param test_case  Test case descriptor
413148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_pixels Pointer to image data
413248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
413348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid SmokeTest::prepareSrcPxls(const SmokeTest::testCase& test_case, GLubyte*& out_pixels) const
413448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
413548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint n_pixels_per_layer = m_width * m_height;
413648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
413748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLenum internal_format = test_case.m_internal_format;
413848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint n_layers		 = (GL_TEXTURE_CUBE_MAP_ARRAY != test_case.m_target) ? m_depth : 6;
413948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint n_pixels		 = n_pixels_per_layer * n_layers;
414048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint pixel_size		 = Utils::getPixelSizeForFormat(internal_format);
414148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint layer_size		 = pixel_size * n_pixels_per_layer;
414248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint line_size		 = pixel_size * m_width;
414348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint req_memory		 = pixel_size * n_pixels;
414448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLenum type			 = test_case.m_type;
414548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
414648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Prepare storage */
414748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	out_pixels = new GLubyte[req_memory];
414848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
414948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 == out_pixels)
415048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
415148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Memory allocation failed");
415248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
415348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
415448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	memset(out_pixels, 0, req_memory);
415548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
415648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Fill pixels */
415748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint layer = 0; layer < n_layers; ++layer)
415848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
415948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLuint layer_offset = layer * layer_size;
416048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
416148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLubyte* layer_data = out_pixels + layer_offset;
416248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
416348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint y = 0; y < m_height; ++y)
416448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
416548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLuint line_offset = line_size * y;
416648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
416748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLubyte* line_data = layer_data + line_offset;
416848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
416948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (GLuint x = 0; x < m_width; ++x)
417048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
417148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				const GLuint pixel_offset = x * pixel_size;
417248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
417348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				GLubyte* pixel_data = line_data + pixel_offset;
417448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
417548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* 255 is max ubyte. 1/15.9375 = 16/255 */
417648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				const GLdouble red   = ((GLdouble)x) / 255.0 + (((GLdouble)y) / 15.9375);
417748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				const GLdouble green = ((GLdouble)layer) / 255.0 + (1.0 / 15.9375);
417848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				const GLdouble blue  = 0.125;
417948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				const GLdouble alpha = 1.0; /* This value has special meaning for some internal_formats */
418048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
418148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				Utils::packPixel(internal_format, type, red, green, blue, alpha, pixel_data);
418248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
418348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
418448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
418548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
418648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
418748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Prepare texture
418848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
418948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param desc       Descriptor
419048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param pixels     Image data
419148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param out_buf_id Id of buffer used by texture buffer
419248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
419348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Name of iamge
419448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
419548087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosGLuint SmokeTest::prepareTexture(const testCase& test_case, const GLubyte* pixels, GLuint& out_buf_id)
419648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
419748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint n_layers = (GL_TEXTURE_CUBE_MAP_ARRAY != test_case.m_target) ? m_depth : 6;
419848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint		 name	 = Utils::generateTexture(m_context, test_case.m_target);
419948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
420048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	Utils::prepareTexture(m_context, name, test_case.m_target, test_case.m_internal_format, test_case.m_format,
420148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  test_case.m_type, 0 /* level */, m_width, m_height, n_layers, pixels, out_buf_id);
420248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
420348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	Utils::makeTextureComplete(m_context, test_case.m_target, name, 0 /* base */, 0 /* max */);
420448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
420548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return name;
420648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
420748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
420848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Verify copy operation
420948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
421048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param test_case  Test case
421148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param src_pixels Original data of source image
421248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
421348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return true if everything is as expected, false otherwise
421448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
421548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool SmokeTest::verify(const testCase& test_case, const GLubyte* src_pixels)
421648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
421748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::vector<GLubyte> dst_data;
421848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint		 n_layers   = (GL_TEXTURE_CUBE_MAP_ARRAY != test_case.m_target) ? m_depth : 6;
421948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint		 pixel_size = Utils::getPixelSizeForFormat(test_case.m_internal_format);
422048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint		 line_size  = pixel_size * m_width;
422148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const GLuint		 req_memory = line_size * m_height * n_layers;
422248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::vector<GLubyte> src_data;
422348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
422448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Prepare storage */
422548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	dst_data.resize(req_memory);
422648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	src_data.resize(req_memory);
422748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
422848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Check if source image was not modified */
422948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
423048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		getPixels(m_src_tex_name, test_case, &src_data[0]);
423148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
423248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (false == compareImages(test_case, src_pixels, &src_data[0]))
423348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
423448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
423548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message << "CopyImageSubData modified contents of source image. Original data: left."
423648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
423748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return false;
423848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
423948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
424048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
424148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Check contents of destination image */
424248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
424348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		getPixels(m_dst_tex_name, test_case, &dst_data[0]);
424448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
424548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (false == compareImages(test_case, src_pixels, &dst_data[0]))
424648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
424748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
424848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
424948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "CopyImageSubData stored invalid contents in destination image. Source data: left."
425048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
425148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
425248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return false;
425348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
425448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
425548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
425648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
425748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
425848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
425948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* InvalidTargetTest */
426048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
426148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
426248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context
426348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
426448087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosInvalidTargetTest::InvalidTargetTest(deqp::Context& context)
426548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCase(context, "invalid_target",
426648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			   "Test verifies if INVALID_ENUM is generated when invalid target is provided to CopySubImageData")
426748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_dst_buf_name(0)
426848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_dst_tex_name(0)
426948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_src_buf_name(0)
427048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_src_tex_name(0)
427148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_test_case_index(0)
427248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
427348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
427448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Valid source, valid dst */
427548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint src = 0; src < s_n_valid_targets; ++src)
427648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
427748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint dst = 0; dst < s_n_valid_targets; ++dst)
427848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
427948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLenum src_target = s_valid_targets[src];
428048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLenum dst_target = s_valid_targets[dst];
428148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			testCase	 test_case  = { src_target, dst_target, GL_NO_ERROR };
428248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
428348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (Utils::isTargetMultisampled(dst_target) != Utils::isTargetMultisampled(src_target))
428448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
428548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				test_case.m_expected_result = GL_INVALID_OPERATION;
428648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
428748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
428848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_test_cases.push_back(test_case);
428948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
429048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
429148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
429248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Invalid source, invalid dst */
429348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint src = 0; src < s_n_invalid_targets; ++src)
429448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
429548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint dst = 0; dst < s_n_invalid_targets; ++dst)
429648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
429748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLenum   src_target = s_invalid_targets[src];
429848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLenum   dst_target = s_invalid_targets[dst];
429948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const testCase test_case  = { src_target, dst_target, GL_INVALID_ENUM };
430048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
430148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_test_cases.push_back(test_case);
430248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
430348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
430448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
430548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Invalid source, valid dst */
430648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint src = 0; src < s_n_invalid_targets; ++src)
430748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
430848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint dst = 0; dst < s_n_valid_targets; ++dst)
430948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
431048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLenum   src_target = s_invalid_targets[src];
431148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLenum   dst_target = s_valid_targets[dst];
431248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const testCase test_case  = { src_target, dst_target, GL_INVALID_ENUM };
431348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
431448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_test_cases.push_back(test_case);
431548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
431648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
431748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
431848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Valid source, invalid dst */
431948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint src = 0; src < s_n_valid_targets; ++src)
432048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
432148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint dst = 0; dst < s_n_invalid_targets; ++dst)
432248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
432348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLenum   src_target = s_valid_targets[src];
432448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLenum   dst_target = s_invalid_targets[dst];
432548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const testCase test_case  = { src_target, dst_target, GL_INVALID_ENUM };
432648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
432748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_test_cases.push_back(test_case);
432848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
432948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
433048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
433148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
433248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test
433348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
433448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise
433548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
433648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult InvalidTargetTest::iterate()
433748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
433848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLenum						 error	 = GL_NO_ERROR;
433948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions&			 gl		   = m_context.getRenderContext().getFunctions();
434048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP;
434148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool						 result	= false;
434248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const testCase&				 test_case = m_test_cases[m_test_case_index];
434348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
434448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
434548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
434648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Prepare textures */
434748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_dst_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_dst_target, GL_RGBA8, GL_RGBA,
434848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												  GL_UNSIGNED_BYTE, m_dst_buf_name);
434948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_src_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_src_target, GL_RGBA8, GL_RGBA,
435048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												  GL_UNSIGNED_BYTE, m_src_buf_name);
435148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
435248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Make textures complete */
435348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Utils::makeTextureComplete(m_context, test_case.m_dst_target, m_dst_tex_name, 0 /* base */, 0 /* max */);
435448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Utils::makeTextureComplete(m_context, test_case.m_src_target, m_src_tex_name, 0 /* base */, 0 /* max */);
435548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
435648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (tcu::Exception& exc)
435748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
435848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		clean();
435948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw exc;
436048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
436148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
436248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Execute CopyImageSubData */
436348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.copyImageSubData(m_src_tex_name, test_case.m_src_target, 0 /* srcLevel */, 0 /* srcX */, 0 /* srcY */,
436448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0 /* srcZ */, m_dst_tex_name, test_case.m_dst_target, 0 /* dstLevel */, 0 /* dstX */,
436548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0 /* dstY */, 0 /* dstZ */, 1 /* srcWidth */, 1 /* srcHeight */, 1 /* srcDepth */);
436648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
436748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Verify generated error */
436848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	error  = gl.getError();
436948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	result = (test_case.m_expected_result == error);
437048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
437148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Free resources */
437248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	clean();
437348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
437448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set result */
437548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (true == result)
437648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
437748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass");
437848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
437948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Increase index */
438048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_case_index += 1;
438148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
438248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Are there any test cases left */
438348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (m_test_cases.size() > m_test_case_index)
438448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
438548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			it_result = tcu::TestNode::CONTINUE;
438648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
438748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
438848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
438948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
439048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().getLog()
439148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result)
439248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< " got: " << glu::getErrorStr(error)
439348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ". Source target: " << glu::getTextureTargetStr(test_case.m_src_target)
439448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ", destination target: " << glu::getTextureTargetStr(test_case.m_dst_target) << tcu::TestLog::EndMessage;
439548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
439648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail");
439748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
439848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
439948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Done */
440048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return it_result;
440148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
440248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
440348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources
440448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
440548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
440648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid InvalidTargetTest::clean()
440748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
440848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions& gl		   = m_context.getRenderContext().getFunctions();
440948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const testCase&  test_case = m_test_cases[m_test_case_index];
441048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
441148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Clean textures and buffers. Errors ignored */
441248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	Utils::deleteTexture(m_context, test_case.m_dst_target, m_dst_tex_name);
441348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	Utils::deleteTexture(m_context, test_case.m_src_target, m_src_tex_name);
441448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
441548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_dst_tex_name = 0;
441648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_src_tex_name = 0;
441748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
441848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 != m_dst_buf_name)
441948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
442048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &m_dst_buf_name);
442148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_dst_buf_name = 0;
442248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
442348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
442448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 != m_src_buf_name)
442548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
442648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &m_src_buf_name);
442748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_src_buf_name = 0;
442848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
442948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
443048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
443148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* TargetMissMatchTest */
443248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
443348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
443448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context
443548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
443648087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTargetMissMatchTest::TargetMissMatchTest(deqp::Context& context)
443748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCase(
443848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		  context, "target_miss_match",
443948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		  "Test verifies if INVALID_ENUM is generated when target provided to CopySubImageData does not match texture")
444048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_dst_buf_name(0)
444148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_dst_tex_name(0)
444248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_src_buf_name(0)
444348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_src_tex_name(0)
444448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_test_case_index(0)
444548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
444648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Wrong dst target */
444748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint target = 0; target < s_n_valid_targets; ++target)
444848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
444948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint dst = 0; dst < s_n_valid_targets; ++dst)
445048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
445148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLenum dst_target = s_valid_targets[dst];
445248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLenum src_target = s_valid_targets[target];
445348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLenum tex_target = s_valid_targets[target];
445448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			testCase	 test_case  = { tex_target, src_target, dst_target, GL_INVALID_ENUM };
445548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
445648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Skip renderbuffers */
445748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if ((GL_RENDERBUFFER == tex_target) || (GL_RENDERBUFFER == dst_target) || (GL_RENDERBUFFER == src_target))
445848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
445948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				continue;
446048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
446148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
446248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Valid case */
446348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (dst_target == tex_target)
446448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
446548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				test_case.m_expected_result = GL_NO_ERROR;
446648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
446748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
446848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Skip cases with multisampling conflict */
446948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (Utils::isTargetMultisampled(dst_target) != Utils::isTargetMultisampled(src_target))
447048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
447148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				continue;
447248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
447348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
447448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_test_cases.push_back(test_case);
447548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
447648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
447748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
447848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Wrong src target */
447948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint target = 0; target < s_n_valid_targets; ++target)
448048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
448148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint src = 0; src < s_n_valid_targets; ++src)
448248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
448348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLenum dst_target = s_valid_targets[target];
448448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLenum src_target = s_valid_targets[src];
448548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLenum tex_target = s_valid_targets[target];
448648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			testCase	 test_case  = { tex_target, src_target, dst_target, GL_INVALID_ENUM };
448748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
448848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Skip renderbuffers */
448948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if ((GL_RENDERBUFFER == tex_target) || (GL_RENDERBUFFER == dst_target) || (GL_RENDERBUFFER == src_target))
449048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
449148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				continue;
449248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
449348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
449448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Valid case */
449548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (src_target == tex_target)
449648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
449748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				test_case.m_expected_result = GL_NO_ERROR;
449848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
449948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
450048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Skip cases with multisampling conflict */
450148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (Utils::isTargetMultisampled(dst_target) != Utils::isTargetMultisampled(src_target))
450248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
450348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				continue;
450448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
450548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
450648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_test_cases.push_back(test_case);
450748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
450848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
450948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
451048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
451148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test
451248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
451348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise
451448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
451548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult TargetMissMatchTest::iterate()
451648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
451748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLenum						 error	 = GL_NO_ERROR;
451848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions&			 gl		   = m_context.getRenderContext().getFunctions();
451948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP;
452048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool						 result	= false;
452148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const testCase&				 test_case = m_test_cases[m_test_case_index];
452248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
452348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
452448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
452548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Prepare textures */
452648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_dst_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, GL_RGBA8, GL_RGBA,
452748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												  GL_UNSIGNED_BYTE, m_dst_buf_name);
452848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_src_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, GL_RGBA8, GL_RGBA,
452948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												  GL_UNSIGNED_BYTE, m_src_buf_name);
453048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
453148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Make textures complete */
453248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_dst_tex_name, 0 /* base */, 0 /* max */);
453348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_src_tex_name, 0 /* base */, 0 /* max */);
453448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
453548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (tcu::Exception& exc)
453648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
453748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		clean();
453848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw exc;
453948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
454048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
454148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Execute CopyImageSubData */
454248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.copyImageSubData(m_src_tex_name, test_case.m_src_target, 0 /* srcLevel */, 0 /* srcX */, 0 /* srcY */,
454348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0 /* srcZ */, m_dst_tex_name, test_case.m_dst_target, 0 /* dstLevel */, 0 /* dstX */,
454448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0 /* dstY */, 0 /* dstZ */, 1 /* srcWidth */, 1 /* srcHeight */, 1 /* srcDepth */);
454548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
454648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Verify generated error */
454748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	error  = gl.getError();
454848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	result = (test_case.m_expected_result == error);
454948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
455048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Remove resources */
455148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	clean();
455248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
455348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (true == result)
455448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
455548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass");
455648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
455748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Increase index */
455848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_case_index += 1;
455948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
456048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Are there any test cases left */
456148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (m_test_cases.size() > m_test_case_index)
456248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
456348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			it_result = tcu::TestNode::CONTINUE;
456448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
456548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
456648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
456748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
456848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().getLog()
456948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result)
457048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< " got: " << glu::getErrorStr(error)
457148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ". Texture target: " << glu::getTextureTargetStr(test_case.m_tex_target)
457248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ". Source target: " << glu::getTextureTargetStr(test_case.m_src_target)
457348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ", destination target: " << glu::getTextureTargetStr(test_case.m_dst_target) << tcu::TestLog::EndMessage;
457448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
457548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail");
457648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
457748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
457848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Done */
457948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return it_result;
458048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
458148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
458248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources
458348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
458448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
458548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid TargetMissMatchTest::clean()
458648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
458748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions& gl = m_context.getRenderContext().getFunctions();
458848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
458948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Clean textures and buffers. Errors ignored */
459048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteTextures(1, &m_dst_tex_name);
459148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteTextures(1, &m_src_tex_name);
459248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
459348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_dst_tex_name = 0;
459448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_src_tex_name = 0;
459548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
459648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 != m_dst_buf_name)
459748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
459848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &m_dst_buf_name);
459948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_dst_buf_name = 0;
460048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
460148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
460248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 != m_src_buf_name)
460348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
460448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &m_src_buf_name);
460548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_src_buf_name = 0;
460648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
460748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
460848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
460948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* TargetMissMatchTest */
461048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
461148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
461248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context
461348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
461448087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosIncompleteTexTest::IncompleteTexTest(deqp::Context& context)
461548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCase(
461648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		  context, "incomplete_tex",
461748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		  "Test verifies if INVALID_OPERATION is generated when texture provided to CopySubImageData is incomplete")
461848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_dst_buf_name(0)
461948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_dst_tex_name(0)
462048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_src_buf_name(0)
462148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_src_tex_name(0)
462248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_test_case_index(0)
462348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
462448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint target = 0; target < s_n_valid_targets; ++target)
462548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
462648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLenum tex_target = s_valid_targets[target];
462748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		testCase	 test_case  = { tex_target, false, false, GL_INVALID_OPERATION };
462848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
462948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Skip targets that are not multi level */
463048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (false == Utils::isTargetMultilevel(tex_target))
463148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
463248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			continue;
463348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
463448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
463548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_cases.push_back(test_case);
463648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
463748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_case.m_is_dst_complete = true;
463848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_case.m_is_src_complete = false;
463948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_cases.push_back(test_case);
464048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
464148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_case.m_is_dst_complete = false;
464248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_case.m_is_src_complete = true;
464348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_cases.push_back(test_case);
464448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
464548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_case.m_is_dst_complete = true;
464648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_case.m_is_src_complete = true;
464748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_case.m_expected_result = GL_NO_ERROR;
464848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_cases.push_back(test_case);
464948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
465048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
465148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
465248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test
465348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
465448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise
465548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
465648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult IncompleteTexTest::iterate()
465748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
465848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLenum						 error	 = GL_NO_ERROR;
465948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions&			 gl		   = m_context.getRenderContext().getFunctions();
466048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP;
466148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool						 result	= false;
466248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const testCase&				 test_case = m_test_cases[m_test_case_index];
466348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
466448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
466548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
466648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Prepare textures */
466748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_dst_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, GL_RGBA8, GL_RGBA,
466848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												  GL_UNSIGNED_BYTE, m_dst_buf_name);
466948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_src_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, GL_RGBA8, GL_RGBA,
467048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												  GL_UNSIGNED_BYTE, m_src_buf_name);
467148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
467248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Make textures complete */
467348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (true == test_case.m_is_dst_complete)
467448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
467548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_dst_tex_name, 0 /* base */, 0 /* max */);
467648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
467748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
467848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (true == test_case.m_is_src_complete)
467948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
468048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_src_tex_name, 0 /* base */, 0 /* max */);
468148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
468248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
468348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (tcu::Exception& exc)
468448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
468548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		clean();
468648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw exc;
468748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
468848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
468948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Execute CopyImageSubData */
469048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.copyImageSubData(m_src_tex_name, test_case.m_tex_target, 0 /* srcLevel */, 0 /* srcX */, 0 /* srcY */,
469148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0 /* srcZ */, m_dst_tex_name, test_case.m_tex_target, 0 /* dstLevel */, 0 /* dstX */,
469248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0 /* dstY */, 0 /* dstZ */, 1 /* srcWidth */, 1 /* srcHeight */, 1 /* srcDepth */);
469348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
469448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Verify generated error */
469548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	error  = gl.getError();
469648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	result = (test_case.m_expected_result == error);
469748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
469848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Remove resources */
469948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	clean();
470048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
470148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (true == result)
470248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
470348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass");
470448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
470548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Increase index */
470648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_case_index += 1;
470748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
470848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Are there any test cases left */
470948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (m_test_cases.size() > m_test_case_index)
471048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
471148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			it_result = tcu::TestNode::CONTINUE;
471248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
471348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
471448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
471548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
471648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().getLog()
471748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result)
471848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< " got: " << glu::getErrorStr(error)
471948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ". Texture target: " << glu::getTextureTargetStr(test_case.m_tex_target)
472048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ". Is source complete: " << test_case.m_is_src_complete
472148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ", is destination complete: " << test_case.m_is_dst_complete << tcu::TestLog::EndMessage;
472248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
472348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail");
472448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
472548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
472648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Done */
472748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return it_result;
472848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
472948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
473048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources
473148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
473248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
473348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid IncompleteTexTest::clean()
473448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
473548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions& gl = m_context.getRenderContext().getFunctions();
473648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
473748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Clean textures and buffers. Errors ignored */
473848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteTextures(1, &m_dst_tex_name);
473948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteTextures(1, &m_src_tex_name);
474048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
474148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_dst_tex_name = 0;
474248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_src_tex_name = 0;
474348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
474448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 != m_dst_buf_name)
474548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
474648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &m_dst_buf_name);
474748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_dst_buf_name = 0;
474848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
474948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
475048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 != m_src_buf_name)
475148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
475248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &m_src_buf_name);
475348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_src_buf_name = 0;
475448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
475548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
475648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
475748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* IncompatibleFormatsTest */
475848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
475948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
476048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context
476148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
476248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosIncompatibleFormatsTest::IncompatibleFormatsTest(deqp::Context& context)
476348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCase(
476448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		  context, "incompatible_formats",
476548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		  "Test verifies if INVALID_OPERATION is generated when textures provided to CopySubImageData are incompatible")
476648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_dst_buf_name(0)
476748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_dst_tex_name(0)
476848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_src_buf_name(0)
476948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_src_tex_name(0)
477048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_test_case_index(0)
477148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
477248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RGBA8UI vs RGBA16UI */
477348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint target = 0; target < s_n_valid_targets; ++target)
477448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
477548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLenum tex_target = s_valid_targets[target];
477648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
477748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		testCase test_case = { tex_target,  GL_RGBA8UI,		 GL_RGBA_INTEGER,   GL_UNSIGNED_BYTE,
477848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							   GL_RGBA16UI, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, GL_INVALID_OPERATION };
477948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
478048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Skip multisampled and rectangle targets */
478148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (true == Utils::isTargetMultisampled(tex_target))
478248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
478348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			continue;
478448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
478548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
478648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_cases.push_back(test_case);
478748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
478848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
478948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RGBA8UI vs RGBA32UI */
479048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint target = 0; target < s_n_valid_targets; ++target)
479148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
479248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLenum tex_target = s_valid_targets[target];
479348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
479448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		testCase test_case = { tex_target,  GL_RGBA8UI,		 GL_RGBA_INTEGER, GL_UNSIGNED_BYTE,
479548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							   GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT, GL_INVALID_OPERATION };
479648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
479748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Skip multisampled and rectangle targets */
479848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (true == Utils::isTargetMultisampled(tex_target))
479948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
480048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			continue;
480148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
480248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
480348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_cases.push_back(test_case);
480448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
480548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
480648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RGBA16UI vs RG16UI */
480748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint target = 0; target < s_n_valid_targets; ++target)
480848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
480948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLenum tex_target = s_valid_targets[target];
481048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
481148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		testCase test_case = { tex_target, GL_RGBA16UI,   GL_RGBA_INTEGER,   GL_UNSIGNED_SHORT,
481248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							   GL_RG16UI,  GL_RG_INTEGER, GL_UNSIGNED_SHORT, GL_INVALID_OPERATION };
481348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
481448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Skip multisampled and rectangle targets */
481548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (true == Utils::isTargetMultisampled(tex_target))
481648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
481748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			continue;
481848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
481948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
482048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_cases.push_back(test_case);
482148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
482248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
482348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RGBA32UI vs RGBA32F */
482448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint target = 0; target < s_n_valid_targets; ++target)
482548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
482648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLenum tex_target = s_valid_targets[target];
482748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
482848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		testCase test_case = { tex_target, GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT,
482948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							   GL_RGBA32F, GL_RGBA,		GL_FLOAT,		 GL_NO_ERROR };
483048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
483148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Skip multisampled and rectangle targets */
483248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (true == Utils::isTargetMultisampled(tex_target))
483348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
483448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			continue;
483548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
483648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
483748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_cases.push_back(test_case);
483848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
483948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
484048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* RGBA8 vs RGBA32F */
484148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint target = 0; target < s_n_valid_targets; ++target)
484248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
484348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLenum tex_target = s_valid_targets[target];
484448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
484548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		testCase test_case = { tex_target, GL_RGBA8, GL_RGBA,  GL_UNSIGNED_BYTE,
484648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							   GL_RGBA32F, GL_RGBA,  GL_FLOAT, GL_INVALID_OPERATION };
484748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
484848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Skip multisampled and rectangle targets */
484948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (true == Utils::isTargetMultisampled(tex_target))
485048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
485148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			continue;
485248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
485348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
485448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_cases.push_back(test_case);
485548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
485648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
485748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
485848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test
485948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
486048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise
486148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
486248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult IncompatibleFormatsTest::iterate()
486348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
486448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLenum						 error	 = GL_NO_ERROR;
486548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions&			 gl		   = m_context.getRenderContext().getFunctions();
486648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP;
486748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool						 result	= false;
486848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const testCase&				 test_case = m_test_cases[m_test_case_index];
486948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
487048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
487148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
487248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Prepare textures */
487348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_dst_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, test_case.m_dst_internal_format,
487448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												  test_case.m_dst_format, test_case.m_dst_type, m_dst_buf_name);
487548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_src_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, test_case.m_src_internal_format,
487648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												  test_case.m_src_format, test_case.m_src_type, m_src_buf_name);
487748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
487848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Make textures complete */
487948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_dst_tex_name, 0 /* base */, 0 /* max */);
488048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_src_tex_name, 0 /* base */, 0 /* max */);
488148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
488248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (tcu::Exception& exc)
488348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
488448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		clean();
488548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw exc;
488648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
488748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
488848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Execute CopyImageSubData */
488948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.copyImageSubData(m_src_tex_name, test_case.m_tex_target, 0 /* srcLevel */, 0 /* srcX */, 0 /* srcY */,
489048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0 /* srcZ */, m_dst_tex_name, test_case.m_tex_target, 0 /* dstLevel */, 0 /* dstX */,
489148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0 /* dstY */, 0 /* dstZ */, 1 /* srcWidth */, 1 /* srcHeight */, 1 /* srcDepth */);
489248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
489348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Verify generated error */
489448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	error  = gl.getError();
489548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	result = (test_case.m_expected_result == error);
489648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
489748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Remove resources */
489848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	clean();
489948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
490048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (true == result)
490148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
490248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass");
490348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
490448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Increase index */
490548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_case_index += 1;
490648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
490748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Are there any test cases left */
490848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (m_test_cases.size() > m_test_case_index)
490948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
491048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			it_result = tcu::TestNode::CONTINUE;
491148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
491248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
491348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
491448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
491548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().getLog()
491648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result)
491748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< " got: " << glu::getErrorStr(error)
491848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ". Texture target: " << glu::getTextureTargetStr(test_case.m_tex_target)
491948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ". Source format: " << glu::getInternalFormatParameterStr(test_case.m_src_internal_format)
492048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ". Destination format: " << glu::getInternalFormatParameterStr(test_case.m_dst_internal_format)
492148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::EndMessage;
492248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
492348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail");
492448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
492548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
492648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Done */
492748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return it_result;
492848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
492948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
493048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources
493148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
493248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
493348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid IncompatibleFormatsTest::clean()
493448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
493548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions& gl		   = m_context.getRenderContext().getFunctions();
493648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const testCase&  test_case = m_test_cases[m_test_case_index];
493748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
493848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Clean textures and buffers. Errors ignored */
493948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	Utils::deleteTexture(m_context, test_case.m_tex_target, m_dst_tex_name);
494048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	Utils::deleteTexture(m_context, test_case.m_tex_target, m_src_tex_name);
494148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
494248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_dst_tex_name = 0;
494348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_src_tex_name = 0;
494448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
494548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 != m_dst_buf_name)
494648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
494748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &m_dst_buf_name);
494848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_dst_buf_name = 0;
494948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
495048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
495148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 != m_src_buf_name)
495248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
495348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &m_src_buf_name);
495448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_src_buf_name = 0;
495548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
495648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
495748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
495848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* InvalidTargetTest */
495948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
496048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
496148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context
496248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
496348087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSamplesMissMatchTest::SamplesMissMatchTest(deqp::Context& context)
496448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCase(context, "samples_missmatch", "Test verifies if INVALID_OPERATION is generated when textures provided "
496548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos											 "to CopySubImageData have different number of samples")
496648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_dst_tex_name(0)
496748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_src_tex_name(0)
496848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_test_case_index(0)
496948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
497048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	testCase test_case;
497148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
497248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLsizei n_samples[2] = { 1, 4 };
497348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
497448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLenum targets[2] = { GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_2D_MULTISAMPLE_ARRAY };
497548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
497648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint src_sample = 0; src_sample < 2; ++src_sample)
497748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
497848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint dst_sample = 0; dst_sample < 2; ++dst_sample)
497948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
498048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (GLuint src_target = 0; src_target < 2; ++src_target)
498148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
498248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				for (GLuint dst_target = 0; dst_target < 2; ++dst_target)
498348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
498448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					test_case.m_src_target	= targets[src_target];
498548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					test_case.m_src_n_samples = n_samples[src_sample];
498648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					test_case.m_dst_target	= targets[dst_target];
498748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					test_case.m_dst_n_samples = n_samples[dst_sample];
498848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
498948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					if (test_case.m_src_n_samples == test_case.m_dst_n_samples)
499048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					{
499148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						test_case.m_expected_result = GL_NO_ERROR;
499248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					}
499348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					else
499448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					{
499548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						test_case.m_expected_result = GL_INVALID_OPERATION;
499648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					}
499748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
499848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_test_cases.push_back(test_case);
499948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
500048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
500148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
500248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
500348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
500448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
500548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test
500648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
500748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise
500848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
500948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult SamplesMissMatchTest::iterate()
501048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
501148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLenum						 error	 = GL_NO_ERROR;
501248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions&			 gl		   = m_context.getRenderContext().getFunctions();
501348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP;
501448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool						 result	= false;
501548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const testCase&				 test_case = m_test_cases[m_test_case_index];
501648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
501748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
501848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
501948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Prepare textures */
502048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_dst_tex_name = Utils::prepareMultisampleTex(m_context, test_case.m_dst_target, test_case.m_dst_n_samples);
502148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_src_tex_name = Utils::prepareMultisampleTex(m_context, test_case.m_src_target, test_case.m_src_n_samples);
502248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
502348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (tcu::Exception& exc)
502448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
502548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		clean();
502648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw exc;
502748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
502848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
502948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Execute CopyImageSubData */
503048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.copyImageSubData(m_src_tex_name, test_case.m_src_target, 0 /* srcLevel */, 0 /* srcX */, 0 /* srcY */,
503148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0 /* srcZ */, m_dst_tex_name, test_case.m_dst_target, 0 /* dstLevel */, 0 /* dstX */,
503248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0 /* dstY */, 0 /* dstZ */, 1 /* srcWidth */, 1 /* srcHeight */, 1 /* srcDepth */);
503348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
503448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Verify generated error */
503548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	error  = gl.getError();
503648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	result = (test_case.m_expected_result == error);
503748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
503848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Free resources */
503948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	clean();
504048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
504148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set result */
504248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (true == result)
504348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
504448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass");
504548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
504648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Increase index */
504748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_case_index += 1;
504848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
504948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Are there any test cases left */
505048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (m_test_cases.size() > m_test_case_index)
505148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
505248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			it_result = tcu::TestNode::CONTINUE;
505348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
505448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
505548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
505648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
505748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().getLog()
505848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result)
505948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< " got: " << glu::getErrorStr(error)
506048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ". Source target: " << glu::getTextureTargetStr(test_case.m_src_target)
506148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< " samples: " << test_case.m_src_n_samples
506248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ", destination target: " << glu::getTextureTargetStr(test_case.m_dst_target)
506348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< " samples: " << test_case.m_dst_n_samples << tcu::TestLog::EndMessage;
506448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
506548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail");
506648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
506748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
506848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Done */
506948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return it_result;
507048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
507148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
507248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources
507348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
507448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
507548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid SamplesMissMatchTest::clean()
507648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
507748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions& gl = m_context.getRenderContext().getFunctions();
507848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
507948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Clean textures . Errors ignored */
508048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteTextures(1, &m_dst_tex_name);
508148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteTextures(1, &m_src_tex_name);
508248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
508348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_dst_tex_name = 0;
508448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_src_tex_name = 0;
508548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
508648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
508748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* IncompatibleFormatsCompressionTest */
508848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
508948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
509048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context
509148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
509248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosIncompatibleFormatsCompressionTest::IncompatibleFormatsCompressionTest(deqp::Context& context)
509348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCase(context, "incompatible_formats_compression", "Test verifies if INVALID_OPERATION is generated when "
509448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															"textures provided to CopySubImageData are incompatible, "
509548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															"one of formats is compressed")
509648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_dst_tex_name(0)
509748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_src_tex_name(0)
509848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_test_case_index(0)
509948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
510048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint target = 0; target < s_n_valid_targets; ++target)
510148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
510248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLenum tex_target = s_valid_targets[target];
510348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
510448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Skip 1D targets, not supported */
510548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if ((GL_TEXTURE_1D == tex_target) || (GL_TEXTURE_1D_ARRAY == tex_target) || (GL_TEXTURE_3D == tex_target) ||
510648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			(GL_TEXTURE_RECTANGLE == tex_target) || (GL_RENDERBUFFER == tex_target))
510748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
510848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			continue;
510948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
511048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
511148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Skip multisampled and rectangle targets */
511248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (true == Utils::isTargetMultisampled(tex_target))
511348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
511448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			continue;
511548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
511648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
511748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Compressed 128bit vs RGBA32UI */
511848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
511948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			testCase test_case = {
512048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				tex_target, GL_RGBA32UI,	  GL_RGBA_INTEGER, GL_UNSIGNED_INT, GL_COMPRESSED_RG_RGTC2,
512148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				GL_RG,		GL_UNSIGNED_BYTE, GL_NO_ERROR
512248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			};
512348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
512448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_test_cases.push_back(test_case);
512548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
512648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
512748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Compressed 128bit vs RGBA16UI */
512848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
512948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			testCase test_case = {
513048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				tex_target, GL_RGBA16UI,	  GL_RGBA_INTEGER,	 GL_UNSIGNED_SHORT, GL_COMPRESSED_RG_RGTC2,
513148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				GL_RG,		GL_UNSIGNED_BYTE, GL_INVALID_OPERATION
513248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			};
513348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
513448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_test_cases.push_back(test_case);
513548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
513648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
513748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
513848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
513948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test
514048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
514148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise
514248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
514348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult IncompatibleFormatsCompressionTest::iterate()
514448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
514548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLenum						 error	 = GL_NO_ERROR;
514648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions&			 gl		   = m_context.getRenderContext().getFunctions();
514748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP;
514848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool						 result	= false;
514948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint						 temp	  = 0;
515048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const testCase&				 test_case = m_test_cases[m_test_case_index];
515148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
515248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
515348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
515448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Prepare textures */
515548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_dst_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, test_case.m_dst_internal_format,
515648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												  test_case.m_dst_format, test_case.m_dst_type, temp);
515748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_src_tex_name = Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, test_case.m_src_internal_format,
515848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												  test_case.m_src_format, test_case.m_src_type, temp);
515948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
516048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Make textures complete */
516148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_dst_tex_name, 0 /* base */, 0 /* max */);
516248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_src_tex_name, 0 /* base */, 0 /* max */);
516348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
516448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (tcu::Exception& exc)
516548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
516648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		clean();
516748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw exc;
516848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
516948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
517048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Execute CopyImageSubData */
517148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.copyImageSubData(m_src_tex_name, test_case.m_tex_target, 0 /* srcLevel */, 0 /* srcX */, 0 /* srcY */,
517248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0 /* srcZ */, m_dst_tex_name, test_case.m_tex_target, 0 /* dstLevel */, 0 /* dstX */,
517348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0 /* dstY */, 0 /* dstZ */, 4 /* srcWidth */, 4 /* srcHeight */, 1 /* srcDepth */);
517448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
517548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Verify generated error */
517648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	error  = gl.getError();
517748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	result = (test_case.m_expected_result == error);
517848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
517948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Remove resources */
518048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	clean();
518148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
518248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (true == result)
518348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
518448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass");
518548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
518648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Increase index */
518748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_case_index += 1;
518848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
518948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Are there any test cases left */
519048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (m_test_cases.size() > m_test_case_index)
519148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
519248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			it_result = tcu::TestNode::CONTINUE;
519348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
519448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
519548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
519648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
519748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().getLog()
519848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result)
519948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< " got: " << glu::getErrorStr(error)
520048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ". Texture target: " << glu::getTextureTargetStr(test_case.m_tex_target)
520148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ". Source format: " << glu::getInternalFormatParameterStr(test_case.m_src_internal_format)
520248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ". Destination format: " << glu::getInternalFormatParameterStr(test_case.m_dst_internal_format)
520348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::EndMessage;
520448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
520548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail");
520648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
520748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
520848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Done */
520948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return it_result;
521048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
521148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
521248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources
521348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
521448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
521548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid IncompatibleFormatsCompressionTest::clean()
521648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
521748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions& gl = m_context.getRenderContext().getFunctions();
521848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
521948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Clean textures and buffers. Errors ignored */
522048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteTextures(1, &m_dst_tex_name);
522148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteTextures(1, &m_src_tex_name);
522248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
522348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_dst_tex_name = 0;
522448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_src_tex_name = 0;
522548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
522648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
522748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* MissMatchObjectTest */
522848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
522948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
523048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context
523148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
523248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosMissMatchObjectTest::MissMatchObjectTest(deqp::Context& context)
523348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCase(
523448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		  context, "missmatch_object",
523548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		  "Test verifies if INVALID_VALUE is generated when object & target provided to CopySubImageData do not match")
523648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_dst_name(0)
523748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_src_name(0)
523848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_test_case_index(0)
523948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
524048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const testCase test_cases[] = { { GL_TEXTURE_2D, GL_TEXTURE_2D, GL_TEXTURE_2D, GL_NO_ERROR },
524148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   { GL_TEXTURE_2D, GL_RENDERBUFFER, GL_TEXTURE_2D, GL_INVALID_VALUE },
524248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   { GL_TEXTURE_2D, GL_TEXTURE_2D, GL_RENDERBUFFER, GL_INVALID_VALUE },
524348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   { GL_TEXTURE_2D, GL_RENDERBUFFER, GL_RENDERBUFFER, GL_INVALID_VALUE },
524448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   { GL_RENDERBUFFER, GL_TEXTURE_2D, GL_TEXTURE_2D, GL_INVALID_VALUE },
524548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   { GL_RENDERBUFFER, GL_RENDERBUFFER, GL_TEXTURE_2D, GL_INVALID_VALUE },
524648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   { GL_RENDERBUFFER, GL_TEXTURE_2D, GL_RENDERBUFFER, GL_INVALID_VALUE },
524748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   { GL_RENDERBUFFER, GL_RENDERBUFFER, GL_RENDERBUFFER, GL_NO_ERROR } };
524848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
524948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint n_test_cases = sizeof(test_cases) / sizeof(testCase);
525048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
525148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint i = 0; i < n_test_cases; ++i)
525248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
525348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const testCase& test_case = test_cases[i];
525448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
525548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_cases.push_back(test_case);
525648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
525748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
525848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
525948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test
526048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
526148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise
526248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
526348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult MissMatchObjectTest::iterate()
526448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
526548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLenum						 error	 = GL_NO_ERROR;
526648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions&			 gl		   = m_context.getRenderContext().getFunctions();
526748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP;
526848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool						 result	= false;
526948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint						 temp	  = 0;
527048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const testCase&				 test_case = m_test_cases[m_test_case_index];
527148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
527248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
527348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
527448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Prepare objects */
527548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_RENDERBUFFER == test_case.m_obj_target)
527648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
527748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_dst_name = Utils::prepareRenderBuffer(m_context, GL_RGBA8);
527848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_src_name = Utils::prepareRenderBuffer(m_context, GL_RGBA8);
527948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
528048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
528148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
528248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_dst_name =
528348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				Utils::prepareTex16x16x6(m_context, test_case.m_obj_target, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, temp);
528448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_src_name =
528548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				Utils::prepareTex16x16x6(m_context, test_case.m_obj_target, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, temp);
528648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
528748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Make textures complete */
528848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			Utils::makeTextureComplete(m_context, test_case.m_obj_target, m_dst_name, 0 /* base */, 0 /* max */);
528948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			Utils::makeTextureComplete(m_context, test_case.m_obj_target, m_src_name, 0 /* base */, 0 /* max */);
529048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
529148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
529248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (tcu::Exception& exc)
529348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
529448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		clean();
529548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw exc;
529648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
529748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
529848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Execute CopyImageSubData */
529948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.copyImageSubData(m_src_name, test_case.m_src_target, 0 /* srcLevel */, 0 /* srcX */, 0 /* srcY */, 0 /* srcZ */,
530048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						m_dst_name, test_case.m_dst_target, 0 /* dstLevel */, 0 /* dstX */, 0 /* dstY */, 0 /* dstZ */,
530148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						1 /* srcWidth */, 1 /* srcHeight */, 1 /* srcDepth */);
530248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
530348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Verify generated error */
530448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	error  = gl.getError();
530548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	result = (test_case.m_expected_result == error);
530648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
530748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Remove resources */
530848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	clean();
530948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
531048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (true == result)
531148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
531248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass");
531348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
531448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Increase index */
531548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_case_index += 1;
531648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
531748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Are there any test cases left */
531848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (m_test_cases.size() > m_test_case_index)
531948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
532048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			it_result = tcu::TestNode::CONTINUE;
532148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
532248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
532348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
532448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
532548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().getLog()
532648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result)
532748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< " got: " << glu::getErrorStr(error)
532848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ". Object target: " << glu::getTextureTargetStr(test_case.m_obj_target)
532948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ". Source target: " << glu::getTextureTargetStr(test_case.m_src_target)
533048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ". Destination target: " << glu::getTextureTargetStr(test_case.m_dst_target) << tcu::TestLog::EndMessage;
533148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
533248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail");
533348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
533448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
533548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Done */
533648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return it_result;
533748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
533848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
533948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources
534048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
534148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
534248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid MissMatchObjectTest::clean()
534348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
534448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions& gl		   = m_context.getRenderContext().getFunctions();
534548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const testCase&  test_case = m_test_cases[m_test_case_index];
534648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
534748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Clean textures or renderbuffers. Errors ignored */
534848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (GL_RENDERBUFFER == test_case.m_obj_target)
534948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
535048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteRenderbuffers(1, &m_dst_name);
535148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteRenderbuffers(1, &m_src_name);
535248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
535348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
535448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
535548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteTextures(1, &m_dst_name);
535648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteTextures(1, &m_src_name);
535748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
535848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
535948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_dst_name = 0;
536048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_src_name = 0;
536148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
536248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
536348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* NonExistentMipMapTest */
536448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
536548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
536648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context
536748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
536848087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosNonExistentMipMapTest::NonExistentMipMapTest(deqp::Context& context)
536948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCase(context, "non_existent_mipmap", "Test verifies if INVALID_VALUE is generated when CopySubImageData is "
537048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos											   "executed for mipmap that does not exist")
537148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_dst_tex_name(0)
537248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_src_tex_name(0)
537348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_test_case_index(0)
537448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
537548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint target = 0; target < s_n_valid_targets; ++target)
537648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
537748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLenum tex_target = s_valid_targets[target];
537848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		testCase	 test_case  = { tex_target, 0, 0, GL_NO_ERROR };
537948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
538048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_RENDERBUFFER == tex_target)
538148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
538248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			continue;
538348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
538448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
538548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_cases.push_back(test_case);
538648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
538748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Rest of cases is invalid */
538848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_case.m_expected_result = GL_INVALID_VALUE;
538948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
539048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_case.m_dst_level = 1;
539148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_case.m_src_level = 0;
539248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_cases.push_back(test_case);
539348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
539448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_case.m_dst_level = 0;
539548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_case.m_src_level = 1;
539648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_cases.push_back(test_case);
539748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
539848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_case.m_dst_level = 1;
539948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		test_case.m_src_level = 1;
540048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_cases.push_back(test_case);
540148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
540248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
540348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
540448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test
540548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
540648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise
540748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
540848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult NonExistentMipMapTest::iterate()
540948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
541048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLenum						 error	 = GL_NO_ERROR;
541148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions&			 gl		   = m_context.getRenderContext().getFunctions();
541248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP;
541348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool						 result	= false;
541448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint						 temp	  = 0;
541548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const testCase&				 test_case = m_test_cases[m_test_case_index];
541648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
541748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
541848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
541948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Prepare textures */
542048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_dst_tex_name =
542148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, temp);
542248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_src_tex_name =
542348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, temp);
542448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
542548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Make textures complete */
542648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_dst_tex_name, 0 /* base */, 0 /* max */);
542748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_src_tex_name, 0 /* base */, 0 /* max */);
542848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
542948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (tcu::Exception& exc)
543048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
543148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		clean();
543248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw exc;
543348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
543448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
543548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Execute CopyImageSubData */
543648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.copyImageSubData(m_src_tex_name, test_case.m_tex_target, test_case.m_src_level, 0 /* srcX */, 0 /* srcY */,
543748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0 /* srcZ */, m_dst_tex_name, test_case.m_tex_target, test_case.m_dst_level, 0 /* dstX */,
543848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						0 /* dstY */, 0 /* dstZ */, 1 /* srcWidth */, 1 /* srcHeight */, 1 /* srcDepth */);
543948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
544048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Verify generated error */
544148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	error  = gl.getError();
544248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	result = (test_case.m_expected_result == error);
544348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
544448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Free resources */
544548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	clean();
544648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
544748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set result */
544848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (true == result)
544948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
545048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass");
545148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
545248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Increase index */
545348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_case_index += 1;
545448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
545548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Are there any test cases left */
545648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (m_test_cases.size() > m_test_case_index)
545748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
545848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			it_result = tcu::TestNode::CONTINUE;
545948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
546048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
546148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
546248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
546348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().getLog()
546448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result)
546548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< " got: " << glu::getErrorStr(error)
546648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ". Texture target: " << glu::getTextureTargetStr(test_case.m_tex_target)
546748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ", source level: " << test_case.m_src_level << ", destination level: " << test_case.m_dst_level
546848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::EndMessage;
546948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
547048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail");
547148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
547248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
547348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Done */
547448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return it_result;
547548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
547648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
547748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources
547848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
547948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
548048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid NonExistentMipMapTest::clean()
548148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
548248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions& gl = m_context.getRenderContext().getFunctions();
548348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
548448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Clean textures and buffers. Errors ignored */
548548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteTextures(1, &m_dst_tex_name);
548648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteTextures(1, &m_src_tex_name);
548748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
548848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_dst_tex_name = 0;
548948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_src_tex_name = 0;
549048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
549148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
549248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* ExceedingBoundariesTest */
549348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLuint ExceedingBoundariesTest::m_region_depth  = 4;
549448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLuint ExceedingBoundariesTest::m_region_height = 4;
549548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLuint ExceedingBoundariesTest::m_region_width  = 4;
549648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
549748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
549848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
549948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context
550048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
550148087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosExceedingBoundariesTest::ExceedingBoundariesTest(deqp::Context& context)
550248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCase(context, "exceeding_boundaries", "Test verifies if INVALID_VALUE is generated when CopySubImageData is "
550348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												"executed for regions exceeding image boundaries")
550448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_dst_tex_name(0)
550548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_src_tex_name(0)
550648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_test_case_index(0)
550748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
550848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 16x16x6 are values used by prepareTex16x16x6 */
550948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint invalid_x = 16 - (m_region_width / 2);
551048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint invalid_y = 16 - (m_region_height / 2);
551148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint invalid_z = 6 - (m_region_depth / 2);
551248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
551348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint x_vals[] = { 0, invalid_x };
551448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint y_vals[] = { 0, invalid_y };
551548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint z_vals[] = { 0, invalid_z };
551648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
551748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint n_x_vals = sizeof(x_vals) / sizeof(x_vals[0]);
551848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint n_y_vals = sizeof(y_vals) / sizeof(y_vals[0]);
551948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint n_z_vals = sizeof(z_vals) / sizeof(z_vals[0]);
552048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
552148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint target = 0; target < s_n_valid_targets; ++target)
552248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
552348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLenum tex_target = s_valid_targets[target];
552448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLuint		 height		= m_region_height;
552548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
552648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_TEXTURE_BUFFER == tex_target)
552748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
552848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			continue;
552948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
553048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
553148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if ((GL_TEXTURE_1D == tex_target) || (GL_TEXTURE_1D_ARRAY == tex_target))
553248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
553348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			height = 1;
553448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
553548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
553648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint x = 0; x < n_x_vals; ++x)
553748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
553848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (GLuint y = 0; y < n_y_vals; ++y)
553948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
554048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				for (GLuint z = 0; z < n_z_vals; ++z)
554148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
554248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLuint x_val = x_vals[x];
554348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLuint y_val = y_vals[y];
554448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLuint z_val = z_vals[z];
554548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLenum res = ((0 == x_val) && (0 == y_val) && (0 == z_val)) ? GL_NO_ERROR : GL_INVALID_VALUE;
554648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					GLuint		 depth = 1;
554748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
554848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					if (0 != z_val)
554948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					{
555048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						if ((GL_TEXTURE_2D_ARRAY != tex_target) || (GL_TEXTURE_2D_MULTISAMPLE_ARRAY != tex_target) ||
555148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							(GL_TEXTURE_3D != tex_target) || (GL_TEXTURE_CUBE_MAP_ARRAY != tex_target))
555248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						{
555348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							/* Skip z != 0 for 2d textures */
555448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							continue;
555548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						}
555648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						else
555748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						{
555848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							/* Set depth so as to exceed boundary */
555948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							depth = m_region_depth;
556048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						}
556148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					}
556248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
556348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					testCase src_test_case = { tex_target, depth, height, x_val, y_val, z_val, 0, 0, 0, res };
556448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
556548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					testCase dst_test_case = { tex_target, depth, height, 0, 0, 0, x_val, y_val, z_val, res };
556648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
556748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_test_cases.push_back(src_test_case);
556848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_test_cases.push_back(dst_test_case);
556948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
557048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
557148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
557248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
557348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
557448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
557548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test
557648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
557748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise
557848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
557948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult ExceedingBoundariesTest::iterate()
558048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
558148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLenum						 error	 = GL_NO_ERROR;
558248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions&			 gl		   = m_context.getRenderContext().getFunctions();
558348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP;
558448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool						 result	= false;
558548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint						 temp	  = 0;
558648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const testCase&				 test_case = m_test_cases[m_test_case_index];
558748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
558848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
558948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
559048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Prepare textures */
559148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_dst_tex_name =
559248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, temp);
559348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_src_tex_name =
559448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			Utils::prepareTex16x16x6(m_context, test_case.m_tex_target, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, temp);
559548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
559648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Make textures complete */
559748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_dst_tex_name, 0 /* base */, 0 /* max */);
559848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Utils::makeTextureComplete(m_context, test_case.m_tex_target, m_src_tex_name, 0 /* base */, 0 /* max */);
559948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
560048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (tcu::Exception& exc)
560148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
560248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		clean();
560348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw exc;
560448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
560548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
560648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Execute CopyImageSubData */
560748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.copyImageSubData(m_src_tex_name, test_case.m_tex_target, 0 /* level */, test_case.m_src_x /* srcX */,
560848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						test_case.m_src_y /* srcY */, test_case.m_src_z /* srcZ */, m_dst_tex_name,
560948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						test_case.m_tex_target, 0 /* level */, test_case.m_dst_x /* dstX */,
561048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						test_case.m_dst_y /* dstY */, test_case.m_dst_z /* dstZ */, m_region_width /* srcWidth */,
561148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						test_case.m_height /* srcHeight */, test_case.m_depth /* srcDepth */);
561248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
561348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Verify generated error */
561448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	error  = gl.getError();
561548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	result = (test_case.m_expected_result == error);
561648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
561748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Free resources */
561848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	clean();
561948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
562048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set result */
562148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (true == result)
562248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
562348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass");
562448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
562548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Increase index */
562648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_case_index += 1;
562748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
562848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Are there any test cases left */
562948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (m_test_cases.size() > m_test_case_index)
563048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
563148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			it_result = tcu::TestNode::CONTINUE;
563248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
563348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
563448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
563548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
563648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().getLog()
563748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result)
563848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< " got: " << glu::getErrorStr(error)
563948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ". Texture target: " << glu::getTextureTargetStr(test_case.m_tex_target) << ", source: ["
564048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< test_case.m_src_x << ", " << test_case.m_src_y << ", " << test_case.m_src_z << "], destination: ["
564148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< test_case.m_src_x << ", " << test_case.m_src_y << ", " << test_case.m_src_z
564248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< "], depth: " << test_case.m_depth << tcu::TestLog::EndMessage;
564348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
564448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail");
564548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
564648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
564748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Done */
564848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return it_result;
564948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
565048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
565148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources
565248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
565348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
565448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid ExceedingBoundariesTest::clean()
565548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
565648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const testCase& test_case = m_test_cases[m_test_case_index];
565748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
565848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Clean textures and buffers. Errors ignored */
565948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	Utils::deleteTexture(m_context, test_case.m_tex_target, m_dst_tex_name);
566048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	Utils::deleteTexture(m_context, test_case.m_tex_target, m_src_tex_name);
566148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
566248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_dst_tex_name = 0;
566348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_src_tex_name = 0;
566448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
566548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
566648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* InvalidAlignmentTest */
566748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
566848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
566948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Text context
567048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
567148087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosInvalidAlignmentTest::InvalidAlignmentTest(deqp::Context& context)
567248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCase(context, "invalid_alignment", "Test verifies if INVALID_VALUE is generated when CopySubImageData is "
567348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos											 "executed for regions with invalid alignment")
567448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_dst_tex_name(0)
567548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_src_tex_name(0)
567648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_test_case_index(0)
567748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
567848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* 16x16x6 are values used by prepareTex16x16x6 */
567948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint invalid_h = 2;
568048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint invalid_w = 2;
568148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint invalid_x = 2;
568248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint invalid_y = 2;
568348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint valid_h   = 4;
568448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint valid_w   = 4;
568548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
568648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint h_vals[] = { valid_h, invalid_h };
568748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint w_vals[] = { valid_w, invalid_w };
568848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint x_vals[] = { 0, invalid_x };
568948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint y_vals[] = { 0, invalid_y };
569048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
569148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint n_h_vals = sizeof(h_vals) / sizeof(h_vals[0]);
569248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint n_w_vals = sizeof(w_vals) / sizeof(w_vals[0]);
569348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint n_x_vals = sizeof(x_vals) / sizeof(x_vals[0]);
569448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const GLuint n_y_vals = sizeof(y_vals) / sizeof(y_vals[0]);
569548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
569648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (GLuint x = 0; x < n_x_vals; ++x)
569748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
569848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint y = 0; y < n_y_vals; ++y)
569948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
570048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (GLuint h = 0; h < n_h_vals; ++h)
570148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
570248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				for (GLuint w = 0; w < n_w_vals; ++w)
570348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
570448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLuint h_val = h_vals[h];
570548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLuint w_val = w_vals[w];
570648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLuint x_val = x_vals[x];
570748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLuint y_val = y_vals[y];
570848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					const GLenum res   = ((valid_h == h_val) && (valid_w == w_val) && (0 == x_val) && (0 == y_val)) ?
570948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   GL_NO_ERROR :
571048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   GL_INVALID_VALUE;
571148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
571248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					testCase dst_test_case = { h_val, w_val, 0, 0, x_val, y_val, res };
571348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
571448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					testCase src_test_case = { h_val, w_val, x_val, y_val, 0, 0, res };
571548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
571648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_test_cases.push_back(dst_test_case);
571748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_test_cases.push_back(src_test_case);
571848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
571948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
572048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
572148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
572248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
572348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
572448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Execute test
572548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
572648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return CONTINUE as long there are more test case, STOP otherwise
572748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
572848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult InvalidAlignmentTest::iterate()
572948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
573048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLenum						 error	 = GL_NO_ERROR;
573148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions&			 gl		   = m_context.getRenderContext().getFunctions();
573248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	tcu::TestNode::IterateResult it_result = tcu::TestNode::STOP;
573348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool						 result	= false;
573448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint						 temp	  = 0;
573548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const testCase&				 test_case = m_test_cases[m_test_case_index];
573648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
573748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
573848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
573948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Prepare textures */
574048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_dst_tex_name =
574148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			Utils::prepareTex16x16x6(m_context, GL_TEXTURE_2D, GL_COMPRESSED_RG_RGTC2, GL_RG, GL_UNSIGNED_BYTE, temp);
574248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_src_tex_name =
574348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			Utils::prepareTex16x16x6(m_context, GL_TEXTURE_2D, GL_COMPRESSED_RG_RGTC2, GL_RG, GL_UNSIGNED_BYTE, temp);
574448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
574548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Make textures complete */
574648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Utils::makeTextureComplete(m_context, GL_TEXTURE_2D, m_dst_tex_name, 0 /* base */, 0 /* max */);
574748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Utils::makeTextureComplete(m_context, GL_TEXTURE_2D, m_src_tex_name, 0 /* base */, 0 /* max */);
574848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
574948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (tcu::Exception& exc)
575048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
575148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		clean();
575248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw exc;
575348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
575448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
575548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Execute CopyImageSubData */
575648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.copyImageSubData(m_src_tex_name, GL_TEXTURE_2D, 0 /* level */, test_case.m_src_x /* srcX */,
575748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						test_case.m_src_y /* srcY */, 0 /* srcZ */, m_dst_tex_name, GL_TEXTURE_2D, 0 /* level */,
575848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						test_case.m_dst_x /* dstX */, test_case.m_dst_y /* dstY */, 0 /* dstZ */,
575948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						test_case.m_width /* srcWidth */, test_case.m_height /* srcHeight */, 1 /* srcDepth */);
576048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
576148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Verify generated error */
576248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	error  = gl.getError();
576348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	result = (test_case.m_expected_result == error);
576448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
576548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Free resources */
576648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	clean();
576748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
576848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Set result */
576948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (true == result)
577048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
577148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass");
577248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
577348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Increase index */
577448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_test_case_index += 1;
577548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
577648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Are there any test cases left */
577748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (m_test_cases.size() > m_test_case_index)
577848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
577948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			it_result = tcu::TestNode::CONTINUE;
578048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
578148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
578248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
578348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
578448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().getLog()
578548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::Message << "Failure. Expected result: " << glu::getErrorStr(test_case.m_expected_result)
578648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< " got: " << glu::getErrorStr(error) << ". source: [" << test_case.m_src_x << ", " << test_case.m_src_y
578748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< "], destination: [" << test_case.m_src_x << ", " << test_case.m_src_y << "], size: " << test_case.m_width
578848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< " x " << test_case.m_height << tcu::TestLog::EndMessage;
578948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
579048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail");
579148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
579248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
579348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Done */
579448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return it_result;
579548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
579648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
579748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Cleans resources
579848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
579948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
580048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid InvalidAlignmentTest::clean()
580148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
580248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const Functions& gl = m_context.getRenderContext().getFunctions();
580348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
580448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Clean textures and buffers. Errors ignored */
580548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteTextures(1, &m_dst_tex_name);
580648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteTextures(1, &m_src_tex_name);
580748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
580848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_dst_tex_name = 0;
580948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_src_tex_name = 0;
581048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
581148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} /* namespace CopyImage */
581248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
581348087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosCopyImageTests::CopyImageTests(deqp::Context& context) : TestCaseGroup(context, "copy_image", "")
581448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
581548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
581648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
581748087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosCopyImageTests::~CopyImageTests(void)
581848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
581948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
582048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
582148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid CopyImageTests::init()
582248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
582348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new CopyImage::FunctionalTest(m_context));
582448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new CopyImage::IncompleteTexTest(m_context));
582548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new CopyImage::MissMatchObjectTest(m_context));
582648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new CopyImage::SmokeTest(m_context));
582748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new CopyImage::InvalidTargetTest(m_context));
582848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new CopyImage::TargetMissMatchTest(m_context));
582948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new CopyImage::IncompatibleFormatsTest(m_context));
583048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new CopyImage::SamplesMissMatchTest(m_context));
583148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new CopyImage::IncompatibleFormatsCompressionTest(m_context));
583248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new CopyImage::NonExistentMipMapTest(m_context));
583348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new CopyImage::ExceedingBoundariesTest(m_context));
583448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new CopyImage::InvalidAlignmentTest(m_context));
583548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
583648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} /* namespace gl4cts */
5837