tcuTexture.hpp revision 222c1cfbf44db3a0bd251ef230e55c3602e518cc
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"
28222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry#include "rrGenericVector.hpp"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deArrayBuffer.hpp"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <vector>
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <ostream>
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace tcu
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Texture format
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureFormat
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum ChannelOrder
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		R = 0,
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		A,
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		I,
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		L,
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LA,
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RG,
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RA,
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RGB,
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RGBA,
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ARGB,
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		BGRA,
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5716d404b8653856a3a402c67c36425e24afe456adJarkko Pöyry		sR,
5816d404b8653856a3a402c67c36425e24afe456adJarkko Pöyry		sRG,
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		sRGB,
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		sRGBA,
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		D,
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		S,
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DS,
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		CHANNELORDER_LAST
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum ChannelType
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SNORM_INT8 = 0,
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SNORM_INT16,
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SNORM_INT32,
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNORM_INT8,
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNORM_INT16,
7607104dfa13013a73a59a93cbd8d132254a5a171dJarkko Pöyry		UNORM_INT24,
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNORM_INT32,
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNORM_SHORT_565,
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNORM_SHORT_555,
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNORM_SHORT_4444,
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNORM_SHORT_5551,
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNORM_INT_101010,
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNORM_INT_1010102_REV,
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNSIGNED_INT_1010102_REV,
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNSIGNED_INT_11F_11F_10F_REV,
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNSIGNED_INT_999_E5_REV,
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNSIGNED_INT_24_8,
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SIGNED_INT8,
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SIGNED_INT16,
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SIGNED_INT32,
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNSIGNED_INT8,
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNSIGNED_INT16,
93db6ba452c1213fd1c2b03369fdf4c1d23f07cfadJarkko Pöyry		UNSIGNED_INT24,
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		UNSIGNED_INT32,
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		HALF_FLOAT,
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		FLOAT,
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		FLOAT_UNSIGNED_INT_24_8_REV,
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		CHANNELTYPE_LAST
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ChannelOrder	order;
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ChannelType		type;
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureFormat (ChannelOrder order_, ChannelType type_)
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: order	(order_)
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, type	(type_)
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureFormat (void)
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: order	(CHANNELORDER_LAST)
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, type	(CHANNELTYPE_LAST)
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int getPixelSize (void) const;
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool operator== (const TextureFormat& other) const { return !(*this != other); }
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool operator!= (const TextureFormat& other) const
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return (order != other.order || type != other.type);
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
12493df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
1276d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry * \brief Texture swizzle
1286d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry *//*--------------------------------------------------------------------*/
1296d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyrystruct TextureSwizzle
1306d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry{
1316d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry	enum Channel
1326d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry	{
1336d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry		// \note CHANNEL_N must equal int N
1346d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry		CHANNEL_0 = 0,
1356d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry		CHANNEL_1,
1366d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry		CHANNEL_2,
1376d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry		CHANNEL_3,
1386d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry
1396d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry		CHANNEL_ZERO,
1406d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry		CHANNEL_ONE,
1416d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry
1426d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry		CHANNEL_LAST
1436d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry	};
1446d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry
1456d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry	Channel components[4];
1466d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry};
1476d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry
1486d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry//! get the swizzle used to expand texture data with a given channel order to RGBA form
1496d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyryconst TextureSwizzle& getChannelReadSwizzle		(TextureFormat::ChannelOrder order);
1506d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry
1516d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry//! get the swizzle used to narrow RGBA form data to native texture data with a given channel order
1526d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyryconst TextureSwizzle& getChannelWriteSwizzle	(TextureFormat::ChannelOrder order);
1536d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry
1546d31105cb879614b2cf87193ea90215efd13bcceJarkko Pöyry/*--------------------------------------------------------------------*//*!
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Sampling parameters
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Sampler
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum WrapMode
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		CLAMP_TO_EDGE = 0,	//! Clamp to edge
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		CLAMP_TO_BORDER,	//! Use border color at edge
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		REPEAT_GL,			//! Repeat with OpenGL semantics
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		REPEAT_CL,			//! Repeat with OpenCL semantics
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		MIRRORED_REPEAT_GL,	//! Mirrored repeat with OpenGL semantics
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		MIRRORED_REPEAT_CL, //! Mirrored repeat with OpenCL semantics
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		WRAPMODE_LAST
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum FilterMode
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		NEAREST = 0,
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LINEAR,
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		NEAREST_MIPMAP_NEAREST,
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		NEAREST_MIPMAP_LINEAR,
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LINEAR_MIPMAP_NEAREST,
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		LINEAR_MIPMAP_LINEAR,
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		FILTERMODE_LAST
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum CompareMode
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_NONE = 0,
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_LESS,
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_LESS_OR_EQUAL,
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_GREATER,
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_GREATER_OR_EQUAL,
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_EQUAL,
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_NOT_EQUAL,
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_ALWAYS,
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_NEVER,
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		COMPAREMODE_LAST
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20041920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry	enum DepthStencilMode
20141920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry	{
20241920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry		MODE_DEPTH = 0,
20341920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry		MODE_STENCIL,
20441920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry
20541920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry		MODE_LAST
20641920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry	};
20741920d7e0d1833907249009d156f6eb2361df97eJarkko Pöyry
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Wrap control
20923da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry	WrapMode			wrapS;
21023da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry	WrapMode			wrapT;
21123da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry	WrapMode			wrapR;
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Minifcation & magnification
21423da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry	FilterMode			minFilter;
21523da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry	FilterMode			magFilter;
21623da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry	float				lodThreshold;		// lod <= lodThreshold ? magnified : minified
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Coordinate normalization
21923da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry	bool				normalizedCoords;
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Shadow comparison
22223da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry	CompareMode			compare;
22323da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry	int					compareChannel;
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
225222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	// Border color.
226222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	// \note It is setter's responsibility to guarantee that the values are representable
227222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	//       in sampled texture's internal format.
228222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	// \note It is setter's responsibility to guarantee that the format is compatible with the
229222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	//       sampled texture's internal format. Otherwise results are undefined.
230222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry	rr::GenericVec4		borderColor;
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Seamless cube map filtering
23323da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry	bool				seamlessCubeMap;
23423da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry
23523da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry	// Depth stencil mode
23623da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry	DepthStencilMode	depthStencilMode;
23723da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry
23823da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry	Sampler (WrapMode			wrapS_,
23923da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry			 WrapMode			wrapT_,
24023da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry			 WrapMode			wrapR_,
24123da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry			 FilterMode			minFilter_,
24223da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry			 FilterMode			magFilter_,
24323da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry			 float				lodThreshold_		= 0.0f,
24423da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry			 bool				normalizedCoords_	= true,
24523da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry			 CompareMode		compare_			= COMPAREMODE_NONE,
24623da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry			 int				compareChannel_		= 0,
24723da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry			 const Vec4&		borderColor_		= Vec4(0.0f, 0.0f, 0.0f, 0.0f),
24823da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry			 bool				seamlessCubeMap_	= false,
24923da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry			 DepthStencilMode	depthStencilMode_	= MODE_DEPTH)
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: wrapS				(wrapS_)
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, wrapT				(wrapT_)
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, wrapR				(wrapR_)
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, minFilter			(minFilter_)
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, magFilter			(magFilter_)
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, lodThreshold		(lodThreshold_)
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, normalizedCoords	(normalizedCoords_)
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, compare			(compare_)
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, compareChannel	(compareChannel_)
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, borderColor		(borderColor_)
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, seamlessCubeMap	(seamlessCubeMap_)
26123da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry		, depthStencilMode	(depthStencilMode_)
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Sampler (void)
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: wrapS				(WRAPMODE_LAST)
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, wrapT				(WRAPMODE_LAST)
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, wrapR				(WRAPMODE_LAST)
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, minFilter			(FILTERMODE_LAST)
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, magFilter			(FILTERMODE_LAST)
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, lodThreshold		(0.0f)
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, normalizedCoords	(true)
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, compare			(COMPAREMODE_NONE)
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, compareChannel	(0)
275222c1cfbf44db3a0bd251ef230e55c3602e518ccJarkko Pöyry		, borderColor		(Vec4(0.0f, 0.0f, 0.0f, 0.0f))
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, seamlessCubeMap	(false)
27723da2952459e6df3511da00f2a6c548a1b442c92Jarkko Pöyry		, depthStencilMode	(MODE_DEPTH)
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
28093df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
28229340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi// Calculate pitches for pixel data with no padding.
28329340067e919854db7d50bb8c0b666117b229f5eMika IsojärviIVec3 calculatePackedPitch (const TextureFormat& format, const IVec3& size);
28429340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureLevel;
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Read-only pixel data access
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ConstPixelBufferAccess encapsulates pixel data pointer along with
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * format and layout information. It can be used for read-only access
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * to arbitrary pixel buffers.
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Access objects are like iterators or pointers. They can be passed around
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * as values and are valid as long as the storage doesn't change.
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ConstPixelBufferAccess
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							ConstPixelBufferAccess		(void);
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							ConstPixelBufferAccess		(const TextureLevel& level);
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							ConstPixelBufferAccess		(const TextureFormat& format, int width, int height, int depth, const void* data);
30329340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi							ConstPixelBufferAccess		(const TextureFormat& format, const IVec3& size, const void* data);
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							ConstPixelBufferAccess		(const TextureFormat& format, int width, int height, int depth, int rowPitch, int slicePitch, const void* data);
30529340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi							ConstPixelBufferAccess		(const TextureFormat& format, const IVec3& size, const IVec3& pitch, const void* data);
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
30729340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi	const TextureFormat&	getFormat					(void) const	{ return m_format;					}
30829340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi	const IVec3&			getSize						(void) const	{ return m_size;					}
30929340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi	int						getWidth					(void) const	{ return m_size.x();				}
31029340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi	int						getHeight					(void) const	{ return m_size.y();				}
31129340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi	int						getDepth					(void) const	{ return m_size.z();				}
3126c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	int						getPixelPitch				(void) const	{ return m_pitch.x();				}
31329340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi	int						getRowPitch					(void) const	{ return m_pitch.y();				}
31429340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi	int						getSlicePitch				(void) const	{ return m_pitch.z();				}
3156c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const IVec3&			getPitch					(void) const	{ return m_pitch;					}
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31729340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi	const void*				getDataPtr					(void) const	{ return m_data;					}
3186c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	const void*				getPixelPtr					(int x, int y, int z = 0) const { return (const deUint8*)m_data + x * m_pitch.x() + y * m_pitch.y() + z * m_pitch.z(); }
3196c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4					getPixel					(int x, int y, int z = 0) const;
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	IVec4					getPixelInt					(int x, int y, int z = 0) const;
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	UVec4					getPixelUint				(int x, int y, int z = 0) const { return getPixelInt(x, y, z).cast<deUint32>(); }
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	template<typename T>
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vector<T, 4>			getPixelT					(int x, int y, int z = 0) const;
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float					getPixDepth					(int x, int y, int z = 0) const;
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						getPixStencil				(int x, int y, int z = 0) const;
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4					sample1D					(const Sampler& sampler, Sampler::FilterMode filter, float s, int level) const;
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4					sample2D					(const Sampler& sampler, Sampler::FilterMode filter, float s, float t, int depth) const;
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4					sample3D					(const Sampler& sampler, Sampler::FilterMode filter, float s, float t, float r) const;
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4					sample1DOffset				(const Sampler& sampler, Sampler::FilterMode filter, float s, const IVec2& offset) const;
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4					sample2DOffset				(const Sampler& sampler, Sampler::FilterMode filter, float s, float t, const IVec3& offset) const;
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4					sample3DOffset				(const Sampler& sampler, Sampler::FilterMode filter, float s, float t, float r, const IVec3& offset) const;
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float					sample1DCompare				(const Sampler& sampler, Sampler::FilterMode filter, float ref, float s, const IVec2& offset) const;
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float					sample2DCompare				(const Sampler& sampler, Sampler::FilterMode filter, float ref, float s, float t, const IVec3& offset) const;
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureFormat			m_format;
34329340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi	IVec3					m_size;
34429340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi	IVec3					m_pitch;	//!< (pixelPitch, rowPitch, slicePitch)
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	mutable void*			m_data;
34693df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Read-write pixel data access
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * This class extends read-only access object by providing write functionality.
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \note PixelBufferAccess may not have any data members nor add any
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *		 virtual functions. It must be possible to reinterpret_cast<>
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *		 PixelBufferAccess to ConstPixelBufferAccess.
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass PixelBufferAccess : public ConstPixelBufferAccess
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
360becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi						PixelBufferAccess	(void) {}
361becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi						PixelBufferAccess	(TextureLevel& level);
362becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi						PixelBufferAccess	(const TextureFormat& format, int width, int height, int depth, void* data);
36329340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi						PixelBufferAccess	(const TextureFormat& format, const IVec3& size, void* data);
364becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi						PixelBufferAccess	(const TextureFormat& format, int width, int height, int depth, int rowPitch, int slicePitch, void* data);
36529340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi						PixelBufferAccess	(const TextureFormat& format, const IVec3& size, const IVec3& pitch, void* data);
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
367becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	void*				getDataPtr			(void) const { return m_data; }
3686c307165131fb7249bb044fc79ff0c2747263b3dJarkko Pöyry	void*				getPixelPtr			(int x, int y, int z = 0) const { return (deUint8*)m_data + x * m_pitch.x() + y * m_pitch.y() + z * m_pitch.z(); }
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
370becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	void				setPixel			(const tcu::Vec4& color, int x, int y, int z = 0) const;
371becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	void				setPixel			(const tcu::IVec4& color, int x, int y, int z = 0) const;
372becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	void				setPixel			(const tcu::UVec4& color, int x, int y, int z = 0) const { setPixel(color.cast<int>(), x, y, z); }
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
374becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	void				setPixDepth			(float depth, int x, int y, int z = 0) const;
375becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	void				setPixStencil		(int stencil, int x, int y, int z = 0) const;
37693df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Generic pixel data container
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * This container supports all valid TextureFormat combinations and
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * both 2D and 3D textures. To read or manipulate data access object must
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * be queried using getAccess().
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureLevel
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
388becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi								TextureLevel		(void);
389becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi								TextureLevel		(const TextureFormat& format);
390becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi								TextureLevel		(const TextureFormat& format, int width, int height, int depth = 1);
391becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi								~TextureLevel		(void);
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
39329340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi	const IVec3&				getSize				(void) const	{ return m_size;		}
39429340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi	int							getWidth			(void) const	{ return m_size.x();	}
39529340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi	int							getHeight			(void) const	{ return m_size.y();	}
39629340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi	int							getDepth			(void) const	{ return m_size.z();	}
39729340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi	bool						isEmpty				(void) const	{ return m_size.x() * m_size.y() * m_size.z() == 0; }
398becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	const TextureFormat			getFormat			(void) const	{ return m_format;	}
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
400becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	void						setStorage			(const TextureFormat& format, int width, int heigth, int depth = 1);
401becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	void						setSize				(int width, int height, int depth = 1);
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
40329340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi	PixelBufferAccess			getAccess			(void)			{ return PixelBufferAccess(m_format, m_size, calculatePackedPitch(m_format, m_size), getPtr());			}
40429340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi	ConstPixelBufferAccess		getAccess			(void) const	{ return ConstPixelBufferAccess(m_format, m_size, calculatePackedPitch(m_format, m_size), getPtr());	}
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
407becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	void*						getPtr				(void)			{ return m_data.getPtr(); }
408becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	const void*					getPtr				(void) const	{ return m_data.getPtr(); }
409becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi
410becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	TextureFormat				m_format;
41129340067e919854db7d50bb8c0b666117b229f5eMika Isojärvi	IVec3						m_size;
412becd5d53015521acf7536ba754de326d8b1da2f3Mika Isojärvi	de::ArrayBuffer<deUint8>	m_data;
4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	friend class ConstPixelBufferAccess;
41593df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4173c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4	sampleLevelArray1D				(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, int level, float lod);
4183c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4	sampleLevelArray2D				(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float t, int depth, float lod);
4193c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4	sampleLevelArray3D				(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float t, float r, float lod);
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4213c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4	sampleLevelArray1DOffset		(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float lod, const IVec2& offset);
4223c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4	sampleLevelArray2DOffset		(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float t, float lod, const IVec3& offset);
4233c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4	sampleLevelArray3DOffset		(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset);
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyryfloat	sampleLevelArray1DCompare		(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float ref, float s, float lod, const IVec2& offset);
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyryfloat	sampleLevelArray2DCompare		(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float ref, float s, float t, float lod, const IVec3& offset);
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4283c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4	gatherArray2DOffsets			(const ConstPixelBufferAccess& src, const Sampler& sampler, float s, float t, int depth, int componentNdx, const IVec2 (&offsets)[4]);
4293c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec4	gatherArray2DOffsetsCompare		(const ConstPixelBufferAccess& src, const Sampler& sampler, float ref, float s, float t, int depth, const IVec2 (&offsets)[4]);
4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum CubeFace
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CUBEFACE_NEGATIVE_X = 0,
4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CUBEFACE_POSITIVE_X,
4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CUBEFACE_NEGATIVE_Y,
4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CUBEFACE_POSITIVE_Y,
4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CUBEFACE_NEGATIVE_Z,
4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CUBEFACE_POSITIVE_Z,
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CUBEFACE_LAST
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Coordinates projected onto cube face.
4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytemplate<typename T>
4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct CubeFaceCoords
4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CubeFace		face;
4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	T				s;
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	T				t;
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					CubeFaceCoords		(CubeFace face_, T s_, T t_) : face(face_), s(s_), t(t_) {}
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					CubeFaceCoords		(CubeFace face_, const Vector<T, 2>& c) : face(face_), s(c.x()), t(c.y()) {}
45593df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytypedef CubeFaceCoords<float>	CubeFaceFloatCoords;
4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytypedef CubeFaceCoords<int>		CubeFaceIntCoords;
4593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4603c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCubeFace				selectCubeFace			(const Vec3& coords);
4613c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVec2					projectToFace			(CubeFace face, const Vec3& coords);
4623c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCubeFaceFloatCoords		getCubeFaceCoords		(const Vec3& coords);
4633c827367444ee418f129b2c238299f49d3264554Jarkko PoyryCubeFaceIntCoords		remapCubeEdgeCoords		(const CubeFaceIntCoords& coords, int size);
4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 1D Texture View
4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture1DView
4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture1DView		(int numLevels, const ConstPixelBufferAccess* levels);
4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLevels		(void) const	{ return m_numLevels;										}
4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_numLevels > 0 ? m_levels[0].getWidth()	: 0;	}
4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess&	getLevel			(int ndx) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx];	}
4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	getLevels			(void) const	{ return m_levels;											}
4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float lod) const;
4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float lod, deInt32 offset) const;
4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float lod) const;
4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float lod, deInt32 offset) const;
4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_numLevels;
4853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	m_levels;
48693df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
4873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Texture1DView::Texture1DView (int numLevels, const ConstPixelBufferAccess* levels)
4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: m_numLevels	(numLevels)
4903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_levels		(levels)
4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_numLevels >= 0 && ((m_numLevels == 0) == !m_levels));
4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture1DView::sample (const Sampler& sampler, float s, float lod) const
4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray1D(m_levels, m_numLevels, sampler, s, 0 /* depth */, lod);
4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture1DView::sampleOffset (const Sampler& sampler, float s, float lod, deInt32 offset) const
5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray1DOffset(m_levels, m_numLevels, sampler, s, lod, IVec2(offset, 0));
5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture1DView::sampleCompare (const Sampler& sampler, float ref, float s, float lod) const
5063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray1DCompare(m_levels, m_numLevels, sampler, ref, s, lod, IVec2(0, 0));
5083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5103c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture1DView::sampleCompareOffset (const Sampler& sampler, float ref, float s, float lod, deInt32 offset) const
5113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray1DCompare(m_levels, m_numLevels, sampler, ref, s, lod, IVec2(offset, 0));
5133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
5163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 2D Texture View
5173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
5183c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture2DView
5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture2DView		(int numLevels, const ConstPixelBufferAccess* levels);
5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLevels		(void) const	{ return m_numLevels;										}
5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_numLevels > 0 ? m_levels[0].getWidth()	: 0;	}
5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getHeight			(void) const	{ return m_numLevels > 0 ? m_levels[0].getHeight()	: 0;	}
5263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess&	getLevel			(int ndx) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx];	}
5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	getLevels			(void) const	{ return m_levels;											}
5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float lod) const;
5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float lod, const IVec2& offset) const;
5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float lod) const;
5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float lod, const IVec2& offset) const;
5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherOffsets		(const Sampler& sampler, float s, float t, int componentNdx, const IVec2 (&offsets)[4]) const;
5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherOffsetsCompare(const Sampler& sampler, float ref, float s, float t, const IVec2 (&offsets)[4]) const;
5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_numLevels;
5393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	m_levels;
54093df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Texture2DView::Texture2DView (int numLevels, const ConstPixelBufferAccess* levels)
5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: m_numLevels	(numLevels)
5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_levels		(levels)
5453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(m_numLevels >= 0 && ((m_numLevels == 0) == !m_levels));
5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2DView::sample (const Sampler& sampler, float s, float t, float lod) const
5503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray2D(m_levels, m_numLevels, sampler, s, t, 0 /* depth */, lod);
5523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2DView::sampleOffset (const Sampler& sampler, float s, float t, float lod, const IVec2& offset) const
5553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray2DOffset(m_levels, m_numLevels, sampler, s, t, lod, IVec3(offset.x(), offset.y(), 0));
5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture2DView::sampleCompare (const Sampler& sampler, float ref, float s, float t, float lod) const
5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray2DCompare(m_levels, m_numLevels, sampler, ref, s, t, lod, IVec3(0, 0, 0));
5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture2DView::sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float lod, const IVec2& offset) const
5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray2DCompare(m_levels, m_numLevels, sampler, ref, s, t, lod, IVec3(offset.x(), offset.y(), 0));
5673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2DView::gatherOffsets (const Sampler& sampler, float s, float t, int componentNdx, const IVec2 (&offsets)[4]) const
5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return gatherArray2DOffsets(m_levels[0], sampler, s, t, 0, componentNdx, offsets);
5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5743c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2DView::gatherOffsetsCompare (const Sampler& sampler, float ref, float s, float t, const IVec2 (&offsets)[4]) const
5753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return gatherArray2DOffsetsCompare(m_levels[0], sampler, ref, s, t, 0, offsets);
5773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Base class for textures that have single mip-map pyramid
5813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
5823c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureLevelPyramid
5833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5843c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
5853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									TextureLevelPyramid	(const TextureFormat& format, int numLevels);
5863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									TextureLevelPyramid	(const TextureLevelPyramid& other);
5873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									~TextureLevelPyramid(void);
5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const TextureFormat&			getFormat			(void) const			{ return m_format;					}
5903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool							isLevelEmpty		(int levelNdx) const	{ return m_data[levelNdx].empty();	}
5913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLevels		(void) const			{ return (int)m_access.size();		}
5933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess&	getLevel			(int ndx) const			{ return m_access[ndx];				}
5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const PixelBufferAccess&		getLevel			(int ndx)				{ return m_access[ndx];				}
5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	getLevels			(void) const			{ return &m_access[0];				}
5973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const PixelBufferAccess*		getLevels			(void)					{ return &m_access[0];				}
5983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							allocLevel			(int levelNdx, int width, int height, int depth);
6003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							clearLevel			(int levelNdx);
6013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureLevelPyramid&			operator=			(const TextureLevelPyramid& other);
6033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
6053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	typedef de::ArrayBuffer<deUint8> LevelData;
6063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureFormat					m_format;
6083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<LevelData>			m_data;
6093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<PixelBufferAccess>	m_access;
61093df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 1D Texture reference implementation
6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
6153c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture1D : private TextureLevelPyramid
6163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6173c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
6183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture1D			(const TextureFormat& format, int width);
6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture1D			(const Texture1D& other);
6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									~Texture1D			(void);
6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_width;	}
6233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const Texture1DView&			getView				(void) const	{ return m_view;	}
6243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							allocLevel			(int levelNdx);
6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Sampling
6283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float lod) const;
6293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float lod, deInt32 offset) const;
6303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getFormat;
6323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getNumLevels;
6333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getLevel;
6343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::clearLevel;
6353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::isLevelEmpty;
6363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture1D&						operator=			(const Texture1D& other);
6383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operator Texture1DView (void) const { return m_view; }
6403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6413c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
6423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_width;
6433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture1DView					m_view;
64493df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture1D::sample (const Sampler& sampler, float s, float lod) const
6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sample(sampler, s, lod);
6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture1D::sampleOffset (const Sampler& sampler, float s, float lod, deInt32 offset) const
6523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleOffset(sampler, s, lod, offset);
6543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
6573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 2D Texture reference implementation
6583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
6593c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture2D : private TextureLevelPyramid
6603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6613c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
6623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture2D			(const TextureFormat& format, int width, int height);
6633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture2D			(const Texture2D& other);
6643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									~Texture2D			(void);
6653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_width;	}
6673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getHeight			(void) const	{ return m_height;	}
6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const Texture2DView&			getView				(void) const	{ return m_view;	}
6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							allocLevel			(int levelNdx);
6713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Sampling
6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float lod) const;
6743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float lod, const IVec2& offset) const;
6753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float lod) const;
6763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float lod, const IVec2& offset) const;
6773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherOffsets		(const Sampler& sampler, float s, float t, int componentNdx, const IVec2 (&offsets)[4]) const;
6793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherOffsetsCompare(const Sampler& sampler, float ref, float s, float t, const IVec2 (&offsets)[4]) const;
6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getFormat;
6823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getNumLevels;
6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getLevel;
6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::clearLevel;
6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::isLevelEmpty;
6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture2D&						operator=			(const Texture2D& other);
6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operator Texture2DView (void) const { return m_view; }
6903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_width;
6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_height;
6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture2DView					m_view;
69593df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
6963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6973c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2D::sample (const Sampler& sampler, float s, float t, float lod) const
6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sample(sampler, s, t, lod);
7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2D::sampleOffset (const Sampler& sampler, float s, float t, float lod, const IVec2& offset) const
7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleOffset(sampler, s, t, lod, offset);
7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture2D::sampleCompare (const Sampler& sampler, float ref, float s, float t, float lod) const
7083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleCompare(sampler, ref, s, t, lod);
7103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture2D::sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float lod, const IVec2& offset) const
7133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleCompareOffset(sampler, ref, s, t, lod, offset);
7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2D::gatherOffsets (const Sampler& sampler, float s, float t, int componentNdx, const IVec2 (&offsets)[4]) const
7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.gatherOffsets(sampler, s, t, componentNdx, offsets);
7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2D::gatherOffsetsCompare (const Sampler& sampler, float ref, float s, float t, const IVec2 (&offsets)[4]) const
7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.gatherOffsetsCompare(sampler, ref, s, t, offsets);
7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Cube Map Texture View
7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureCubeView
7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									TextureCubeView		(void);
7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									TextureCubeView		(int numLevels, const ConstPixelBufferAccess* const (&levels)[CUBEFACE_LAST]);
7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLevels		(void) const	{ return m_numLevels;										}
7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getSize				(void) const	{ return m_numLevels > 0 ? m_levels[0][0].getWidth() : 0;	}
7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess&	getLevelFace		(int ndx, CubeFace face) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[face][ndx];	}
7393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	getFaceLevels		(CubeFace face) const			{ return m_levels[face];					}
7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float p, float lod) const;
7423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float r, float lod) const;
7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gather				(const Sampler& sampler, float s, float t, float r, int componentNdx) const;
7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherCompare		(const Sampler& sampler, float ref, float s, float t, float r) const;
7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_numLevels;
7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	m_levels[CUBEFACE_LAST];
75093df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Cube Map Texture reference implementation
7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureCube
7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
7583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									TextureCube			(const TextureFormat& format, int size);
7593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									TextureCube			(const TextureCube& other);
7603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									~TextureCube		(void);
7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const TextureFormat&			getFormat			(void) const	{ return m_format;	}
7633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getSize				(void) const	{ return m_size;	}
7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLevels		(void) const					{ return (int)m_access[0].size();	}
7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess&	getLevelFace		(int ndx, CubeFace face) const	{ return m_access[face][ndx];		}
7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const PixelBufferAccess&		getLevelFace		(int ndx, CubeFace face)		{ return m_access[face][ndx];		}
7683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							allocLevel			(CubeFace face, int levelNdx);
7703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							clearLevel			(CubeFace face, int levelNdx);
7713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool							isLevelEmpty		(CubeFace face, int levelNdx) const		{ return m_data[face][levelNdx].empty();	}
7723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float p, float lod) const;
7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float r, float lod) const;
7753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gather				(const Sampler& sampler, float s, float t, float r, int componentNdx) const;
7773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherCompare		(const Sampler& sampler, float ref, float s, float t, float r) const;
7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureCube&					operator=			(const TextureCube& other);
7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operator TextureCubeView (void) const { return m_view; }
7823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7833c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
7843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	typedef de::ArrayBuffer<deUint8> LevelData;
7853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureFormat					m_format;
7873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_size;
7883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<LevelData>			m_data[CUBEFACE_LAST];
7893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<PixelBufferAccess>	m_access[CUBEFACE_LAST];
7903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureCubeView					m_view;
79193df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
7923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7933c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 TextureCube::sample (const Sampler& sampler, float s, float t, float p, float lod) const
7943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sample(sampler, s, t, p, lod);
7963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7983c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float TextureCube::sampleCompare (const Sampler& sampler, float ref, float s, float t, float r, float lod) const
7993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleCompare(sampler, ref, s, t, r, lod);
8013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8033c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 TextureCube::gather (const Sampler& sampler, float s, float t, float r, int componentNdx) const
8043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.gather(sampler, s, t, r, componentNdx);
8063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8083c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 TextureCube::gatherCompare (const Sampler& sampler, float ref, float s, float t, float r) const
8093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.gatherCompare(sampler, ref, s, t, r);
8113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
8143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 1D Array Texture View
8153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
8163c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture1DArrayView
8173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8183c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
8193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture1DArrayView	(int numLevels, const ConstPixelBufferAccess* levels);
8203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_numLevels > 0 ? m_levels[0].getWidth()	: 0;	}
8223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLayers		(void) const	{ return m_numLevels > 0 ? m_levels[0].getHeight()	: 0;	}
8233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLevels		(void) const	{ return m_numLevels;										}
8243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess&	getLevel			(int ndx) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx];	}
8253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	getLevels			(void) const	{ return m_levels;											}
8263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float lod) const;
8283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float lod, deInt32 offset) const;
8293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float lod) const;
8303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float lod, deInt32 offset) const;
8313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8323c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
8333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								selectLayer			(float r) const;
8343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_numLevels;
8363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	m_levels;
83793df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
8383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
8403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 2D Array Texture View
8413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
8423c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture2DArrayView
8433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8443c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
8453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture2DArrayView	(int numLevels, const ConstPixelBufferAccess* levels);
8463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_numLevels > 0 ? m_levels[0].getWidth()	: 0;	}
8483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getHeight			(void) const	{ return m_numLevels > 0 ? m_levels[0].getHeight()	: 0;	}
8493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLayers		(void) const	{ return m_numLevels > 0 ? m_levels[0].getDepth()	: 0;	}
8503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLevels		(void) const	{ return m_numLevels;										}
8513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess&	getLevel			(int ndx) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx];	}
8523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	getLevels			(void) const	{ return m_levels;											}
8533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float r, float lod) const;
8553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float r, float lod, const IVec2& offset) const;
8563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float r, float lod) const;
8573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float r, float lod, const IVec2& offset) const;
8583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherOffsets		(const Sampler& sampler, float s, float t, float r, int componentNdx, const IVec2 (&offsets)[4]) const;
8603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherOffsetsCompare(const Sampler& sampler, float ref, float s, float t, float r, const IVec2 (&offsets)[4]) const;
8613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8623c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
8633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								selectLayer			(float r) const;
8643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_numLevels;
8663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	m_levels;
86793df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
8683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
8703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 1D Array Texture reference implementation
8713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
8723c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture1DArray : private TextureLevelPyramid
8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture1DArray		(const TextureFormat& format, int width, int numLayers);
8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture1DArray		(const Texture1DArray& other);
8773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									~Texture1DArray		(void);
8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_width;		}
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 lod) const;
8913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float lod, deInt32 offset) const;
8923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float lod) const;
8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float lod, deInt32 offset) const;
8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture1DArray&					operator=			(const Texture1DArray& other);
8963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operator Texture1DArrayView (void) const { return m_view; }
8983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
9003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_width;
9013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_numLayers;
9023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture1DArrayView				m_view;
90393df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
9043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9053c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture1DArray::sample (const Sampler& sampler, float s, float t, float lod) const
9063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sample(sampler, s, t, lod);
9083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9103c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture1DArray::sampleOffset (const Sampler& sampler, float s, float t, float lod, deInt32 offset) const
9113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleOffset(sampler, s, t, lod, offset);
9133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9153c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture1DArray::sampleCompare (const Sampler& sampler, float ref, float s, float t, float lod) const
9163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleCompare(sampler, ref, s, t, lod);
9183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture1DArray::sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float lod, deInt32 offset) const
9213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleCompareOffset(sampler, ref, s, t, lod, offset);
9233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
9263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 2D Array Texture reference implementation
9273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
9283c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture2DArray : private TextureLevelPyramid
9293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9303c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
9313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture2DArray		(const TextureFormat& format, int width, int height, int numLayers);
9323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture2DArray		(const Texture2DArray& other);
9333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									~Texture2DArray		(void);
9343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_width;		}
9363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getHeight			(void) const	{ return m_height;		}
9373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLayers		(void) const	{ return m_numLayers;	}
9383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							allocLevel			(int levelNdx);
9403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getFormat;
9423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getNumLevels;
9433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getLevel;
9443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::clearLevel;
9453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::isLevelEmpty;
9463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float r, float lod) const;
9483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float r, float lod, const IVec2& offset) const;
9493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float r, float lod) const;
9503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float r, float lod, const IVec2& offset) const;
9513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherOffsets		(const Sampler& sampler, float s, float t, float r, int componentNdx, const IVec2 (&offsets)[4]) const;
9533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							gatherOffsetsCompare(const Sampler& sampler, float ref, float s, float t, float r, const IVec2 (&offsets)[4]) const;
9543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture2DArray&					operator=			(const Texture2DArray& other);
9563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operator Texture2DArrayView (void) const { return m_view; }
9583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9593c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
9603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_width;
9613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_height;
9623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_numLayers;
9633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture2DArrayView				m_view;
96493df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
9653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9663c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2DArray::sample (const Sampler& sampler, float s, float t, float r, float lod) const
9673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sample(sampler, s, t, r, lod);
9693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9713c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2DArray::sampleOffset (const Sampler& sampler, float s, float t, float r, float lod, const IVec2& offset) const
9723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleOffset(sampler, s, t, r, lod, offset);
9743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9763c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture2DArray::sampleCompare (const Sampler& sampler, float ref, float s, float t, float r, float lod) const
9773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleCompare(sampler, ref, s, t, r, lod);
9793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9813c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float Texture2DArray::sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float r, float lod, const IVec2& offset) const
9823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleCompareOffset(sampler, ref, s, t, r, lod, offset);
9843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9863c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2DArray::gatherOffsets (const Sampler& sampler, float s, float t, float r, int componentNdx, const IVec2 (&offsets)[4]) const
9873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.gatherOffsets(sampler, s, t, r, componentNdx, offsets);
9893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9913c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture2DArray::gatherOffsetsCompare (const Sampler& sampler, float ref, float s, float t, float r, const IVec2 (&offsets)[4]) const
9923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.gatherOffsetsCompare(sampler, ref, s, t, r, offsets);
9943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
9973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 3D Texture View
9983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
9993c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture3DView
10003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10013c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
10023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture3DView		(int numLevels, const ConstPixelBufferAccess* levels);
10033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_numLevels > 0 ? m_levels[0].getWidth()	: 0;	}
10053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getHeight			(void) const	{ return m_numLevels > 0 ? m_levels[0].getHeight()	: 0;	}
10063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getDepth			(void) const	{ return m_numLevels > 0 ? m_levels[0].getDepth()	: 0;	}
10073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLevels		(void) const	{ return m_numLevels;										}
10083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess&	getLevel			(int ndx) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx];	}
10093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	getLevels			(void) const	{ return m_levels;											}
10103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float r, float lod) const;
10123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset) const;
10133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10143c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
10153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_numLevels;
10163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	m_levels;
101793df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
10183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10193c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture3DView::sample (const Sampler& sampler, float s, float t, float r, float lod) const
10203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray3D(m_levels, m_numLevels, sampler, s, t, r, lod);
10223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10243c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture3DView::sampleOffset (const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset) const
10253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return sampleLevelArray3DOffset(m_levels, m_numLevels, sampler, s, t, r, lod, offset);
10273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
10303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief 3D Texture reference implementation
10313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
10323c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Texture3D : private TextureLevelPyramid
10333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10343c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
10353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture3D			(const TextureFormat& format, int width, int height, int depth);
10363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									Texture3D			(const Texture3D& other);
10373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									~Texture3D			(void);
10383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getWidth			(void) const	{ return m_width;	}
10403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getHeight			(void) const	{ return m_height;	}
10413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getDepth			(void) const	{ return m_depth;	}
10423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							allocLevel			(int levelNdx);
10443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getFormat;
10463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getNumLevels;
10473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getLevel;
10483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::clearLevel;
10493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::isLevelEmpty;
10503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float r, float lod) const;
10523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset) const;
10533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture3D&						operator=			(const Texture3D& other);
10553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operator Texture3DView (void) const { return m_view; }
10573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10583c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
10593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_width;
10603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_height;
10613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_depth;
10623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Texture3DView					m_view;
106393df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
10643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10653c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture3D::sample (const Sampler& sampler, float s, float t, float r, float lod) const
10663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sample(sampler, s, t, r, lod);
10683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10703c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 Texture3D::sampleOffset (const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset) const
10713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleOffset(sampler, s, t, r, lod, offset);
10733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
10763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Cube Map Array Texture View
10773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
10783c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureCubeArrayView
10793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10803c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
10813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									TextureCubeArrayView	(int numLevels, const ConstPixelBufferAccess* levels);
10823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	int								getSize					(void) const	{ return m_numLevels > 0 ? m_levels[0].getWidth()	: 0;	}
10848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	int								getDepth				(void) const	{ return m_numLevels > 0 ? m_levels[0].getDepth()	: 0;	}
10858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	int								getNumLayers			(void) const	{ return getDepth()	/ 6;	}
10863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								getNumLevels			(void) const	{ return m_numLevels;										}
10873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess&	getLevel				(int ndx) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx];	}
10883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	getLevels				(void) const	{ return m_levels;											}
10893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample					(const Sampler& sampler, float s, float t, float r, float q, float lod) const;
10913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset			(const Sampler& sampler, float s, float t, float r, float q, float lod, const IVec2& offset) const;
10923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare			(const Sampler& sampler, float ref, float s, float t, float r, float q, float lod) const;
10933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompareOffset		(const Sampler& sampler, float ref, float s, float t, float r, float q, float lod, const IVec2& offset) const;
10943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
10968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	int								selectLayer				(float q) const;
10973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_numLevels;
10993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const ConstPixelBufferAccess*	m_levels;
110093df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
11013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
11033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Cube Map Array Texture reference implementation
11043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
11053c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureCubeArray : private TextureLevelPyramid
11063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11073c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
11088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry									TextureCubeArray	(const TextureFormat& format, int size, int depth);
11093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									TextureCubeArray	(const TextureCubeArray& other);
11103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									~TextureCubeArray	(void);
11113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	int								getSize				(void) const	{ return m_size;	}
11138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	int								getDepth			(void) const	{ return m_depth;	}
11143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							allocLevel			(int levelNdx);
11163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getFormat;
11183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getNumLevels;
11193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::getLevel;
11203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::clearLevel;
11213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureLevelPyramid::isLevelEmpty;
11223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sample				(const Sampler& sampler, float s, float t, float r, float q, float lod) const;
11243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float r, float q, float lod, const IVec2& offset) const;
11253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float r, float q, float lod) const;
11263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float r, float q, float lod, const IVec2& offset) const;
11273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureCubeArray&				operator=			(const TextureCubeArray& other);
11293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	operator TextureCubeArrayView (void) const { return m_view; }
11313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11323c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
11333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_size;
11348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	int								m_depth;
11353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureCubeArrayView			m_view;
113693df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
11373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11383c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 TextureCubeArray::sample (const Sampler& sampler, float s, float t, float r, float q, float lod) const
11393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sample(sampler, s, t, r, q, lod);
11413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11433c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline Vec4 TextureCubeArray::sampleOffset (const Sampler& sampler, float s, float t, float r, float q, float lod, const IVec2& offset) const
11443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleOffset(sampler, s, t, r, q, lod, offset);
11463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11483c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float TextureCubeArray::sampleCompare (const Sampler& sampler, float ref, float s, float t, float r, float q, float lod) const
11493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleCompare(sampler, ref, s, t, r, q, lod);
11513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11533c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float TextureCubeArray::sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float r, float q, float lod, const IVec2& offset) const
11543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return m_view.sampleCompareOffset(sampler, ref, s, t, r, q, lod, offset);
11563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Stream operators.
11593c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystd::ostream&		operator<<		(std::ostream& str, TextureFormat::ChannelOrder order);
11603c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystd::ostream&		operator<<		(std::ostream& str, TextureFormat::ChannelType type);
11613c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystd::ostream&		operator<<		(std::ostream& str, TextureFormat format);
11623c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystd::ostream&		operator<<		(std::ostream& str, CubeFace face);
11633c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystd::ostream&		operator<<		(std::ostream& str, const ConstPixelBufferAccess& access);
11643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // tcu
11663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif // _TCUTEXTURE_HPP
1168