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