13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program Tester Core
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ----------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Texture utilities.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTextureUtil.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuVectorUtil.hpp"
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deRandom.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMath.h"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMemory.h"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <limits>
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace tcu
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline float sRGBChannelToLinear (float cs)
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (cs <= 0.04045)
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return cs / 12.92f;
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return deFloatPow((cs + 0.055f) / 1.055f, 2.4f);
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvistatic const deUint32 s_srgb8Lut[256] =
44a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi{
45a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi#include "tcuSRGB8Lut.inl"
46a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi};
47a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi
48a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvistatic inline float sRGB8ChannelToLinear (deUint32 cs)
49a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi{
50a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi	DE_ASSERT(cs < 256);
51a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi
52a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi	// \note This triggers UB, but in practice it doesn't cause any problems
53a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi	return ((const float*)s_srgb8Lut)[cs];
54a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi}
55a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline float linearChannelToSRGB (float cl)
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (cl <= 0.0f)
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return 0.0f;
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (cl < 0.0031308f)
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return 12.92f*cl;
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (cl < 1.0f)
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return 1.055f*deFloatPow(cl, 0.41666f) - 0.055f;
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return 1.0f;
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//! Convert sRGB to linear colorspace
693c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4 sRGBToLinear (const Vec4& cs)
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return Vec4(sRGBChannelToLinear(cs[0]),
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				sRGBChannelToLinear(cs[1]),
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				sRGBChannelToLinear(cs[2]),
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				cs[3]);
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
77a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika IsojärviVec4 sRGB8ToLinear (const UVec4& cs)
78a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi{
79a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi	return Vec4(sRGB8ChannelToLinear(cs[0]),
80a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi				sRGB8ChannelToLinear(cs[1]),
81a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi				sRGB8ChannelToLinear(cs[2]),
82a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi				1.0f);
83a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi}
84a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi
85a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika IsojärviVec4 sRGBA8ToLinear (const UVec4& cs)
86a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi{
87a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi	return Vec4(sRGB8ChannelToLinear(cs[0]),
88a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi				sRGB8ChannelToLinear(cs[1]),
89a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi				sRGB8ChannelToLinear(cs[2]),
90a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi				(float)cs[3] / 255.0f);
91a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi}
92a99421e9ede7fac9c1ea832038e2b6dfe4231845Mika Isojärvi
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//! Convert from linear to sRGB colorspace
943c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4 linearToSRGB (const Vec4& cl)
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return Vec4(linearChannelToSRGB(cl[0]),
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				linearChannelToSRGB(cl[1]),
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				linearChannelToSRGB(cl[2]),
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				cl[3]);
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10289a729134d6a1880d2b59426dfe14d615381e314Jarkko Pöyrybool isSRGB (TextureFormat format)
10389a729134d6a1880d2b59426dfe14d615381e314Jarkko Pöyry{
104725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos	// make sure to update this if type table is updated
105725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos	DE_STATIC_ASSERT(TextureFormat::CHANNELORDER_LAST == 21);
106725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos
107725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos	return	format.order == TextureFormat::sR		||
108725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos			format.order == TextureFormat::sRG		||
109725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos			format.order == TextureFormat::sRGB		||
110725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos			format.order == TextureFormat::sRGBA	||
111725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos			format.order == TextureFormat::sBGR		||
112725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos			format.order == TextureFormat::sBGRA;
11389a729134d6a1880d2b59426dfe14d615381e314Jarkko Pöyry}
11489a729134d6a1880d2b59426dfe14d615381e314Jarkko Pöyry
115183e1448c4d0673f07fc18df30a2c3573ab04086Szilard Ledantcu::Vec4 linearToSRGBIfNeeded (const TextureFormat& format, const tcu::Vec4& color)
116183e1448c4d0673f07fc18df30a2c3573ab04086Szilard Ledan{
117183e1448c4d0673f07fc18df30a2c3573ab04086Szilard Ledan	return isSRGB(format) ? linearToSRGB(color) : color;
118183e1448c4d0673f07fc18df30a2c3573ab04086Szilard Ledan}
119183e1448c4d0673f07fc18df30a2c3573ab04086Szilard Ledan
12041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyrybool isCombinedDepthStencilType (TextureFormat::ChannelType type)
12141920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry{
12241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry	// make sure to update this if type table is updated
1235b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos	DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 38);
12441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry
125725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos	return	type == TextureFormat::UNSIGNED_INT_16_8_8			||
126725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos			type == TextureFormat::UNSIGNED_INT_24_8			||
127725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos			type == TextureFormat::UNSIGNED_INT_24_8_REV		||
12841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry			type == TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV;
12941920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry}
13041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry
13143b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvibool hasStencilComponent (TextureFormat::ChannelOrder order)
13243b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi{
133725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos	DE_STATIC_ASSERT(TextureFormat::CHANNELORDER_LAST == 21);
13443b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi
13543b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi	switch (order)
13643b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi	{
13743b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi		case TextureFormat::S:
13843b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi		case TextureFormat::DS:
13943b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi			return true;
14043b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi
14143b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi		default:
14243b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi			return false;
14343b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi	}
14443b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi}
14543b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi
14643b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvibool hasDepthComponent (TextureFormat::ChannelOrder order)
14743b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi{
148725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos	DE_STATIC_ASSERT(TextureFormat::CHANNELORDER_LAST == 21);
14943b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi
15043b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi	switch (order)
15143b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi	{
15243b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi		case TextureFormat::D:
15343b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi		case TextureFormat::DS:
15443b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi			return true;
15543b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi
15643b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi		default:
15743b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi			return false;
15843b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi	}
15943b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi}
16043b3c7468cee6a00bb75470ed5386b2c54b88874Mika Isojärvi
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//! Get texture channel class for format
1623c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTextureChannelClass getTextureChannelClass (TextureFormat::ChannelType channelType)
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
16407104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry	// make sure this table is updated if format table is updated
1655b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos	DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 38);
16607104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (channelType)
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::SNORM_INT8:						return TEXTURECHANNELCLASS_SIGNED_FIXED_POINT;
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::SNORM_INT16:					return TEXTURECHANNELCLASS_SIGNED_FIXED_POINT;
17107104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry		case TextureFormat::SNORM_INT32:					return TEXTURECHANNELCLASS_SIGNED_FIXED_POINT;
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_INT8:						return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_INT16:					return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
17407104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry		case TextureFormat::UNORM_INT24:					return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
17507104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry		case TextureFormat::UNORM_INT32:					return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
176725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNORM_BYTE_44:					return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_SHORT_565:				return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_SHORT_555:				return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_SHORT_4444:				return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_SHORT_5551:				return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
1815b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos		case TextureFormat::UNORM_SHORT_1555:				return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
182725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNSIGNED_BYTE_44:				return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
183725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNSIGNED_SHORT_565:				return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
184725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNSIGNED_SHORT_4444:			return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
185725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNSIGNED_SHORT_5551:			return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_INT_101010:				return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
187725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::SNORM_INT_1010102_REV:			return TEXTURECHANNELCLASS_SIGNED_FIXED_POINT;
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_INT_1010102_REV:			return TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
189725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::SIGNED_INT_1010102_REV:			return TEXTURECHANNELCLASS_SIGNED_INTEGER;
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNSIGNED_INT_1010102_REV:		return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNSIGNED_INT_11F_11F_10F_REV:	return TEXTURECHANNELCLASS_FLOATING_POINT;
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNSIGNED_INT_999_E5_REV:		return TEXTURECHANNELCLASS_FLOATING_POINT;
193725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNSIGNED_INT_16_8_8:			return TEXTURECHANNELCLASS_LAST;					//!< packed unorm16-x8-uint8
19407104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry		case TextureFormat::UNSIGNED_INT_24_8:				return TEXTURECHANNELCLASS_LAST;					//!< packed unorm24-uint8
195725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNSIGNED_INT_24_8_REV:			return TEXTURECHANNELCLASS_LAST;					//!< packed unorm24-uint8
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::SIGNED_INT8:					return TEXTURECHANNELCLASS_SIGNED_INTEGER;
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::SIGNED_INT16:					return TEXTURECHANNELCLASS_SIGNED_INTEGER;
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::SIGNED_INT32:					return TEXTURECHANNELCLASS_SIGNED_INTEGER;
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNSIGNED_INT8:					return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNSIGNED_INT16:					return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
201db6ba452c1213fd1c2b03369fdf4c1d23f07cfadJarkko Pöyry		case TextureFormat::UNSIGNED_INT24:					return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNSIGNED_INT32:					return TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::HALF_FLOAT:						return TEXTURECHANNELCLASS_FLOATING_POINT;
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::FLOAT:							return TEXTURECHANNELCLASS_FLOATING_POINT;
2055b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos		case TextureFormat::FLOAT64:						return TEXTURECHANNELCLASS_FLOATING_POINT;
20607104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry		case TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV:	return TEXTURECHANNELCLASS_LAST;					//!< packed float32-pad24-uint8
2075b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos		default:
2085b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos			DE_FATAL("Unknown channel type");
2095b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos			return TEXTURECHANNELCLASS_LAST;
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
21325977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulosbool isAccessValid (TextureFormat format, TextureAccessType type)
21425977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos{
21525977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos	DE_ASSERT(isValid(format));
21625977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos
21725977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos	if (format.order == TextureFormat::DS)
21825977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos	{
21925977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos		// It is never allowed to access combined depth-stencil format with getPixel().
22025977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos		// Instead either getPixDepth() or getPixStencil(), or effective depth- or stencil-
22125977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos		// access must be used.
22225977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos		return false;
22325977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos	}
22425977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos	else if (format.order == TextureFormat::D)
22525977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos		return type == TEXTUREACCESSTYPE_FLOAT;
22625977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos	else if (format.order == TextureFormat::S)
22725977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos		return type == TEXTUREACCESSTYPE_UNSIGNED_INT;
22825977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos	else
22925977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos	{
23025977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos		// A few packed color formats have access type restrictions
23125977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos		if (format.type == TextureFormat::UNSIGNED_INT_11F_11F_10F_REV ||
23225977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos			format.type == TextureFormat::UNSIGNED_INT_999_E5_REV)
23325977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos			return type == TEXTUREACCESSTYPE_FLOAT;
23425977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos		else
23525977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos			return true;
23625977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos	}
23725977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos}
23825977694b814e285649d6a60c148cb3b5a04ef30Pyry Haulos
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Get access to subregion of pixel buffer
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param access	Parent access object
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param x			X offset
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param y			Y offset
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param z			Z offset
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param width		Width
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param height	Height
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param depth		Depth
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \return Access object that targets given subregion of parent access object
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
2503c827367444ee418f129b2c238299f49d3264554Jarkko PoyryConstPixelBufferAccess getSubregion (const ConstPixelBufferAccess& access, int x, int y, int z, int width, int height, int depth)
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
252becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	DE_ASSERT(de::inBounds(x, 0, access.getWidth()));
253becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	DE_ASSERT(de::inRange(x+width, x+1, access.getWidth()));
254becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi
255becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	DE_ASSERT(de::inBounds(y, 0, access.getHeight()));
256becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	DE_ASSERT(de::inRange(y+height, y+1, access.getHeight()));
257becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi
258becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	DE_ASSERT(de::inBounds(z, 0, access.getDepth()));
259becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	DE_ASSERT(de::inRange(z+depth, z+1, access.getDepth()));
260becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi
2616c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	return ConstPixelBufferAccess(access.getFormat(), tcu::IVec3(width, height, depth), access.getPitch(),
2626c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry								  (const deUint8*)access.getDataPtr() + access.getPixelPitch()*x + access.getRowPitch()*y + access.getSlicePitch()*z);
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Get access to subregion of pixel buffer
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param access	Parent access object
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param x			X offset
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param y			Y offset
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param z			Z offset
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param width		Width
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param height	Height
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param depth		Depth
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \return Access object that targets given subregion of parent access object
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
2763c827367444ee418f129b2c238299f49d3264554Jarkko PoyryPixelBufferAccess getSubregion (const PixelBufferAccess& access, int x, int y, int z, int width, int height, int depth)
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
278becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	DE_ASSERT(de::inBounds(x, 0, access.getWidth()));
279becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	DE_ASSERT(de::inRange(x+width, x+1, access.getWidth()));
280becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi
281becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	DE_ASSERT(de::inBounds(y, 0, access.getHeight()));
282becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	DE_ASSERT(de::inRange(y+height, y+1, access.getHeight()));
283becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi
284becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	DE_ASSERT(de::inBounds(z, 0, access.getDepth()));
285becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	DE_ASSERT(de::inRange(z+depth, z+1, access.getDepth()));
286becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi
2876c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	return PixelBufferAccess(access.getFormat(), tcu::IVec3(width, height, depth), access.getPitch(),
2886c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry							 (deUint8*)access.getDataPtr() + access.getPixelPitch()*x + access.getRowPitch()*y + access.getSlicePitch()*z);
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Get access to subregion of pixel buffer
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param access	Parent access object
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param x			X offset
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param y			Y offset
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param width		Width
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param height	Height
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \return Access object that targets given subregion of parent access object
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
3003c827367444ee418f129b2c238299f49d3264554Jarkko PoyryPixelBufferAccess getSubregion (const PixelBufferAccess& access, int x, int y, int width, int height)
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return getSubregion(access, x, y, 0, width, height, 1);
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Get access to subregion of pixel buffer
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param access	Parent access object
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param x			X offset
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param y			Y offset
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param width		Width
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param height	Height
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \return Access object that targets given subregion of parent access object
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
3143c827367444ee418f129b2c238299f49d3264554Jarkko PoyryConstPixelBufferAccess getSubregion (const ConstPixelBufferAccess& access, int x, int y, int width, int height)
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return getSubregion(access, x, y, 0, width, height, 1);
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Flip rows in Y direction
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param access Access object
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \return Modified access object where Y coordinates are reversed
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
3243c827367444ee418f129b2c238299f49d3264554Jarkko PoyryPixelBufferAccess flipYAccess (const PixelBufferAccess& access)
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3266c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const int			rowPitch		= access.getRowPitch();
3276c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const int			offsetToLast	= rowPitch*(access.getHeight()-1);
3286c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const tcu::IVec3	pitch			(access.getPixelPitch(), -rowPitch, access.getSlicePitch());
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3306c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	return PixelBufferAccess(access.getFormat(), access.getSize(), pitch, (deUint8*)access.getDataPtr() + offsetToLast);
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Flip rows in Y direction
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \param access Access object
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \return Modified access object where Y coordinates are reversed
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
3383c827367444ee418f129b2c238299f49d3264554Jarkko PoyryConstPixelBufferAccess flipYAccess (const ConstPixelBufferAccess& access)
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3406c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const int			rowPitch		= access.getRowPitch();
3416c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const int			offsetToLast	= rowPitch*(access.getHeight()-1);
3426c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const tcu::IVec3	pitch			(access.getPixelPitch(), -rowPitch, access.getSlicePitch());
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3446c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	return ConstPixelBufferAccess(access.getFormat(), access.getSize(), pitch, (deUint8*)access.getDataPtr() + offsetToLast);
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3474356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvistatic Vec2 getFloatChannelValueRange (TextureFormat::ChannelType channelType)
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
34907104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry	// make sure this table is updated if format table is updated
3505b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos	DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 38);
35107104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float cMin = 0.0f;
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float cMax = 0.0f;
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (channelType)
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Signed normalized formats.
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::SNORM_INT8:
35907104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry		case TextureFormat::SNORM_INT16:
360725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::SNORM_INT32:
361725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::SNORM_INT_1010102_REV:			cMin = -1.0f;			cMax = 1.0f;			break;
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Unsigned normalized formats.
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_INT8:
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_INT16:
36607104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry		case TextureFormat::UNORM_INT24:
36707104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry		case TextureFormat::UNORM_INT32:
368725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNORM_BYTE_44:
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_SHORT_565:
370725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNORM_SHORT_555:
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_SHORT_4444:
372725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNORM_SHORT_5551:
3735b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos		case TextureFormat::UNORM_SHORT_1555:
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_INT_101010:
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_INT_1010102_REV:			cMin = 0.0f;			cMax = 1.0f;			break;
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Misc formats.
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::SIGNED_INT8:					cMin = -128.0f;			cMax = 127.0f;			break;
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::SIGNED_INT16:					cMin = -32768.0f;		cMax = 32767.0f;		break;
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::SIGNED_INT32:					cMin = -2147483648.0f;	cMax = 2147483647.0f;	break;
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNSIGNED_INT8:					cMin = 0.0f;			cMax = 255.0f;			break;
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNSIGNED_INT16:					cMin = 0.0f;			cMax = 65535.0f;		break;
383db6ba452c1213fd1c2b03369fdf4c1d23f07cfadJarkko Pöyry		case TextureFormat::UNSIGNED_INT24:					cMin = 0.0f;			cMax = 16777215.0f;		break;
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNSIGNED_INT32:					cMin = 0.0f;			cMax = 4294967295.f;	break;
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::HALF_FLOAT:						cMin = -1e3f;			cMax = 1e3f;			break;
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::FLOAT:							cMin = -1e5f;			cMax = 1e5f;			break;
387725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::FLOAT64:						cMin = -1e5f;			cMax = 1e5f;			break;
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNSIGNED_INT_11F_11F_10F_REV:	cMin = 0.0f;			cMax = 1e4f;			break;
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNSIGNED_INT_999_E5_REV:		cMin = 0.0f;			cMax = 1e5f;			break;
3905b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos		case TextureFormat::UNSIGNED_BYTE_44:				cMin = 0.0f;			cMax = 15.f;			break;
3915b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos		case TextureFormat::UNSIGNED_SHORT_4444:			cMin = 0.0f;			cMax = 15.f;			break;
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(false);
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return Vec2(cMin, cMax);
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Get standard parameters for testing texture format
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Returns TextureFormatInfo that describes good parameters for exercising
4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * given TextureFormat. Parameters include value ranges per channel and
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * suitable lookup scaling and bias in order to reduce result back to
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 0..1 range.
4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
4083c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTextureFormatInfo getTextureFormatInfo (const TextureFormat& format)
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Special cases.
4115b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos	if (format.type == TextureFormat::UNSIGNED_INT_1010102_REV)
4125b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos		return TextureFormatInfo(Vec4(	     0.0f,		    0.0f,		    0.0f,		 0.0f),
4135b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos								 Vec4(	  1023.0f,		 1023.0f,		 1023.0f,		 3.0f),
4145b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos								 Vec4(1.0f/1023.f,	1.0f/1023.0f,	1.0f/1023.0f,	1.0f/3.0f),
4155b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos								 Vec4(	     0.0f,		    0.0f,		    0.0f,		 0.0f));
4165b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos	if (format.type == TextureFormat::SIGNED_INT_1010102_REV)
4175b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos		return TextureFormatInfo(Vec4(	  -512.0f,		 -512.0f,		 -512.0f,		-2.0f),
4185b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos								 Vec4(	   511.0f,		  511.0f,		  511.0f,		 1.0f),
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								 Vec4(1.0f/1023.f,	1.0f/1023.0f,	1.0f/1023.0f,	1.0f/3.0f),
4205b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos								 Vec4(	     0.5f,		    0.5f,		    0.5f,		 0.5f));
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (format.order == TextureFormat::D || format.order == TextureFormat::DS)
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return TextureFormatInfo(Vec4(0.0f,	0.0f,	0.0f,	0.0f),
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								 Vec4(1.0f,	1.0f,	1.0f,	0.0f),
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								 Vec4(1.0f,	1.0f,	1.0f,	1.0f),
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								 Vec4(0.0f,	0.0f,	0.0f,	0.0f)); // Depth / stencil formats.
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (format == TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_SHORT_5551))
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return TextureFormatInfo(Vec4(0.0f, 0.0f, 0.0f, 0.5f),
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								 Vec4(1.0f, 1.0f, 1.0f, 1.5f),
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								 Vec4(1.0f, 1.0f, 1.0f, 1.0f),
4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								 Vec4(0.0f, 0.0f, 0.0f, 0.0f));
4315b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos	else if (format.type == TextureFormat::UNSIGNED_SHORT_5551)
4325b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos		return TextureFormatInfo(Vec4(	   0.0f,		  0.0f,		  0.0f,	0.0f),
4335b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos								 Vec4(	  31.0f,		 31.0f,		 31.0f,	1.0f),
4345b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos								 Vec4(1.0f/31.f,	1.0f/31.0f,	1.0f/31.0f,	1.0f),
4355b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos								 Vec4(	   0.0f,		  0.0f,		  0.0f,	0.0f));
4365b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos	else if (format.type == TextureFormat::UNSIGNED_SHORT_565)
4375b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos		return TextureFormatInfo(Vec4(	   0.0f,		  0.0f,		  0.0f,	0.0f),
4385b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos								 Vec4(	  31.0f,		 63.0f,		 31.0f,	0.0f),
4395b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos								 Vec4(1.0f/31.f,	1.0f/63.0f,	1.0f/31.0f,	1.0f),
4405b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos								 Vec4(	   0.0f,		  0.0f,		  0.0f,	0.0f));
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4424356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi	const Vec2						cRange		= getFloatChannelValueRange(format.type);
4436d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry	const TextureSwizzle::Channel*	map			= getChannelReadSwizzle(format.order).components;
4446d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry	const BVec4						chnMask		= BVec4(deInRange32(map[0], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE,
4456d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry														deInRange32(map[1], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE,
4466d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry														deInRange32(map[2], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE,
4476d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry														deInRange32(map[3], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE);
4486d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry	const float						scale		= 1.0f / (cRange[1] - cRange[0]);
4496d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry	const float						bias		= -cRange[0] * scale;
4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return TextureFormatInfo(select(cRange[0],	0.0f, chnMask),
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							 select(cRange[1],	0.0f, chnMask),
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							 select(scale,		1.0f, chnMask),
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							 select(bias,		0.0f, chnMask));
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4574356bb5b4e9a1559ecea41265ee242d37aacaa38Mika IsojärviIVec4 getFormatMinIntValue (const TextureFormat& format)
4584356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi{
4594356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi	DE_ASSERT(getTextureChannelClass(format.type) == TEXTURECHANNELCLASS_SIGNED_INTEGER);
4604356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi
4614356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi	switch (format.type)
4624356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi	{
4636a6286cee0349735c45cf883478570f8b273025fPyry Haulos		case TextureFormat::SIGNED_INT8:	return IVec4(std::numeric_limits<deInt8>::min());
4646a6286cee0349735c45cf883478570f8b273025fPyry Haulos		case TextureFormat::SIGNED_INT16:	return IVec4(std::numeric_limits<deInt16>::min());
4656a6286cee0349735c45cf883478570f8b273025fPyry Haulos		case TextureFormat::SIGNED_INT32:	return IVec4(std::numeric_limits<deInt32>::min());
4664356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi
4674356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi		default:
4684356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi			DE_FATAL("Invalid channel type");
4694356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi			return IVec4(0);
4704356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi	}
4714356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi}
4724356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi
4734356bb5b4e9a1559ecea41265ee242d37aacaa38Mika IsojärviIVec4 getFormatMaxIntValue (const TextureFormat& format)
4744356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi{
4754356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi	DE_ASSERT(getTextureChannelClass(format.type) == TEXTURECHANNELCLASS_SIGNED_INTEGER);
4764356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi
477e34def5b9c18a972fd4fc99a5e229f780a54e371Peter Siket	if (format == TextureFormat(TextureFormat::RGBA, TextureFormat::SIGNED_INT_1010102_REV) ||
478e34def5b9c18a972fd4fc99a5e229f780a54e371Peter Siket		format == TextureFormat(TextureFormat::BGRA, TextureFormat::SIGNED_INT_1010102_REV))
479e34def5b9c18a972fd4fc99a5e229f780a54e371Peter Siket		return IVec4(511, 511, 511, 1);
480e34def5b9c18a972fd4fc99a5e229f780a54e371Peter Siket
4814356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi	switch (format.type)
4824356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi	{
4836a6286cee0349735c45cf883478570f8b273025fPyry Haulos		case TextureFormat::SIGNED_INT8:	return IVec4(std::numeric_limits<deInt8>::max());
4846a6286cee0349735c45cf883478570f8b273025fPyry Haulos		case TextureFormat::SIGNED_INT16:	return IVec4(std::numeric_limits<deInt16>::max());
4856a6286cee0349735c45cf883478570f8b273025fPyry Haulos		case TextureFormat::SIGNED_INT32:	return IVec4(std::numeric_limits<deInt32>::max());
4864356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi
4874356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi		default:
4884356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi			DE_FATAL("Invalid channel type");
4894356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi			return IVec4(0);
4904356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi	}
4914356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi}
4924356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi
4934356bb5b4e9a1559ecea41265ee242d37aacaa38Mika IsojärviUVec4 getFormatMaxUintValue (const TextureFormat& format)
4944356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi{
4954356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi	DE_ASSERT(getTextureChannelClass(format.type) == TEXTURECHANNELCLASS_UNSIGNED_INTEGER);
4964356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi
497e34def5b9c18a972fd4fc99a5e229f780a54e371Peter Siket	if (format == TextureFormat(TextureFormat::RGBA, TextureFormat::UNSIGNED_INT_1010102_REV) ||
498e34def5b9c18a972fd4fc99a5e229f780a54e371Peter Siket		format == TextureFormat(TextureFormat::BGRA, TextureFormat::UNSIGNED_INT_1010102_REV))
4994356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi		return UVec4(1023u, 1023u, 1023u, 3u);
5004356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi
5014356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi	switch (format.type)
5024356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi	{
5036a6286cee0349735c45cf883478570f8b273025fPyry Haulos		case TextureFormat::UNSIGNED_INT8:	return UVec4(std::numeric_limits<deUint8>::max());
5046a6286cee0349735c45cf883478570f8b273025fPyry Haulos		case TextureFormat::UNSIGNED_INT16:	return UVec4(std::numeric_limits<deUint16>::max());
5056a6286cee0349735c45cf883478570f8b273025fPyry Haulos		case TextureFormat::UNSIGNED_INT24:	return UVec4(0xffffffu);
5066a6286cee0349735c45cf883478570f8b273025fPyry Haulos		case TextureFormat::UNSIGNED_INT32:	return UVec4(std::numeric_limits<deUint32>::max());
5074356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi
5084356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi		default:
5094356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi			DE_FATAL("Invalid channel type");
5104356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi			return UVec4(0);
5114356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi	}
5124356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi}
5134356bb5b4e9a1559ecea41265ee242d37aacaa38Mika Isojärvi
5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic IVec4 getChannelBitDepth (TextureFormat::ChannelType channelType)
5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
51607104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry	// make sure this table is updated if format table is updated
5175b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos	DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 38);
51807104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry
5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (channelType)
5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::SNORM_INT8:						return IVec4(8);
5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::SNORM_INT16:					return IVec4(16);
5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::SNORM_INT32:					return IVec4(32);
5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_INT8:						return IVec4(8);
5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_INT16:					return IVec4(16);
52607104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry		case TextureFormat::UNORM_INT24:					return IVec4(24);
5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_INT32:					return IVec4(32);
528725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNORM_BYTE_44:					return IVec4(4,4,0,0);
5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_SHORT_565:				return IVec4(5,6,5,0);
5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_SHORT_4444:				return IVec4(4);
5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_SHORT_555:				return IVec4(5,5,5,0);
5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_SHORT_5551:				return IVec4(5,5,5,1);
5335b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos		case TextureFormat::UNORM_SHORT_1555:				return IVec4(1,5,5,5);
534725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNSIGNED_BYTE_44:				return IVec4(4,4,0,0);
535725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNSIGNED_SHORT_565:				return IVec4(5,6,5,0);
536725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNSIGNED_SHORT_4444:			return IVec4(4);
537725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNSIGNED_SHORT_5551:			return IVec4(5,5,5,1);
5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_INT_101010:				return IVec4(10,10,10,0);
539725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::SNORM_INT_1010102_REV:			return IVec4(10,10,10,2);
5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNORM_INT_1010102_REV:			return IVec4(10,10,10,2);
5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::SIGNED_INT8:					return IVec4(8);
5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::SIGNED_INT16:					return IVec4(16);
5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::SIGNED_INT32:					return IVec4(32);
5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNSIGNED_INT8:					return IVec4(8);
5453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNSIGNED_INT16:					return IVec4(16);
546db6ba452c1213fd1c2b03369fdf4c1d23f07cfadJarkko Pöyry		case TextureFormat::UNSIGNED_INT24:					return IVec4(24);
5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNSIGNED_INT32:					return IVec4(32);
548725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::SIGNED_INT_1010102_REV:			return IVec4(10,10,10,2);
5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNSIGNED_INT_1010102_REV:		return IVec4(10,10,10,2);
550725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNSIGNED_INT_16_8_8:			return IVec4(16,8,0,0);
551ed7aa26e96ce420ea1d269ed45c62ed65f8c6bd4Jarkko Pöyry		case TextureFormat::UNSIGNED_INT_24_8:				return IVec4(24,8,0,0);
552725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNSIGNED_INT_24_8_REV:			return IVec4(24,8,0,0);
5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::HALF_FLOAT:						return IVec4(16);
5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::FLOAT:							return IVec4(32);
555725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::FLOAT64:						return IVec4(64);
5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNSIGNED_INT_11F_11F_10F_REV:	return IVec4(11,11,10,0);
5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case TextureFormat::UNSIGNED_INT_999_E5_REV:		return IVec4(9,9,9,0);
558ed7aa26e96ce420ea1d269ed45c62ed65f8c6bd4Jarkko Pöyry		case TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV:	return IVec4(32,8,0,0);
5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(false);
5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return IVec4(0);
5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5653c827367444ee418f129b2c238299f49d3264554Jarkko PoyryIVec4 getTextureFormatBitDepth (const TextureFormat& format)
5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5676d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry	const IVec4						chnBits		= getChannelBitDepth(format.type);
5686d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry	const TextureSwizzle::Channel*	map			= getChannelReadSwizzle(format.order).components;
5696d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry	const BVec4						chnMask		= BVec4(deInRange32(map[0], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE,
5706d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry														deInRange32(map[1], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE,
5716d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry														deInRange32(map[2], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE,
5726d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry														deInRange32(map[3], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE);
5736d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry	const IVec4						chnSwz		= IVec4((chnMask[0]) ? ((int)map[0]) : (0),
5746d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry														(chnMask[1]) ? ((int)map[1]) : (0),
5756d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry														(chnMask[2]) ? ((int)map[2]) : (0),
5766d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry														(chnMask[3]) ? ((int)map[3]) : (0));
577ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry
578ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry	return select(chnBits.swizzle(chnSwz.x(), chnSwz.y(), chnSwz.z(), chnSwz.w()), IVec4(0), chnMask);
579ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry}
580ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry
581ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyrystatic IVec4 getChannelMantissaBitDepth (TextureFormat::ChannelType channelType)
582ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry{
58307104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry	// make sure this table is updated if format table is updated
5845b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos	DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 38);
58507104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry
586ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry	switch (channelType)
587ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry	{
588ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::SNORM_INT8:
589ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::SNORM_INT16:
590ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::SNORM_INT32:
591ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::UNORM_INT8:
592ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::UNORM_INT16:
59307104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry		case TextureFormat::UNORM_INT24:
594ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::UNORM_INT32:
595725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNORM_BYTE_44:
596ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::UNORM_SHORT_565:
597ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::UNORM_SHORT_4444:
598ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::UNORM_SHORT_555:
599ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::UNORM_SHORT_5551:
6005b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos		case TextureFormat::UNORM_SHORT_1555:
601725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNSIGNED_BYTE_44:
602725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNSIGNED_SHORT_565:
603725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNSIGNED_SHORT_4444:
604725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNSIGNED_SHORT_5551:
605ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::UNORM_INT_101010:
606725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::SNORM_INT_1010102_REV:
607ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::UNORM_INT_1010102_REV:
608ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::SIGNED_INT8:
609ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::SIGNED_INT16:
610ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::SIGNED_INT32:
611ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::UNSIGNED_INT8:
612ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::UNSIGNED_INT16:
613db6ba452c1213fd1c2b03369fdf4c1d23f07cfadJarkko Pöyry		case TextureFormat::UNSIGNED_INT24:
614ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::UNSIGNED_INT32:
615725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::SIGNED_INT_1010102_REV:
616ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::UNSIGNED_INT_1010102_REV:
617725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNSIGNED_INT_16_8_8:
618ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::UNSIGNED_INT_24_8:
619725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::UNSIGNED_INT_24_8_REV:
620ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::UNSIGNED_INT_999_E5_REV:
621ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry			return getChannelBitDepth(channelType);
622ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry
623ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::HALF_FLOAT:						return IVec4(10);
624ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::FLOAT:							return IVec4(23);
625725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::FLOAT64:						return IVec4(52);
626ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		case TextureFormat::UNSIGNED_INT_11F_11F_10F_REV:	return IVec4(6,6,5,0);
627ed7aa26e96ce420ea1d269ed45c62ed65f8c6bd4Jarkko Pöyry		case TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV:	return IVec4(23,8,0,0);
628ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry		default:
629ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry			DE_ASSERT(false);
630ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry			return IVec4(0);
631ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry	}
632ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry}
633ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry
634ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko PöyryIVec4 getTextureFormatMantissaBitDepth (const TextureFormat& format)
635ade588f3b2b1b6d007b9681e95434dc4a4bd46caJarkko Pöyry{
6366d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry	const IVec4						chnBits		= getChannelMantissaBitDepth(format.type);
6376d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry	const TextureSwizzle::Channel*	map			= getChannelReadSwizzle(format.order).components;
6386d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry	const BVec4						chnMask		= BVec4(deInRange32(map[0], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE,
6396d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry														deInRange32(map[1], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE,
6406d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry														deInRange32(map[2], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE,
6416d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry														deInRange32(map[3], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE);
6426d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry	const IVec4						chnSwz		= IVec4((chnMask[0]) ? ((int)map[0]) : (0),
6436d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry														(chnMask[1]) ? ((int)map[1]) : (0),
6446d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry														(chnMask[2]) ? ((int)map[2]) : (0),
6456d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry														(chnMask[3]) ? ((int)map[3]) : (0));
6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return select(chnBits.swizzle(chnSwz.x(), chnSwz.y(), chnSwz.z(), chnSwz.w()), IVec4(0), chnMask);
6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
65066ff4f4209ef24ee7216925c15c4acc5ced88c3eJarkko PöyryBVec4 getTextureFormatChannelMask (const TextureFormat& format)
65166ff4f4209ef24ee7216925c15c4acc5ced88c3eJarkko Pöyry{
65266ff4f4209ef24ee7216925c15c4acc5ced88c3eJarkko Pöyry	const TextureSwizzle::Channel* const map = getChannelReadSwizzle(format.order).components;
65366ff4f4209ef24ee7216925c15c4acc5ced88c3eJarkko Pöyry	return BVec4(deInRange32(map[0], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE,
65466ff4f4209ef24ee7216925c15c4acc5ced88c3eJarkko Pöyry				 deInRange32(map[1], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE,
65566ff4f4209ef24ee7216925c15c4acc5ced88c3eJarkko Pöyry				 deInRange32(map[2], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE,
65666ff4f4209ef24ee7216925c15c4acc5ced88c3eJarkko Pöyry				 deInRange32(map[3], TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE);
65766ff4f4209ef24ee7216925c15c4acc5ced88c3eJarkko Pöyry}
65866ff4f4209ef24ee7216925c15c4acc5ced88c3eJarkko Pöyry
6593c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline float linearInterpolate (float t, float minVal, float maxVal)
6603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return minVal + (maxVal - minVal) * t;
6623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6643c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic inline Vec4 linearInterpolate (float t, const Vec4& a, const Vec4& b)
6653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return a + (b - a) * t;
6673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum
6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CLEAR_OPTIMIZE_THRESHOLD		= 128,
6723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CLEAR_OPTIMIZE_MAX_PIXEL_SIZE	= 8
6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
6743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6753c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline void fillRow (const PixelBufferAccess& dst, int y, int z, int pixelSize, const deUint8* pixel)
6763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
67771d8c06b97777d8fb0dca62165d4998867bf1849Jarkko Pöyry	DE_ASSERT(dst.getPixelPitch() == pixelSize); // only tightly packed
67871d8c06b97777d8fb0dca62165d4998867bf1849Jarkko Pöyry
67971d8c06b97777d8fb0dca62165d4998867bf1849Jarkko Pöyry	deUint8*	dstPtr	= (deUint8*)dst.getPixelPtr(0, y, z);
6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int			width	= dst.getWidth();
6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
68271d8c06b97777d8fb0dca62165d4998867bf1849Jarkko Pöyry	if (pixelSize == 8 && deIsAlignedPtr(dstPtr, pixelSize))
6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deUint64 val;
6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		memcpy(&val, pixel, sizeof(val));
6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int i = 0; i < width; i++)
6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			((deUint64*)dstPtr)[i] = val;
6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
69071d8c06b97777d8fb0dca62165d4998867bf1849Jarkko Pöyry	else if (pixelSize == 4 && deIsAlignedPtr(dstPtr, pixelSize))
6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deUint32 val;
6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		memcpy(&val, pixel, sizeof(val));
6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int i = 0; i < width; i++)
6963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			((deUint32*)dstPtr)[i] = val;
6973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int i = 0; i < width; i++)
7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int j = 0; j < pixelSize; j++)
7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				dstPtr[i*pixelSize+j] = pixel[j];
7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid clear (const PixelBufferAccess& access, const Vec4& color)
7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7086c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const int	pixelSize				= access.getFormat().getPixelSize();
7096c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const int	pixelPitch				= access.getPixelPitch();
7106c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const bool	rowPixelsTightlyPacked	= (pixelSize == pixelPitch);
7116c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry
7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (access.getWidth()*access.getHeight()*access.getDepth() >= CLEAR_OPTIMIZE_THRESHOLD &&
7136c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry		pixelSize < CLEAR_OPTIMIZE_MAX_PIXEL_SIZE && rowPixelsTightlyPacked)
7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Convert to destination format.
7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		union
7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			deUint8		u8[CLEAR_OPTIMIZE_MAX_PIXEL_SIZE];
7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			deUint64	u64; // Forces 64-bit alignment.
7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		} pixel;
7213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_STATIC_ASSERT(sizeof(pixel) == CLEAR_OPTIMIZE_MAX_PIXEL_SIZE);
7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		PixelBufferAccess(access.getFormat(), 1, 1, 1, 0, 0, &pixel.u8[0]).setPixel(color, 0, 0);
7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int z = 0; z < access.getDepth(); z++)
7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int y = 0; y < access.getHeight(); y++)
7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				fillRow(access, y, z, pixelSize, &pixel.u8[0]);
7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int z = 0; z < access.getDepth(); z++)
7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int y = 0; y < access.getHeight(); y++)
7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				for (int x = 0; x < access.getWidth(); x++)
7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					access.setPixel(color, x, y, z);
7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid clear (const PixelBufferAccess& access, const IVec4& color)
7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7396c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const int	pixelSize				= access.getFormat().getPixelSize();
7406c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const int	pixelPitch				= access.getPixelPitch();
7416c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const bool	rowPixelsTightlyPacked	= (pixelSize == pixelPitch);
7426c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry
7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (access.getWidth()*access.getHeight()*access.getDepth() >= CLEAR_OPTIMIZE_THRESHOLD &&
7446c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry		pixelSize < CLEAR_OPTIMIZE_MAX_PIXEL_SIZE && rowPixelsTightlyPacked)
7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Convert to destination format.
7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		union
7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			deUint8		u8[CLEAR_OPTIMIZE_MAX_PIXEL_SIZE];
7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			deUint64	u64; // Forces 64-bit alignment.
7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		} pixel;
7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_STATIC_ASSERT(sizeof(pixel) == CLEAR_OPTIMIZE_MAX_PIXEL_SIZE);
7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		PixelBufferAccess(access.getFormat(), 1, 1, 1, 0, 0, &pixel.u8[0]).setPixel(color, 0, 0);
7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int z = 0; z < access.getDepth(); z++)
7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int y = 0; y < access.getHeight(); y++)
7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				fillRow(access, y, z, pixelSize, &pixel.u8[0]);
7583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
7603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int z = 0; z < access.getDepth(); z++)
7623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int y = 0; y < access.getHeight(); y++)
7633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				for (int x = 0; x < access.getWidth(); x++)
7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					access.setPixel(color, x, y, z);
7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
768cd7a989d6ad7df86bd4288eabbe66720625c4607Mika Isojärvivoid clear (const PixelBufferAccess& access, const UVec4& color)
769cd7a989d6ad7df86bd4288eabbe66720625c4607Mika Isojärvi{
770cd7a989d6ad7df86bd4288eabbe66720625c4607Mika Isojärvi	clear(access, color.cast<deInt32>());
771cd7a989d6ad7df86bd4288eabbe66720625c4607Mika Isojärvi}
772cd7a989d6ad7df86bd4288eabbe66720625c4607Mika Isojärvi
7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid clearDepth (const PixelBufferAccess& access, float depth)
7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
77571d8c06b97777d8fb0dca62165d4998867bf1849Jarkko Pöyry	DE_ASSERT(access.getFormat().order == TextureFormat::DS || access.getFormat().order == TextureFormat::D);
7766c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry
77771d8c06b97777d8fb0dca62165d4998867bf1849Jarkko Pöyry	clear(getEffectiveDepthStencilAccess(access, Sampler::MODE_DEPTH), tcu::Vec4(depth, 0.0f, 0.0f, 0.0f));
7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid clearStencil (const PixelBufferAccess& access, int stencil)
7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
78271d8c06b97777d8fb0dca62165d4998867bf1849Jarkko Pöyry	DE_ASSERT(access.getFormat().order == TextureFormat::DS || access.getFormat().order == TextureFormat::S);
7833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
78471d8c06b97777d8fb0dca62165d4998867bf1849Jarkko Pöyry	clear(getEffectiveDepthStencilAccess(access, Sampler::MODE_STENCIL), tcu::UVec4(stencil, 0u, 0u, 0u));
7853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7873c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void fillWithComponentGradients1D (const PixelBufferAccess& access, const Vec4& minVal, const Vec4& maxVal)
7883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(access.getHeight() == 1);
7903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int x = 0; x < access.getWidth(); x++)
7913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
792222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		float s = ((float)x + 0.5f) / (float)access.getWidth();
7933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
794222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		float r = linearInterpolate(s, minVal.x(), maxVal.x());
7953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		float g = linearInterpolate(s, minVal.y(), maxVal.y());
7963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		float b = linearInterpolate(s, minVal.z(), maxVal.z());
7973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		float a = linearInterpolate(s, minVal.w(), maxVal.w());
7983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		access.setPixel(tcu::Vec4(r, g, b, a), x, 0);
8003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8033c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void fillWithComponentGradients2D (const PixelBufferAccess& access, const Vec4& minVal, const Vec4& maxVal)
8043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int y = 0; y < access.getHeight(); y++)
8063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int x = 0; x < access.getWidth(); x++)
8083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
809222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			float s = ((float)x + 0.5f) / (float)access.getWidth();
810222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			float t = ((float)y + 0.5f) / (float)access.getHeight();
8113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
812222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			float r = linearInterpolate((      s  +       t) *0.5f, minVal.x(), maxVal.x());
8133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			float g = linearInterpolate((      s  + (1.0f-t))*0.5f, minVal.y(), maxVal.y());
8143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			float b = linearInterpolate(((1.0f-s) +       t) *0.5f, minVal.z(), maxVal.z());
8153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			float a = linearInterpolate(((1.0f-s) + (1.0f-t))*0.5f, minVal.w(), maxVal.w());
8163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			access.setPixel(tcu::Vec4(r, g, b, a), x, y);
8183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
8193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8223c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void fillWithComponentGradients3D (const PixelBufferAccess& dst, const Vec4& minVal, const Vec4& maxVal)
8233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int z = 0; z < dst.getDepth(); z++)
8253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int y = 0; y < dst.getHeight(); y++)
8273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int x = 0; x < dst.getWidth(); x++)
8293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
8303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				float s = ((float)x + 0.5f) / (float)dst.getWidth();
8313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				float t = ((float)y + 0.5f) / (float)dst.getHeight();
8323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				float p = ((float)z + 0.5f) / (float)dst.getDepth();
8333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				float r = linearInterpolate(s,						minVal.x(), maxVal.x());
8353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				float g = linearInterpolate(t,						minVal.y(), maxVal.y());
8363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				float b = linearInterpolate(p,						minVal.z(), maxVal.z());
8373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				float a = linearInterpolate(1.0f - (s+t+p)/3.0f,	minVal.w(), maxVal.w());
8383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				dst.setPixel(tcu::Vec4(r, g, b, a), x, y, z);
8403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
8413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
8423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8453c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid fillWithComponentGradients (const PixelBufferAccess& access, const Vec4& minVal, const Vec4& maxVal)
8463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8475a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry	if (isCombinedDepthStencilType(access.getFormat().type))
8485a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry	{
8495a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		const bool hasDepth		= access.getFormat().order == tcu::TextureFormat::DS || access.getFormat().order == tcu::TextureFormat::D;
8505a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		const bool hasStencil	= access.getFormat().order == tcu::TextureFormat::DS || access.getFormat().order == tcu::TextureFormat::S;
8515a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry
8525a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		DE_ASSERT(hasDepth || hasStencil);
8535a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry
8545a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		// For combined formats, treat D and S as separate channels
8555a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		if (hasDepth)
8565a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry			fillWithComponentGradients(getEffectiveDepthStencilAccess(access, tcu::Sampler::MODE_DEPTH), minVal, maxVal);
8575a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		if (hasStencil)
8585a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry			fillWithComponentGradients(getEffectiveDepthStencilAccess(access, tcu::Sampler::MODE_STENCIL), minVal.swizzle(3,2,1,0), maxVal.swizzle(3,2,1,0));
8595a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry	}
8603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
8615a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry	{
8625a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		if (access.getHeight() == 1 && access.getDepth() == 1)
8635a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry			fillWithComponentGradients1D(access, minVal, maxVal);
8645a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		else if (access.getDepth() == 1)
8655a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry			fillWithComponentGradients2D(access, minVal, maxVal);
8665a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		else
8675a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry			fillWithComponentGradients3D(access, minVal, maxVal);
8685a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry	}
8693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8715a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyrystatic void fillWithGrid1D (const PixelBufferAccess& access, int cellSize, const Vec4& colorA, const Vec4& colorB)
8723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int x = 0; x < access.getWidth(); x++)
8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int mx = (x / cellSize) % 2;
8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (mx)
8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			access.setPixel(colorB, x, 0);
8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
8803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			access.setPixel(colorA, x, 0);
8813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8845a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyrystatic void fillWithGrid2D (const PixelBufferAccess& access, int cellSize, const Vec4& colorA, const Vec4& colorB)
8853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int y = 0; y < access.getHeight(); y++)
8873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int x = 0; x < access.getWidth(); x++)
8893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int mx = (x / cellSize) % 2;
8913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int my = (y / cellSize) % 2;
8923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (mx ^ my)
8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				access.setPixel(colorB, x, y);
8953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
8963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				access.setPixel(colorA, x, y);
8973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
8983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9015a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyrystatic void fillWithGrid3D (const PixelBufferAccess& access, int cellSize, const Vec4& colorA, const Vec4& colorB)
9023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int z = 0; z < access.getDepth(); z++)
9043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
9053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int y = 0; y < access.getHeight(); y++)
9063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
9073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int x = 0; x < access.getWidth(); x++)
9083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
9093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				int mx = (x / cellSize) % 2;
9103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				int my = (y / cellSize) % 2;
9113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				int mz = (z / cellSize) % 2;
9123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				if (mx ^ my ^ mz)
9143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					access.setPixel(colorB, x, y, z);
9153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				else
9163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					access.setPixel(colorA, x, y, z);
9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
9183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9223c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid fillWithGrid (const PixelBufferAccess& access, int cellSize, const Vec4& colorA, const Vec4& colorB)
9233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9245a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry	if (isCombinedDepthStencilType(access.getFormat().type))
9255a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry	{
9265a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		const bool hasDepth		= access.getFormat().order == tcu::TextureFormat::DS || access.getFormat().order == tcu::TextureFormat::D;
9275a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		const bool hasStencil	= access.getFormat().order == tcu::TextureFormat::DS || access.getFormat().order == tcu::TextureFormat::S;
9285a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry
9295a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		DE_ASSERT(hasDepth || hasStencil);
9305a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry
9315a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		// For combined formats, treat D and S as separate channels
9325a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		if (hasDepth)
933c66f849e3e6079cf960252bf1fd1dc86a45a36c3Mika Isojärvi			fillWithGrid(getEffectiveDepthStencilAccess(access, tcu::Sampler::MODE_DEPTH), cellSize, colorA, colorB);
9345a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		if (hasStencil)
935c66f849e3e6079cf960252bf1fd1dc86a45a36c3Mika Isojärvi			fillWithGrid(getEffectiveDepthStencilAccess(access, tcu::Sampler::MODE_STENCIL), cellSize, colorA.swizzle(3,2,1,0), colorB.swizzle(3,2,1,0));
9365a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry	}
9373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
9385a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry	{
9395a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		if (access.getHeight() == 1 && access.getDepth() == 1)
9405a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry			fillWithGrid1D(access, cellSize, colorA, colorB);
9415a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		else if (access.getDepth() == 1)
9425a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry			fillWithGrid2D(access, cellSize, colorA, colorB);
9435a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		else
9445a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry			fillWithGrid3D(access, cellSize, colorA, colorB);
9455a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry	}
9463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9483c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid fillWithRepeatableGradient (const PixelBufferAccess& access, const Vec4& colorA, const Vec4& colorB)
9493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int y = 0; y < access.getHeight(); y++)
9513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
9523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int x = 0; x < access.getWidth(); x++)
9533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
9543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			float s = ((float)x + 0.5f) / (float)access.getWidth();
9553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			float t = ((float)y + 0.5f) / (float)access.getHeight();
9563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			float a = s > 0.5f ? (2.0f - 2.0f*s) : 2.0f*s;
9583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			float b = t > 0.5f ? (2.0f - 2.0f*t) : 2.0f*t;
9593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			float p = deFloatClamp(deFloatSqrt(a*a + b*b), 0.0f, 1.0f);
9613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			access.setPixel(linearInterpolate(p, colorA, colorB), x, y);
9623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
9633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9663c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid fillWithRGBAQuads (const PixelBufferAccess& dst)
9673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TCU_CHECK_INTERNAL(dst.getDepth() == 1);
9693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int width	= dst.getWidth();
9703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int height	= dst.getHeight();
9713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int	left	= width/2;
9723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int top		= height/2;
9733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	clear(getSubregion(dst, 0,		0,		0, left,		top,		1),	Vec4(1.0f, 0.0f, 0.0f, 1.0f));
9753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	clear(getSubregion(dst, left,	0,		0, width-left,	top,		1),	Vec4(0.0f, 1.0f, 0.0f, 1.0f));
9763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	clear(getSubregion(dst, 0,		top,	0, left,		height-top,	1), Vec4(0.0f, 0.0f, 1.0f, 0.0f));
9773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	clear(getSubregion(dst, left,	top,	0, width-left,	height-top, 1), Vec4(0.5f, 0.5f, 0.5f, 1.0f));
9783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// \todo [2012-11-13 pyry] There is much better metaballs code in CL SIR value generators.
9813c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid fillWithMetaballs (const PixelBufferAccess& dst, int numBalls, deUint32 seed)
9823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TCU_CHECK_INTERNAL(dst.getDepth() == 1);
9843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<Vec2>	points(numBalls);
9853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	de::Random			rnd(seed);
9863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < numBalls; i++)
9883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
9893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		float x = rnd.getFloat();
9903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		float y = rnd.getFloat();
9913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		points[i] = (Vec2(x, y));
9923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int y = 0; y < dst.getHeight(); y++)
9953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int x = 0; x < dst.getWidth(); x++)
9963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
9973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Vec2 p((float)x/(float)dst.getWidth(), (float)y/(float)dst.getHeight());
9983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		float sum = 0.0f;
10003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (std::vector<Vec2>::const_iterator i = points.begin(); i != points.end(); i++)
10013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
10023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			Vec2	d = p - *i;
10033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			float	f = 0.01f / (d.x()*d.x() + d.y()*d.y());
10043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			sum += f;
10063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
10073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		dst.setPixel(Vec4(sum), x, y);
10093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10123c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid copy (const PixelBufferAccess& dst, const ConstPixelBufferAccess& src)
10133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10146c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	DE_ASSERT(src.getSize() == dst.getSize());
10156c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry
10166c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const int	width				= dst.getWidth();
10176c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const int	height				= dst.getHeight();
10186c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const int	depth				= dst.getDepth();
10193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10206c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const int	srcPixelSize		= src.getFormat().getPixelSize();
10216c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const int	dstPixelSize		= dst.getFormat().getPixelSize();
10226c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const int	srcPixelPitch		= src.getPixelPitch();
10236c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const int	dstPixelPitch		= dst.getPixelPitch();
10246c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const bool	srcTightlyPacked	= (srcPixelSize == srcPixelPitch);
10256c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const bool	dstTightlyPacked	= (dstPixelSize == dstPixelPitch);
10263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10275a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry	const bool	srcHasDepth			= (src.getFormat().order == tcu::TextureFormat::DS || src.getFormat().order == tcu::TextureFormat::D);
10285a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry	const bool	srcHasStencil		= (src.getFormat().order == tcu::TextureFormat::DS || src.getFormat().order == tcu::TextureFormat::S);
10295a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry	const bool	dstHasDepth			= (dst.getFormat().order == tcu::TextureFormat::DS || dst.getFormat().order == tcu::TextureFormat::D);
10305a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry	const bool	dstHasStencil		= (dst.getFormat().order == tcu::TextureFormat::DS || dst.getFormat().order == tcu::TextureFormat::S);
10315a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry
10326c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	if (src.getFormat() == dst.getFormat() && srcTightlyPacked && dstTightlyPacked)
10333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Fast-path for matching formats.
10353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int z = 0; z < depth; z++)
10363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int y = 0; y < height; y++)
10376c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry			deMemcpy(dst.getPixelPtr(0, y, z), src.getPixelPtr(0, y, z), srcPixelSize*width);
10386c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	}
10396c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	else if (src.getFormat() == dst.getFormat())
10406c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	{
10416c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry		// Bit-exact copy for matching formats.
10426c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry		for (int z = 0; z < depth; z++)
10436c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry		for (int y = 0; y < height; y++)
10446c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry		for (int x = 0; x < width; x++)
10456c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry			deMemcpy(dst.getPixelPtr(x, y, z), src.getPixelPtr(x, y, z), srcPixelSize);
10463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10475a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry	else if (srcHasDepth || srcHasStencil || dstHasDepth || dstHasStencil)
10485a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry	{
10495a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		DE_ASSERT((srcHasDepth && dstHasDepth) || (srcHasStencil && dstHasStencil)); // must have at least one common channel
10505a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry
10515a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		if (dstHasDepth && srcHasDepth)
10525a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		{
10535a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry			for (int z = 0; z < depth; z++)
10545a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry			for (int y = 0; y < height; y++)
10555a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry			for (int x = 0; x < width; x++)
10565a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry				dst.setPixDepth(src.getPixDepth(x, y, z), x, y, z);
10575a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		}
10585a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		else if (dstHasDepth && !srcHasDepth)
10595a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		{
10605a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry			// consistency with color copies
10615a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry			tcu::clearDepth(dst, 0.0f);
10625a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		}
10635a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry
10645a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		if (dstHasStencil && srcHasStencil)
10655a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		{
10665a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry			for (int z = 0; z < depth; z++)
10675a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry			for (int y = 0; y < height; y++)
10685a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry			for (int x = 0; x < width; x++)
10695a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry				dst.setPixStencil(src.getPixStencil(x, y, z), x, y, z);
10705a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		}
10715a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		else if (dstHasStencil && !srcHasStencil)
10725a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		{
10735a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry			// consistency with color copies
10745a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry			tcu::clearStencil(dst, 0u);
10755a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry		}
10765a0a3bbda9383ed89e44198619b9564282905865Jarkko Pöyry	}
10773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
10783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TextureChannelClass		srcClass	= getTextureChannelClass(src.getFormat().type);
10803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TextureChannelClass		dstClass	= getTextureChannelClass(dst.getFormat().type);
10813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool					srcIsInt	= srcClass == TEXTURECHANNELCLASS_SIGNED_INTEGER || srcClass == TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
10823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		bool					dstIsInt	= dstClass == TEXTURECHANNELCLASS_SIGNED_INTEGER || dstClass == TEXTURECHANNELCLASS_UNSIGNED_INTEGER;
10833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (srcIsInt && dstIsInt)
10853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
10863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int z = 0; z < depth; z++)
10873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int y = 0; y < height; y++)
10883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int x = 0; x < width; x++)
10893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				dst.setPixel(src.getPixelInt(x, y, z), x, y, z);
10903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
10913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
10923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
10933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int z = 0; z < depth; z++)
10943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int y = 0; y < height; y++)
10953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int x = 0; x < width; x++)
10963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				dst.setPixel(src.getPixel(x, y, z), x, y, z);
10973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
10983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11013c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid scale (const PixelBufferAccess& dst, const ConstPixelBufferAccess& src, Sampler::FilterMode filter)
11023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(filter == Sampler::NEAREST || filter == Sampler::LINEAR);
11043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Sampler sampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE,
11063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					filter, filter, 0.0f, false);
11073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float sX = (float)src.getWidth() / (float)dst.getWidth();
11093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float sY = (float)src.getHeight() / (float)dst.getHeight();
11103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float sZ = (float)src.getDepth() / (float)dst.getDepth();
11113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (dst.getDepth() == 1 && src.getDepth() == 1)
11133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int y = 0; y < dst.getHeight(); y++)
11153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int x = 0; x < dst.getWidth(); x++)
1116183e1448c4d0673f07fc18df30a2c3573ab04086Szilard Ledan			dst.setPixel(linearToSRGBIfNeeded(dst.getFormat(), src.sample2D(sampler, filter, ((float)x+0.5f)*sX, ((float)y+0.5f)*sY, 0)), x, y);
11173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
11193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int z = 0; z < dst.getDepth(); z++)
11213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int y = 0; y < dst.getHeight(); y++)
11223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int x = 0; x < dst.getWidth(); x++)
1123183e1448c4d0673f07fc18df30a2c3573ab04086Szilard Ledan			dst.setPixel(linearToSRGBIfNeeded(dst.getFormat(), src.sample3D(sampler, filter, ((float)x+0.5f)*sX, ((float)y+0.5f)*sY, ((float)z+0.5f)*sZ)), x, y, z);
11243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11273c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid estimatePixelValueRange (const ConstPixelBufferAccess& access, Vec4& minVal, Vec4& maxVal)
11283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const TextureFormat& format = access.getFormat();
11303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11315f69470fe8597d811df06deb940cc5b54529fb4eJarkko Pöyry	switch (getTextureChannelClass(format.type))
11323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11335f69470fe8597d811df06deb940cc5b54529fb4eJarkko Pöyry		case TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
11343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// Normalized unsigned formats.
11353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			minVal = Vec4(0.0f);
11363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			maxVal = Vec4(1.0f);
11373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
11383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11395f69470fe8597d811df06deb940cc5b54529fb4eJarkko Pöyry		case TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
11403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// Normalized signed formats.
11413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			minVal = Vec4(-1.0f);
11423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			maxVal = Vec4(+1.0f);
11433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
11443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
11463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// \note Samples every 4/8th pixel.
11473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			minVal = Vec4(std::numeric_limits<float>::max());
11483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			maxVal = Vec4(std::numeric_limits<float>::min());
11493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for (int z = 0; z < access.getDepth(); z += 2)
11513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
11523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				for (int y = 0; y < access.getHeight(); y += 2)
11533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
11543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					for (int x = 0; x < access.getWidth(); x += 2)
11553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					{
11563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						Vec4 p = access.getPixel(x, y, z);
11573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1158cf5839d6cd971f12b42fa07bd8a429a44130cc7eMika Isojärvi						minVal[0] = (deFloatIsNaN(p[0]) ? minVal[0] : de::min(minVal[0], p[0]));
1159cf5839d6cd971f12b42fa07bd8a429a44130cc7eMika Isojärvi						minVal[1] = (deFloatIsNaN(p[1]) ? minVal[1] : de::min(minVal[1], p[1]));
1160cf5839d6cd971f12b42fa07bd8a429a44130cc7eMika Isojärvi						minVal[2] = (deFloatIsNaN(p[2]) ? minVal[2] : de::min(minVal[2], p[2]));
1161cf5839d6cd971f12b42fa07bd8a429a44130cc7eMika Isojärvi						minVal[3] = (deFloatIsNaN(p[3]) ? minVal[3] : de::min(minVal[3], p[3]));
1162cf5839d6cd971f12b42fa07bd8a429a44130cc7eMika Isojärvi
1163cf5839d6cd971f12b42fa07bd8a429a44130cc7eMika Isojärvi						maxVal[0] = (deFloatIsNaN(p[0]) ? maxVal[0] : de::max(maxVal[0], p[0]));
1164cf5839d6cd971f12b42fa07bd8a429a44130cc7eMika Isojärvi						maxVal[1] = (deFloatIsNaN(p[1]) ? maxVal[1] : de::max(maxVal[1], p[1]));
1165cf5839d6cd971f12b42fa07bd8a429a44130cc7eMika Isojärvi						maxVal[2] = (deFloatIsNaN(p[2]) ? maxVal[2] : de::max(maxVal[2], p[2]));
1166cf5839d6cd971f12b42fa07bd8a429a44130cc7eMika Isojärvi						maxVal[3] = (deFloatIsNaN(p[3]) ? maxVal[3] : de::max(maxVal[3], p[3]));
11673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					}
11683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
11693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
11703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
11713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11743c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid computePixelScaleBias (const ConstPixelBufferAccess& access, Vec4& scale, Vec4& bias)
11753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4 minVal, maxVal;
11773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	estimatePixelValueRange(access, minVal, maxVal);
11783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const float eps = 0.0001f;
11803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int c = 0; c < 4; c++)
11823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (maxVal[c] - minVal[c] < eps)
11843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
11853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			scale[c]	= (maxVal[c] < eps) ? 1.0f : (1.0f / maxVal[c]);
11863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bias[c]		= (c == 3) ? (1.0f - maxVal[c]*scale[c]) : (0.0f - minVal[c]*scale[c]);
11873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
11883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
11893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
11903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			scale[c]	= 1.0f / (maxVal[c] - minVal[c]);
11913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bias[c]		= 0.0f - minVal[c]*scale[c];
11923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
11933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryint getCubeArrayFaceIndex (CubeFace face)
11978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
11988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	DE_ASSERT((int)face >= 0 && face < CUBEFACE_LAST);
11998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
12008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	switch (face)
12018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
12028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case CUBEFACE_POSITIVE_X:	return 0;
12038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case CUBEFACE_NEGATIVE_X:	return 1;
12048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case CUBEFACE_POSITIVE_Y:	return 2;
12058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case CUBEFACE_NEGATIVE_Y:	return 3;
12068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case CUBEFACE_POSITIVE_Z:	return 4;
12078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case CUBEFACE_NEGATIVE_Z:	return 5;
12088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
12098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		default:
12108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			return -1;
12118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
12128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
12138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
12142925635ad62614cb6c5f824c22e31e8ca6bbb03eMika IsojärvideUint32 packRGB999E5 (const tcu::Vec4& color)
12152925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi{
12162925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	const int	mBits	= 9;
12172925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	const int	eBits	= 5;
12182925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	const int	eBias	= 15;
12192925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	const int	eMax	= (1<<eBits)-1;
12202925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	const float	maxVal	= (float)(((1<<mBits) - 1) * (1<<(eMax-eBias))) / (float)(1<<mBits);
12212925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi
12222925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	float	rc		= deFloatClamp(color[0], 0.0f, maxVal);
12232925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	float	gc		= deFloatClamp(color[1], 0.0f, maxVal);
12242925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	float	bc		= deFloatClamp(color[2], 0.0f, maxVal);
12252925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	float	maxc	= de::max(rc, de::max(gc, bc));
12262925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	int		expp	= de::max(-eBias - 1, deFloorFloatToInt32(deFloatLog2(maxc))) + 1 + eBias;
12272925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	float	e		= deFloatPow(2.0f, (float)(expp-eBias-mBits));
12282925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	int		maxs	= deFloorFloatToInt32(maxc / e + 0.5f);
12292925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi
12302925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	deUint32	exps	= maxs == (1<<mBits) ? expp+1 : expp;
12312925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	deUint32	rs		= (deUint32)deClamp32(deFloorFloatToInt32(rc / e + 0.5f), 0, (1<<9)-1);
12322925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	deUint32	gs		= (deUint32)deClamp32(deFloorFloatToInt32(gc / e + 0.5f), 0, (1<<9)-1);
12332925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	deUint32	bs		= (deUint32)deClamp32(deFloorFloatToInt32(bc / e + 0.5f), 0, (1<<9)-1);
12342925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi
12352925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	DE_ASSERT((exps & ~((1<<5)-1)) == 0);
12362925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	DE_ASSERT((rs & ~((1<<9)-1)) == 0);
12372925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	DE_ASSERT((gs & ~((1<<9)-1)) == 0);
12382925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	DE_ASSERT((bs & ~((1<<9)-1)) == 0);
12392925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi
12402925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi	return rs | (gs << 9) | (bs << 18) | (exps << 27);
12412925635ad62614cb6c5f824c22e31e8ca6bbb03eMika Isojärvi}
1242becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi
124341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry// Sampler utils
124441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry
124541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyrystatic const void* addOffset (const void* ptr, int numBytes)
124641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry{
124741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry	return (const deUint8*)ptr + numBytes;
124841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry}
124941920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry
125041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyrystatic void* addOffset (void* ptr, int numBytes)
125141920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry{
125241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry	return (deUint8*)ptr + numBytes;
125341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry}
125441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry
125541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyrytemplate <typename AccessType>
125641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyrystatic AccessType toSamplerAccess (const AccessType& baseAccess, Sampler::DepthStencilMode mode)
125741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry{
125841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry	// make sure to update this if type table is updated
12595b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos	DE_STATIC_ASSERT(TextureFormat::CHANNELTYPE_LAST == 38);
126041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry
126141920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry	if (!isCombinedDepthStencilType(baseAccess.getFormat().type))
126241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry		return baseAccess;
126341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry	else
126441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry	{
126541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry#if (DE_ENDIANNESS == DE_LITTLE_ENDIAN)
1266725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		const deUint32 uint32ByteOffsetBits0To8		= 0; //!< least significant byte in the lowest address
1267725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		const deUint32 uint32ByteOffsetBits0To24	= 0;
126800d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos		const deUint32 uint32ByteOffsetBits8To32	= 1;
1269725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		const deUint32 uint32ByteOffsetBits16To32	= 2;
1270725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		const deUint32 uint32ByteOffsetBits24To32	= 3;
127141920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry#else
1272725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		const deUint32 uint32ByteOffsetBits0To8		= 3; //!< least significant byte in the highest address
1273725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		const deUint32 uint32ByteOffsetBits0To24	= 1;
127400d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos		const deUint32 uint32ByteOffsetBits8To32	= 0;
1275725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		const deUint32 uint32ByteOffsetBits16To32	= 0;
1276725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		const deUint32 uint32ByteOffsetBits24To32	= 0;
127741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry#endif
127841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry
127941920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry		// Sampled channel must exist
128041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry		DE_ASSERT(baseAccess.getFormat().order == TextureFormat::DS ||
128141920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				  (mode == Sampler::MODE_DEPTH && baseAccess.getFormat().order == TextureFormat::D) ||
128241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				  (mode == Sampler::MODE_STENCIL && baseAccess.getFormat().order == TextureFormat::S));
128341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry
128441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry		// combined formats have multiple channel classes, detect on sampler settings
128541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry		switch (baseAccess.getFormat().type)
128641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry		{
1287725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos			case TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV:
128800d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos			{
128900d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos				if (mode == Sampler::MODE_DEPTH)
129000d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos				{
129100d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos					// select the float component
129200d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos					return AccessType(TextureFormat(TextureFormat::D, TextureFormat::FLOAT),
129300d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos									  baseAccess.getSize(),
129400d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos									  baseAccess.getPitch(),
129500d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos									  baseAccess.getDataPtr());
129600d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos				}
129700d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos				else if (mode == Sampler::MODE_STENCIL)
129800d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos				{
129900d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos					// select the uint 8 component
130000d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos					return AccessType(TextureFormat(TextureFormat::S, TextureFormat::UNSIGNED_INT8),
130100d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos									  baseAccess.getSize(),
130200d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos									  baseAccess.getPitch(),
1303725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos									  addOffset(baseAccess.getDataPtr(), 4 + uint32ByteOffsetBits0To8));
130400d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos				}
130500d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos				else
130600d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos				{
130700d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos					// unknown sampler mode
130800d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos					DE_ASSERT(false);
130900d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos					return AccessType();
131000d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos				}
131100d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos			}
131200d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos
1313725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos			case TextureFormat::UNSIGNED_INT_16_8_8:
131441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry			{
131541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				if (mode == Sampler::MODE_DEPTH)
131641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				{
1317725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos					// select the unorm16 component
1318725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos					return AccessType(TextureFormat(TextureFormat::D, TextureFormat::UNORM_INT16),
131941920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry									  baseAccess.getSize(),
132041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry									  baseAccess.getPitch(),
1321725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos									  addOffset(baseAccess.getDataPtr(), uint32ByteOffsetBits16To32));
132241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				}
132341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				else if (mode == Sampler::MODE_STENCIL)
132441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				{
132541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry					// select the uint 8 component
132641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry					return AccessType(TextureFormat(TextureFormat::S, TextureFormat::UNSIGNED_INT8),
132741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry									  baseAccess.getSize(),
132841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry									  baseAccess.getPitch(),
1329725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos									  addOffset(baseAccess.getDataPtr(), uint32ByteOffsetBits0To8));
133041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				}
133141920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				else
133241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				{
133341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry					// unknown sampler mode
133441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry					DE_ASSERT(false);
133541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry					return AccessType();
133641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				}
133741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry			}
133841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry
1339725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos			case TextureFormat::UNSIGNED_INT_24_8:
134000d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos			{
134100d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos				if (mode == Sampler::MODE_DEPTH)
134200d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos				{
1343725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos					// select the unorm24 component
1344725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos					return AccessType(TextureFormat(TextureFormat::D, TextureFormat::UNORM_INT24),
134500d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos									  baseAccess.getSize(),
134600d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos									  baseAccess.getPitch(),
1347725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos									  addOffset(baseAccess.getDataPtr(), uint32ByteOffsetBits8To32));
134800d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos				}
134900d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos				else if (mode == Sampler::MODE_STENCIL)
135000d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos				{
135100d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos					// select the uint 8 component
135200d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos					return AccessType(TextureFormat(TextureFormat::S, TextureFormat::UNSIGNED_INT8),
135300d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos									  baseAccess.getSize(),
135400d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos									  baseAccess.getPitch(),
1355725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos									  addOffset(baseAccess.getDataPtr(), uint32ByteOffsetBits0To8));
135600d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos				}
135700d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos				else
135800d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos				{
135900d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos					// unknown sampler mode
136000d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos					DE_ASSERT(false);
136100d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos					return AccessType();
136200d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos				}
136300d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos			}
136400d2d01b88792c1cbdabac206ec38d9b63c6f401Pyry Haulos
1365725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos			case TextureFormat::UNSIGNED_INT_24_8_REV:
136641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry			{
136741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				if (mode == Sampler::MODE_DEPTH)
136841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				{
136941920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry					// select the unorm24 component
137041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry					return AccessType(TextureFormat(TextureFormat::D, TextureFormat::UNORM_INT24),
137141920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry									  baseAccess.getSize(),
137241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry									  baseAccess.getPitch(),
1373725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos									  addOffset(baseAccess.getDataPtr(), uint32ByteOffsetBits0To24));
137441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				}
137541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				else if (mode == Sampler::MODE_STENCIL)
137641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				{
137741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry					// select the uint 8 component
137841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry					return AccessType(TextureFormat(TextureFormat::S, TextureFormat::UNSIGNED_INT8),
137941920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry									  baseAccess.getSize(),
138041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry									  baseAccess.getPitch(),
1381725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos									  addOffset(baseAccess.getDataPtr(), uint32ByteOffsetBits24To32));
138241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				}
138341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				else
138441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				{
138541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry					// unknown sampler mode
138641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry					DE_ASSERT(false);
138741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry					return AccessType();
138841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				}
138941920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry			}
139041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry
139141920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry			default:
139241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry			{
139341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				// unknown combined format
139441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				DE_ASSERT(false);
139541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry				return AccessType();
139641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry			}
139741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry		}
139841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry	}
139941920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry}
140041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry
140141920d7e0d1833907249009d156f6eb2361df97eJarkko PöyryPixelBufferAccess getEffectiveDepthStencilAccess (const PixelBufferAccess& baseAccess, Sampler::DepthStencilMode mode)
140241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry{
140341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry	return toSamplerAccess<PixelBufferAccess>(baseAccess, mode);
140441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry}
140541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry
140641920d7e0d1833907249009d156f6eb2361df97eJarkko PöyryConstPixelBufferAccess getEffectiveDepthStencilAccess (const ConstPixelBufferAccess& baseAccess, Sampler::DepthStencilMode mode)
140741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry{
140841920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry	return toSamplerAccess<ConstPixelBufferAccess>(baseAccess, mode);
140941920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry}
141041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry
141141920d7e0d1833907249009d156f6eb2361df97eJarkko PöyryTextureFormat getEffectiveDepthStencilTextureFormat (const TextureFormat& baseFormat, Sampler::DepthStencilMode mode)
141241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry{
141341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry	return toSamplerAccess(ConstPixelBufferAccess(baseFormat, IVec3(0, 0, 0), DE_NULL), mode).getFormat();
141441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry}
141541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry
14160d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyrytemplate <typename ViewType>
14170d61ad28c122cede72a061c4b8346a176b245b69Jarkko PöyryViewType getEffectiveTView (const ViewType& src, std::vector<tcu::ConstPixelBufferAccess>& storage, const tcu::Sampler& sampler)
14180d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry{
14190d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry	storage.resize(src.getNumLevels());
14200d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry
14210d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry	ViewType view = ViewType(src.getNumLevels(), &storage[0]);
14220d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry
14230d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry	for (int levelNdx = 0; levelNdx < src.getNumLevels(); ++levelNdx)
14240d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry		storage[levelNdx] = tcu::getEffectiveDepthStencilAccess(src.getLevel(levelNdx), sampler.depthStencilMode);
14250d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry
14260d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry	return view;
14270d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry}
14280d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry
14290d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyrytcu::TextureCubeView getEffectiveTView (const tcu::TextureCubeView& src, std::vector<tcu::ConstPixelBufferAccess>& storage, const tcu::Sampler& sampler)
14300d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry{
14310d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry	storage.resize(tcu::CUBEFACE_LAST * src.getNumLevels());
14320d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry
14330d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry	const tcu::ConstPixelBufferAccess* storagePtrs[tcu::CUBEFACE_LAST] =
14340d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry	{
14350d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry		&storage[0 * src.getNumLevels()],
14360d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry		&storage[1 * src.getNumLevels()],
14370d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry		&storage[2 * src.getNumLevels()],
14380d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry		&storage[3 * src.getNumLevels()],
14390d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry		&storage[4 * src.getNumLevels()],
14400d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry		&storage[5 * src.getNumLevels()],
14410d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry	};
14420d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry
14430d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry	tcu::TextureCubeView view = tcu::TextureCubeView(src.getNumLevels(), storagePtrs);
14440d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry
14450d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry	for (int faceNdx = 0; faceNdx < tcu::CUBEFACE_LAST; ++faceNdx)
14460d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry	for (int levelNdx = 0; levelNdx < src.getNumLevels(); ++levelNdx)
14470d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry		storage[faceNdx * src.getNumLevels() + levelNdx] = tcu::getEffectiveDepthStencilAccess(src.getLevelFace(levelNdx, (tcu::CubeFace)faceNdx), sampler.depthStencilMode);
14480d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry
14490d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry	return view;
14500d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry}
14510d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry
14520d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyrytcu::Texture1DView getEffectiveTextureView (const tcu::Texture1DView& src, std::vector<tcu::ConstPixelBufferAccess>& storage, const tcu::Sampler& sampler)
14530d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry{
14540d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry	return getEffectiveTView(src, storage, sampler);
14550d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry}
14560d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry
14570d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyrytcu::Texture2DView getEffectiveTextureView (const tcu::Texture2DView& src, std::vector<tcu::ConstPixelBufferAccess>& storage, const tcu::Sampler& sampler)
14580d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry{
14590d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry	return getEffectiveTView(src, storage, sampler);
14600d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry}
14610d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry
14620d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyrytcu::Texture3DView getEffectiveTextureView (const tcu::Texture3DView& src, std::vector<tcu::ConstPixelBufferAccess>& storage, const tcu::Sampler& sampler)
14630d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry{
14640d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry	return getEffectiveTView(src, storage, sampler);
14650d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry}
14660d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry
14670d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyrytcu::Texture1DArrayView getEffectiveTextureView (const tcu::Texture1DArrayView& src, std::vector<tcu::ConstPixelBufferAccess>& storage, const tcu::Sampler& sampler)
14680d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry{
14690d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry	return getEffectiveTView(src, storage, sampler);
14700d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry}
14710d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry
14720d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyrytcu::Texture2DArrayView getEffectiveTextureView (const tcu::Texture2DArrayView& src, std::vector<tcu::ConstPixelBufferAccess>& storage, const tcu::Sampler& sampler)
14730d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry{
14740d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry	return getEffectiveTView(src, storage, sampler);
14750d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry}
14760d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry
14770d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyrytcu::TextureCubeView getEffectiveTextureView (const tcu::TextureCubeView& src, std::vector<tcu::ConstPixelBufferAccess>& storage, const tcu::Sampler& sampler)
14780d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry{
14790d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry	return getEffectiveTView(src, storage, sampler);
14800d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry}
14810d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry
14820d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyrytcu::TextureCubeArrayView getEffectiveTextureView (const tcu::TextureCubeArrayView& src, std::vector<tcu::ConstPixelBufferAccess>& storage, const tcu::Sampler& sampler)
14830d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry{
14840d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry	return getEffectiveTView(src, storage, sampler);
14850d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry}
14860d61ad28c122cede72a061c4b8346a176b245b69Jarkko Pöyry
1487222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry//! Returns the effective swizzle of a border color. The effective swizzle is the
1488222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry//! equal to first writing an RGBA color with a write swizzle and then reading
1489222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry//! it back using a read swizzle, i.e. BorderSwizzle(c) == readSwizzle(writeSwizzle(C))
1490222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrystatic const TextureSwizzle& getBorderColorReadSwizzle (TextureFormat::ChannelOrder order)
1491222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry{
1492222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	// make sure to update these tables when channel orders are updated
1493725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos	DE_STATIC_ASSERT(TextureFormat::CHANNELORDER_LAST == 21);
1494222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1495222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	static const TextureSwizzle INV		= {{ TextureSwizzle::CHANNEL_ZERO,	TextureSwizzle::CHANNEL_ZERO,	TextureSwizzle::CHANNEL_ZERO,	TextureSwizzle::CHANNEL_ONE	}};
1496222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	static const TextureSwizzle R		= {{ TextureSwizzle::CHANNEL_0,		TextureSwizzle::CHANNEL_ZERO,	TextureSwizzle::CHANNEL_ZERO,	TextureSwizzle::CHANNEL_ONE	}};
1497222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	static const TextureSwizzle A		= {{ TextureSwizzle::CHANNEL_ZERO,	TextureSwizzle::CHANNEL_ZERO,	TextureSwizzle::CHANNEL_ZERO,	TextureSwizzle::CHANNEL_3	}};
1498222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	static const TextureSwizzle I		= {{ TextureSwizzle::CHANNEL_0,		TextureSwizzle::CHANNEL_0,		TextureSwizzle::CHANNEL_0,		TextureSwizzle::CHANNEL_0	}};
1499222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	static const TextureSwizzle L		= {{ TextureSwizzle::CHANNEL_0,		TextureSwizzle::CHANNEL_0,		TextureSwizzle::CHANNEL_0,		TextureSwizzle::CHANNEL_ONE	}};
1500222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	static const TextureSwizzle LA		= {{ TextureSwizzle::CHANNEL_0,		TextureSwizzle::CHANNEL_0,		TextureSwizzle::CHANNEL_0,		TextureSwizzle::CHANNEL_3	}};
1501222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	static const TextureSwizzle RG		= {{ TextureSwizzle::CHANNEL_0,		TextureSwizzle::CHANNEL_1,		TextureSwizzle::CHANNEL_ZERO,	TextureSwizzle::CHANNEL_ONE	}};
1502222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	static const TextureSwizzle RA		= {{ TextureSwizzle::CHANNEL_0,		TextureSwizzle::CHANNEL_ZERO,	TextureSwizzle::CHANNEL_ZERO,	TextureSwizzle::CHANNEL_3	}};
1503222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	static const TextureSwizzle RGB		= {{ TextureSwizzle::CHANNEL_0,		TextureSwizzle::CHANNEL_1,		TextureSwizzle::CHANNEL_2,		TextureSwizzle::CHANNEL_ONE	}};
1504222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	static const TextureSwizzle RGBA	= {{ TextureSwizzle::CHANNEL_0,		TextureSwizzle::CHANNEL_1,		TextureSwizzle::CHANNEL_2,		TextureSwizzle::CHANNEL_3	}};
1505222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	static const TextureSwizzle D		= {{ TextureSwizzle::CHANNEL_0,		TextureSwizzle::CHANNEL_ZERO,	TextureSwizzle::CHANNEL_ZERO,	TextureSwizzle::CHANNEL_ONE	}};
1506222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	static const TextureSwizzle S		= {{ TextureSwizzle::CHANNEL_0,		TextureSwizzle::CHANNEL_ZERO,	TextureSwizzle::CHANNEL_ZERO,	TextureSwizzle::CHANNEL_ONE	}};
1507222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1508222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	const TextureSwizzle* swizzle;
1509222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1510222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	switch (order)
1511222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	{
1512222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case TextureFormat::R:			swizzle = &R;		break;
1513222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case TextureFormat::A:			swizzle = &A;		break;
1514222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case TextureFormat::I:			swizzle = &I;		break;
1515222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case TextureFormat::L:			swizzle = &L;		break;
1516222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case TextureFormat::LA:			swizzle = &LA;		break;
1517222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case TextureFormat::RG:			swizzle = &RG;		break;
1518222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case TextureFormat::RA:			swizzle = &RA;		break;
1519222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case TextureFormat::RGB:		swizzle = &RGB;		break;
1520222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case TextureFormat::RGBA:		swizzle = &RGBA;	break;
1521222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case TextureFormat::ARGB:		swizzle = &RGBA;	break;
1522725691d12fb107f6ba64aa8ab5aafa0a1cea2847Pyry Haulos		case TextureFormat::BGR:		swizzle = &RGB;		break;
1523222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case TextureFormat::BGRA:		swizzle = &RGBA;	break;
1524222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case TextureFormat::sR:			swizzle = &R;		break;
1525222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case TextureFormat::sRG:		swizzle = &RG;		break;
1526222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case TextureFormat::sRGB:		swizzle = &RGB;		break;
1527222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case TextureFormat::sRGBA:		swizzle = &RGBA;	break;
15285b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos		case TextureFormat::sBGR:		swizzle = &RGB;		break;
15295b2b45177edf5062ce3a76a885e60e3fb5044002Pyry Haulos		case TextureFormat::sBGRA:		swizzle = &RGBA;	break;
1530222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case TextureFormat::D:			swizzle = &D;		break;
1531222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case TextureFormat::S:			swizzle = &S;		break;
1532222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1533222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case TextureFormat::DS:
1534222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			DE_ASSERT(false); // combined depth-stencil border color?
1535222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			swizzle = &INV;
1536222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			break;
1537222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1538222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		default:
1539222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			DE_ASSERT(false);
1540222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			swizzle = &INV;
1541222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			break;
1542222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	}
1543222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1544222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry#ifdef DE_DEBUG
1545222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1546222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	{
1547222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		// check that BorderSwizzle(c) == readSwizzle(writeSwizzle(C))
1548222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		const TextureSwizzle& readSwizzle	= getChannelReadSwizzle(order);
1549222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		const TextureSwizzle& writeSwizzle	= getChannelWriteSwizzle(order);
1550222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1551222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		for (int ndx = 0; ndx < 4; ++ndx)
1552222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		{
1553222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			TextureSwizzle::Channel writeRead = readSwizzle.components[ndx];
1554222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			if (deInRange32(writeRead, TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_3) == DE_TRUE)
1555222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry				writeRead = writeSwizzle.components[(int)writeRead];
1556222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			DE_ASSERT(writeRead == swizzle->components[ndx]);
1557222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		}
1558222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	}
1559222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1560222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry#endif
1561222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1562222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	return *swizzle;
1563222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry}
1564222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1565222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrystatic tcu::UVec4 getNBitUnsignedIntegerVec4MaxValue (const tcu::IVec4& numBits)
1566222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry{
1567222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	return tcu::UVec4((numBits[0] > 0) ? (deUintMaxValue32(numBits[0])) : (0),
1568222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry					  (numBits[1] > 0) ? (deUintMaxValue32(numBits[1])) : (0),
1569222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry					  (numBits[2] > 0) ? (deUintMaxValue32(numBits[2])) : (0),
1570222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry					  (numBits[3] > 0) ? (deUintMaxValue32(numBits[3])) : (0));
1571222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry}
1572222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1573222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrystatic tcu::IVec4 getNBitSignedIntegerVec4MaxValue (const tcu::IVec4& numBits)
1574222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry{
1575222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	return tcu::IVec4((numBits[0] > 0) ? (deIntMaxValue32(numBits[0])) : (0),
1576222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry					  (numBits[1] > 0) ? (deIntMaxValue32(numBits[1])) : (0),
1577222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry					  (numBits[2] > 0) ? (deIntMaxValue32(numBits[2])) : (0),
1578222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry					  (numBits[3] > 0) ? (deIntMaxValue32(numBits[3])) : (0));
1579222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry}
1580222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1581222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrystatic tcu::IVec4 getNBitSignedIntegerVec4MinValue (const tcu::IVec4& numBits)
1582222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry{
1583222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	return tcu::IVec4((numBits[0] > 0) ? (deIntMinValue32(numBits[0])) : (0),
1584222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry					  (numBits[1] > 0) ? (deIntMinValue32(numBits[1])) : (0),
1585222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry					  (numBits[2] > 0) ? (deIntMinValue32(numBits[2])) : (0),
1586222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry					  (numBits[3] > 0) ? (deIntMinValue32(numBits[3])) : (0));
1587222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry}
1588222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1589222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrystatic tcu::Vec4 getTextureBorderColorFloat (const TextureFormat& format, const Sampler& sampler)
1590222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry{
1591653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	const tcu::TextureChannelClass	channelClass	= getTextureChannelClass(format.type);
1592222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	const TextureSwizzle::Channel*	channelMap		= getBorderColorReadSwizzle(format.order).components;
1593222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	const bool						isFloat			= channelClass == tcu::TEXTURECHANNELCLASS_FLOATING_POINT;
1594222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	const bool						isSigned		= channelClass != tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT;
1595222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	const float						valueMin		= (isSigned) ? (-1.0f) : (0.0f);
1596222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	const float						valueMax		= 1.0f;
1597222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	Vec4							result;
1598222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1599222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	DE_ASSERT(channelClass == tcu::TEXTURECHANNELCLASS_FLOATING_POINT ||
1600222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			  channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT ||
1601222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			  channelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT);
1602222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1603222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	for (int c = 0; c < 4; c++)
1604222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	{
1605222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		const TextureSwizzle::Channel map = channelMap[c];
1606222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		if (map == TextureSwizzle::CHANNEL_ZERO)
1607222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			result[c] = 0.0f;
1608222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		else if (map == TextureSwizzle::CHANNEL_ONE)
1609222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			result[c] = 1.0f;
1610222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		else if (isFloat)
1611222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		{
1612222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			// floating point values are not clamped
1613222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			result[c] = sampler.borderColor.getAccess<float>()[(int)map];
1614222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		}
1615222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		else
1616222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		{
1617222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			// fixed point values are clamped to a representable range
1618222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			result[c] = de::clamp(sampler.borderColor.getAccess<float>()[(int)map], valueMin, valueMax);
1619222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		}
1620222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	}
1621222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1622d5be8ad612a000b4ad2caf14c8d93501f3558eb8Jarkko Pöyry	return result;
1623222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry}
1624222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1625222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrystatic tcu::IVec4 getTextureBorderColorInt (const TextureFormat& format, const Sampler& sampler)
1626222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry{
1627653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	const tcu::TextureChannelClass	channelClass	= getTextureChannelClass(format.type);
1628222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	const TextureSwizzle::Channel*	channelMap		= getBorderColorReadSwizzle(format.order).components;
1629222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	const IVec4						channelBits		= getChannelBitDepth(format.type);
1630222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	const IVec4						valueMin		= getNBitSignedIntegerVec4MinValue(channelBits);
1631222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	const IVec4						valueMax		= getNBitSignedIntegerVec4MaxValue(channelBits);
1632222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	IVec4							result;
1633222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1634222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	DE_ASSERT(channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER);
163535f093054670f38076b8b347d37a41be90a5ac8cJarkko Pöyry	DE_UNREF(channelClass);
1636222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1637222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	for (int c = 0; c < 4; c++)
1638222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	{
1639222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		const TextureSwizzle::Channel map = channelMap[c];
1640222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		if (map == TextureSwizzle::CHANNEL_ZERO)
1641222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			result[c] = 0;
1642222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		else if (map == TextureSwizzle::CHANNEL_ONE)
1643222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			result[c] = 1;
1644222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		else
1645222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		{
1646222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			// integer values are clamped to a representable range
1647222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			result[c] = de::clamp(sampler.borderColor.getAccess<deInt32>()[(int)map], valueMin[(int)map], valueMax[(int)map]);
1648222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		}
1649222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	}
1650222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1651222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	return result;
1652222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry}
1653222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1654222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrystatic tcu::UVec4 getTextureBorderColorUint (const TextureFormat& format, const Sampler& sampler)
1655222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry{
1656653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	const tcu::TextureChannelClass	channelClass	= getTextureChannelClass(format.type);
1657222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	const TextureSwizzle::Channel*	channelMap		= getBorderColorReadSwizzle(format.order).components;
1658222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	const IVec4						channelBits		= getChannelBitDepth(format.type);
1659222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	const UVec4						valueMax		= getNBitUnsignedIntegerVec4MaxValue(channelBits);
1660222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	UVec4							result;
1661222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1662222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	DE_ASSERT(channelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER);
166335f093054670f38076b8b347d37a41be90a5ac8cJarkko Pöyry	DE_UNREF(channelClass);
1664222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1665222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	for (int c = 0; c < 4; c++)
1666222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	{
1667222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		const TextureSwizzle::Channel map = channelMap[c];
1668222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		if (map == TextureSwizzle::CHANNEL_ZERO)
1669222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			result[c] = 0;
1670222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		else if (map == TextureSwizzle::CHANNEL_ONE)
1671222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			result[c] = 1;
1672222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		else
1673222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		{
1674222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			// integer values are clamped to a representable range
1675222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			result[c] = de::min(sampler.borderColor.getAccess<deUint32>()[(int)map], valueMax[(int)map]);
1676222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		}
1677222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	}
1678222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1679222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	return result;
1680222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry}
1681222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1682222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrytemplate <typename ScalarType>
1683222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrytcu::Vector<ScalarType, 4> sampleTextureBorder (const TextureFormat& format, const Sampler& sampler)
1684222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry{
1685222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	const tcu::TextureChannelClass channelClass = getTextureChannelClass(format.type);
1686222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1687222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	switch (channelClass)
1688222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	{
1689222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
1690222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
1691222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
1692222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			return getTextureBorderColorFloat(format, sampler).cast<ScalarType>();
1693222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1694222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
1695222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			return getTextureBorderColorInt(format, sampler).cast<ScalarType>();
1696222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1697222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
1698222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			return getTextureBorderColorUint(format, sampler).cast<ScalarType>();
1699222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1700222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		default:
1701222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			DE_ASSERT(false);
1702222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry			return tcu::Vector<ScalarType, 4>();
1703222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	}
1704222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry}
1705222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
1706222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry// instantiation
1707222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrytemplate tcu::Vector<float, 4>		sampleTextureBorder (const TextureFormat& format, const Sampler& sampler);
1708222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrytemplate tcu::Vector<deInt32, 4>	sampleTextureBorder (const TextureFormat& format, const Sampler& sampler);
1709222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyrytemplate tcu::Vector<deUint32, 4>	sampleTextureBorder (const TextureFormat& format, const Sampler& sampler);
1710222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry
17113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // tcu
1712