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