1433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi/*-------------------------------------------------------------------------
2433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * drawElements Quality Program OpenGL ES 3.1 Module
3433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * -------------------------------------------------
4433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi *
5433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * Copyright 2014 The Android Open Source Project
6433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi *
7433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * Licensed under the Apache License, Version 2.0 (the "License");
8433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * you may not use this file except in compliance with the License.
9433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * You may obtain a copy of the License at
10433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi *
11433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi *      http://www.apache.org/licenses/LICENSE-2.0
12433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi *
13433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * Unless required by applicable law or agreed to in writing, software
14433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * distributed under the License is distributed on an "AS IS" BASIS,
15433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * See the License for the specific language governing permissions and
17433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * limitations under the License.
18433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi *
19433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi *//*!
20433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * \file
21433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi * \brief Copy image tests for GL_EXT_copy_image.
22433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi *//*--------------------------------------------------------------------*/
23433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
24433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "es31fCopyImageTests.hpp"
25433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
26433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tes31TestCase.hpp"
27433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
28433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "glsTextureTestUtil.hpp"
29433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
30433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "gluContextInfo.hpp"
31433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "gluObjectWrapper.hpp"
32433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "gluRenderContext.hpp"
33433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "gluStrUtil.hpp"
34433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "gluTextureUtil.hpp"
35433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "gluPixelTransfer.hpp"
36433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
37433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "glwEnums.hpp"
38433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "glwFunctions.hpp"
39433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
40433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tcuCompressedTexture.hpp"
41433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tcuFloat.hpp"
42433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tcuImageCompare.hpp"
43433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tcuTestLog.hpp"
44433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tcuTexture.hpp"
45433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tcuTextureUtil.hpp"
46433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tcuVector.hpp"
47433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tcuVectorUtil.hpp"
48433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "tcuSeedBuilder.hpp"
4922bdf29e89799390266ab526e524c71a8c69d42cJarkko Pöyry#include "tcuResultCollector.hpp"
50433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
51433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "deArrayBuffer.hpp"
52433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "deFloat16.h"
53433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "deRandom.hpp"
54433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "deStringUtil.hpp"
55433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include "deUniquePtr.hpp"
56d6148171f88da1301f053e2e0236afc69416137cJarkko Pöyry#include "deArrayUtil.hpp"
57433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
58433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include <map>
59433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include <string>
60433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi#include <vector>
61433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
62433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing namespace deqp::gls::TextureTestUtil;
63433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
64433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing tcu::Float;
65433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing tcu::IVec3;
66433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing tcu::Sampler;
67433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing tcu::ScopedLogSection;
68433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing tcu::TestLog;
69433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing tcu::Vec4;
70433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing tcu::SeedBuilder;
71433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
72433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing de::ArrayBuffer;
73433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
74433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing std::map;
75433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing std::string;
76433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing std::vector;
77433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviusing std::pair;
78433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
79433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvinamespace deqp
80433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
81433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvinamespace gles31
82433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
83433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvinamespace Functional
84433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
85433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvinamespace
86433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
87433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
88433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvienum ViewClass
89433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
90433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_128_BITS = 0,
91433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_96_BITS,
92433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_64_BITS,
93433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_48_BITS,
94433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_32_BITS,
95433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_24_BITS,
96433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_16_BITS,
97433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_8_BITS,
98433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
99433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_EAC_R11,
100433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_EAC_RG11,
101433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_ETC2_RGB,
102433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_ETC2_RGBA,
103433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_ETC2_EAC_RGBA,
104433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_ASTC_4x4_RGBA,
105433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_ASTC_5x4_RGBA,
106433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_ASTC_5x5_RGBA,
107433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_ASTC_6x5_RGBA,
108433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_ASTC_6x6_RGBA,
109433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_ASTC_8x5_RGBA,
110433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_ASTC_8x6_RGBA,
111433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_ASTC_8x8_RGBA,
112433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_ASTC_10x5_RGBA,
113433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_ASTC_10x6_RGBA,
114433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_ASTC_10x8_RGBA,
115433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_ASTC_10x10_RGBA,
116433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_ASTC_12x10_RGBA,
117433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	VIEWCLASS_ASTC_12x12_RGBA
118433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi};
119433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
120433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviconst char* viewClassToName (ViewClass viewClass)
121433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
122433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	switch (viewClass)
123433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
124433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_128_BITS:			return "viewclass_128_bits";
125433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_96_BITS:				return "viewclass_96_bits";
126433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_64_BITS:				return "viewclass_64_bits";
127433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_48_BITS:				return "viewclass_48_bits";
128433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_32_BITS:				return "viewclass_32_bits";
129433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_24_BITS:				return "viewclass_24_bits";
130433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_16_BITS:				return "viewclass_16_bits";
131433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_8_BITS:				return "viewclass_8_bits";
132433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_EAC_R11:				return "viewclass_eac_r11";
133433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_EAC_RG11:			return "viewclass_eac_rg11";
134433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_ETC2_RGB:			return "viewclass_etc2_rgb";
135433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_ETC2_RGBA:			return "viewclass_etc2_rgba";
136433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_ETC2_EAC_RGBA:		return "viewclass_etc2_eac_rgba";
137433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_ASTC_4x4_RGBA:		return "viewclass_astc_4x4_rgba";
138433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_ASTC_5x4_RGBA:		return "viewclass_astc_5x4_rgba";
139433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_ASTC_5x5_RGBA:		return "viewclass_astc_5x5_rgba";
140433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_ASTC_6x5_RGBA:		return "viewclass_astc_6x5_rgba";
141433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_ASTC_6x6_RGBA:		return "viewclass_astc_6x6_rgba";
142433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_ASTC_8x5_RGBA:		return "viewclass_astc_8x5_rgba";
143433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_ASTC_8x6_RGBA:		return "viewclass_astc_8x6_rgba";
144433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_ASTC_8x8_RGBA:		return "viewclass_astc_8x8_rgba";
145433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_ASTC_10x5_RGBA:		return "viewclass_astc_10x5_rgba";
146433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_ASTC_10x6_RGBA:		return "viewclass_astc_10x6_rgba";
147433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_ASTC_10x8_RGBA:		return "viewclass_astc_10x8_rgba";
148433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_ASTC_10x10_RGBA:		return "viewclass_astc_10x10_rgba";
149433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_ASTC_12x10_RGBA:		return "viewclass_astc_12x10_rgba";
150433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case VIEWCLASS_ASTC_12x12_RGBA:		return "viewclass_astc_12x12_rgba";
151433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
152433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		default:
153433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			DE_ASSERT(false);
154433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			return NULL;
155433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
156433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
157433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
158433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviconst char* targetToName (deUint32 target)
159433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
160433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	switch (target)
161433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
162433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RENDERBUFFER:		return "renderbuffer";
163433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_TEXTURE_2D:			return "texture2d";
164433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_TEXTURE_3D:			return "texture3d";
165433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_TEXTURE_2D_ARRAY:	return "texture2d_array";
166433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_TEXTURE_CUBE_MAP:	return "cubemap";
167433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
168433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		default:
169433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			DE_ASSERT(false);
170433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			return NULL;
171433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
172433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
173433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
174433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvistring formatToName (deUint32 format)
175433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
176433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	string enumName;
177433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
178238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry	if (glu::isCompressedFormat(format))
179433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		enumName = glu::getCompressedTexFormatStr(format).toString().substr(14); // Strip GL_COMPRESSED_
180433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
181433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		enumName = glu::getPixelFormatStr(format).toString().substr(3); // Strip GL_
182433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
183433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	return de::toLower(enumName);
184433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
185433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
186433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvibool isFloatFormat (deUint32 format)
187433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
188238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry	if (glu::isCompressedFormat(format))
189433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return false;
190433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
191433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return tcu::getTextureChannelClass(glu::mapGLInternalFormat(format).type) == tcu::TEXTURECHANNELCLASS_FLOATING_POINT;
192433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
193433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
194433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvibool isUintFormat (deUint32 format)
195433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
196238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry	if (glu::isCompressedFormat(format))
197433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return false;
198433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
199433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return tcu::getTextureChannelClass(glu::mapGLInternalFormat(format).type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
200433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
201433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
202433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvibool isIntFormat (deUint32 format)
203433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
204238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry	if (glu::isCompressedFormat(format))
205433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return false;
206433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
207433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return tcu::getTextureChannelClass(glu::mapGLInternalFormat(format).type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER;
208433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
209433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
210433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvibool isTextureTarget (deUint32 target)
211433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
212433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	return target != GL_RENDERBUFFER;
213433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
214433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
215433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviint getTargetTexDims (deUint32 target)
216433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
217433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT(isTextureTarget(target));
218433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
219433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	switch (target)
220433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
221433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_TEXTURE_1D:
222433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			return 1;
223433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
224433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_TEXTURE_1D_ARRAY:
225433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_TEXTURE_2D:
226433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_TEXTURE_CUBE_MAP:
227433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			return 2;
228433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
229433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_TEXTURE_2D_ARRAY:
230433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_TEXTURE_3D:
231433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			return 3;
232433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
233433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		default:
234433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			DE_ASSERT(false);
235433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			return -1;
236433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
237433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
238433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
239433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviclass ImageInfo
240433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
241433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvipublic:
242433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					ImageInfo		(deUint32 format, deUint32 target, const IVec3& size);
243433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
244433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	deUint32		getFormat		(void) const { return m_format; }
245433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	deUint32		getTarget		(void) const { return m_target; }
246433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3&	getSize			(void) const { return m_size; }
247433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
248433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviprivate:
249433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	deUint32		m_format;
250433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	deUint32		m_target;
251433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	IVec3			m_size;
252433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi};
253433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
254433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviImageInfo::ImageInfo (deUint32 format, deUint32 target, const IVec3& size)
255433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	: m_format		(format)
256433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	, m_target		(target)
257433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	, m_size		(size)
258433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
259433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT(m_target == GL_TEXTURE_2D_ARRAY || m_target == GL_TEXTURE_3D || m_size.z() == 1);
260238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry	DE_ASSERT(isTextureTarget(m_target) || !glu::isCompressedFormat(m_target));
261433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
262433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
263433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
264433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviSeedBuilder& operator<< (SeedBuilder& builder, const ImageInfo& info)
265433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
266433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	builder << info.getFormat() << info.getTarget() << info.getSize();
267433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	return builder;
268433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
269433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
270433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviconst glu::ObjectTraits& getObjectTraits (const ImageInfo& info)
271433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
272433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	if (isTextureTarget(info.getTarget()))
273433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return glu::objectTraits(glu::OBJECTTYPE_TEXTURE);
274433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
275433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return glu::objectTraits(glu::OBJECTTYPE_RENDERBUFFER);
276433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
277433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
278433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviint getLevelCount (const ImageInfo& info)
279433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
280433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const deUint32	target	= info.getTarget();
281433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3		size	= info.getSize();
282433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
283433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	if (target == GL_RENDERBUFFER)
284433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return 1;
285433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else if (target == GL_TEXTURE_2D_ARRAY)
286433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
287433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const int maxSize = de::max(size.x(), size.y());
288433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
289433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return deLog2Ceil32(maxSize);
290433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
291433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
292433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
293433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const int maxSize = de::max(size.x(), de::max(size.y(), size.z()));
294433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
295433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return deLog2Ceil32(maxSize);
296433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
297433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
298433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
299433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi// Return format that has more restrictions on texel data.
300433e5704171098c7cd062c7339b259ad76a55678Mika IsojärvideUint32 getMoreRestrictiveFormat (deUint32 formatA, deUint32 formatB)
301433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
302433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	if (formatA == formatB)
303433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return formatA;
304238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry	else if (glu::isCompressedFormat(formatA) && isAstcFormat(glu::mapGLCompressedTexFormat(formatA)))
305433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return formatA;
306238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry	else if (glu::isCompressedFormat(formatB) && isAstcFormat(glu::mapGLCompressedTexFormat(formatB)))
307433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return formatB;
308433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else if (isFloatFormat(formatA))
309433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
310433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		DE_ASSERT(!isFloatFormat(formatB));
311433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
312433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return formatA;
313433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
314433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else if (isFloatFormat(formatB))
315433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
316433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		DE_ASSERT(!isFloatFormat(formatA));
317433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
318433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return formatB;
319433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
320238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry	else if (glu::isCompressedFormat(formatA))
321433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
322433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return formatA;
323433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
324238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry	else if (glu::isCompressedFormat(formatB))
325433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
326433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return formatB;
327433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
328433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
329433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return formatA;
330433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
331433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
332433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviint getTexelBlockSize (deUint32 format)
333433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
334238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry	if (glu::isCompressedFormat(format))
335433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return tcu::getBlockSize(glu::mapGLCompressedTexFormat(format));
336433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
337433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return glu::mapGLInternalFormat(format).getPixelSize();
338433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
339433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
340433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviIVec3 getTexelBlockPixelSize (deUint32 format)
341433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
342238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry	if (glu::isCompressedFormat(format))
343433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return tcu::getBlockPixelSize(glu::mapGLCompressedTexFormat(format));
344433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
345433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return IVec3(1, 1, 1);
346433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
347433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
348433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviIVec3 getLevelSize (deUint32 target, const IVec3& baseSize, int level)
349433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
350433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	IVec3 size;
351433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
352433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	if (target != GL_TEXTURE_2D_ARRAY)
353433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
354433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		for (int i = 0; i < 3; i++)
355433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			size[i] = de::max(baseSize[i] >> level, 1);
356433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
357433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
358433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
359433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		for (int i = 0; i < 2; i++)
360433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			size[i] = de::max(baseSize[i] >> level, 1);
361433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
362433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		size[2] = baseSize[2];
363433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
364433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
365433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	return size;
366433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
367433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
368433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvibool isColorRenderable (deUint32 format)
369433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
370433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	switch (format)
371433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
372433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_R8:
373433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RG8:
374433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RGB8:
375433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RGB565:
376433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RGB4:
377433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RGB5_A1:
378433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RGBA8:
379433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RGB10_A2:
380433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RGB10_A2UI:
381433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_SRGB8_ALPHA8:
382433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_R8I:
383433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_R8UI:
384433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_R16I:
385433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_R16UI:
386433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_R32I:
387433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_R32UI:
388433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RG8I:
389433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RG8UI:
390433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RG16I:
391433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RG16UI:
392433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RG32I:
393433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RG32UI:
394433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RGBA8I:
395433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RGBA8UI:
396433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RGBA16I:
397433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RGBA16UI:
398433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RGBA32I:
399433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RGBA32UI:
400433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			return true;
401433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
402433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		default:
403433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			return false;
404433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
405433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
406433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
407433e5704171098c7cd062c7339b259ad76a55678Mika IsojärvideUint32 getTypeForInternalFormat (deUint32 format)
408433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
409433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	return glu::getTransferFormat(glu::mapGLInternalFormat(format)).dataType;
410433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
411433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
412433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid genTexel (de::Random& rng, deUint32 glFormat, int texelBlockSize, const int texelCount, deUint8* buffer)
413433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
414433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	if (isFloatFormat(glFormat))
415433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
416433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const tcu::TextureFormat		format	= glu::mapGLInternalFormat(glFormat);
417433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const tcu::PixelBufferAccess	access	(format, texelCount, 1, 1, buffer);
418433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const tcu::TextureFormatInfo	info	= tcu::getTextureFormatInfo(format);
419433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
420433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		for (int texelNdx = 0; texelNdx < texelCount; texelNdx++)
421433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
422433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const float	red		= rng.getFloat(info.valueMin.x(), info.valueMax.x());
423433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const float green	= rng.getFloat(info.valueMin.y(), info.valueMax.y());
424433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const float blue	= rng.getFloat(info.valueMin.z(), info.valueMax.z());
425433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const float alpha	= rng.getFloat(info.valueMin.w(), info.valueMax.w());
426433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
427433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const Vec4	color	(red, green, blue, alpha);
428433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
429433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			access.setPixel(color, texelNdx, 0, 0);
430433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
431433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
432238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry	else if (glu::isCompressedFormat(glFormat))
433433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
434433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const tcu::CompressedTexFormat compressedFormat = glu::mapGLCompressedTexFormat(glFormat);
435433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
436433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		if (tcu::isAstcFormat(compressedFormat))
437433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
438433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const int		BLOCK_SIZE				= 16;
439433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const deUint8	blocks[][BLOCK_SIZE]	=
440433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			{
441433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				// \note All of the following blocks are valid in LDR mode.
442433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				{ 252,	253,	255,	255,	255,	255,	255,	255,	8,		71,		90,		78,		22,		17,		26,		66,		},
443433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				{ 252,	253,	255,	255,	255,	255,	255,	255,	220,	74,		139,	235,	249,	6,		145,	125		},
444433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				{ 252,	253,	255,	255,	255,	255,	255,	255,	223,	251,	28,		206,	54,		251,	160,	174		},
445433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				{ 252,	253,	255,	255,	255,	255,	255,	255,	39,		4,		153,	219,	180,	61,		51,		37		},
446433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				{ 67,	2,		0,		254,	1,		0,		64,		215,	83,		211,	159,	105,	41,		140,	50,		2		},
447433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				{ 67,	130,	0,		170,	84,		255,	65,		215,	83,		211,	159,	105,	41,		140,	50,		2		},
448433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				{ 67,	2,		129,	38,		51,		229,	95,		215,	83,		211,	159,	105,	41,		140,	50,		2		},
449433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				{ 67,	130,	193,	56,		213,	144,	95,		215,	83,		211,	159,	105,	41,		140,	50,		2		}
450433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			};
451433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
452433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			DE_ASSERT(texelBlockSize == BLOCK_SIZE);
453433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
454433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			for (int i = 0; i < texelCount; i++)
455433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			{
456433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				const int blockNdx = rng.getInt(0, DE_LENGTH_OF_ARRAY(blocks)-1);
457433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
458433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				deMemcpy(buffer + i * BLOCK_SIZE,  blocks[blockNdx], BLOCK_SIZE);
459433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			}
460433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
461433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		else
462433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
463433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			for (int i = 0; i < texelBlockSize * texelCount; i++)
464433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			{
465433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				const deUint8 val = rng.getUint8();
466433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
467433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				buffer[i] = val;
468433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			}
469433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
470433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
471433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
472433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
473433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		for (int i = 0; i < texelBlockSize * texelCount; i++)
474433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
475433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const deUint8 val = rng.getUint8();
476433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
477433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			buffer[i] = val;
478433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
479433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
480433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
481433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
482433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviIVec3 divRoundUp (const IVec3& a, const IVec3& b)
483433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
484433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	IVec3 res;
485433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
486433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (int i =0; i < 3; i++)
487433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		res[i] = a[i] / b[i] + ((a[i] % b[i]) ? 1 : 0);
488433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
489433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	return res;
490433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
491433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
492433e5704171098c7cd062c7339b259ad76a55678Mika IsojärvideUint32 mapFaceNdxToFace (int ndx)
493433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
494433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const deUint32 cubeFaces[] =
495433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
496433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		GL_TEXTURE_CUBE_MAP_POSITIVE_X,
497433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
498433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
499433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
500433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
501433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
502433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
503433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
504433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	};
505433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
5065730719a54e92e0816ef2b4217a2277907d67bccJarkko Pöyry	return de::getSizedArrayElement<6>(cubeFaces, ndx);
507433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
508433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
509433e5704171098c7cd062c7339b259ad76a55678Mika IsojärvideUint32 getFormatForInternalFormat (deUint32 format)
510433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
511433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	return glu::getTransferFormat(glu::mapGLInternalFormat(format)).format;
512433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
513433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
514433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid genericTexImage (const glw::Functions&	gl,
515433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  deUint32				target,
516433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  int					faceNdx,
517433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  int					level,
518433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  const IVec3&			size,
519433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  deUint32				format,
520433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  size_t				dataSize,
521433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  const void*			data)
522433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
523433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const deUint32 glTarget = (target == GL_TEXTURE_CUBE_MAP ? mapFaceNdxToFace(faceNdx) : target);
524433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
525433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT(target == GL_TEXTURE_CUBE_MAP || faceNdx == 0);
526433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
527238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry	if (glu::isCompressedFormat(format))
528433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
529433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		switch (getTargetTexDims(target))
530433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
531433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			case 2:
532433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				DE_ASSERT(size.z() == 1);
533654d8c53a77c4fac3c57c6e7abf1fa940e715899Pyry Haulos				gl.compressedTexImage2D(glTarget, level, format, (glw::GLsizei)size.x(), (glw::GLsizei)size.y(), 0, (glw::GLsizei)dataSize, data);
534433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				GLU_EXPECT_NO_ERROR(gl.getError(), "glCompressedTexImage2D failed.");
535433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				break;
536433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
537433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			case 3:
538654d8c53a77c4fac3c57c6e7abf1fa940e715899Pyry Haulos				gl.compressedTexImage3D(glTarget, level, format, (glw::GLsizei)size.x(), (glw::GLsizei)size.y(), (glw::GLsizei)size.z(), 0, (glw::GLsizei)dataSize, data);
539433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				GLU_EXPECT_NO_ERROR(gl.getError(), "glCompressedTexImage3D failed.");
540433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				break;
541433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
542433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			default:
543433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				DE_ASSERT(false);
544433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
545433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
546433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
547433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
548433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const deUint32	glFormat	= getFormatForInternalFormat(format);
549433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const deUint32	glType		= getTypeForInternalFormat(format);
550433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
551433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		switch (getTargetTexDims(target))
552433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
553433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			case 2:
554433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				DE_ASSERT(size.z() == 1);
555654d8c53a77c4fac3c57c6e7abf1fa940e715899Pyry Haulos				gl.texImage2D(glTarget, level, format, (glw::GLsizei)size.x(), (glw::GLsizei)size.y(), 0, glFormat, glType, data);
556433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage2D failed.");
557433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				break;
558433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
559433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			case 3:
560654d8c53a77c4fac3c57c6e7abf1fa940e715899Pyry Haulos				gl.texImage3D(glTarget, level, format, (glw::GLsizei)size.x(), (glw::GLsizei)size.y(), (glw::GLsizei)size.z(), 0, glFormat, glType, data);
561433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage3D failed.");
562433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				break;
563433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
564433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			default:
565433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				DE_ASSERT(false);
566433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
567433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
568433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
569433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
570433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid genTextureImage (const glw::Functions&				gl,
571433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  de::Random&						rng,
572433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  deUint32							name,
573433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  vector<ArrayBuffer<deUint8> >&	levels,
574433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  const ImageInfo&					info,
575433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  deUint32							moreRestrictiveFormat)
576433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
577433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const int		texelBlockSize			= getTexelBlockSize(info.getFormat());
578433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3		texelBlockPixelSize 	= getTexelBlockPixelSize(info.getFormat());
579433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
580433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	levels.resize(getLevelCount(info));
581433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
582433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.pixelStorei(GL_UNPACK_ALIGNMENT, 1);
583433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "Setting pixel store aligment failed.");
584433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
585433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.bindTexture(info.getTarget(), name);
586433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "Binding texture failed.");
587433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
588433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (int levelNdx = 0; levelNdx < getLevelCount(info); levelNdx++)
589433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
590433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		ArrayBuffer<deUint8>&	level					= levels[levelNdx];
591433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
592433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const int				faceCount				= (info.getTarget() == GL_TEXTURE_CUBE_MAP ? 6 : 1);
593433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
594433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const IVec3				levelPixelSize			= getLevelSize(info.getTarget(), info.getSize(), levelNdx);
595433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const IVec3				levelTexelBlockSize		= divRoundUp(levelPixelSize, texelBlockPixelSize);
596433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const int				levelTexelBlockCount	= levelTexelBlockSize.x() * levelTexelBlockSize.y() * levelTexelBlockSize.z();
597433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const int				levelSize 				= levelTexelBlockCount * texelBlockSize;
598433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
599433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		level.setStorage(levelSize * faceCount);
600433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
601433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		for (int faceNdx = 0; faceNdx < faceCount; faceNdx++)
602433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
603433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			genTexel(rng, moreRestrictiveFormat, texelBlockSize, levelTexelBlockCount, level.getElementPtr(faceNdx * levelSize));
604433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
605433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			genericTexImage(gl, info.getTarget(), faceNdx, levelNdx, levelPixelSize, info.getFormat(), levelSize, level.getElementPtr(faceNdx * levelSize));
606433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
607433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
608433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
6099ea37879e8c0ecc8a8973b3d5194d4dc12f21360Mika Isojärvi	gl.texParameteri(info.getTarget(), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
6109ea37879e8c0ecc8a8973b3d5194d4dc12f21360Mika Isojärvi	gl.texParameteri(info.getTarget(), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
6119ea37879e8c0ecc8a8973b3d5194d4dc12f21360Mika Isojärvi
6129ea37879e8c0ecc8a8973b3d5194d4dc12f21360Mika Isojärvi	if (info.getTarget() == GL_TEXTURE_3D)
6139ea37879e8c0ecc8a8973b3d5194d4dc12f21360Mika Isojärvi		gl.texParameteri(info.getTarget(), GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
6149ea37879e8c0ecc8a8973b3d5194d4dc12f21360Mika Isojärvi
6159ea37879e8c0ecc8a8973b3d5194d4dc12f21360Mika Isojärvi	gl.texParameteri(info.getTarget(), GL_TEXTURE_MIN_FILTER, GL_NEAREST);
6169ea37879e8c0ecc8a8973b3d5194d4dc12f21360Mika Isojärvi	gl.texParameteri(info.getTarget(), GL_TEXTURE_MAG_FILTER, GL_NEAREST);
6179ea37879e8c0ecc8a8973b3d5194d4dc12f21360Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "Setting texture parameters failed");
6189ea37879e8c0ecc8a8973b3d5194d4dc12f21360Mika Isojärvi
619433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.bindTexture(info.getTarget(), 0);
620433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "Unbinding texture failed.");
621433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
622433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
623433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid genRenderbufferImage (const glw::Functions&			gl,
624433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						   de::Random&						rng,
625433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						   deUint32							name,
626433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						   vector<ArrayBuffer<deUint8> >&	levels,
627433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						   const ImageInfo&					info,
628433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						   deUint32							moreRestrictiveFormat)
629433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
630433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3					size	= info.getSize();
631433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::TextureFormat	format	= glu::mapGLInternalFormat(info.getFormat());
632433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
633433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT(info.getTarget() == GL_RENDERBUFFER);
634433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT(info.getSize().z() == 1);
635433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT(getLevelCount(info) == 1);
636238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry	DE_ASSERT(!glu::isCompressedFormat(info.getFormat()));
637433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
638433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	glu::Framebuffer framebuffer(gl);
639433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
640433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	levels.resize(1);
641433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	levels[0].setStorage(format.getPixelSize() * size.x() * size.y());
642433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	tcu::PixelBufferAccess refAccess(format, size.x(), size.y(), 1, levels[0].getPtr());
643433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
644433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.bindRenderbuffer(GL_RENDERBUFFER, name);
645433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.renderbufferStorage(GL_RENDERBUFFER, info.getFormat(), info.getSize().x(), info.getSize().y());
646433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "Binding and setting storage for renderbuffer failed.");
647433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
648433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.bindFramebuffer(GL_FRAMEBUFFER, *framebuffer);
649433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, name);
650433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "Binding framebuffer and attaching renderbuffer failed.");
651433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
652433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
653433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		vector<deUint8> texelBlock(format.getPixelSize());
654433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
655433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		genTexel(rng, moreRestrictiveFormat, format.getPixelSize(), 1, &(texelBlock[0]));
656433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
657433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
658433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const tcu::ConstPixelBufferAccess texelAccess (format, 1, 1, 1, &(texelBlock[0]));
659433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
660433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			if (isFloatFormat(info.getFormat()))
661433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			{
662433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				const tcu::Vec4 color = texelAccess.getPixel(0, 0, 0);
663433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
664433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				gl.clearBufferfv(GL_COLOR, 0, (const float*)&color);
665433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to clear renderbuffer.");
666433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
667065cde5304da4f2d89e0c8d422870917453a383eMika Isojärvi				tcu::clear(refAccess, (tcu::isSRGB(format) ? tcu::linearToSRGB(color) : color));
668433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			}
669433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			else if (isIntFormat(info.getFormat()))
670433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			{
671433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				const tcu::IVec4 color = texelAccess.getPixelInt(0, 0, 0);
672433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
673433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				gl.clearBufferiv(GL_COLOR, 0, (const deInt32*)&color);
674433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to clear renderbuffer.");
675433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
676065cde5304da4f2d89e0c8d422870917453a383eMika Isojärvi				DE_ASSERT(!tcu::isSRGB(format));
677433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				tcu::clear(refAccess, color);
678433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			}
679433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			else if (isUintFormat(info.getFormat()))
680433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			{
681433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				const tcu::IVec4 color = texelAccess.getPixelInt(0, 0, 0);
682433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
683433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				gl.clearBufferuiv(GL_COLOR, 0, (const deUint32*)&color);
684433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to clear renderbuffer.");
685433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
686065cde5304da4f2d89e0c8d422870917453a383eMika Isojärvi				DE_ASSERT(!tcu::isSRGB(format));
687433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				tcu::clear(refAccess, color);
688433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			}
689433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			else
690433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			{
691433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				const tcu::Vec4 color = texelAccess.getPixel(0, 0, 0);
692433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
693433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				gl.clearColor(color.x(), color.y(), color.z(), color.w());
694433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				gl.clear(GL_COLOR_BUFFER_BIT);
695433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to clear renderbuffer.");
696433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
697065cde5304da4f2d89e0c8d422870917453a383eMika Isojärvi				tcu::clear(refAccess, (tcu::isSRGB(format) ? tcu::linearToSRGB(color) : color));
698433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			}
699433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
700433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
701433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
702433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.bindRenderbuffer(GL_RENDERBUFFER, 0);
703433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.bindFramebuffer(GL_FRAMEBUFFER, 0);
704433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind renderbufer and framebuffer.");
705433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
706433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
707433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
708433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
709433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid genImage (const glw::Functions&			gl,
710433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			   de::Random&						rng,
711433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			   deUint32							name,
712433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			   vector<ArrayBuffer<deUint8> >&	levels,
713433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			   const ImageInfo&					info,
714433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			   deUint32							moreRestrictiveFormat)
715433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
716433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	if (isTextureTarget(info.getTarget()))
717433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		genTextureImage(gl, rng, name, levels, info, moreRestrictiveFormat);
718433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
719433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		genRenderbufferImage(gl, rng, name, levels, info, moreRestrictiveFormat);
720433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
721433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
722433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviIVec3 getTexelBlockStride (const ImageInfo& info, int level)
723433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
724433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3	size					= getLevelSize(info.getTarget(), info.getSize(), level);
725433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const int	texelBlockSize			= getTexelBlockSize(info.getFormat());
726433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3 texelBlockPixelSize		= getTexelBlockPixelSize(info.getFormat());
727433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3 textureTexelBlockSize	= divRoundUp(size, texelBlockPixelSize);
728433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
729433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	return IVec3(texelBlockSize, textureTexelBlockSize.x() * texelBlockSize, textureTexelBlockSize.x() * textureTexelBlockSize.y() * texelBlockSize);
730433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
731433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
732433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviint sumComponents (const IVec3& v)
733433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
734433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	int s = 0;
735433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
736433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (int i = 0; i < 3; i++)
737433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		s += v[i];
738433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
739433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	return s;
740433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
741433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
742433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid copyImageData (vector<ArrayBuffer<deUint8> >&			dstImageData,
7439ea37879e8c0ecc8a8973b3d5194d4dc12f21360Mika Isojärvi					const ImageInfo&						dstImageInfo,
744433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					int										dstLevel,
745433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					const IVec3&							dstPos,
746433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
747433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					const vector<ArrayBuffer<deUint8> >&	srcImageData,
7489ea37879e8c0ecc8a8973b3d5194d4dc12f21360Mika Isojärvi					const ImageInfo&						srcImageInfo,
749433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					int										srcLevel,
750433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					const IVec3&							srcPos,
751433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
752433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					const IVec3&							copySize)
753433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
754433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const ArrayBuffer<deUint8>&	srcLevelData			= srcImageData[srcLevel];
755433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	ArrayBuffer<deUint8>&		dstLevelData			= dstImageData[dstLevel];
756433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
757433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3					srcTexelBlockPixelSize	= getTexelBlockPixelSize(srcImageInfo.getFormat());
758433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const int					srcTexelBlockSize		= getTexelBlockSize(srcImageInfo.getFormat());
759433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3					srcTexelPos				= srcPos / srcTexelBlockPixelSize;
760433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3					srcTexelBlockStride		= getTexelBlockStride(srcImageInfo, srcLevel);
761433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
762433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3					dstTexelBlockPixelSize	= getTexelBlockPixelSize(dstImageInfo.getFormat());
763433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const int					dstTexelBlockSize		= getTexelBlockSize(dstImageInfo.getFormat());
764433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3					dstTexelPos				= dstPos / dstTexelBlockPixelSize;
765433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3					dstTexelBlockStride		= getTexelBlockStride(dstImageInfo, dstLevel);
766433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
767433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3					copyTexelBlockCount		= copySize / srcTexelBlockPixelSize;
768433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const int					texelBlockSize			= srcTexelBlockSize;
769433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
770433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT(srcTexelBlockSize == dstTexelBlockSize);
771433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_UNREF(dstTexelBlockSize);
772433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
773433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT((copySize.x() % srcTexelBlockPixelSize.x()) == 0);
774433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT((copySize.y() % srcTexelBlockPixelSize.y()) == 0);
775433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT((copySize.z() % srcTexelBlockPixelSize.z()) == 0);
776433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
777433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT((srcPos.x() % srcTexelBlockPixelSize.x()) == 0);
778433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT((srcPos.y() % srcTexelBlockPixelSize.y()) == 0);
779433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT((srcPos.z() % srcTexelBlockPixelSize.z()) == 0);
780433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
781433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (int z = 0; z < copyTexelBlockCount.z(); z++)
782433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (int y = 0; y < copyTexelBlockCount.y(); y++)
783433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
784433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const IVec3				blockPos		(0, y, z);
785433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const deUint8* const	srcPtr			= srcLevelData.getElementPtr(sumComponents((srcTexelPos + blockPos) * srcTexelBlockStride));
786433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		deUint8* const			dstPtr			= dstLevelData.getElementPtr(sumComponents((dstTexelPos + blockPos) * dstTexelBlockStride));
787433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const int				copyLineSize	= copyTexelBlockCount.x() * texelBlockSize;
788433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
789433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		deMemcpy(dstPtr, srcPtr, copyLineSize);
790433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
791433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
792433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
793433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivector<tcu::ConstPixelBufferAccess> getLevelAccesses (const vector<ArrayBuffer<deUint8> >& data, const ImageInfo& info)
794433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
795433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::TextureFormat			format	= glu::mapGLInternalFormat(info.getFormat());
796433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3							size	= info.getSize();
797433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
798433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	vector<tcu::ConstPixelBufferAccess>	result;
799433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
800433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT((int)data.size() == getLevelCount(info));
801433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
802433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (int level = 0; level < (int)data.size(); level++)
803433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
804433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const IVec3 levelSize = getLevelSize(info.getTarget(), size, level);
805433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
806433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		result.push_back(tcu::ConstPixelBufferAccess(format, levelSize.x(), levelSize.y(), levelSize.z(), data[level].getPtr()));
807433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
808433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
809433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	return result;
810433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
811433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
812433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivector<tcu::ConstPixelBufferAccess> getCubeLevelAccesses (const vector<ArrayBuffer<deUint8> >&	data,
813433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi														  const ImageInfo&						info,
814433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi														  int									faceNdx)
815433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
816433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::TextureFormat			format				= glu::mapGLInternalFormat(info.getFormat());
817433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3							size				= info.getSize();
818433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const int							texelBlockSize		= getTexelBlockSize(info.getFormat());
819433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3							texelBlockPixelSize = getTexelBlockPixelSize(info.getFormat());
820433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	vector<tcu::ConstPixelBufferAccess>	result;
821433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
822433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT(info.getTarget() == GL_TEXTURE_CUBE_MAP);
823433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT((int)data.size() == getLevelCount(info));
824433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
825433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (int level = 0; level < (int)data.size(); level++)
826433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
827433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const IVec3 levelPixelSize			= getLevelSize(info.getTarget(), size, level);
828433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const IVec3	levelTexelBlockSize		= divRoundUp(levelPixelSize, texelBlockPixelSize);
829433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const int	levelTexelBlockCount	= levelTexelBlockSize.x() * levelTexelBlockSize.y() * levelTexelBlockSize.z();
830433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const int	levelSize				= levelTexelBlockCount * texelBlockSize;
831433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
832433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		result.push_back(tcu::ConstPixelBufferAccess(format, levelPixelSize.x(), levelPixelSize.y(), levelPixelSize.z(), data[level].getElementPtr(levelSize * faceNdx)));
833433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
834433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
835433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	return result;
836433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
837433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
838433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid copyImage (const glw::Functions&					gl,
839433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
840433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				deUint32								dstName,
841433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				vector<ArrayBuffer<deUint8> >&			dstImageData,
842433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				const ImageInfo&						dstImageInfo,
843433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				int										dstLevel,
844433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				const IVec3&							dstPos,
845433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
846433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				deUint32								srcName,
847433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				const vector<ArrayBuffer<deUint8> >&	srcImageData,
848433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				const ImageInfo&						srcImageInfo,
849433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				int										srcLevel,
850433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				const IVec3&							srcPos,
851433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
852433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				const IVec3&							copySize)
853433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
854433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.copyImageSubData(srcName, srcImageInfo.getTarget(), srcLevel, srcPos.x(), srcPos.y(), srcPos.z(),
855433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						dstName, dstImageInfo.getTarget(), dstLevel, dstPos.x(), dstPos.y(), dstPos.z(),
856433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						copySize.x(), copySize.y(), copySize.z());
857433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
858433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "glCopyImageSubData failed.");
859433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
860433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	copyImageData(dstImageData, dstImageInfo, dstLevel, dstPos,
861433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				  srcImageData, srcImageInfo, srcLevel, srcPos, copySize);
862433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
863433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
864433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verifyTexture2DView (tcu::TestContext&			testContext,
865433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						  glu::RenderContext&		renderContext,
866433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						  TextureRenderer&			renderer,
867433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						  tcu::ResultCollector&		results,
868433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						  de::Random&				rng,
869433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						  deUint32					name,
870433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						  const ImageInfo&			info,
871433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						  const tcu::Texture2DView&	refTexture)
872433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
873433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	tcu::TestLog&					log				= testContext.getLog();
874433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const glw::Functions&			gl				= renderContext.getFunctions();
875433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::RGBA					threshold		= renderContext.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1);
876433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::TextureFormat		format			= refTexture.getLevel(0).getFormat();
877433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::TextureFormatInfo	spec			= tcu::getTextureFormatInfo(format);
878433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
879433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	ReferenceParams					renderParams	(TEXTURETYPE_2D);
880433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
881433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	renderParams.samplerType	= getSamplerType(format);
882433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	renderParams.sampler		= Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST_MIPMAP_NEAREST, Sampler::NEAREST);
883433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	renderParams.colorScale		= spec.lookupScale;
884433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	renderParams.colorBias		= spec.lookupBias;
885433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
886433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.activeTexture(GL_TEXTURE0);
887433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.bindTexture(GL_TEXTURE_2D, name);
888433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to bind texture.");
889433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
890433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
891433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
892433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
893433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
894433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to setup texture filtering state.");
895433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
896433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (int level = 0; level < getLevelCount(info); level++)
897433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
898433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const IVec3				levelSize		= getLevelSize(info.getTarget(), info.getSize(), level);
899433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const RandomViewport	viewport		(renderContext.getRenderTarget(), levelSize.x(), levelSize.y(), rng.getUint32());
900433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
901433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		vector<float>			texCoord;
902433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		tcu::Surface			renderedFrame	(viewport.width, viewport.height);
903433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		tcu::Surface			referenceFrame	(viewport.width, viewport.height);
904433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
9052783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi		renderParams.baseLevel	= level;
9062783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi		renderParams.maxLevel	= level;
9072783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi
9082783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi		gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, level);
9092783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi		gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, level);
9102783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi
911433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		computeQuadTexCoord2D(texCoord, tcu::Vec2(0.0f, 0.0f), tcu::Vec2(1.0f, 1.0f));
912433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
913433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		// Setup base viewport.
914433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
915433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
916433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		// Draw.
917433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		renderer.renderQuad(0, &texCoord[0], renderParams);
918433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		glu::readPixels(renderContext, viewport.x, viewport.y, renderedFrame.getAccess());
919433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to render and read pixels.");
920433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
921433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		// Compute reference.
922433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		sampleTexture(SurfaceAccess(referenceFrame, renderContext.getRenderTarget().getPixelFormat()), refTexture, &texCoord[0], renderParams);
923433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
924433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		// Compare and log.
925433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		if (!pixelThresholdCompare(log, ("Level" + de::toString(level)).c_str(), ("Render level " + de::toString(level)).c_str(), referenceFrame, renderedFrame, threshold, tcu::COMPARE_LOG_ON_ERROR))
926433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			results.fail("Image comparison of level " + de::toString(level) + " failed.");
927433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		else
928433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			log << TestLog::Message << "Image comparison of level " << level << " passed." << TestLog::EndMessage;
929433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
930433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
9312783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
9322783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1000);
9332783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi
934433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.bindTexture(GL_TEXTURE_2D, 0);
935433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind texture.");
936433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
937433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
938433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid decompressTextureLevel (const tcu::TexDecompressionParams&		params,
939433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							 ArrayBuffer<deUint8>&					levelData,
940433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							 tcu::PixelBufferAccess& 				levelAccess,
941433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							 const tcu::CompressedTexFormat&		compressedFormat,
942433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							 const tcu::TextureFormat&				decompressedFormat,
943433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							 const IVec3&							levelPixelSize,
944433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							 const void*							data)
945433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
946433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	levelData.setStorage(levelPixelSize.x() * levelPixelSize.y() * levelPixelSize.z() * decompressedFormat.getPixelSize());
947433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	levelAccess = tcu::PixelBufferAccess(decompressedFormat, levelPixelSize.x(), levelPixelSize.y(), levelPixelSize.z(), levelData.getPtr());
948433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
949433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	tcu::decompress(levelAccess, compressedFormat, (const deUint8*)data, params);
950433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
951433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
952433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid decompressTexture (vector<ArrayBuffer<deUint8> >&			levelDatas,
953433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						vector<tcu::PixelBufferAccess>& 		levelAccesses,
954433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						glu::RenderContext&						renderContext,
955433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						const ImageInfo&						info,
956433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						const vector<ArrayBuffer<deUint8> >&	data)
957433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
958433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::CompressedTexFormat	compressedFormat	= glu::mapGLCompressedTexFormat(info.getFormat());
959433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::TextureFormat		decompressedFormat	= tcu::getUncompressedFormat(compressedFormat);
960433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3						size				= info.getSize();
961433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	de::UniquePtr<glu::ContextInfo>	ctxInfo				(glu::ContextInfo::create(renderContext));
962433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	tcu::TexDecompressionParams		decompressParams;
963433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
964433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	if (tcu::isAstcFormat(compressedFormat))
965433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
966433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		if (ctxInfo->isExtensionSupported("GL_KHR_texture_compression_astc_hdr"))
967433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			decompressParams = tcu::TexDecompressionParams(tcu::TexDecompressionParams::ASTCMODE_HDR);
968433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		else if (ctxInfo->isExtensionSupported("GL_KHR_texture_compression_astc_ldr"))
969433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			decompressParams = tcu::TexDecompressionParams(tcu::TexDecompressionParams::ASTCMODE_LDR);
970433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		else
971433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			DE_ASSERT(false);
972433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
973433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
974433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	levelDatas.resize(getLevelCount(info));
975433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	levelAccesses.resize(getLevelCount(info));
976433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
977433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (int level = 0; level < getLevelCount(info); level++)
978433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
979433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const IVec3					levelPixelSize	= getLevelSize(info.getTarget(), size, level);
980433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		de::ArrayBuffer<deUint8>&	levelData		= levelDatas[level];
981433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		tcu::PixelBufferAccess&		levelAccess 	= levelAccesses[level];
982433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
983433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		decompressTextureLevel(decompressParams, levelData, levelAccess, compressedFormat, decompressedFormat, levelPixelSize, data[level].getPtr());
984433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
985433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
986433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
987433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verifyTexture2D (tcu::TestContext&						testContext,
988433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  glu::RenderContext&					renderContext,
989433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  TextureRenderer&						textureRenderer,
990433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  tcu::ResultCollector&					results,
991433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  de::Random&							rng,
992433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  deUint32								name,
993433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  const vector<ArrayBuffer<deUint8> >&	data,
994433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  const ImageInfo&						info)
995433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
996238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry	if (glu::isCompressedFormat(info.getFormat()))
997433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
998433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		vector<de::ArrayBuffer<deUint8> >	levelDatas;
999433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		vector<tcu::PixelBufferAccess>		levelAccesses;
1000433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1001433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		decompressTexture(levelDatas, levelAccesses, renderContext, info, data);
1002433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1003433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
1004654d8c53a77c4fac3c57c6e7abf1fa940e715899Pyry Haulos			const tcu::Texture2DView refTexture((int)levelAccesses.size(), &(levelAccesses[0]));
1005433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1006433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			verifyTexture2DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture);
1007433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
1008433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1009433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
1010433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1011433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const vector<tcu::ConstPixelBufferAccess>	levelAccesses	= getLevelAccesses(data, info);
1012654d8c53a77c4fac3c57c6e7abf1fa940e715899Pyry Haulos		const tcu::Texture2DView					refTexture		((int)levelAccesses.size(), &(levelAccesses[0]));
1013433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1014433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		verifyTexture2DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture);
1015433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1016433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1017433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1018433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verifyTexture3DView (tcu::TestContext&			testContext,
1019433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						  glu::RenderContext&		renderContext,
1020433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						  TextureRenderer&			renderer,
1021433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						  tcu::ResultCollector&		results,
1022433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						  de::Random&				rng,
1023433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						  deUint32					name,
1024433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						  const ImageInfo&			info,
1025433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						  const tcu::Texture3DView&	refTexture)
1026433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1027433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	tcu::TestLog&					log				= testContext.getLog();
1028433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const glw::Functions&			gl				= renderContext.getFunctions();
1029433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::RGBA					threshold		= renderContext.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1);
1030433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::TextureFormat		format			= refTexture.getLevel(0).getFormat();
1031433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::TextureFormatInfo	spec			= tcu::getTextureFormatInfo(format);
1032433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1033433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	ReferenceParams					renderParams	(TEXTURETYPE_3D);
1034433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1035433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	renderParams.samplerType	= getSamplerType(format);
1036433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	renderParams.sampler		= Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST_MIPMAP_NEAREST, Sampler::NEAREST);
1037433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	renderParams.colorScale		= spec.lookupScale;
1038433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	renderParams.colorBias		= spec.lookupBias;
1039433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1040433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.activeTexture(GL_TEXTURE0);
1041433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.bindTexture(GL_TEXTURE_3D, name);
1042433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to bind texture.");
1043433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1044433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1045433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1046433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
1047433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
1048433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1049433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to setup texture filtering state.");
1050433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1051433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (int level = 0; level < getLevelCount(info); level++)
1052433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1053433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const IVec3 levelSize = getLevelSize(info.getTarget(), info.getSize(), level);
1054433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
10552783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi		renderParams.baseLevel	= level;
10562783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi		renderParams.maxLevel	= level;
10572783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi
10582783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi		gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, level);
10592783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi		gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, level);
10602783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi
1061433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		for (int slice = 0; slice < levelSize.z(); slice++)
1062433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
1063433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const RandomViewport	viewport		(renderContext.getRenderTarget(), levelSize.x(), levelSize.y(), rng.getUint32());
1064433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const float				r				= (float(slice) + 0.5f) / levelSize.z();
1065433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			tcu::Surface			renderedFrame	(viewport.width, viewport.height);
1066433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			tcu::Surface			referenceFrame	(viewport.width, viewport.height);
1067433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			vector<float>			texCoord;
1068433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1069433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			computeQuadTexCoord3D(texCoord, tcu::Vec3(0.0f, 0.0f, r), tcu::Vec3(1.0f, 1.0f, r), tcu::IVec3(0, 1, 2));
1070433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1071433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			// Setup base viewport.
1072433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
1073433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1074433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			// Draw.
1075433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			renderer.renderQuad(0, &texCoord[0], renderParams);
1076433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			glu::readPixels(renderContext, viewport.x, viewport.y, renderedFrame.getAccess());
1077433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to render and read pixels.");
1078433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1079433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			// Compute reference.
1080433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			sampleTexture(SurfaceAccess(referenceFrame, renderContext.getRenderTarget().getPixelFormat()), refTexture, &texCoord[0], renderParams);
1081433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1082433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			// Compare and log.
1083433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			if (!pixelThresholdCompare(log, ("Level" + de::toString(level) + "Slice" + de::toString(slice)).c_str(), ("Render level " + de::toString(level) + ", Slice" + de::toString(slice)).c_str(), referenceFrame, renderedFrame, threshold, tcu::COMPARE_LOG_ON_ERROR))
1084433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				results.fail("Image comparison of level " + de::toString(level) + " and slice " + de::toString(slice) + " failed.");
1085433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			else
1086433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				log << TestLog::Message << "Image comparison of level " << level << " and slice " << slice << " passed." << TestLog::EndMessage;;
1087433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
1088433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1089433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
10902783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi	gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
10912783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi	gl.texParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 1000);
10922783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi
1093433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.bindTexture(GL_TEXTURE_3D, 0);
1094433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind texture.");
1095433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1096433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1097433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verifyTexture3D (tcu::TestContext&						testContext,
1098433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  glu::RenderContext&					renderContext,
1099433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  TextureRenderer&						textureRenderer,
1100433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  tcu::ResultCollector&					results,
1101433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  de::Random&							rng,
1102433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  deUint32								name,
1103433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  const vector<ArrayBuffer<deUint8> >&	data,
1104433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  const ImageInfo&						info)
1105433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1106238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry	if (glu::isCompressedFormat(info.getFormat()))
1107433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1108433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		vector<de::ArrayBuffer<deUint8> >	levelDatas;
1109433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		vector<tcu::PixelBufferAccess>		levelAccesses;
1110433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1111433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		decompressTexture(levelDatas, levelAccesses, renderContext, info, data);
1112433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1113433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
1114654d8c53a77c4fac3c57c6e7abf1fa940e715899Pyry Haulos			const tcu::Texture3DView refTexture((int)levelAccesses.size(), &(levelAccesses[0]));
1115433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1116433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			verifyTexture3DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture);
1117433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
1118433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1119433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
1120433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1121433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const vector<tcu::ConstPixelBufferAccess>	levelAccesses	= getLevelAccesses(data, info);
1122654d8c53a77c4fac3c57c6e7abf1fa940e715899Pyry Haulos		const tcu::Texture3DView					refTexture		((int)levelAccesses.size(), &(levelAccesses[0]));
1123433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1124433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		verifyTexture3DView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture);
1125433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1126433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1127433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1128433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verifyTextureCubemapView (tcu::TestContext&			testContext,
1129433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							   glu::RenderContext&			renderContext,
1130433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							   TextureRenderer&				renderer,
1131433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							   tcu::ResultCollector&		results,
1132433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							   de::Random&					rng,
1133433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							   deUint32						name,
1134433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							   const ImageInfo&				info,
1135433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							   const tcu::TextureCubeView&	refTexture)
1136433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1137433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	tcu::TestLog&					log				= testContext.getLog();
1138433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const glw::Functions&			gl				= renderContext.getFunctions();
1139433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::RGBA					threshold		= renderContext.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1);
1140433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::TextureFormat		format			= refTexture.getLevelFace(0, tcu::CUBEFACE_POSITIVE_X).getFormat();
1141433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::TextureFormatInfo	spec			= tcu::getTextureFormatInfo(format);
1142433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1143433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	ReferenceParams					renderParams	(TEXTURETYPE_CUBE);
1144433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1145433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	renderParams.samplerType	= getSamplerType(format);
1146433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	renderParams.sampler		= Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST_MIPMAP_NEAREST, Sampler::NEAREST);
1147433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	renderParams.colorScale		= spec.lookupScale;
1148433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	renderParams.colorBias		= spec.lookupBias;
1149433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1150433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.activeTexture(GL_TEXTURE0);
1151433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.bindTexture(GL_TEXTURE_CUBE_MAP, name);
1152433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to bind texture.");
1153433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1154433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1155433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1156433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
1157433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1158433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to setup texture filtering state.");
1159433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1160433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (int level = 0; level < getLevelCount(info); level++)
1161433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1162433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const IVec3 levelSize = getLevelSize(info.getTarget(), info.getSize(), level);
1163433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1164433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		// \note It seems we can't reliably sample two smallest texture levels with cubemaps
1165433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		if (levelSize.x() < 4 && levelSize.y() < 4)
1166433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			continue;
1167433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
11682783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi		renderParams.baseLevel	= level;
11692783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi		renderParams.maxLevel	= level;
11702783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi
11712783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi		gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BASE_LEVEL, level);
11722783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi		gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LEVEL, level);
11732783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi
1174433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		for (int face = 0; face < 6; face++)
1175433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
1176433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const RandomViewport	viewport		(renderContext.getRenderTarget(), levelSize.x(), levelSize.y(), rng.getUint32());
1177433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const string			cubemapFaceName	= glu::getCubeMapFaceStr(mapFaceNdxToFace(face)).toString();
1178433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			tcu::Surface			renderedFrame	(viewport.width, viewport.height);
1179433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			tcu::Surface			referenceFrame	(viewport.width, viewport.height);
1180433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			vector<float>			texCoord;
1181433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1182433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			computeQuadTexCoordCube(texCoord, glu::getCubeFaceFromGL(mapFaceNdxToFace(face)));
1183433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1184433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			// Setup base viewport.
1185433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
1186433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1187433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			// Draw.
1188433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			renderer.renderQuad(0, &texCoord[0], renderParams);
1189433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			glu::readPixels(renderContext, viewport.x, viewport.y, renderedFrame.getAccess());
1190433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to render and read pixels.");
1191433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1192433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			// Compute reference.
1193433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			sampleTexture(SurfaceAccess(referenceFrame, renderContext.getRenderTarget().getPixelFormat()), refTexture, &texCoord[0], renderParams);
1194433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1195433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			// Compare and log.
1196433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			if (!pixelThresholdCompare(log, ("Level" + de::toString(level) + "Face" + cubemapFaceName).c_str(), ("Render level " + de::toString(level) + ", Face " + cubemapFaceName).c_str(), referenceFrame, renderedFrame, threshold, tcu::COMPARE_LOG_ON_ERROR))
1197433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				results.fail("Image comparison of level " + de::toString(level) + " and face " + cubemapFaceName + " failed.");
1198433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			else
1199433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				log << TestLog::Message << "Image comparison of level " << level << " and face " << cubemapFaceName << " passed." << TestLog::EndMessage;
1200433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
1201433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1202433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
12032783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi	gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BASE_LEVEL, 0);
12042783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi	gl.texParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LEVEL, 1000);
12052783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi
1206433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.bindTexture(GL_TEXTURE_CUBE_MAP, 0);
1207433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind texture.");
1208433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1209433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1210433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verifyTextureCubemap (tcu::TestContext&					testContext,
1211433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						   glu::RenderContext&					renderContext,
1212433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						   TextureRenderer&						textureRenderer,
1213433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						   tcu::ResultCollector&				results,
1214433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						   de::Random&							rng,
1215433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						   deUint32								name,
1216433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						   const vector<ArrayBuffer<deUint8> >&	data,
1217433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						   const ImageInfo&						info)
1218433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1219238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry	if (glu::isCompressedFormat(info.getFormat()))
1220433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1221433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const tcu::CompressedTexFormat&	compressedFormat	= glu::mapGLCompressedTexFormat(info.getFormat());
1222433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const tcu::TextureFormat&		decompressedFormat	= tcu::getUncompressedFormat(compressedFormat);
1223433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1224433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const int						texelBlockSize		= getTexelBlockSize(info.getFormat());
1225433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const IVec3						texelBlockPixelSize = getTexelBlockPixelSize(info.getFormat());
1226433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1227433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		vector<tcu::PixelBufferAccess>	levelAccesses[6];
1228433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		vector<ArrayBuffer<deUint8> >	levelDatas[6];
1229433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		de::UniquePtr<glu::ContextInfo>	ctxInfo				(glu::ContextInfo::create(renderContext));
1230433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		tcu::TexDecompressionParams		decompressParams;
1231433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1232433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		if (tcu::isAstcFormat(compressedFormat))
1233433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
1234433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			if (ctxInfo->isExtensionSupported("GL_KHR_texture_compression_astc_hdr"))
1235433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				decompressParams = tcu::TexDecompressionParams(tcu::TexDecompressionParams::ASTCMODE_HDR);
1236433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			else if (ctxInfo->isExtensionSupported("GL_KHR_texture_compression_astc_ldr"))
1237433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				decompressParams = tcu::TexDecompressionParams(tcu::TexDecompressionParams::ASTCMODE_LDR);
1238433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			else
1239433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				DE_ASSERT(false);
1240433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
1241433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1242433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		for (int faceNdx = 0; faceNdx < 6; faceNdx++)
1243433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
1244433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			levelAccesses[faceNdx].resize(getLevelCount(info));
1245433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			levelDatas[faceNdx].resize(getLevelCount(info));
1246433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
1247433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1248433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		for (int level = 0; level < getLevelCount(info); level++)
1249433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
1250433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			for (int faceNdx = 0; faceNdx < 6; faceNdx++)
1251433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			{
1252433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				const IVec3				levelPixelSize			= getLevelSize(info.getTarget(), info.getSize(), level);
1253433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				const IVec3				levelTexelBlockSize		= divRoundUp(levelPixelSize, texelBlockPixelSize);
1254433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				const int				levelTexelBlockCount	= levelTexelBlockSize.x() * levelTexelBlockSize.y() * levelTexelBlockSize.z();
1255433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				const int				levelSize 				= levelTexelBlockCount * texelBlockSize;
1256433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1257433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				const deUint8*			dataPtr					= data[level].getElementPtr(faceNdx * levelSize);
1258433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				tcu::PixelBufferAccess& levelAccess				= levelAccesses[faceNdx][level];
1259433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				ArrayBuffer<deUint8>&	levelData				= levelDatas[faceNdx][level];
1260433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1261433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				decompressTextureLevel(decompressParams, levelData, levelAccess, compressedFormat, decompressedFormat, levelPixelSize, dataPtr);
1262433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			}
1263433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
1264433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1265433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const tcu::ConstPixelBufferAccess* levels[6];
1266433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1267433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		for (int faceNdx = 0; faceNdx < 6; faceNdx++)
1268433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			levels[glu::getCubeFaceFromGL(mapFaceNdxToFace(faceNdx))] = &(levelAccesses[faceNdx][0]);
1269433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1270433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
1271433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const tcu::TextureCubeView refTexture(getLevelCount(info), levels);
1272433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1273433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			verifyTextureCubemapView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture);
1274433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
1275433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1276433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
1277433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1278433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const vector<tcu::ConstPixelBufferAccess> levelAccesses[6] =
1279433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
1280433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			getCubeLevelAccesses(data, info, 0),
1281433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			getCubeLevelAccesses(data, info, 1),
1282433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			getCubeLevelAccesses(data, info, 2),
1283433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			getCubeLevelAccesses(data, info, 3),
1284433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			getCubeLevelAccesses(data, info, 4),
1285433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			getCubeLevelAccesses(data, info, 5),
1286433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		};
1287433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1288433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const tcu::ConstPixelBufferAccess* levels[6];
1289433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1290433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		for (int faceNdx = 0; faceNdx < 6; faceNdx++)
1291433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			levels[glu::getCubeFaceFromGL(mapFaceNdxToFace(faceNdx))] = &(levelAccesses[faceNdx][0]);
1292433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1293433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
1294433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const tcu::TextureCubeView refTexture(getLevelCount(info), levels);
1295433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1296433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			verifyTextureCubemapView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture);
1297433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
1298433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1299433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1300433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1301433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verifyTexture2DArrayView (tcu::TestContext&				testContext,
1302433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							   glu::RenderContext&				renderContext,
1303433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							   TextureRenderer&					renderer,
1304433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							   tcu::ResultCollector&			results,
1305433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							   de::Random&						rng,
1306433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							   deUint32							name,
1307433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							   const ImageInfo&					info,
1308433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							   const tcu::Texture2DArrayView&	refTexture)
1309433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1310433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	tcu::TestLog&					log				= testContext.getLog();
1311433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const glw::Functions&			gl				= renderContext.getFunctions();
1312433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::RGBA					threshold		= renderContext.getRenderTarget().getPixelFormat().getColorThreshold() + tcu::RGBA(1,1,1,1);
1313433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::TextureFormat		format			= refTexture.getLevel(0).getFormat();
1314433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::TextureFormatInfo	spec			= tcu::getTextureFormatInfo(format);
1315433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1316433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	ReferenceParams					renderParams	(TEXTURETYPE_2D_ARRAY);
1317433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1318433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	renderParams.samplerType	= getSamplerType(format);
1319433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	renderParams.sampler		= Sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::NEAREST_MIPMAP_NEAREST, Sampler::NEAREST);
1320433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	renderParams.colorScale		= spec.lookupScale;
1321433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	renderParams.colorBias		= spec.lookupBias;
1322433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1323433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.activeTexture(GL_TEXTURE0);
1324433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.bindTexture(GL_TEXTURE_2D_ARRAY, name);
1325433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to bind texture.");
1326433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1327433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1328433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1329433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
1330433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1331433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to setup texture filtering state.");
1332433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1333433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (int level = 0; level < getLevelCount(info); level++)
1334433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1335433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const IVec3 levelSize = getLevelSize(info.getTarget(), info.getSize(), level);
1336433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
13372783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi		renderParams.baseLevel	= level;
13382783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi		renderParams.maxLevel	= level;
13392783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi
13402783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi		gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, level);
13412783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi		gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, level);
13422783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi
1343433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		for (int layer = 0; layer < levelSize.z(); layer++)
1344433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
1345433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const RandomViewport	viewport		(renderContext.getRenderTarget(), levelSize.x(), levelSize.y(), rng.getUint32());
1346433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			tcu::Surface			renderedFrame	(viewport.width, viewport.height);
1347433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			tcu::Surface			referenceFrame	(viewport.width, viewport.height);
1348433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			vector<float>			texCoord;
1349433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1350433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			computeQuadTexCoord2DArray(texCoord, layer, tcu::Vec2(0.0f, 0.0f), tcu::Vec2(1.0f, 1.0f));
1351433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1352433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			// Setup base viewport.
1353433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
1354433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1355433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			// Draw.
1356433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			renderer.renderQuad(0, &texCoord[0], renderParams);
1357433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			glu::readPixels(renderContext, viewport.x, viewport.y, renderedFrame.getAccess());
1358433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to render and read pixels.");
1359433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1360433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			// Compute reference.
1361433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			sampleTexture(SurfaceAccess(referenceFrame, renderContext.getRenderTarget().getPixelFormat()), refTexture, &texCoord[0], renderParams);
1362433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1363433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			// Compare and log.
1364433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			if (!pixelThresholdCompare(log, ("Level" + de::toString(level) + "Layer" + de::toString(layer)).c_str(), ("Render level " + de::toString(level) + ", Layer" + de::toString(layer)).c_str(), referenceFrame, renderedFrame, threshold, tcu::COMPARE_LOG_ON_ERROR))
1365433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				results.fail("Image comparison of level " + de::toString(level) + " and layer " + de::toString(layer) + " failed.");
1366433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			else
1367433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				log << TestLog::Message << "Image comparison of level " << level << " and layer " << layer << " passed." << TestLog::EndMessage;
1368433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
1369433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1370433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
13712783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi	gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
13722783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi	gl.texParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 1000);
13732783be6b88cec7514319a35f7643e60a6550fc24Mika Isojärvi
1374433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	gl.bindTexture(GL_TEXTURE_2D_ARRAY, 0);
1375433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind texture.");
1376433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1377433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1378433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verifyTexture2DArray (tcu::TestContext&					testContext,
1379433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						   glu::RenderContext&					renderContext,
1380433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						   TextureRenderer&						textureRenderer,
1381433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						   tcu::ResultCollector&				results,
1382433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						   de::Random&							rng,
1383433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						   deUint32								name,
1384433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						   const vector<ArrayBuffer<deUint8> >&	data,
1385433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						   const ImageInfo&						info)
1386433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1387238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry	if (glu::isCompressedFormat(info.getFormat()))
1388433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1389433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		vector<de::ArrayBuffer<deUint8> >	levelDatas;
1390433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		vector<tcu::PixelBufferAccess>		levelAccesses;
1391433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1392433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		decompressTexture(levelDatas, levelAccesses, renderContext, info, data);
1393433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1394433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
1395654d8c53a77c4fac3c57c6e7abf1fa940e715899Pyry Haulos			const tcu::Texture2DArrayView refTexture((int)levelAccesses.size(), &(levelAccesses[0]));
1396433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1397433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			verifyTexture2DArrayView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture);
1398433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
1399433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1400433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
1401433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1402433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const vector<tcu::ConstPixelBufferAccess>	levelAccesses	= getLevelAccesses(data, info);
1403654d8c53a77c4fac3c57c6e7abf1fa940e715899Pyry Haulos		const tcu::Texture2DArrayView				refTexture		((int)levelAccesses.size(), &(levelAccesses[0]));
1404433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1405433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		verifyTexture2DArrayView(testContext, renderContext, textureRenderer, results, rng, name, info, refTexture);
1406433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1407433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1408433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1409433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvitcu::TextureFormat getReadPixelFormat (const tcu::TextureFormat& format)
1410433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1411433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	switch (tcu::getTextureChannelClass(format.type))
1412433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1413433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
1414433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
1415433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
1416433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8);
1417433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1418433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
1419433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT32);
1420433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1421433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
1422433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			return tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32);
1423433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1424433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		default:
1425433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			DE_ASSERT(false);
1426433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			return tcu::TextureFormat();
1427433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1428433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1429433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1430433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviVec4 calculateThreshold (const tcu::TextureFormat& sourceFormat, const tcu::TextureFormat& readPixelsFormat)
1431433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1432433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT(tcu::getTextureChannelClass(sourceFormat.type) != tcu::TEXTURECHANNELCLASS_FLOATING_POINT);
1433433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT(tcu::getTextureChannelClass(readPixelsFormat.type) != tcu::TEXTURECHANNELCLASS_FLOATING_POINT);
1434433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1435433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT(tcu::getTextureChannelClass(sourceFormat.type) != tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER);
1436433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT(tcu::getTextureChannelClass(readPixelsFormat.type) != tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER);
1437433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1438433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT(tcu::getTextureChannelClass(sourceFormat.type) != tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER);
1439433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT(tcu::getTextureChannelClass(readPixelsFormat.type) != tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER);
1440433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1441433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1442433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const tcu::IVec4	srcBits		= tcu::getTextureFormatBitDepth(sourceFormat);
1443433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const tcu::IVec4	readBits	= tcu::getTextureFormatBitDepth(readPixelsFormat);
1444433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1445433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return Vec4(1.0f) / ((tcu::IVec4(1) << (tcu::min(srcBits, readBits))) - tcu::IVec4(1)).cast<float>();
1446433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1447433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1448433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1449433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verifyRenderbuffer (tcu::TestContext&						testContext,
1450433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						 glu::RenderContext&					renderContext,
1451433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						 tcu::ResultCollector&					results,
1452433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						 deUint32								name,
1453433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						 const vector<ArrayBuffer<deUint8> >&	data,
1454433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						 const ImageInfo&						info)
1455433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1456433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const glw::Functions&				gl					= renderContext.getFunctions();
1457433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	TestLog&							log					= testContext.getLog();
1458433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1459433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::TextureFormat			format				= glu::mapGLInternalFormat(info.getFormat());
1460433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3							size				= info.getSize();
1461433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::ConstPixelBufferAccess	refRenderbuffer		(format, size.x(), size.y(), 1, data[0].getPtr());
1462433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::TextureFormat			readPixelsFormat	= getReadPixelFormat(format);
1463433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	tcu::TextureLevel					renderbuffer		(readPixelsFormat, size.x(), size.y());
1464433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1465433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT(size.z() == 1);
1466433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT(data.size() == 1);
1467433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1468433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1469433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		glu::Framebuffer framebuffer(gl);
1470433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1471433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		gl.bindFramebuffer(GL_FRAMEBUFFER, *framebuffer);
1472433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to create and bind framebuffer.");
1473433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1474433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		gl.bindRenderbuffer(GL_RENDERBUFFER, name);
1475433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, name);
1476433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to bind and attach renderbuffer to framebuffer.");
1477433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1478433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		glu::readPixels(renderContext, 0, 0, renderbuffer.getAccess());
1479433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1480433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		gl.bindRenderbuffer(GL_RENDERBUFFER, 0);
1481433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		gl.bindFramebuffer(GL_FRAMEBUFFER, 0);
1482433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind renderbuffer and framebuffer.");
1483433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1484433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1485433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	if (isFloatFormat(info.getFormat()))
1486433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1487433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const tcu::UVec4 threshold (2, 2, 2, 2);
1488433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1489433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		if (!(tcu::floatUlpThresholdCompare(log, "Image comparison", "Image comparison", refRenderbuffer, renderbuffer.getAccess(), threshold, tcu::COMPARE_LOG_ON_ERROR)))
1490433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			results.fail("Image comparison failed.");
1491433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		else
1492433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			log << TestLog::Message << "Image comarison passed." << TestLog::EndMessage;
1493433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1494433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else if (isIntFormat(info.getFormat()) || isUintFormat(info.getFormat()))
1495433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1496433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const tcu::UVec4 threshold (1, 1, 1, 1);
1497433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1498433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		if (!(tcu::intThresholdCompare(log, "Image comparison", "Image comparison", refRenderbuffer, renderbuffer.getAccess(), threshold, tcu::COMPARE_LOG_ON_ERROR)))
1499433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			results.fail("Image comparison failed.");
1500433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		else
1501433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			log << TestLog::Message << "Image comarison passed." << TestLog::EndMessage;
1502433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1503433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
1504433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1505433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const Vec4 threshold = calculateThreshold(format, readPixelsFormat);
1506433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1507433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		if (!(tcu::floatThresholdCompare(log, "Image comparison", "Image comparison", refRenderbuffer, renderbuffer.getAccess(), threshold, tcu::COMPARE_LOG_ON_ERROR)))
1508433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			results.fail("Image comparison failed.");
1509433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		else
1510433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			log << TestLog::Message << "Image comarison passed." << TestLog::EndMessage;
1511433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1512433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1513433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1514433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid verify (tcu::TestContext&						testContext,
1515433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			 glu::RenderContext&					renderContext,
1516433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			 TextureRenderer&						textureRenderer,
1517433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			 tcu::ResultCollector&					results,
1518433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			 de::Random&							rng,
1519433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			 deUint32								name,
1520433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			 const vector<ArrayBuffer<deUint8> >&	data,
1521433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			 const ImageInfo&						info)
1522433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1523433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	switch (info.getTarget())
1524433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1525433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_TEXTURE_2D:
1526433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			verifyTexture2D(testContext, renderContext, textureRenderer, results, rng, name, data, info);
1527433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			break;
1528433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1529433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_TEXTURE_3D:
1530433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			verifyTexture3D(testContext, renderContext, textureRenderer, results, rng, name, data, info);
1531433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			break;
1532433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1533433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_TEXTURE_CUBE_MAP:
1534433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			verifyTextureCubemap(testContext, renderContext, textureRenderer, results, rng, name, data, info);
1535433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			break;
1536433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1537433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_TEXTURE_2D_ARRAY:
1538433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			verifyTexture2DArray(testContext, renderContext, textureRenderer, results, rng, name, data, info);
1539433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			break;
1540433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1541433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		case GL_RENDERBUFFER:
1542433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			verifyRenderbuffer(testContext, renderContext, results, name, data, info);
1543433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			break;
1544433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1545433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		default:
1546433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			DE_ASSERT(false);
1547433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1548433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1549433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1550433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid logTestImageInfo (TestLog&			log,
1551433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					   const ImageInfo&	imageInfo)
1552433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1553433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	log << TestLog::Message << "Target: " << targetToName(imageInfo.getTarget()) << TestLog::EndMessage;
1554433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	log << TestLog::Message << "Size: " << imageInfo.getSize() << TestLog::EndMessage;
1555433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	log << TestLog::Message << "Levels: " << getLevelCount(imageInfo) << TestLog::EndMessage;
1556433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	log << TestLog::Message << "Format: " << formatToName(imageInfo.getFormat()) << TestLog::EndMessage;
1557433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1558433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1559433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid logTestInfo (TestLog&			log,
1560433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				  const ImageInfo&	srcImageInfo,
1561433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				  const ImageInfo&	dstImageInfo)
1562433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1563433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	tcu::ScopedLogSection section(log, "TestCaseInfo", "Test case info");
1564433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1565433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	log << TestLog::Message << "Testing copying from " << targetToName(srcImageInfo.getTarget()) << " to " << targetToName(dstImageInfo.getTarget()) << "." << TestLog::EndMessage;
1566433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1567433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1568433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		tcu::ScopedLogSection srcSection(log, "Source image info.", "Source image info.");
1569433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		logTestImageInfo(log, srcImageInfo);
1570433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1571433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1572433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1573433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		tcu::ScopedLogSection dstSection(log, "Destination image info.", "Destination image info.");
1574433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		logTestImageInfo(log, dstImageInfo);
1575433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1576433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1577433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1578433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviclass CopyImageTest : public TestCase
1579433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1580433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvipublic:
1581433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							CopyImageTest			(Context&			context,
1582433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi													 const ImageInfo&	srcImage,
1583433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi													 const ImageInfo&	dstImage,
1584433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi													 const char*		name,
1585433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi													 const char*		description);
1586433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1587433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							~CopyImageTest			(void);
1588433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1589433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	void					init					(void);
1590433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	void					deinit					(void);
1591433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1592433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	TestCase::IterateResult	iterate					(void);
1593433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1594433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviprivate:
1595433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	void					logTestInfoIter			(void);
1596433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	void					createImagesIter		(void);
1597433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	void					destroyImagesIter		(void);
1598433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	void					verifySourceIter		(void);
1599433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	void					verifyDestinationIter	(void);
1600433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	void					copyImageIter			(void);
1601433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1602433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	struct State
1603433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1604433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		State (int					seed,
1605469002caa1ccd58f59f53a1bf3dbac4cf6a5d817Jarkko Pöyry			   tcu::TestLog&		log,
1606433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			   glu::RenderContext&	renderContext)
1607433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			: rng				(seed)
1608469002caa1ccd58f59f53a1bf3dbac4cf6a5d817Jarkko Pöyry			, results			(log)
1609433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			, srcImage			(NULL)
1610433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			, dstImage			(NULL)
1611469002caa1ccd58f59f53a1bf3dbac4cf6a5d817Jarkko Pöyry			, textureRenderer	(renderContext, log, glu::GLSL_VERSION_310_ES, glu::PRECISION_HIGHP)
1612433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
1613433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
1614433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1615433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		~State (void)
1616433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
1617433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			delete srcImage;
1618433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			delete dstImage;
1619433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
1620433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1621433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		de::Random						rng;
1622433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		tcu::ResultCollector			results;
1623433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		glu::ObjectWrapper*				srcImage;
1624433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		glu::ObjectWrapper*				dstImage;
1625433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		TextureRenderer					textureRenderer;
1626433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1627433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		vector<ArrayBuffer<deUint8> >	srcImageLevels;
1628433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		vector<ArrayBuffer<deUint8> >	dstImageLevels;
1629433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	};
1630433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1631433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const ImageInfo	m_srcImageInfo;
1632433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const ImageInfo	m_dstImageInfo;
1633433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1634433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	int				m_iteration;
1635433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	State*			m_state;
1636433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi};
1637433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1638433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviCopyImageTest::CopyImageTest (Context&			context,
1639433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							  const ImageInfo&	srcImage,
1640433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							  const ImageInfo&	dstImage,
1641433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							  const char*		name,
1642433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi							  const char*		description)
1643433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	: TestCase			(context, name, description)
1644433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	, m_srcImageInfo	(srcImage)
1645433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	, m_dstImageInfo	(dstImage)
1646433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1647433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	, m_iteration		(0)
1648433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	, m_state			(NULL)
1649433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1650433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1651433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1652433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviCopyImageTest::~CopyImageTest (void)
1653433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1654433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	deinit();
1655433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1656433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
165768f1f6b90aa202797d208d69c79d310eb1fb9225Kalle Raitavoid checkFormatSupport (glu::ContextInfo& info, deUint32 format, deUint32 target)
1658433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1659238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry	if (glu::isCompressedFormat(format))
1660433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1661433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		if (isAstcFormat(glu::mapGLCompressedTexFormat(format)))
1662433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
166368f1f6b90aa202797d208d69c79d310eb1fb9225Kalle Raita			DE_ASSERT(target != GL_RENDERBUFFER);
166468f1f6b90aa202797d208d69c79d310eb1fb9225Kalle Raita			if (!info.isExtensionSupported("GL_KHR_texture_compression_astc_hdr") &&
166568f1f6b90aa202797d208d69c79d310eb1fb9225Kalle Raita				!info.isExtensionSupported("GL_OES_texture_compression_astc"))
166668f1f6b90aa202797d208d69c79d310eb1fb9225Kalle Raita			{
16679cb5b076f78c1f85fd9c4d10eca3f0532f0d24e6Kalle Raita				if (target == GL_TEXTURE_3D)
16689cb5b076f78c1f85fd9c4d10eca3f0532f0d24e6Kalle Raita					TCU_THROW(NotSupportedError, "TEXTURE_3D target requires HDR astc support.");
166968f1f6b90aa202797d208d69c79d310eb1fb9225Kalle Raita				if (!info.isExtensionSupported("GL_KHR_texture_compression_astc_ldr"))
167068f1f6b90aa202797d208d69c79d310eb1fb9225Kalle Raita					TCU_THROW(NotSupportedError, "Compressed astc texture not supported.");
167168f1f6b90aa202797d208d69c79d310eb1fb9225Kalle Raita			}
1672433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
1673433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		else
1674433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
1675433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			if (!info.isCompressedTextureFormatSupported(format))
167668f1f6b90aa202797d208d69c79d310eb1fb9225Kalle Raita				TCU_THROW(NotSupportedError, "Compressed texture not supported.");
1677433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
1678433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1679433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1680433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1681433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid CopyImageTest::init (void)
1682433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1683433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	de::UniquePtr<glu::ContextInfo> ctxInfo(glu::ContextInfo::create(m_context.getRenderContext()));
1684433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1685433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	if (!ctxInfo->isExtensionSupported("GL_EXT_copy_image"))
1686433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		throw tcu::NotSupportedError("Extension GL_EXT_copy_image not supported.", "", __FILE__, __LINE__);
1687433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
168868f1f6b90aa202797d208d69c79d310eb1fb9225Kalle Raita	checkFormatSupport(*ctxInfo, m_srcImageInfo.getFormat(), m_srcImageInfo.getTarget());
168968f1f6b90aa202797d208d69c79d310eb1fb9225Kalle Raita	checkFormatSupport(*ctxInfo, m_dstImageInfo.getFormat(), m_dstImageInfo.getTarget());
1690433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1691433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1692433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		SeedBuilder builder;
1693433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1694433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		builder << 903980
1695433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				<< m_srcImageInfo
1696433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				<< m_dstImageInfo;
1697433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1698469002caa1ccd58f59f53a1bf3dbac4cf6a5d817Jarkko Pöyry		m_state = new State(builder.get(), m_testCtx.getLog(), m_context.getRenderContext());
1699433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1700433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1701433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1702433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid CopyImageTest::deinit (void)
1703433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1704433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	delete m_state;
1705433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	m_state = NULL;
1706433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1707433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1708433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid CopyImageTest::logTestInfoIter (void)
1709433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1710433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	TestLog& log = m_testCtx.getLog();
1711433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1712433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	logTestInfo(log, m_srcImageInfo, m_dstImageInfo);
1713433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1714433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1715433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid CopyImageTest::createImagesIter (void)
1716433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1717433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	TestLog&				log						= m_testCtx.getLog();
1718433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	glu::RenderContext&		renderContext			= m_context.getRenderContext();
1719433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const glw::Functions&	gl						= renderContext.getFunctions();
1720433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const deUint32			moreRestrictiveFormat	= getMoreRestrictiveFormat(m_srcImageInfo.getFormat(), m_dstImageInfo.getFormat());
1721433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	de::Random&				rng						= m_state->rng;
1722433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1723433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT(!m_state->srcImage);
1724433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	DE_ASSERT(!m_state->dstImage);
1725433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1726433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	m_state->srcImage = new glu::ObjectWrapper(gl, getObjectTraits(m_srcImageInfo));
1727433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	m_state->dstImage = new glu::ObjectWrapper(gl, getObjectTraits(m_dstImageInfo));
1728433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1729433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1730433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		glu::ObjectWrapper&				srcImage				= *m_state->srcImage;
1731433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		glu::ObjectWrapper&				dstImage				= *m_state->dstImage;
1732433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1733433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		vector<ArrayBuffer<deUint8> >&	srcImageLevels			= m_state->srcImageLevels;
1734433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		vector<ArrayBuffer<deUint8> >&	dstImageLevels			= m_state->dstImageLevels;
1735433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1736433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		log << TestLog::Message << "Creating source image." << TestLog::EndMessage;
1737433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		genImage(gl, rng, *srcImage, srcImageLevels, m_srcImageInfo, moreRestrictiveFormat);
1738433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1739433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		log << TestLog::Message << "Creating destination image." << TestLog::EndMessage;
1740433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		genImage(gl, rng, *dstImage, dstImageLevels, m_dstImageInfo, moreRestrictiveFormat);
1741433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1742433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1743433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1744433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid CopyImageTest::destroyImagesIter (void)
1745433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1746433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	TestLog& log = m_testCtx.getLog();
1747433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1748433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	log << TestLog::Message << "Deleting source image. " << TestLog::EndMessage;
1749433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1750433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	delete m_state->srcImage;
1751433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	m_state->srcImage = NULL;
1752433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	m_state->srcImageLevels.clear();
1753433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1754433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	log << TestLog::Message << "Deleting destination image. " << TestLog::EndMessage;
1755433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1756433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	delete m_state->dstImage;
1757433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	m_state->dstImage = NULL;
1758433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	m_state->dstImageLevels.clear();
1759433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1760433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1761433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid CopyImageTest::verifySourceIter (void)
1762433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1763433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	TestLog&						log					= m_testCtx.getLog();
1764433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::ScopedLogSection		sourceSection		(log, "Source image verify.", "Source image verify.");
1765433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1766433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	de::Random&						rng					= m_state->rng;
1767433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	tcu::ResultCollector&			results				= m_state->results;
1768433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	glu::ObjectWrapper&				srcImage			= *m_state->srcImage;
1769433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	vector<ArrayBuffer<deUint8> >&	srcImageLevels		= m_state->srcImageLevels;
1770433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1771433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	log << TestLog::Message << "Verifying source image." << TestLog::EndMessage;
1772433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1773433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	verify(m_testCtx, m_context.getRenderContext(), m_state->textureRenderer, results, rng, *srcImage, srcImageLevels, m_srcImageInfo);
1774433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1775433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1776433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid CopyImageTest::verifyDestinationIter (void)
1777433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1778433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	TestLog&						log					= m_testCtx.getLog();
1779433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const tcu::ScopedLogSection		destinationSection	(log, "Destination image verify.", "Destination image verify.");
1780433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1781433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	de::Random&						rng					= m_state->rng;
1782433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	tcu::ResultCollector&			results				= m_state->results;
1783433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	glu::ObjectWrapper&				dstImage			= *m_state->dstImage;
1784433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	vector<ArrayBuffer<deUint8> >&	dstImageLevels		= m_state->dstImageLevels;
1785433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1786433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	log << TestLog::Message << "Verifying destination image." << TestLog::EndMessage;
1787433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1788433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	verify(m_testCtx, m_context.getRenderContext(), m_state->textureRenderer, results, rng, *dstImage, dstImageLevels, m_dstImageInfo);
1789433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1790433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1791433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvistruct Copy
1792433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1793433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	Copy (const IVec3&	srcPos_,
1794433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		  int			srcLevel_,
1795433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1796433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		  const IVec3&	dstPos_,
1797433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		  int			dstLevel_,
1798433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1799433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		  const IVec3&	size_)
1800433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		: srcPos	(srcPos_)
1801433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		, srcLevel	(srcLevel_)
1802433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1803433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		, dstPos	(dstPos_)
1804433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		, dstLevel	(dstLevel_)
1805433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		, size		(size_)
1806433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1807433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1808433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1809433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	IVec3	srcPos;
1810433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	int		srcLevel;
1811433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	IVec3	dstPos;
1812433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	int		dstLevel;
1813433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	IVec3	size;
1814433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi};
1815433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1816433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviint getLastFullLevel (const ImageInfo& info)
1817433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1818433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const int	levelCount		= getLevelCount(info);
1819433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3	blockPixelSize	= getTexelBlockPixelSize(info.getFormat());
1820433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1821433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (int level = 0; level < levelCount; level++)
1822433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1823433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const IVec3 levelSize = getLevelSize(info.getTarget(), info.getSize(), level);
1824433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1825433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		if (levelSize.x() < blockPixelSize.x() || levelSize.y() < blockPixelSize.y() || levelSize.z() < blockPixelSize.z())
1826433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			return level - 1;
1827433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1828433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1829433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	return levelCount -1;
1830433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1831433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1832433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid generateCopies (vector<Copy>& copies, const ImageInfo& srcInfo, const ImageInfo& dstInfo)
1833433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1834433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const deUint32	srcTarget		= srcInfo.getTarget();
1835433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const deUint32	dstTarget		= dstInfo.getTarget();
1836433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1837433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const bool		srcIsTexture	= isTextureTarget(srcInfo.getTarget());
1838433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const bool		dstIsTexture	= isTextureTarget(dstInfo.getTarget());
1839433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1840433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const bool		srcIsCube		= srcTarget == GL_TEXTURE_CUBE_MAP;
1841433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const bool		dstIsCube		= dstTarget == GL_TEXTURE_CUBE_MAP;
1842433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1843433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3		srcBlockPixelSize		= getTexelBlockPixelSize(srcInfo.getFormat());
1844433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3		dstBlockPixelSize		= getTexelBlockPixelSize(dstInfo.getFormat());
1845433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1846433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const int levels[] =
1847433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1848433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		0, 1, -1
1849433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	};
1850433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1851433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (int levelNdx = 0; levelNdx < (srcIsTexture || dstIsTexture ? DE_LENGTH_OF_ARRAY(levels) : 1); levelNdx++)
1852433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1853433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const int	srcLevel				= (srcIsTexture ? (levels[levelNdx] >= 0 ? levels[levelNdx] : getLastFullLevel(srcInfo)) : 0);
1854433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const int	dstLevel				= (dstIsTexture ? (levels[levelNdx] >= 0 ? levels[levelNdx] : getLastFullLevel(dstInfo)) : 0);
1855433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1856433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const IVec3	srcSize					= getLevelSize(srcInfo.getTarget(), srcInfo.getSize(), srcLevel);
1857433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const IVec3	dstSize					= getLevelSize(dstInfo.getTarget(), dstInfo.getSize(), dstLevel);
1858433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1859433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		// \note These are rounded down
1860433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const IVec3	srcCompleteBlockSize	= IVec3(srcSize.x() / srcBlockPixelSize.x(), srcSize.y() / srcBlockPixelSize.y(), (srcIsCube ? 6 : srcSize.z() / srcBlockPixelSize.z()));
1861433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const IVec3	dstCompleteBlockSize	= IVec3(dstSize.x() / dstBlockPixelSize.x(), dstSize.y() / dstBlockPixelSize.y(), (dstIsCube ? 6 : dstSize.z() / dstBlockPixelSize.z()));
1862433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1863433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const IVec3	maxCopyBlockSize		= tcu::min(srcCompleteBlockSize, dstCompleteBlockSize);
1864433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1865433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		// \note These are rounded down
1866433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const int	copyBlockWidth			= de::max((2 * (maxCopyBlockSize.x() / 4)) - 1, 1);
1867433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const int	copyBlockHeight			= de::max((2 * (maxCopyBlockSize.y() / 4)) - 1, 1);
1868433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const int	copyBlockDepth			= de::max((2 * (maxCopyBlockSize.z() / 4)) - 1, 1);
1869433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1870433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		// Copy NPOT block from (0,0,0) to other corner on dst
1871433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
1872433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3	copyBlockSize	(copyBlockWidth, copyBlockHeight, copyBlockDepth);
1873433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3	srcBlockPos		(srcCompleteBlockSize - copyBlockSize);
1874433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3	dstBlockPos		(0, 0, 0);
1875433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1876433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3	srcPos			(srcBlockPos * srcBlockPixelSize);
1877433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3	dstPos			(dstBlockPos * dstBlockPixelSize);
1878433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3 copySize		(copyBlockSize * srcBlockPixelSize);
1879433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1880433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			copies.push_back(Copy(srcPos, srcLevel, dstPos, dstLevel, copySize));
1881433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
1882433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1883433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		// Copy NPOT block to (0,0,0) from other corner on src
1884433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
1885433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3	copyBlockSize	(copyBlockWidth, copyBlockHeight, copyBlockDepth);
1886433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3	srcBlockPos		(0, 0, 0);
1887433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3	dstBlockPos		(dstCompleteBlockSize - copyBlockSize);
1888433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1889433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3	srcPos			(srcBlockPos * srcBlockPixelSize);
1890433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3	dstPos			(dstBlockPos * dstBlockPixelSize);
1891433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3 copySize		(copyBlockSize * srcBlockPixelSize);
1892433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1893433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			copies.push_back(Copy(srcPos, srcLevel, dstPos, dstLevel, copySize));
1894433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
1895433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1896433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		// Copy NPOT block to (0,0,0) from other corner on src
1897433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
1898433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3	copyBlockSize	(copyBlockWidth, copyBlockHeight, copyBlockDepth);
1899433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3	srcBlockPos		(tcu::max((srcCompleteBlockSize / 4) * 4 - copyBlockSize, IVec3(0)));
1900433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3	dstBlockPos		(tcu::max((dstCompleteBlockSize / 4) * 4 - copyBlockSize, IVec3(0)));
1901433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1902433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3	srcPos			(srcBlockPos * srcBlockPixelSize);
1903433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3	dstPos			(dstBlockPos * dstBlockPixelSize);
1904433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3 copySize		(copyBlockSize * srcBlockPixelSize);
1905433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1906433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			copies.push_back(Copy(srcPos, srcLevel, dstPos, dstLevel, copySize));
1907433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
1908433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1909433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1910433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1911433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid CopyImageTest::copyImageIter (void)
1912433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1913433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	TestLog&						log				= m_testCtx.getLog();
1914433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const glw::Functions&			gl				= m_context.getRenderContext().getFunctions();
1915433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	glu::ObjectWrapper&				srcImage		= *m_state->srcImage;
1916433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	glu::ObjectWrapper&				dstImage		= *m_state->dstImage;
1917433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1918433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	vector<ArrayBuffer<deUint8> >&	srcImageLevels	= m_state->srcImageLevels;
1919433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	vector<ArrayBuffer<deUint8> >&	dstImageLevels	= m_state->dstImageLevels;
1920433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	vector<Copy>					copies;
1921433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1922433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	generateCopies(copies, m_srcImageInfo, m_dstImageInfo);
1923433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1924433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (int copyNdx = 0; copyNdx < (int)copies.size(); copyNdx++)
1925433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1926433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const Copy& copy = copies[copyNdx];
1927433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1928433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		log << TestLog::Message << "Copying block " << copy.size << " from source image position " << copy.srcPos << " and mipmap level " << copy.srcLevel
1929433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi								<< " to destination image position " << copy.dstPos << " and mipmap level " << copy.dstLevel << TestLog::EndMessage;
1930433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1931433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		copyImage(gl, *dstImage, dstImageLevels, m_dstImageInfo, copy.dstLevel, copy.dstPos,
1932433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi					  *srcImage, srcImageLevels, m_srcImageInfo, copy.srcLevel, copy.srcPos, copy.size);
1933433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1934433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1935433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1936433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviTestCase::IterateResult CopyImageTest::iterate (void)
1937433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1938433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	void(CopyImageTest::*methods[])(void) =
1939433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1940433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		&CopyImageTest::logTestInfoIter,
1941433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1942433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		// Render both images and then copy and verify again.
1943433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		&CopyImageTest::createImagesIter,
1944433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		&CopyImageTest::verifySourceIter,
1945433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		&CopyImageTest::verifyDestinationIter,
1946433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		&CopyImageTest::copyImageIter,
1947433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		&CopyImageTest::verifySourceIter,
1948433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		&CopyImageTest::verifyDestinationIter,
1949433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		&CopyImageTest::destroyImagesIter,
1950433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1951433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		// Create images and immediately copies between thew and verify.
1952433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		&CopyImageTest::createImagesIter,
1953433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		&CopyImageTest::copyImageIter,
1954433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		&CopyImageTest::verifySourceIter,
1955433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		&CopyImageTest::verifyDestinationIter,
1956433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		&CopyImageTest::destroyImagesIter
1957433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	};
1958433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1959433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	if (m_iteration < DE_LENGTH_OF_ARRAY(methods))
1960433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1961433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		(this->*methods[m_iteration])();
1962433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		m_iteration++;
1963433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return CONTINUE;
1964433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1965433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
1966433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
1967433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		m_state->results.setTestContextResult(m_testCtx);
1968433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return STOP;
1969433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
1970433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1971433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1972433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviclass CopyImageTests : public TestCaseGroup
1973433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1974433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvipublic:
1975433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						CopyImageTests			(Context& context);
1976433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						~CopyImageTests			(void);
1977433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1978433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	void				init					(void);
1979433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1980433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviprivate:
1981433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi						CopyImageTests			(const CopyImageTests& other);
1982433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	CopyImageTests&		operator=				(const CopyImageTests& other);
1983433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi};
1984433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1985433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviCopyImageTests::CopyImageTests (Context& context)
1986433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	: TestCaseGroup	(context, "copy_image", "Copy image tests for GL_EXT_copy_image.")
1987433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1988433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1989433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1990433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviCopyImageTests::~CopyImageTests (void)
1991433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1992433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
1993433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
1994433e5704171098c7cd062c7339b259ad76a55678Mika Isojärviint smallestCommonMultiple (int a_, int b_)
1995433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
1996433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	int	a		= (a_ > b_ ? a_ : b_);
1997433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	int	b		= (a_ > b_ ? b_ : a_);
1998433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	int	result  = 1;
1999433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2000433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (int i = b/2; i > 1; i--)
2001433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
2002433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		while ((a % i) == 0 && (b % i) == 0)
2003433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
2004433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			result *= i;
2005433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			a /= i;
2006433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			b /= i;
2007433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
2008433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
2009433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2010433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	return result * a * b;
2011433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
2012433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2013433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviIVec3 getTestedSize (deUint32 target, deUint32 format, const IVec3& targetSize)
2014433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
2015433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const IVec3 texelBlockPixelSize = getTexelBlockPixelSize(format);
2016433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const bool	isCube				= target == GL_TEXTURE_CUBE_MAP;
2017433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const bool	is3D				= target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY;
2018433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2019433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	if (isCube)
2020433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
2021433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const int	multiplier	= smallestCommonMultiple(texelBlockPixelSize.x(), texelBlockPixelSize.y());
2022433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const int	size		= (1 + (targetSize.x() / multiplier)) * multiplier;
2023433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2024433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return IVec3(size, size, 1);
2025433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
2026433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else if (is3D)
2027433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
2028433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return (1 + (targetSize / texelBlockPixelSize)) * texelBlockPixelSize;
2029433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
2030433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	else
2031433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
2032433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const int width = (1 + targetSize.x() / texelBlockPixelSize.x()) * texelBlockPixelSize.x();
2033433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const int height = ((targetSize.y() / texelBlockPixelSize.y()) - 1) * texelBlockPixelSize.y();
2034433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2035433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		return IVec3(width, height, 1);
2036433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
2037433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
2038433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2039433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid addCopyTests (TestCaseGroup* root, deUint32 srcFormat, deUint32 dstFormat)
2040433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
2041433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const string			groupName	= string(formatToName(srcFormat)) + "_" + formatToName(dstFormat);
2042433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	TestCaseGroup* const	group		= new TestCaseGroup(root->getContext(), groupName.c_str(), groupName.c_str());
2043433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2044433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	const deUint32 targets[] =
2045433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
2046433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		GL_TEXTURE_2D,
2047433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		GL_TEXTURE_3D,
2048433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		GL_TEXTURE_CUBE_MAP,
2049433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		GL_TEXTURE_2D_ARRAY,
2050433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		GL_RENDERBUFFER
2051433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	};
2052433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2053433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	root->addChild(group);
2054433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2055433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (int srcTargetNdx = 0; srcTargetNdx < DE_LENGTH_OF_ARRAY(targets); srcTargetNdx++)
2056433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
2057433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const deUint32	srcTarget				= targets[srcTargetNdx];
2058433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const bool		srcIs3D					= srcTarget == GL_TEXTURE_2D_ARRAY || srcTarget == GL_TEXTURE_3D;
2059433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2060238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry		if (glu::isCompressedFormat(srcFormat) && srcTarget == GL_RENDERBUFFER)
2061433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			continue;
2062433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2063433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		if (srcTarget == GL_RENDERBUFFER && !isColorRenderable(srcFormat))
2064433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			continue;
2065433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2066238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry		if (glu::isCompressedFormat(srcFormat) && !tcu::isAstcFormat(glu::mapGLCompressedTexFormat(srcFormat)) && srcIs3D)
2067433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			continue;
2068433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2069433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		for (int dstTargetNdx = 0; dstTargetNdx < DE_LENGTH_OF_ARRAY(targets); dstTargetNdx++)
2070433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
2071433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const deUint32	dstTarget				= targets[dstTargetNdx];
2072433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const bool		dstIs3D					= dstTarget == GL_TEXTURE_2D_ARRAY || dstTarget == GL_TEXTURE_3D;
2073433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2074238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry			if (glu::isCompressedFormat(dstFormat) && dstTarget == GL_RENDERBUFFER)
2075433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				continue;
2076433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2077433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			if (dstTarget == GL_RENDERBUFFER && !isColorRenderable(dstFormat))
2078433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				continue;
2079433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2080238d2aee289b3bc19b059ddbfc9e83892be1d8a6Jarkko Pöyry			if (glu::isCompressedFormat(dstFormat) && !tcu::isAstcFormat(glu::mapGLCompressedTexFormat(dstFormat)) && dstIs3D)
2081433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				continue;
2082433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2083433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const string	targetTestName	= string(targetToName(srcTarget)) + "_to_" + targetToName(dstTarget);
2084433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2085433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3		targetSize2D	(128, 128, 1);
2086433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3		targetSize3D	(128, 128, 16);
2087433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2088433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3		srcSize			= getTestedSize(srcTarget, srcFormat, (srcIs3D ? targetSize3D : targetSize2D));
2089433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const IVec3		dstSize			= getTestedSize(dstTarget, dstFormat, (dstIs3D ? targetSize3D : targetSize2D));
2090433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2091433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			group->addChild(new CopyImageTest(root->getContext(),
2092433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi											ImageInfo(srcFormat, srcTarget, srcSize),
2093433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi											ImageInfo(dstFormat, dstTarget, dstSize),
2094433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi											targetTestName.c_str(), targetTestName.c_str()));
2095433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
2096433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
2097433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
2098433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2099433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvivoid CopyImageTests::init (void)
2100433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
2101433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	TestCaseGroup* const	nonCompressedGroup	= new TestCaseGroup(m_context, "non_compressed", "Test copying between textures.");
2102433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	TestCaseGroup* const	compressedGroup		= new TestCaseGroup(m_context, "compressed", "Test copying between compressed textures.");
2103433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	TestCaseGroup* const	mixedGroup			= new TestCaseGroup(m_context, "mixed", "Test copying between compressed and non-compressed textures.");
2104433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2105433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	addChild(nonCompressedGroup);
2106433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	addChild(compressedGroup);
2107433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	addChild(mixedGroup);
2108433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2109433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	map<ViewClass, vector<deUint32> >							textureFormatViewClasses;
2110433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	map<ViewClass, vector<deUint32> >							compressedTextureFormatViewClasses;
2111433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	map<ViewClass, pair<vector<deUint32>, vector<deUint32> > >	mixedViewClasses;
2112433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2113433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// Texture view classes
2114433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_128_BITS]		= vector<deUint32>();
2115433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_96_BITS]			= vector<deUint32>();
2116433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_64_BITS]			= vector<deUint32>();
2117433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_48_BITS]			= vector<deUint32>();
2118433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_32_BITS]			= vector<deUint32>();
2119433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_24_BITS]			= vector<deUint32>();
2120433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_16_BITS]			= vector<deUint32>();
2121433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_8_BITS]			= vector<deUint32>();
2122433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2123433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// 128bit / VIEWCLASS_128_BITS
2124433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_128_BITS].push_back(GL_RGBA32F);
2125433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_128_BITS].push_back(GL_RGBA32I);
2126433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_128_BITS].push_back(GL_RGBA32UI);
2127433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2128433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// 96bit / VIEWCLASS_96_BITS
2129433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_96_BITS].push_back(GL_RGB32F);
2130433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_96_BITS].push_back(GL_RGB32I);
2131433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_96_BITS].push_back(GL_RGB32UI);
2132433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2133433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// 64bit / VIEWCLASS_64_BITS
2134433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_64_BITS].push_back(GL_RG32F);
2135433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_64_BITS].push_back(GL_RG32I);
2136433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_64_BITS].push_back(GL_RG32UI);
2137433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2138433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_64_BITS].push_back(GL_RGBA16F);
2139433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_64_BITS].push_back(GL_RGBA16I);
2140433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_64_BITS].push_back(GL_RGBA16UI);
2141433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2142433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// 48bit / VIEWCLASS_48_BITS
2143433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_48_BITS].push_back(GL_RGB16F);
2144433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_48_BITS].push_back(GL_RGB16I);
2145433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_48_BITS].push_back(GL_RGB16UI);
2146433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2147433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// 32bit / VIEWCLASS_32_BITS
2148433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_R32F);
2149433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_R32I);
2150433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_R32UI);
2151433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2152433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RG16F);
2153433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RG16I);
2154433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RG16UI);
2155433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2156433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGBA8);
2157433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGBA8I);
2158433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGBA8UI);
2159433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2160433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_R11F_G11F_B10F);
2161433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGB10_A2UI);
2162433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGB10_A2);
2163433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGBA8_SNORM);
2164433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_SRGB8_ALPHA8);
2165433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_32_BITS].push_back(GL_RGB9_E5);
2166433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2167433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// 24bit / VIEWCLASS_24_BITS
2168433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_24_BITS].push_back(GL_RGB8);
2169433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_24_BITS].push_back(GL_RGB8I);
2170433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_24_BITS].push_back(GL_RGB8UI);
2171433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_24_BITS].push_back(GL_RGB8_SNORM);
2172433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_24_BITS].push_back(GL_SRGB8);
2173433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2174433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// 16bit / VIEWCLASS_16_BITS
2175433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_R16F);
2176433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_R16I);
2177433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_R16UI);
2178433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2179433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_RG8);
2180433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_RG8I);
2181433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_RG8UI);
2182433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_16_BITS].push_back(GL_RG8_SNORM);
2183433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2184433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// 8bit / VIEWCLASS_8_BITS
2185433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_8_BITS].push_back(GL_R8);
2186433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_8_BITS].push_back(GL_R8I);
2187433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_8_BITS].push_back(GL_R8UI);
2188433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	textureFormatViewClasses[VIEWCLASS_8_BITS].push_back(GL_R8_SNORM);
2189433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2190433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// Compressed texture view classes
2191433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_EAC_R11]			= vector<deUint32>();
2192433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_EAC_RG11]			= vector<deUint32>();
2193433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ETC2_RGB]			= vector<deUint32>();
2194433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ETC2_RGBA]			= vector<deUint32>();
2195433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ETC2_EAC_RGBA]		= vector<deUint32>();
2196433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_4x4_RGBA]		= vector<deUint32>();
2197433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_5x4_RGBA]		= vector<deUint32>();
2198433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_5x5_RGBA]		= vector<deUint32>();
2199433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_6x5_RGBA]		= vector<deUint32>();
2200433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_6x6_RGBA]		= vector<deUint32>();
2201433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x5_RGBA]		= vector<deUint32>();
2202433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x6_RGBA]		= vector<deUint32>();
2203433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x8_RGBA]		= vector<deUint32>();
2204433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x5_RGBA]	= vector<deUint32>();
2205433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x6_RGBA]	= vector<deUint32>();
2206433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x8_RGBA]	= vector<deUint32>();
2207433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x10_RGBA]	= vector<deUint32>();
2208433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_12x10_RGBA]	= vector<deUint32>();
2209433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_12x12_RGBA]	= vector<deUint32>();
2210433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2211433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// VIEWCLASS_EAC_R11
2212433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_EAC_R11].push_back(GL_COMPRESSED_R11_EAC);
2213433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_EAC_R11].push_back(GL_COMPRESSED_SIGNED_R11_EAC);
2214433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2215433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// VIEWCLASS_EAC_RG11
2216433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_EAC_RG11].push_back(GL_COMPRESSED_RG11_EAC);
2217433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_EAC_RG11].push_back(GL_COMPRESSED_SIGNED_RG11_EAC);
2218433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2219433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// VIEWCLASS_ETC2_RGB
2220433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ETC2_RGB].push_back(GL_COMPRESSED_RGB8_ETC2);
2221433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ETC2_RGB].push_back(GL_COMPRESSED_SRGB8_ETC2);
2222433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2223433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// VIEWCLASS_ETC2_RGBA
2224433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ETC2_RGBA].push_back(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2);
2225433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ETC2_RGBA].push_back(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2);
2226433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2227433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// VIEWCLASS_ETC2_EAC_RGBA
2228433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ETC2_EAC_RGBA].push_back(GL_COMPRESSED_RGBA8_ETC2_EAC);
2229433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ETC2_EAC_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC);
2230433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2231433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// VIEWCLASS_ASTC_4x4_RGBA
2232433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_4x4_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_4x4_KHR);
2233433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_4x4_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR);
2234433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2235433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// VIEWCLASS_ASTC_5x4_RGBA
2236433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_5x4_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_5x4_KHR);
2237433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_5x4_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR);
2238433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2239433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// VIEWCLASS_ASTC_5x5_RGBA
2240433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_5x5_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_5x5_KHR);
2241433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_5x5_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR);
2242433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2243433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// VIEWCLASS_ASTC_6x5_RGBA
2244433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_6x5_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_6x5_KHR);
2245433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_6x5_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR);
2246433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2247433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// VIEWCLASS_ASTC_6x6_RGBA
2248433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_6x6_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_6x6_KHR);
2249433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_6x6_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR);
2250433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2251433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// VIEWCLASS_ASTC_8x5_RGBA
2252433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x5_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_8x5_KHR);
2253433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x5_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR);
2254433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2255433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// VIEWCLASS_ASTC_8x6_RGBA
2256433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x6_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_8x6_KHR);
2257433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x6_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR);
2258433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2259433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// VIEWCLASS_ASTC_8x8_RGBA
2260433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x8_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_8x8_KHR);
2261433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_8x8_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR);
2262433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2263433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// VIEWCLASS_ASTC_10x5_RGBA
2264433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x5_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_10x5_KHR);
2265433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x5_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR);
2266433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2267433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// VIEWCLASS_ASTC_10x6_RGBA
2268433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x6_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_10x6_KHR);
2269433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x6_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR);
2270433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2271433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// VIEWCLASS_ASTC_10x8_RGBA
2272433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x8_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_10x8_KHR);
2273433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x8_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR);
2274433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2275433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// VIEWCLASS_ASTC_10x10_RGBA
2276433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x10_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_10x10_KHR);
2277433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_10x10_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR);
2278433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2279433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// VIEWCLASS_ASTC_12x10_RGBA
2280433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_12x10_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_12x10_KHR);
2281433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_12x10_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR);
2282433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2283433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// VIEWCLASS_ASTC_12x12_RGBA
2284433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_12x12_RGBA].push_back(GL_COMPRESSED_RGBA_ASTC_12x12_KHR);
2285433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	compressedTextureFormatViewClasses[VIEWCLASS_ASTC_12x12_RGBA].push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR);
2286433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2287433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// Mixed view classes
2288433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS] = pair<vector<deUint32>, vector<deUint32> >();
2289433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_64_BITS] = pair<vector<deUint32>, vector<deUint32> >();
2290433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2291433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// 128 bits
2292433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2293433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// Non compressed
2294433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].first.push_back(GL_RGBA32F);
2295433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].first.push_back(GL_RGBA32UI);
2296433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].first.push_back(GL_RGBA32I);
2297433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2298433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// Compressed
2299433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA8_ETC2_EAC);
2300433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC);
2301433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RG11_EAC);
2302433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SIGNED_RG11_EAC);
2303433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_4x4_KHR);
2304433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_5x4_KHR);
2305433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_5x5_KHR);
2306433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_6x5_KHR);
2307433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_6x6_KHR);
2308433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_8x5_KHR);
2309433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_8x6_KHR);
2310433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_8x8_KHR);
2311433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_10x5_KHR);
2312433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_10x6_KHR);
2313433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_10x8_KHR);
2314433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_10x10_KHR);
2315433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_12x10_KHR);
2316433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_RGBA_ASTC_12x12_KHR);
2317433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR);
2318433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR);
2319433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR);
2320433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR);
2321433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR);
2322433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR);
2323433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR);
2324433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR);
2325433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR);
2326433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR);
2327433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR);
2328433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR);
2329433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR);
2330433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_128_BITS].second.push_back(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR);
2331433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2332433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// 64 bits
2333433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2334433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// Non compressed
2335433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_64_BITS].first.push_back(GL_RGBA16F);
2336433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_64_BITS].first.push_back(GL_RGBA16UI);
2337433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_64_BITS].first.push_back(GL_RGBA16I);
2338433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2339433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_64_BITS].first.push_back(GL_RG32F);
2340433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_64_BITS].first.push_back(GL_RG32UI);
2341433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_64_BITS].first.push_back(GL_RG32I);
2342433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2343433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	// Compressed
2344433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_64_BITS].second.push_back(GL_COMPRESSED_R11_EAC);
2345433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	mixedViewClasses[VIEWCLASS_64_BITS].second.push_back(GL_COMPRESSED_SIGNED_R11_EAC);
2346433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2347433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (map<ViewClass, vector<deUint32> >::const_iterator viewClassIter = textureFormatViewClasses.begin(); viewClassIter != textureFormatViewClasses.end(); ++viewClassIter)
2348433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
2349433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const vector<deUint32>&	formats		= viewClassIter->second;
2350433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const ViewClass			viewClass	= viewClassIter->first;
2351433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		TestCaseGroup* const	viewGroup	= new TestCaseGroup(m_context, viewClassToName(viewClass), viewClassToName(viewClass));
2352433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2353433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		nonCompressedGroup->addChild(viewGroup);
2354433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2355433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		for (int srcFormatNdx = 0; srcFormatNdx < (int)formats.size(); srcFormatNdx++)
2356433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		for (int dstFormatNdx = 0; dstFormatNdx < (int)formats.size(); dstFormatNdx++)
2357433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
2358433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const deUint32 srcFormat = formats[srcFormatNdx];
2359433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const deUint32 dstFormat = formats[dstFormatNdx];
2360433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2361433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			if (srcFormat != dstFormat && isFloatFormat(srcFormat) && isFloatFormat(dstFormat))
2362433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				continue;
2363433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2364433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			addCopyTests(viewGroup, srcFormat, dstFormat);
2365433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
2366433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
2367433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2368433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (map<ViewClass, vector<deUint32> >::const_iterator viewClassIter = compressedTextureFormatViewClasses.begin(); viewClassIter != compressedTextureFormatViewClasses.end(); ++viewClassIter)
2369433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
2370433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const vector<deUint32>&	formats		= viewClassIter->second;
2371433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const ViewClass			viewClass	= viewClassIter->first;
2372433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		TestCaseGroup* const	viewGroup	= new TestCaseGroup(m_context, viewClassToName(viewClass), viewClassToName(viewClass));
2373433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2374433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		compressedGroup->addChild(viewGroup);
2375433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2376433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		for (int srcFormatNdx = 0; srcFormatNdx < (int)formats.size(); srcFormatNdx++)
2377433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		for (int dstFormatNdx = 0; dstFormatNdx < (int)formats.size(); dstFormatNdx++)
2378433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
2379433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const deUint32 srcFormat = formats[srcFormatNdx];
2380433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const deUint32 dstFormat = formats[dstFormatNdx];
2381433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2382433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			if (srcFormat != dstFormat && isFloatFormat(srcFormat) && isFloatFormat(dstFormat))
2383433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				continue;
2384433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2385433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			addCopyTests(viewGroup, srcFormat, dstFormat);
2386433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
2387433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
2388433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2389433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	for (map<ViewClass, pair<vector<deUint32>, vector<deUint32> > >::const_iterator iter = mixedViewClasses.begin(); iter != mixedViewClasses.end(); ++iter)
2390433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	{
2391433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const ViewClass			viewClass				= iter->first;
2392433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const string			viewClassName			= string(viewClassToName(viewClass)) + "_mixed";
2393433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		TestCaseGroup* const	viewGroup				= new TestCaseGroup(m_context, viewClassName.c_str(), viewClassName.c_str());
2394433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2395433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const vector<deUint32>	nonCompressedFormats	= iter->second.first;
2396433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		const vector<deUint32>	compressedFormats		= iter->second.second;
2397433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2398433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		mixedGroup->addChild(viewGroup);
2399433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2400433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		for (int srcFormatNdx = 0; srcFormatNdx < (int)nonCompressedFormats.size(); srcFormatNdx++)
2401433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		for (int dstFormatNdx = 0; dstFormatNdx < (int)compressedFormats.size(); dstFormatNdx++)
2402433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		{
2403433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const deUint32 srcFormat = nonCompressedFormats[srcFormatNdx];
2404433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			const deUint32 dstFormat = compressedFormats[dstFormatNdx];
2405433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2406433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			if (srcFormat != dstFormat && isFloatFormat(srcFormat) && isFloatFormat(dstFormat))
2407433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi				continue;
2408433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2409433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			addCopyTests(viewGroup, srcFormat, dstFormat);
2410433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi			addCopyTests(viewGroup, dstFormat, srcFormat);
2411433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi		}
2412433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	}
2413433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
2414433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2415433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} // anonymous
2416433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2417433e5704171098c7cd062c7339b259ad76a55678Mika IsojärviTestCaseGroup* createCopyImageTests (Context& context)
2418433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi{
2419433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi	return new CopyImageTests(context);
2420433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi}
2421433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi
2422433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} // Functional
2423433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} // gles31
2424433e5704171098c7cd062c7339b259ad76a55678Mika Isojärvi} // deqp
2425