tcuTexture.hpp revision becd5d53015521acf7536ba754de326d8b1da2f3
13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#ifndef _TCUTEXTURE_HPP
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define _TCUTEXTURE_HPP
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program Tester Core
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ----------------------------------------
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Reference Texture Implementation.
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuDefs.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuVector.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deArrayBuffer.hpp"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <vector>
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <ostream>
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace tcu
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Texture format
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureFormat
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum ChannelOrder
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		R = 0,
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		A,
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		I,
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		L,
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LA,
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RG,
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RA,
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RGB,
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RGBA,
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ARGB,
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		BGRA,
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		sRGB,
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		sRGBA,
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		D,
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		S,
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DS,
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		CHANNELORDER_LAST
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum ChannelType
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SNORM_INT8 = 0,
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SNORM_INT16,
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SNORM_INT32,
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNORM_INT8,
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNORM_INT16,
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNORM_INT32,
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNORM_SHORT_565,
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNORM_SHORT_555,
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNORM_SHORT_4444,
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNORM_SHORT_5551,
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNORM_INT_101010,
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNORM_INT_1010102_REV,
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNSIGNED_INT_1010102_REV,
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNSIGNED_INT_11F_11F_10F_REV,
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNSIGNED_INT_999_E5_REV,
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNSIGNED_INT_24_8,
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SIGNED_INT8,
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SIGNED_INT16,
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SIGNED_INT32,
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNSIGNED_INT8,
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNSIGNED_INT16,
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNSIGNED_INT32,
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		HALF_FLOAT,
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		FLOAT,
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		FLOAT_UNSIGNED_INT_24_8_REV,
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		CHANNELTYPE_LAST
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ChannelOrder	order;
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ChannelType		type;
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureFormat (ChannelOrder order_, ChannelType type_)
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: order	(order_)
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, type	(type_)
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureFormat (void)
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: order	(CHANNELORDER_LAST)
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, type	(CHANNELTYPE_LAST)
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int getPixelSize (void) const;
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool operator== (const TextureFormat& other) const { return !(*this != other); }
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool operator!= (const TextureFormat& other) const
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return (order != other.order || type != other.type);
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Sampling parameters
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Sampler
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum WrapMode
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		CLAMP_TO_EDGE = 0,	//! Clamp to edge
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		CLAMP_TO_BORDER,	//! Use border color at edge
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		REPEAT_GL,			//! Repeat with OpenGL semantics
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		REPEAT_CL,			//! Repeat with OpenCL semantics
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		MIRRORED_REPEAT_GL,	//! Mirrored repeat with OpenGL semantics
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		MIRRORED_REPEAT_CL, //! Mirrored repeat with OpenCL semantics
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		WRAPMODE_LAST
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum FilterMode
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		NEAREST = 0,
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LINEAR,
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		NEAREST_MIPMAP_NEAREST,
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		NEAREST_MIPMAP_LINEAR,
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LINEAR_MIPMAP_NEAREST,
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LINEAR_MIPMAP_LINEAR,
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		FILTERMODE_LAST
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum CompareMode
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_NONE = 0,
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_LESS,
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_LESS_OR_EQUAL,
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_GREATER,
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_GREATER_OR_EQUAL,
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_EQUAL,
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_NOT_EQUAL,
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_ALWAYS,
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_NEVER,
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_LAST
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Wrap control
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	WrapMode		wrapS;
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	WrapMode		wrapT;
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	WrapMode		wrapR;
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Minifcation & magnification
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FilterMode		minFilter;
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FilterMode		magFilter;
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float			lodThreshold;		// lod <= lodThreshold ? magnified : minified
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Coordinate normalization
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool			normalizedCoords;
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Shadow comparison
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CompareMode		compare;
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int				compareChannel;
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Border color
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4			borderColor;
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Seamless cube map filtering
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool			seamlessCubeMap;
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Sampler (WrapMode		wrapS_,
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			 WrapMode		wrapT_,
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			 WrapMode		wrapR_,
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			 FilterMode		minFilter_,
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			 FilterMode		magFilter_,
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			 float			lodThreshold_		= 0.0f,
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			 bool			normalizedCoords_	= true,
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			 CompareMode	compare_			= COMPAREMODE_NONE,
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			 int			compareChannel_		= 0,
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			 const Vec4&	borderColor_		= Vec4(0.0f, 0.0f, 0.0f, 0.0f),
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			 bool			seamlessCubeMap_	= false)
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: wrapS				(wrapS_)
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, wrapT				(wrapT_)
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, wrapR				(wrapR_)
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, minFilter			(minFilter_)
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, magFilter			(magFilter_)
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, lodThreshold		(lodThreshold_)
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, normalizedCoords	(normalizedCoords_)
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, compare			(compare_)
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, compareChannel	(compareChannel_)
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, borderColor		(borderColor_)
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, seamlessCubeMap	(seamlessCubeMap_)
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Sampler (void)
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: wrapS				(WRAPMODE_LAST)
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, wrapT				(WRAPMODE_LAST)
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, wrapR				(WRAPMODE_LAST)
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, minFilter			(FILTERMODE_LAST)
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, magFilter			(FILTERMODE_LAST)
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, lodThreshold		(0.0f)
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, normalizedCoords	(true)
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, compare			(COMPAREMODE_NONE)
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, compareChannel	(0)
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, borderColor		(0.0f, 0.0f, 0.0f, 0.0f)
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, seamlessCubeMap	(false)
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureLevel;
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Read-only pixel data access
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ConstPixelBufferAccess encapsulates pixel data pointer along with
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * format and layout information. It can be used for read-only access
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * to arbitrary pixel buffers.
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Access objects are like iterators or pointers. They can be passed around
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * as values and are valid as long as the storage doesn't change.
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ConstPixelBufferAccess
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							ConstPixelBufferAccess		(void);
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							ConstPixelBufferAccess		(const TextureLevel& level);
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							ConstPixelBufferAccess		(const TextureFormat& format, int width, int height, int depth, const void* data);
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							ConstPixelBufferAccess		(const TextureFormat& format, int width, int height, int depth, int rowPitch, int slicePitch, const void* data);
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const TextureFormat&	getFormat					(void) const	{ return m_format;		}
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						getWidth					(void) const	{ return m_width;		}
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						getHeight					(void) const	{ return m_height;		}
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						getDepth					(void) const	{ return m_depth;		}
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						getRowPitch					(void) const	{ return m_rowPitch;	}
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						getSlicePitch				(void) const	{ return m_slicePitch;	}
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const void*				getDataPtr					(void) const	{ return m_data;		}
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						getDataSize					(void) const	{ return m_depth*m_slicePitch;	}
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4					getPixel					(int x, int y, int z = 0) const;
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	IVec4					getPixelInt					(int x, int y, int z = 0) const;
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UVec4					getPixelUint				(int x, int y, int z = 0) const { return getPixelInt(x, y, z).cast<deUint32>(); }
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	template<typename T>
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vector<T, 4>			getPixelT					(int x, int y, int z = 0) const;
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float					getPixDepth					(int x, int y, int z = 0) const;
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						getPixStencil				(int x, int y, int z = 0) const;
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4					sample1D					(const Sampler& sampler, Sampler::FilterMode filter, float s, int level) const;
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4					sample2D					(const Sampler& sampler, Sampler::FilterMode filter, float s, float t, int depth) const;
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4					sample3D					(const Sampler& sampler, Sampler::FilterMode filter, float s, float t, float r) const;
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4					sample1DOffset				(const Sampler& sampler, Sampler::FilterMode filter, float s, const IVec2& offset) const;
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4					sample2DOffset				(const Sampler& sampler, Sampler::FilterMode filter, float s, float t, const IVec3& offset) const;
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4					sample3DOffset				(const Sampler& sampler, Sampler::FilterMode filter, float s, float t, float r, const IVec3& offset) const;
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float					sample1DCompare				(const Sampler& sampler, Sampler::FilterMode filter, float ref, float s, const IVec2& offset) const;
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float					sample2DCompare				(const Sampler& sampler, Sampler::FilterMode filter, float ref, float s, float t, const IVec3& offset) const;
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureFormat			m_format;
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						m_width;
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						m_height;
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						m_depth;
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						m_rowPitch;
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						m_slicePitch;
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	mutable void*			m_data;
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Read-write pixel data access
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * This class extends read-only access object by providing write functionality.
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \note PixelBufferAccess may not have any data members nor add any
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *		 virtual functions. It must be possible to reinterpret_cast<>
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *		 PixelBufferAccess to ConstPixelBufferAccess.
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass PixelBufferAccess : public ConstPixelBufferAccess
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
304becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi						PixelBufferAccess	(void) {}
305becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi						PixelBufferAccess	(TextureLevel& level);
306becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi						PixelBufferAccess	(const TextureFormat& format, int width, int height, int depth, void* data);
307becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi						PixelBufferAccess	(const TextureFormat& format, int width, int height, int depth, int rowPitch, int slicePitch, void* data);
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
309becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	void*				getDataPtr			(void) const { return m_data; }
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
311becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	void				setPixels			(const void* buf, int bufSize) const;
312becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	void				setPixel			(const tcu::Vec4& color, int x, int y, int z = 0) const;
313becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	void				setPixel			(const tcu::IVec4& color, int x, int y, int z = 0) const;
314becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	void				setPixel			(const tcu::UVec4& color, int x, int y, int z = 0) const { setPixel(color.cast<int>(), x, y, z); }
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
316becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	void				setPixDepth			(float depth, int x, int y, int z = 0) const;
317becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	void				setPixStencil		(int stencil, int x, int y, int z = 0) const;
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Generic pixel data container
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * This container supports all valid TextureFormat combinations and
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * both 2D and 3D textures. To read or manipulate data access object must
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * be queried using getAccess().
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureLevel
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
330becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi								TextureLevel		(void);
331becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi								TextureLevel		(const TextureFormat& format);
332becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi								TextureLevel		(const TextureFormat& format, int width, int height, int depth = 1);
333becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi								~TextureLevel		(void);
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
335becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	int							getWidth			(void) const	{ return m_width;	}
336becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	int							getHeight			(void) const	{ return m_height;	}
337becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	int							getDepth			(void) const	{ return m_depth;	}
338becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	bool						isEmpty				(void) const	{ return m_width == 0 || m_height == 0 || m_depth == 0; }
339becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	const TextureFormat			getFormat			(void) const	{ return m_format;	}
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
341becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	void						setStorage			(const TextureFormat& format, int width, int heigth, int depth = 1);
342becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	void						setSize				(int width, int height, int depth = 1);
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
344becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	PixelBufferAccess			getAccess			(void)			{ return PixelBufferAccess(m_format, m_width, m_height, m_depth, getPtr());			}
345becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	ConstPixelBufferAccess		getAccess			(void) const	{ return ConstPixelBufferAccess(m_format, m_width, m_height, m_depth, getPtr());	}
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
348becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	void*						getPtr				(void)			{ return m_data.getPtr(); }
349becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	const void*					getPtr				(void) const	{ return m_data.getPtr(); }
350becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi
351becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	TextureFormat				m_format;
352becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	int							m_width;
353becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	int							m_height;
354becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	int							m_depth;
355becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	de::ArrayBuffer<deUint8>	m_data;
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	friend class ConstPixelBufferAccess;
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3603c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4	sampleLevelArray1D				(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, int level, float lod);
3613c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4	sampleLevelArray2D				(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float t, int depth, float lod);
3623c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4	sampleLevelArray3D				(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float t, float r, float lod);
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3643c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4	sampleLevelArray1DOffset		(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float lod, const IVec2& offset);
3653c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4	sampleLevelArray2DOffset		(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float t, float lod, const IVec3& offset);
3663c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4	sampleLevelArray3DOffset		(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset);
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyryfloat	sampleLevelArray1DCompare		(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float ref, float s, float lod, const IVec2& offset);
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyryfloat	sampleLevelArray2DCompare		(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float ref, float s, float t, float lod, const IVec3& offset);
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3713c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4	gatherArray2DOffsets			(const ConstPixelBufferAccess& src, const Sampler& sampler, float s, float t, int depth, int componentNdx, const IVec2 (&offsets)[4]);
3723c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4	gatherArray2DOffsetsCompare		(const ConstPixelBufferAccess& src, const Sampler& sampler, float ref, float s, float t, int depth, const IVec2 (&offsets)[4]);
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum CubeFace
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CUBEFACE_NEGATIVE_X = 0,
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CUBEFACE_POSITIVE_X,
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CUBEFACE_NEGATIVE_Y,
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CUBEFACE_POSITIVE_Y,
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CUBEFACE_NEGATIVE_Z,
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CUBEFACE_POSITIVE_Z,
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CUBEFACE_LAST
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Coordinates projected onto cube face.
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T>
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct CubeFaceCoords
3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CubeFace		face;
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	T				s;
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	T				t;
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					CubeFaceCoords		(CubeFace face_, T s_, T t_) : face(face_), s(s_), t(t_) {}
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					CubeFaceCoords		(CubeFace face_, const Vector<T, 2>& c) : face(face_), s(c.x()), t(c.y()) {}
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytypedef CubeFaceCoords<float>	CubeFaceFloatCoords;
4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytypedef CubeFaceCoords<int>		CubeFaceIntCoords;
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4033c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCubeFace				selectCubeFace			(const Vec3& coords);
4043c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec2					projectToFace			(CubeFace face, const Vec3& coords);
4053c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCubeFaceFloatCoords		getCubeFaceCoords		(const Vec3& coords);
4063c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCubeFaceIntCoords		remapCubeEdgeCoords		(const CubeFaceIntCoords& coords, int size);
4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 1D Texture View
4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture1DView
4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture1DView		(int numLevels, const ConstPixelBufferAccess* levels);
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLevels		(void) const	{ return m_numLevels;										}
4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_numLevels > 0 ? m_levels[0].getWidth()	: 0;	}
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess&	getLevel			(int ndx) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx];	}
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	getLevels			(void) const	{ return m_levels;											}
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float lod) const;
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float lod, deInt32 offset) const;
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float lod) const;
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float lod, deInt32 offset) const;
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_numLevels;
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	m_levels;
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Texture1DView::Texture1DView (int numLevels, const ConstPixelBufferAccess* levels)
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: m_numLevels	(numLevels)
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_levels		(levels)
4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_numLevels >= 0 && ((m_numLevels == 0) == !m_levels));
4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture1DView::sample (const Sampler& sampler, float s, float lod) const
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray1D(m_levels, m_numLevels, sampler, s, 0 /* depth */, lod);
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture1DView::sampleOffset (const Sampler& sampler, float s, float lod, deInt32 offset) const
4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray1DOffset(m_levels, m_numLevels, sampler, s, lod, IVec2(offset, 0));
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture1DView::sampleCompare (const Sampler& sampler, float ref, float s, float lod) const
4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray1DCompare(m_levels, m_numLevels, sampler, ref, s, lod, IVec2(0, 0));
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture1DView::sampleCompareOffset (const Sampler& sampler, float ref, float s, float lod, deInt32 offset) const
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray1DCompare(m_levels, m_numLevels, sampler, ref, s, lod, IVec2(offset, 0));
4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
4593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 2D Texture View
4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture2DView
4623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4633c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture2DView		(int numLevels, const ConstPixelBufferAccess* levels);
4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLevels		(void) const	{ return m_numLevels;										}
4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_numLevels > 0 ? m_levels[0].getWidth()	: 0;	}
4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getHeight			(void) const	{ return m_numLevels > 0 ? m_levels[0].getHeight()	: 0;	}
4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess&	getLevel			(int ndx) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx];	}
4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	getLevels			(void) const	{ return m_levels;											}
4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float lod) const;
4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float lod, const IVec2& offset) const;
4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float lod) const;
4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float lod, const IVec2& offset) const;
4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherOffsets		(const Sampler& sampler, float s, float t, int componentNdx, const IVec2 (&offsets)[4]) const;
4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherOffsetsCompare(const Sampler& sampler, float ref, float s, float t, const IVec2 (&offsets)[4]) const;
4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_numLevels;
4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	m_levels;
4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4853c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Texture2DView::Texture2DView (int numLevels, const ConstPixelBufferAccess* levels)
4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: m_numLevels	(numLevels)
4873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_levels		(levels)
4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_numLevels >= 0 && ((m_numLevels == 0) == !m_levels));
4903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2DView::sample (const Sampler& sampler, float s, float t, float lod) const
4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray2D(m_levels, m_numLevels, sampler, s, t, 0 /* depth */, lod);
4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2DView::sampleOffset (const Sampler& sampler, float s, float t, float lod, const IVec2& offset) const
4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray2DOffset(m_levels, m_numLevels, sampler, s, t, lod, IVec3(offset.x(), offset.y(), 0));
5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture2DView::sampleCompare (const Sampler& sampler, float ref, float s, float t, float lod) const
5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray2DCompare(m_levels, m_numLevels, sampler, ref, s, t, lod, IVec3(0, 0, 0));
5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5073c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture2DView::sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float lod, const IVec2& offset) const
5083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray2DCompare(m_levels, m_numLevels, sampler, ref, s, t, lod, IVec3(offset.x(), offset.y(), 0));
5103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5123c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2DView::gatherOffsets (const Sampler& sampler, float s, float t, int componentNdx, const IVec2 (&offsets)[4]) const
5133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return gatherArray2DOffsets(m_levels[0], sampler, s, t, 0, componentNdx, offsets);
5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5173c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2DView::gatherOffsetsCompare (const Sampler& sampler, float ref, float s, float t, const IVec2 (&offsets)[4]) const
5183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return gatherArray2DOffsetsCompare(m_levels[0], sampler, ref, s, t, 0, offsets);
5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Base class for textures that have single mip-map pyramid
5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureLevelPyramid
5263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									TextureLevelPyramid	(const TextureFormat& format, int numLevels);
5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									TextureLevelPyramid	(const TextureLevelPyramid& other);
5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									~TextureLevelPyramid(void);
5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const TextureFormat&			getFormat			(void) const			{ return m_format;					}
5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool							isLevelEmpty		(int levelNdx) const	{ return m_data[levelNdx].empty();	}
5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLevels		(void) const			{ return (int)m_access.size();		}
5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess&	getLevel			(int ndx) const			{ return m_access[ndx];				}
5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const PixelBufferAccess&		getLevel			(int ndx)				{ return m_access[ndx];				}
5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	getLevels			(void) const			{ return &m_access[0];				}
5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const PixelBufferAccess*		getLevels			(void)					{ return &m_access[0];				}
5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							allocLevel			(int levelNdx, int width, int height, int depth);
5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							clearLevel			(int levelNdx);
5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureLevelPyramid&			operator=			(const TextureLevelPyramid& other);
5463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
5483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	typedef de::ArrayBuffer<deUint8> LevelData;
5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureFormat					m_format;
5513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<LevelData>			m_data;
5523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<PixelBufferAccess>	m_access;
5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 1D Texture reference implementation
5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture1D : private TextureLevelPyramid
5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture1D			(const TextureFormat& format, int width);
5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture1D			(const Texture1D& other);
5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									~Texture1D			(void);
5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_width;	}
5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const Texture1DView&			getView				(void) const	{ return m_view;	}
5673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							allocLevel			(int levelNdx);
5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Sampling
5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float lod) const;
5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float lod, deInt32 offset) const;
5733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getFormat;
5753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getNumLevels;
5763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getLevel;
5773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::clearLevel;
5783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::isLevelEmpty;
5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture1D&						operator=			(const Texture1D& other);
5813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operator Texture1DView (void) const { return m_view; }
5833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5843c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
5853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_width;
5863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture1DView					m_view;
5873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture1D::sample (const Sampler& sampler, float s, float lod) const
5903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sample(sampler, s, lod);
5923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture1D::sampleOffset (const Sampler& sampler, float s, float lod, deInt32 offset) const
5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleOffset(sampler, s, lod, offset);
5973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
6003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 2D Texture reference implementation
6013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
6023c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture2D : private TextureLevelPyramid
6033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
6053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture2D			(const TextureFormat& format, int width, int height);
6063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture2D			(const Texture2D& other);
6073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									~Texture2D			(void);
6083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_width;	}
6103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getHeight			(void) const	{ return m_height;	}
6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const Texture2DView&			getView				(void) const	{ return m_view;	}
6123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							allocLevel			(int levelNdx);
6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Sampling
6163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float lod) const;
6173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float lod, const IVec2& offset) const;
6183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float lod) const;
6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float lod, const IVec2& offset) const;
6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherOffsets		(const Sampler& sampler, float s, float t, int componentNdx, const IVec2 (&offsets)[4]) const;
6223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherOffsetsCompare(const Sampler& sampler, float ref, float s, float t, const IVec2 (&offsets)[4]) const;
6233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getFormat;
6253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getNumLevels;
6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getLevel;
6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::clearLevel;
6283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::isLevelEmpty;
6293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture2D&						operator=			(const Texture2D& other);
6313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operator Texture2DView (void) const { return m_view; }
6333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6343c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
6353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_width;
6363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_height;
6373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture2DView					m_view;
6383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
6393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6403c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2D::sample (const Sampler& sampler, float s, float t, float lod) const
6413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sample(sampler, s, t, lod);
6433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2D::sampleOffset (const Sampler& sampler, float s, float t, float lod, const IVec2& offset) const
6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleOffset(sampler, s, t, lod, offset);
6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6503c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture2D::sampleCompare (const Sampler& sampler, float ref, float s, float t, float lod) const
6513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleCompare(sampler, ref, s, t, lod);
6533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6553c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture2D::sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float lod, const IVec2& offset) const
6563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleCompareOffset(sampler, ref, s, t, lod, offset);
6583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6603c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2D::gatherOffsets (const Sampler& sampler, float s, float t, int componentNdx, const IVec2 (&offsets)[4]) const
6613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.gatherOffsets(sampler, s, t, componentNdx, offsets);
6633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6653c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2D::gatherOffsetsCompare (const Sampler& sampler, float ref, float s, float t, const IVec2 (&offsets)[4]) const
6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.gatherOffsetsCompare(sampler, ref, s, t, offsets);
6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
6713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Cube Map Texture View
6723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureCubeView
6743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6753c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
6763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									TextureCubeView		(void);
6773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									TextureCubeView		(int numLevels, const ConstPixelBufferAccess* const (&levels)[CUBEFACE_LAST]);
6783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLevels		(void) const	{ return m_numLevels;										}
6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getSize				(void) const	{ return m_numLevels > 0 ? m_levels[0][0].getWidth() : 0;	}
6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess&	getLevelFace		(int ndx, CubeFace face) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[face][ndx];	}
6823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	getFaceLevels		(CubeFace face) const			{ return m_levels[face];					}
6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float p, float lod) const;
6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float r, float lod) const;
6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gather				(const Sampler& sampler, float s, float t, float r, int componentNdx) const;
6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherCompare		(const Sampler& sampler, float ref, float s, float t, float r) const;
6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6903c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_numLevels;
6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	m_levels[CUBEFACE_LAST];
6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
6963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Cube Map Texture reference implementation
6973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureCube
6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									TextureCube			(const TextureFormat& format, int size);
7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									TextureCube			(const TextureCube& other);
7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									~TextureCube		(void);
7043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const TextureFormat&			getFormat			(void) const	{ return m_format;	}
7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getSize				(void) const	{ return m_size;	}
7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLevels		(void) const					{ return (int)m_access[0].size();	}
7093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess&	getLevelFace		(int ndx, CubeFace face) const	{ return m_access[face][ndx];		}
7103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const PixelBufferAccess&		getLevelFace		(int ndx, CubeFace face)		{ return m_access[face][ndx];		}
7113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							allocLevel			(CubeFace face, int levelNdx);
7133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							clearLevel			(CubeFace face, int levelNdx);
7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool							isLevelEmpty		(CubeFace face, int levelNdx) const		{ return m_data[face][levelNdx].empty();	}
7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float p, float lod) const;
7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float r, float lod) const;
7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gather				(const Sampler& sampler, float s, float t, float r, int componentNdx) const;
7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherCompare		(const Sampler& sampler, float ref, float s, float t, float r) const;
7213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureCube&					operator=			(const TextureCube& other);
7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operator TextureCubeView (void) const { return m_view; }
7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	typedef de::ArrayBuffer<deUint8> LevelData;
7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureFormat					m_format;
7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_size;
7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<LevelData>			m_data[CUBEFACE_LAST];
7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<PixelBufferAccess>	m_access[CUBEFACE_LAST];
7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureCubeView					m_view;
7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 TextureCube::sample (const Sampler& sampler, float s, float t, float p, float lod) const
7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sample(sampler, s, t, p, lod);
7393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float TextureCube::sampleCompare (const Sampler& sampler, float ref, float s, float t, float r, float lod) const
7423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleCompare(sampler, ref, s, t, r, lod);
7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 TextureCube::gather (const Sampler& sampler, float s, float t, float r, int componentNdx) const
7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.gather(sampler, s, t, r, componentNdx);
7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 TextureCube::gatherCompare (const Sampler& sampler, float ref, float s, float t, float r) const
7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.gatherCompare(sampler, ref, s, t, r);
7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 1D Array Texture View
7583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
7593c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture1DArrayView
7603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
7623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture1DArrayView	(int numLevels, const ConstPixelBufferAccess* levels);
7633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_numLevels > 0 ? m_levels[0].getWidth()	: 0;	}
7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLayers		(void) const	{ return m_numLevels > 0 ? m_levels[0].getHeight()	: 0;	}
7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLevels		(void) const	{ return m_numLevels;										}
7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess&	getLevel			(int ndx) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx];	}
7683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	getLevels			(void) const	{ return m_levels;											}
7693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float lod) const;
7713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float lod, deInt32 offset) const;
7723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float lod) const;
7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float lod, deInt32 offset) const;
7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7753c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
7763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								selectLayer			(float r) const;
7773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_numLevels;
7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	m_levels;
7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
7833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 2D Array Texture View
7843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
7853c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture2DArrayView
7863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7873c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
7883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture2DArrayView	(int numLevels, const ConstPixelBufferAccess* levels);
7893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_numLevels > 0 ? m_levels[0].getWidth()	: 0;	}
7913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getHeight			(void) const	{ return m_numLevels > 0 ? m_levels[0].getHeight()	: 0;	}
7923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLayers		(void) const	{ return m_numLevels > 0 ? m_levels[0].getDepth()	: 0;	}
7933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLevels		(void) const	{ return m_numLevels;										}
7943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess&	getLevel			(int ndx) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx];	}
7953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	getLevels			(void) const	{ return m_levels;											}
7963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float r, float lod) const;
7983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float r, float lod, const IVec2& offset) const;
7993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float r, float lod) const;
8003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float r, float lod, const IVec2& offset) const;
8013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherOffsets		(const Sampler& sampler, float s, float t, float r, int componentNdx, const IVec2 (&offsets)[4]) const;
8033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherOffsetsCompare(const Sampler& sampler, float ref, float s, float t, float r, const IVec2 (&offsets)[4]) const;
8043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8053c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
8063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								selectLayer			(float r) const;
8073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_numLevels;
8093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	m_levels;
8103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
8113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
8133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 1D Array Texture reference implementation
8143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
8153c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture1DArray : private TextureLevelPyramid
8163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8173c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
8183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture1DArray		(const TextureFormat& format, int width, int numLayers);
8193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture1DArray		(const Texture1DArray& other);
8203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									~Texture1DArray		(void);
8213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_width;		}
8233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLayers		(void) const	{ return m_numLayers;	}
8243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							allocLevel			(int levelNdx);
8263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getFormat;
8283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getNumLevels;
8293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getLevel;
8303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::clearLevel;
8313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::isLevelEmpty;
8323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float lod) const;
8343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float lod, deInt32 offset) const;
8353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float lod) const;
8363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float lod, deInt32 offset) const;
8373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture1DArray&					operator=			(const Texture1DArray& other);
8393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operator Texture1DArrayView (void) const { return m_view; }
8413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8423c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
8433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_width;
8443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_numLayers;
8453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture1DArrayView				m_view;
8463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
8473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8483c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture1DArray::sample (const Sampler& sampler, float s, float t, float lod) const
8493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sample(sampler, s, t, lod);
8513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8533c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture1DArray::sampleOffset (const Sampler& sampler, float s, float t, float lod, deInt32 offset) const
8543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleOffset(sampler, s, t, lod, offset);
8563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8583c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture1DArray::sampleCompare (const Sampler& sampler, float ref, float s, float t, float lod) const
8593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleCompare(sampler, ref, s, t, lod);
8613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8633c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture1DArray::sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float lod, deInt32 offset) const
8643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleCompareOffset(sampler, ref, s, t, lod, offset);
8663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
8693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 2D Array Texture reference implementation
8703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
8713c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture2DArray : private TextureLevelPyramid
8723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture2DArray		(const TextureFormat& format, int width, int height, int numLayers);
8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture2DArray		(const Texture2DArray& other);
8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									~Texture2DArray		(void);
8773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_width;		}
8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getHeight			(void) const	{ return m_height;		}
8803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLayers		(void) const	{ return m_numLayers;	}
8813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							allocLevel			(int levelNdx);
8833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getFormat;
8853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getNumLevels;
8863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getLevel;
8873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::clearLevel;
8883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::isLevelEmpty;
8893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float r, float lod) const;
8913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float r, float lod, const IVec2& offset) const;
8923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float r, float lod) const;
8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float r, float lod, const IVec2& offset) const;
8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherOffsets		(const Sampler& sampler, float s, float t, float r, int componentNdx, const IVec2 (&offsets)[4]) const;
8963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherOffsetsCompare(const Sampler& sampler, float ref, float s, float t, float r, const IVec2 (&offsets)[4]) const;
8973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture2DArray&					operator=			(const Texture2DArray& other);
8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operator Texture2DArrayView (void) const { return m_view; }
9013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9023c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
9033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_width;
9043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_height;
9053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_numLayers;
9063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture2DArrayView				m_view;
9073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
9083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9093c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2DArray::sample (const Sampler& sampler, float s, float t, float r, float lod) const
9103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sample(sampler, s, t, r, lod);
9123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9143c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2DArray::sampleOffset (const Sampler& sampler, float s, float t, float r, float lod, const IVec2& offset) const
9153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleOffset(sampler, s, t, r, lod, offset);
9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture2DArray::sampleCompare (const Sampler& sampler, float ref, float s, float t, float r, float lod) const
9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleCompare(sampler, ref, s, t, r, lod);
9223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9243c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture2DArray::sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float r, float lod, const IVec2& offset) const
9253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleCompareOffset(sampler, ref, s, t, r, lod, offset);
9273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9293c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2DArray::gatherOffsets (const Sampler& sampler, float s, float t, float r, int componentNdx, const IVec2 (&offsets)[4]) const
9303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.gatherOffsets(sampler, s, t, r, componentNdx, offsets);
9323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9343c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2DArray::gatherOffsetsCompare (const Sampler& sampler, float ref, float s, float t, float r, const IVec2 (&offsets)[4]) const
9353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.gatherOffsetsCompare(sampler, ref, s, t, r, offsets);
9373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
9403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 3D Texture View
9413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
9423c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture3DView
9433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9443c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
9453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture3DView		(int numLevels, const ConstPixelBufferAccess* levels);
9463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_numLevels > 0 ? m_levels[0].getWidth()	: 0;	}
9483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getHeight			(void) const	{ return m_numLevels > 0 ? m_levels[0].getHeight()	: 0;	}
9493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getDepth			(void) const	{ return m_numLevels > 0 ? m_levels[0].getDepth()	: 0;	}
9503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLevels		(void) const	{ return m_numLevels;										}
9513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess&	getLevel			(int ndx) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx];	}
9523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	getLevels			(void) const	{ return m_levels;											}
9533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float r, float lod) const;
9553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset) const;
9563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9573c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
9583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_numLevels;
9593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	m_levels;
9603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
9613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9623c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture3DView::sample (const Sampler& sampler, float s, float t, float r, float lod) const
9633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray3D(m_levels, m_numLevels, sampler, s, t, r, lod);
9653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9673c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture3DView::sampleOffset (const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset) const
9683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray3DOffset(m_levels, m_numLevels, sampler, s, t, r, lod, offset);
9703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
9733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 3D Texture reference implementation
9743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
9753c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture3D : private TextureLevelPyramid
9763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9773c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
9783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture3D			(const TextureFormat& format, int width, int height, int depth);
9793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture3D			(const Texture3D& other);
9803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									~Texture3D			(void);
9813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_width;	}
9833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getHeight			(void) const	{ return m_height;	}
9843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getDepth			(void) const	{ return m_depth;	}
9853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							allocLevel			(int levelNdx);
9873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getFormat;
9893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getNumLevels;
9903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getLevel;
9913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::clearLevel;
9923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::isLevelEmpty;
9933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float r, float lod) const;
9953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset) const;
9963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture3D&						operator=			(const Texture3D& other);
9983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operator Texture3DView (void) const { return m_view; }
10003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10013c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
10023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_width;
10033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_height;
10043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_depth;
10053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture3DView					m_view;
10063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
10073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10083c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture3D::sample (const Sampler& sampler, float s, float t, float r, float lod) const
10093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sample(sampler, s, t, r, lod);
10113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10133c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture3D::sampleOffset (const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset) const
10143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleOffset(sampler, s, t, r, lod, offset);
10163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
10193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Cube Map Array Texture View
10203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
10213c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureCubeArrayView
10223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10233c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
10243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									TextureCubeArrayView	(int numLevels, const ConstPixelBufferAccess* levels);
10253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	int								getSize					(void) const	{ return m_numLevels > 0 ? m_levels[0].getWidth()	: 0;	}
10278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	int								getDepth				(void) const	{ return m_numLevels > 0 ? m_levels[0].getDepth()	: 0;	}
10288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	int								getNumLayers			(void) const	{ return getDepth()	/ 6;	}
10293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLevels			(void) const	{ return m_numLevels;										}
10303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess&	getLevel				(int ndx) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx];	}
10313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	getLevels				(void) const	{ return m_levels;											}
10323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample					(const Sampler& sampler, float s, float t, float r, float q, float lod) const;
10343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset			(const Sampler& sampler, float s, float t, float r, float q, float lod, const IVec2& offset) const;
10353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare			(const Sampler& sampler, float ref, float s, float t, float r, float q, float lod) const;
10363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompareOffset		(const Sampler& sampler, float ref, float s, float t, float r, float q, float lod, const IVec2& offset) const;
10373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10383c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
10398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	int								selectLayer				(float q) const;
10403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_numLevels;
10423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	m_levels;
10433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
10443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
10463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Cube Map Array Texture reference implementation
10473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
10483c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureCubeArray : private TextureLevelPyramid
10493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10503c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
10518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry									TextureCubeArray	(const TextureFormat& format, int size, int depth);
10523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									TextureCubeArray	(const TextureCubeArray& other);
10533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									~TextureCubeArray	(void);
10543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	int								getSize				(void) const	{ return m_size;	}
10568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	int								getDepth			(void) const	{ return m_depth;	}
10573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							allocLevel			(int levelNdx);
10593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getFormat;
10613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getNumLevels;
10623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getLevel;
10633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::clearLevel;
10643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::isLevelEmpty;
10653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float r, float q, float lod) const;
10673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float r, float q, float lod, const IVec2& offset) const;
10683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float r, float q, float lod) const;
10693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float r, float q, float lod, const IVec2& offset) const;
10703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureCubeArray&				operator=			(const TextureCubeArray& other);
10723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operator TextureCubeArrayView (void) const { return m_view; }
10743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10753c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
10763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_size;
10778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	int								m_depth;
10783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureCubeArrayView			m_view;
10793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
10803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10813c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 TextureCubeArray::sample (const Sampler& sampler, float s, float t, float r, float q, float lod) const
10823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sample(sampler, s, t, r, q, lod);
10843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10863c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 TextureCubeArray::sampleOffset (const Sampler& sampler, float s, float t, float r, float q, float lod, const IVec2& offset) const
10873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleOffset(sampler, s, t, r, q, lod, offset);
10893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10913c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float TextureCubeArray::sampleCompare (const Sampler& sampler, float ref, float s, float t, float r, float q, float lod) const
10923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleCompare(sampler, ref, s, t, r, q, lod);
10943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10963c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float TextureCubeArray::sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float r, float q, float lod, const IVec2& offset) const
10973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleCompareOffset(sampler, ref, s, t, r, q, lod, offset);
10993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Stream operators.
11023c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystd::ostream&		operator<<		(std::ostream& str, TextureFormat::ChannelOrder order);
11033c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystd::ostream&		operator<<		(std::ostream& str, TextureFormat::ChannelType type);
11043c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystd::ostream&		operator<<		(std::ostream& str, TextureFormat format);
11053c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystd::ostream&		operator<<		(std::ostream& str, CubeFace face);
11063c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystd::ostream&		operator<<		(std::ostream& str, const ConstPixelBufferAccess& access);
11073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // tcu
11093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif // _TCUTEXTURE_HPP
1111