Home | History | Annotate | Download | only in common
      1 #ifndef _TCUTEXTURE_HPP
      2 #define _TCUTEXTURE_HPP
      3 /*-------------------------------------------------------------------------
      4  * drawElements Quality Program Tester Core
      5  * ----------------------------------------
      6  *
      7  * Copyright 2014 The Android Open Source Project
      8  *
      9  * Licensed under the Apache License, Version 2.0 (the "License");
     10  * you may not use this file except in compliance with the License.
     11  * You may obtain a copy of the License at
     12  *
     13  *      http://www.apache.org/licenses/LICENSE-2.0
     14  *
     15  * Unless required by applicable law or agreed to in writing, software
     16  * distributed under the License is distributed on an "AS IS" BASIS,
     17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     18  * See the License for the specific language governing permissions and
     19  * limitations under the License.
     20  *
     21  *//*!
     22  * \file
     23  * \brief Reference Texture Implementation.
     24  *//*--------------------------------------------------------------------*/
     25 
     26 #include "tcuDefs.hpp"
     27 #include "tcuVector.hpp"
     28 #include "rrGenericVector.hpp"
     29 #include "deArrayBuffer.hpp"
     30 
     31 #include <vector>
     32 #include <ostream>
     33 
     34 namespace tcu
     35 {
     36 
     37 /*--------------------------------------------------------------------*//*!
     38  * \brief Texture format
     39  *//*--------------------------------------------------------------------*/
     40 class TextureFormat
     41 {
     42 public:
     43 	enum ChannelOrder
     44 	{
     45 		R = 0,
     46 		A,
     47 		I,
     48 		L,
     49 		LA,
     50 		RG,
     51 		RA,
     52 		RGB,
     53 		RGBA,
     54 		ARGB,
     55 		BGR,
     56 		BGRA,
     57 
     58 		sR,
     59 		sRG,
     60 		sRGB,
     61 		sRGBA,
     62 		sBGR,
     63 		sBGRA,
     64 
     65 		D,
     66 		S,
     67 		DS,
     68 
     69 		CHANNELORDER_LAST
     70 	};
     71 
     72 	enum ChannelType
     73 	{
     74 		SNORM_INT8 = 0,
     75 		SNORM_INT16,
     76 		SNORM_INT32,
     77 		UNORM_INT8,
     78 		UNORM_INT16,
     79 		UNORM_INT24,
     80 		UNORM_INT32,
     81 		UNORM_BYTE_44,
     82 		UNORM_SHORT_565,
     83 		UNORM_SHORT_555,
     84 		UNORM_SHORT_4444,
     85 		UNORM_SHORT_5551,
     86 		UNORM_SHORT_1555,
     87 		UNORM_INT_101010,
     88 		SNORM_INT_1010102_REV,
     89 		UNORM_INT_1010102_REV,
     90 		UNSIGNED_BYTE_44,
     91 		UNSIGNED_SHORT_565,
     92 		UNSIGNED_SHORT_4444,
     93 		UNSIGNED_SHORT_5551,
     94 		SIGNED_INT_1010102_REV,
     95 		UNSIGNED_INT_1010102_REV,
     96 		UNSIGNED_INT_11F_11F_10F_REV,
     97 		UNSIGNED_INT_999_E5_REV,
     98 		UNSIGNED_INT_16_8_8,
     99 		UNSIGNED_INT_24_8,
    100 		UNSIGNED_INT_24_8_REV,
    101 		SIGNED_INT8,
    102 		SIGNED_INT16,
    103 		SIGNED_INT32,
    104 		UNSIGNED_INT8,
    105 		UNSIGNED_INT16,
    106 		UNSIGNED_INT24,
    107 		UNSIGNED_INT32,
    108 		HALF_FLOAT,
    109 		FLOAT,
    110 		FLOAT64,
    111 		FLOAT_UNSIGNED_INT_24_8_REV,
    112 
    113 		CHANNELTYPE_LAST
    114 	};
    115 
    116 	ChannelOrder	order;
    117 	ChannelType		type;
    118 
    119 	TextureFormat (ChannelOrder order_, ChannelType type_)
    120 		: order	(order_)
    121 		, type	(type_)
    122 	{
    123 	}
    124 
    125 	TextureFormat (void)
    126 		: order	(CHANNELORDER_LAST)
    127 		, type	(CHANNELTYPE_LAST)
    128 	{
    129 	}
    130 
    131 	int getPixelSize (void) const; //!< Deprecated, use tcu::getPixelSize(fmt)
    132 
    133 	bool operator== (const TextureFormat& other) const { return !(*this != other); }
    134 	bool operator!= (const TextureFormat& other) const
    135 	{
    136 		return (order != other.order || type != other.type);
    137 	}
    138 } DE_WARN_UNUSED_TYPE;
    139 
    140 bool	isValid			(TextureFormat format);
    141 int		getPixelSize	(TextureFormat format);
    142 
    143 /*--------------------------------------------------------------------*//*!
    144  * \brief Texture swizzle
    145  *//*--------------------------------------------------------------------*/
    146 struct TextureSwizzle
    147 {
    148 	enum Channel
    149 	{
    150 		// \note CHANNEL_N must equal int N
    151 		CHANNEL_0 = 0,
    152 		CHANNEL_1,
    153 		CHANNEL_2,
    154 		CHANNEL_3,
    155 
    156 		CHANNEL_ZERO,
    157 		CHANNEL_ONE,
    158 
    159 		CHANNEL_LAST
    160 	};
    161 
    162 	Channel components[4];
    163 };
    164 
    165 //! get the swizzle used to expand texture data with a given channel order to RGBA form
    166 const TextureSwizzle& getChannelReadSwizzle		(TextureFormat::ChannelOrder order);
    167 
    168 //! get the swizzle used to narrow RGBA form data to native texture data with a given channel order
    169 const TextureSwizzle& getChannelWriteSwizzle	(TextureFormat::ChannelOrder order);
    170 
    171 /*--------------------------------------------------------------------*//*!
    172  * \brief Sampling parameters
    173  *//*--------------------------------------------------------------------*/
    174 class Sampler
    175 {
    176 public:
    177 	enum WrapMode
    178 	{
    179 		CLAMP_TO_EDGE = 0,	//! Clamp to edge
    180 		CLAMP_TO_BORDER,	//! Use border color at edge
    181 		REPEAT_GL,			//! Repeat with OpenGL semantics
    182 		REPEAT_CL,			//! Repeat with OpenCL semantics
    183 		MIRRORED_REPEAT_GL,	//! Mirrored repeat with OpenGL semantics
    184 		MIRRORED_REPEAT_CL, //! Mirrored repeat with OpenCL semantics
    185 		MIRRORED_ONCE,		//! Mirrored once in negative directions
    186 
    187 		WRAPMODE_LAST
    188 	};
    189 
    190 	enum FilterMode
    191 	{
    192 		NEAREST = 0,
    193 		LINEAR,
    194 
    195 		NEAREST_MIPMAP_NEAREST,
    196 		NEAREST_MIPMAP_LINEAR,
    197 		LINEAR_MIPMAP_NEAREST,
    198 		LINEAR_MIPMAP_LINEAR,
    199 
    200 		FILTERMODE_LAST
    201 	};
    202 
    203 	enum CompareMode
    204 	{
    205 		COMPAREMODE_NONE = 0,
    206 		COMPAREMODE_LESS,
    207 		COMPAREMODE_LESS_OR_EQUAL,
    208 		COMPAREMODE_GREATER,
    209 		COMPAREMODE_GREATER_OR_EQUAL,
    210 		COMPAREMODE_EQUAL,
    211 		COMPAREMODE_NOT_EQUAL,
    212 		COMPAREMODE_ALWAYS,
    213 		COMPAREMODE_NEVER,
    214 
    215 		COMPAREMODE_LAST
    216 	};
    217 
    218 	enum DepthStencilMode
    219 	{
    220 		MODE_DEPTH = 0,
    221 		MODE_STENCIL,
    222 
    223 		MODE_LAST
    224 	};
    225 
    226 	// Wrap control
    227 	WrapMode			wrapS;
    228 	WrapMode			wrapT;
    229 	WrapMode			wrapR;
    230 
    231 	// Minifcation & magnification
    232 	FilterMode			minFilter;
    233 	FilterMode			magFilter;
    234 	float				lodThreshold;		// lod <= lodThreshold ? magnified : minified
    235 
    236 	// Coordinate normalization
    237 	bool				normalizedCoords;
    238 
    239 	// Shadow comparison
    240 	CompareMode			compare;
    241 	int					compareChannel;
    242 
    243 	// Border color.
    244 	// \note It is setter's responsibility to guarantee that the values are representable
    245 	//       in sampled texture's internal format.
    246 	// \note It is setter's responsibility to guarantee that the format is compatible with the
    247 	//       sampled texture's internal format. Otherwise results are undefined.
    248 	rr::GenericVec4		borderColor;
    249 
    250 	// Seamless cube map filtering
    251 	bool				seamlessCubeMap;
    252 
    253 	// Depth stencil mode
    254 	DepthStencilMode	depthStencilMode;
    255 
    256 	Sampler (WrapMode			wrapS_,
    257 			 WrapMode			wrapT_,
    258 			 WrapMode			wrapR_,
    259 			 FilterMode			minFilter_,
    260 			 FilterMode			magFilter_,
    261 			 float				lodThreshold_		= 0.0f,
    262 			 bool				normalizedCoords_	= true,
    263 			 CompareMode		compare_			= COMPAREMODE_NONE,
    264 			 int				compareChannel_		= 0,
    265 			 const Vec4&		borderColor_		= Vec4(0.0f, 0.0f, 0.0f, 0.0f),
    266 			 bool				seamlessCubeMap_	= false,
    267 			 DepthStencilMode	depthStencilMode_	= MODE_DEPTH)
    268 		: wrapS				(wrapS_)
    269 		, wrapT				(wrapT_)
    270 		, wrapR				(wrapR_)
    271 		, minFilter			(minFilter_)
    272 		, magFilter			(magFilter_)
    273 		, lodThreshold		(lodThreshold_)
    274 		, normalizedCoords	(normalizedCoords_)
    275 		, compare			(compare_)
    276 		, compareChannel	(compareChannel_)
    277 		, borderColor		(borderColor_)
    278 		, seamlessCubeMap	(seamlessCubeMap_)
    279 		, depthStencilMode	(depthStencilMode_)
    280 	{
    281 	}
    282 
    283 	Sampler (void)
    284 		: wrapS				(WRAPMODE_LAST)
    285 		, wrapT				(WRAPMODE_LAST)
    286 		, wrapR				(WRAPMODE_LAST)
    287 		, minFilter			(FILTERMODE_LAST)
    288 		, magFilter			(FILTERMODE_LAST)
    289 		, lodThreshold		(0.0f)
    290 		, normalizedCoords	(true)
    291 		, compare			(COMPAREMODE_NONE)
    292 		, compareChannel	(0)
    293 		, borderColor		(Vec4(0.0f, 0.0f, 0.0f, 0.0f))
    294 		, seamlessCubeMap	(false)
    295 		, depthStencilMode	(MODE_DEPTH)
    296 	{
    297 	}
    298 } DE_WARN_UNUSED_TYPE;
    299 
    300 // Calculate pitches for pixel data with no padding.
    301 IVec3 calculatePackedPitch (const TextureFormat& format, const IVec3& size);
    302 
    303 class TextureLevel;
    304 
    305 /*--------------------------------------------------------------------*//*!
    306  * \brief Read-only pixel data access
    307  *
    308  * ConstPixelBufferAccess encapsulates pixel data pointer along with
    309  * format and layout information. It can be used for read-only access
    310  * to arbitrary pixel buffers.
    311  *
    312  * Access objects are like iterators or pointers. They can be passed around
    313  * as values and are valid as long as the storage doesn't change.
    314  *//*--------------------------------------------------------------------*/
    315 class ConstPixelBufferAccess
    316 {
    317 public:
    318 							ConstPixelBufferAccess		(void);
    319 							ConstPixelBufferAccess		(const TextureLevel& level);
    320 							ConstPixelBufferAccess		(const TextureFormat& format, int width, int height, int depth, const void* data);
    321 							ConstPixelBufferAccess		(const TextureFormat& format, const IVec3& size, const void* data);
    322 							ConstPixelBufferAccess		(const TextureFormat& format, int width, int height, int depth, int rowPitch, int slicePitch, const void* data);
    323 							ConstPixelBufferAccess		(const TextureFormat& format, const IVec3& size, const IVec3& pitch, const void* data);
    324 
    325 	const TextureFormat&	getFormat					(void) const	{ return m_format;					}
    326 	const IVec3&			getSize						(void) const	{ return m_size;					}
    327 	int						getWidth					(void) const	{ return m_size.x();				}
    328 	int						getHeight					(void) const	{ return m_size.y();				}
    329 	int						getDepth					(void) const	{ return m_size.z();				}
    330 	int						getPixelPitch				(void) const	{ return m_pitch.x();				}
    331 	int						getRowPitch					(void) const	{ return m_pitch.y();				}
    332 	int						getSlicePitch				(void) const	{ return m_pitch.z();				}
    333 	const IVec3&			getPitch					(void) const	{ return m_pitch;					}
    334 
    335 	const void*				getDataPtr					(void) const	{ return m_data;					}
    336 	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(); }
    337 
    338 	Vec4					getPixel					(int x, int y, int z = 0) const;
    339 	IVec4					getPixelInt					(int x, int y, int z = 0) const;
    340 	UVec4					getPixelUint				(int x, int y, int z = 0) const { return getPixelInt(x, y, z).cast<deUint32>(); }
    341 
    342 	template<typename T>
    343 	Vector<T, 4>			getPixelT					(int x, int y, int z = 0) const;
    344 
    345 	float					getPixDepth					(int x, int y, int z = 0) const;
    346 	int						getPixStencil				(int x, int y, int z = 0) const;
    347 
    348 	Vec4					sample1D					(const Sampler& sampler, Sampler::FilterMode filter, float s, int level) const;
    349 	Vec4					sample2D					(const Sampler& sampler, Sampler::FilterMode filter, float s, float t, int depth) const;
    350 	Vec4					sample3D					(const Sampler& sampler, Sampler::FilterMode filter, float s, float t, float r) const;
    351 
    352 	Vec4					sample1DOffset				(const Sampler& sampler, Sampler::FilterMode filter, float s, const IVec2& offset) const;
    353 	Vec4					sample2DOffset				(const Sampler& sampler, Sampler::FilterMode filter, float s, float t, const IVec3& offset) const;
    354 	Vec4					sample3DOffset				(const Sampler& sampler, Sampler::FilterMode filter, float s, float t, float r, const IVec3& offset) const;
    355 
    356 	float					sample1DCompare				(const Sampler& sampler, Sampler::FilterMode filter, float ref, float s, const IVec2& offset) const;
    357 	float					sample2DCompare				(const Sampler& sampler, Sampler::FilterMode filter, float ref, float s, float t, const IVec3& offset) const;
    358 
    359 protected:
    360 	TextureFormat			m_format;
    361 	IVec3					m_size;
    362 	IVec3					m_pitch;	//!< (pixelPitch, rowPitch, slicePitch)
    363 	mutable void*			m_data;
    364 } DE_WARN_UNUSED_TYPE;
    365 
    366 /*--------------------------------------------------------------------*//*!
    367  * \brief Read-write pixel data access
    368  *
    369  * This class extends read-only access object by providing write functionality.
    370  *
    371  * \note PixelBufferAccess may not have any data members nor add any
    372  *		 virtual functions. It must be possible to reinterpret_cast<>
    373  *		 PixelBufferAccess to ConstPixelBufferAccess.
    374  *//*--------------------------------------------------------------------*/
    375 class PixelBufferAccess : public ConstPixelBufferAccess
    376 {
    377 public:
    378 						PixelBufferAccess	(void) {}
    379 						PixelBufferAccess	(TextureLevel& level);
    380 						PixelBufferAccess	(const TextureFormat& format, int width, int height, int depth, void* data);
    381 						PixelBufferAccess	(const TextureFormat& format, const IVec3& size, void* data);
    382 						PixelBufferAccess	(const TextureFormat& format, int width, int height, int depth, int rowPitch, int slicePitch, void* data);
    383 						PixelBufferAccess	(const TextureFormat& format, const IVec3& size, const IVec3& pitch, void* data);
    384 
    385 	void*				getDataPtr			(void) const { return m_data; }
    386 	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(); }
    387 
    388 	void				setPixel			(const tcu::Vec4& color, int x, int y, int z = 0) const;
    389 	void				setPixel			(const tcu::IVec4& color, int x, int y, int z = 0) const;
    390 	void				setPixel			(const tcu::UVec4& color, int x, int y, int z = 0) const { setPixel(color.cast<int>(), x, y, z); }
    391 
    392 	void				setPixDepth			(float depth, int x, int y, int z = 0) const;
    393 	void				setPixStencil		(int stencil, int x, int y, int z = 0) const;
    394 } DE_WARN_UNUSED_TYPE;
    395 
    396 /*--------------------------------------------------------------------*//*!
    397  * \brief Generic pixel data container
    398  *
    399  * This container supports all valid TextureFormat combinations and
    400  * both 2D and 3D textures. To read or manipulate data access object must
    401  * be queried using getAccess().
    402  *//*--------------------------------------------------------------------*/
    403 class TextureLevel
    404 {
    405 public:
    406 								TextureLevel		(void);
    407 								TextureLevel		(const TextureFormat& format);
    408 								TextureLevel		(const TextureFormat& format, int width, int height, int depth = 1);
    409 								~TextureLevel		(void);
    410 
    411 	const IVec3&				getSize				(void) const	{ return m_size;		}
    412 	int							getWidth			(void) const	{ return m_size.x();	}
    413 	int							getHeight			(void) const	{ return m_size.y();	}
    414 	int							getDepth			(void) const	{ return m_size.z();	}
    415 	bool						isEmpty				(void) const	{ return m_size.x() * m_size.y() * m_size.z() == 0; }
    416 	const TextureFormat			getFormat			(void) const	{ return m_format;	}
    417 
    418 	void						setStorage			(const TextureFormat& format, int width, int heigth, int depth = 1);
    419 	void						setSize				(int width, int height, int depth = 1);
    420 
    421 	PixelBufferAccess			getAccess			(void)			{ return isEmpty() ? PixelBufferAccess() : PixelBufferAccess(m_format, m_size, calculatePackedPitch(m_format, m_size), getPtr());			}
    422 	ConstPixelBufferAccess		getAccess			(void) const	{ return isEmpty() ? ConstPixelBufferAccess() : ConstPixelBufferAccess(m_format, m_size, calculatePackedPitch(m_format, m_size), getPtr());	}
    423 
    424 private:
    425 	void*						getPtr				(void)			{ return m_data.getPtr(); }
    426 	const void*					getPtr				(void) const	{ return m_data.getPtr(); }
    427 
    428 	TextureFormat				m_format;
    429 	IVec3						m_size;
    430 	de::ArrayBuffer<deUint8>	m_data;
    431 
    432 	friend class ConstPixelBufferAccess;
    433 } DE_WARN_UNUSED_TYPE;
    434 
    435 Vec4	sampleLevelArray1D				(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, int level, float lod);
    436 Vec4	sampleLevelArray2D				(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float t, int depth, float lod);
    437 Vec4	sampleLevelArray3D				(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float t, float r, float lod);
    438 
    439 Vec4	sampleLevelArray1DOffset		(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float lod, const IVec2& offset);
    440 Vec4	sampleLevelArray2DOffset		(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float t, float lod, const IVec3& offset);
    441 Vec4	sampleLevelArray3DOffset		(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset);
    442 
    443 float	sampleLevelArray1DCompare		(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float ref, float s, float lod, const IVec2& offset);
    444 float	sampleLevelArray2DCompare		(const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float ref, float s, float t, float lod, const IVec3& offset);
    445 
    446 Vec4	gatherArray2DOffsets			(const ConstPixelBufferAccess& src, const Sampler& sampler, float s, float t, int depth, int componentNdx, const IVec2 (&offsets)[4]);
    447 Vec4	gatherArray2DOffsetsCompare		(const ConstPixelBufferAccess& src, const Sampler& sampler, float ref, float s, float t, int depth, const IVec2 (&offsets)[4]);
    448 
    449 enum CubeFace
    450 {
    451 	CUBEFACE_NEGATIVE_X = 0,
    452 	CUBEFACE_POSITIVE_X,
    453 	CUBEFACE_NEGATIVE_Y,
    454 	CUBEFACE_POSITIVE_Y,
    455 	CUBEFACE_NEGATIVE_Z,
    456 	CUBEFACE_POSITIVE_Z,
    457 
    458 	CUBEFACE_LAST
    459 };
    460 
    461 /*--------------------------------------------------------------------*//*!
    462  * \brief Coordinates projected onto cube face.
    463  *//*--------------------------------------------------------------------*/
    464 template<typename T>
    465 struct CubeFaceCoords
    466 {
    467 	CubeFace		face;
    468 	T				s;
    469 	T				t;
    470 
    471 					CubeFaceCoords		(CubeFace face_, T s_, T t_) : face(face_), s(s_), t(t_) {}
    472 					CubeFaceCoords		(CubeFace face_, const Vector<T, 2>& c) : face(face_), s(c.x()), t(c.y()) {}
    473 } DE_WARN_UNUSED_TYPE;
    474 
    475 typedef CubeFaceCoords<float>	CubeFaceFloatCoords;
    476 typedef CubeFaceCoords<int>		CubeFaceIntCoords;
    477 
    478 CubeFace				selectCubeFace			(const Vec3& coords);
    479 Vec2					projectToFace			(CubeFace face, const Vec3& coords);
    480 CubeFaceFloatCoords		getCubeFaceCoords		(const Vec3& coords);
    481 CubeFaceIntCoords		remapCubeEdgeCoords		(const CubeFaceIntCoords& coords, int size);
    482 
    483 /*--------------------------------------------------------------------*//*!
    484  * \brief 1D Texture View
    485  *//*--------------------------------------------------------------------*/
    486 class Texture1DView
    487 {
    488 public:
    489 									Texture1DView		(int numLevels, const ConstPixelBufferAccess* levels);
    490 
    491 	int								getNumLevels		(void) const	{ return m_numLevels;										}
    492 	int								getWidth			(void) const	{ return m_numLevels > 0 ? m_levels[0].getWidth()	: 0;	}
    493 	const ConstPixelBufferAccess&	getLevel			(int ndx) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx];	}
    494 	const ConstPixelBufferAccess*	getLevels			(void) const	{ return m_levels;											}
    495 
    496 	Vec4							sample				(const Sampler& sampler, float s, float lod) const;
    497 	Vec4							sampleOffset		(const Sampler& sampler, float s, float lod, deInt32 offset) const;
    498 	float							sampleCompare		(const Sampler& sampler, float ref, float s, float lod) const;
    499 	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float lod, deInt32 offset) const;
    500 
    501 protected:
    502 	int								m_numLevels;
    503 	const ConstPixelBufferAccess*	m_levels;
    504 } DE_WARN_UNUSED_TYPE;
    505 
    506 inline Texture1DView::Texture1DView (int numLevels, const ConstPixelBufferAccess* levels)
    507 	: m_numLevels	(numLevels)
    508 	, m_levels		(levels)
    509 {
    510 	DE_ASSERT(m_numLevels >= 0 && ((m_numLevels == 0) == !m_levels));
    511 }
    512 
    513 inline Vec4 Texture1DView::sample (const Sampler& sampler, float s, float lod) const
    514 {
    515 	return sampleLevelArray1D(m_levels, m_numLevels, sampler, s, 0 /* depth */, lod);
    516 }
    517 
    518 inline Vec4 Texture1DView::sampleOffset (const Sampler& sampler, float s, float lod, deInt32 offset) const
    519 {
    520 	return sampleLevelArray1DOffset(m_levels, m_numLevels, sampler, s, lod, IVec2(offset, 0));
    521 }
    522 
    523 inline float Texture1DView::sampleCompare (const Sampler& sampler, float ref, float s, float lod) const
    524 {
    525 	return sampleLevelArray1DCompare(m_levels, m_numLevels, sampler, ref, s, lod, IVec2(0, 0));
    526 }
    527 
    528 inline float Texture1DView::sampleCompareOffset (const Sampler& sampler, float ref, float s, float lod, deInt32 offset) const
    529 {
    530 	return sampleLevelArray1DCompare(m_levels, m_numLevels, sampler, ref, s, lod, IVec2(offset, 0));
    531 }
    532 
    533 /*--------------------------------------------------------------------*//*!
    534  * \brief 2D Texture View
    535  *//*--------------------------------------------------------------------*/
    536 class Texture2DView
    537 {
    538 public:
    539 									Texture2DView		(int numLevels, const ConstPixelBufferAccess* levels);
    540 
    541 	int								getNumLevels		(void) const	{ return m_numLevels;										}
    542 	int								getWidth			(void) const	{ return m_numLevels > 0 ? m_levels[0].getWidth()	: 0;	}
    543 	int								getHeight			(void) const	{ return m_numLevels > 0 ? m_levels[0].getHeight()	: 0;	}
    544 	const ConstPixelBufferAccess&	getLevel			(int ndx) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx];	}
    545 	const ConstPixelBufferAccess*	getLevels			(void) const	{ return m_levels;											}
    546 
    547 	Vec4							sample				(const Sampler& sampler, float s, float t, float lod) const;
    548 	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float lod, const IVec2& offset) const;
    549 	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float lod) const;
    550 	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float lod, const IVec2& offset) const;
    551 
    552 	Vec4							gatherOffsets		(const Sampler& sampler, float s, float t, int componentNdx, const IVec2 (&offsets)[4]) const;
    553 	Vec4							gatherOffsetsCompare(const Sampler& sampler, float ref, float s, float t, const IVec2 (&offsets)[4]) const;
    554 
    555 protected:
    556 	int								m_numLevels;
    557 	const ConstPixelBufferAccess*	m_levels;
    558 } DE_WARN_UNUSED_TYPE;
    559 
    560 inline Texture2DView::Texture2DView (int numLevels, const ConstPixelBufferAccess* levels)
    561 	: m_numLevels	(numLevels)
    562 	, m_levels		(levels)
    563 {
    564 	DE_ASSERT(m_numLevels >= 0 && ((m_numLevels == 0) == !m_levels));
    565 }
    566 
    567 inline Vec4 Texture2DView::sample (const Sampler& sampler, float s, float t, float lod) const
    568 {
    569 	return sampleLevelArray2D(m_levels, m_numLevels, sampler, s, t, 0 /* depth */, lod);
    570 }
    571 
    572 inline Vec4 Texture2DView::sampleOffset (const Sampler& sampler, float s, float t, float lod, const IVec2& offset) const
    573 {
    574 	return sampleLevelArray2DOffset(m_levels, m_numLevels, sampler, s, t, lod, IVec3(offset.x(), offset.y(), 0));
    575 }
    576 
    577 inline float Texture2DView::sampleCompare (const Sampler& sampler, float ref, float s, float t, float lod) const
    578 {
    579 	return sampleLevelArray2DCompare(m_levels, m_numLevels, sampler, ref, s, t, lod, IVec3(0, 0, 0));
    580 }
    581 
    582 inline float Texture2DView::sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float lod, const IVec2& offset) const
    583 {
    584 	return sampleLevelArray2DCompare(m_levels, m_numLevels, sampler, ref, s, t, lod, IVec3(offset.x(), offset.y(), 0));
    585 }
    586 
    587 inline Vec4 Texture2DView::gatherOffsets (const Sampler& sampler, float s, float t, int componentNdx, const IVec2 (&offsets)[4]) const
    588 {
    589 	return gatherArray2DOffsets(m_levels[0], sampler, s, t, 0, componentNdx, offsets);
    590 }
    591 
    592 inline Vec4 Texture2DView::gatherOffsetsCompare (const Sampler& sampler, float ref, float s, float t, const IVec2 (&offsets)[4]) const
    593 {
    594 	return gatherArray2DOffsetsCompare(m_levels[0], sampler, ref, s, t, 0, offsets);
    595 }
    596 
    597 /*--------------------------------------------------------------------*//*!
    598  * \brief Base class for textures that have single mip-map pyramid
    599  *//*--------------------------------------------------------------------*/
    600 class TextureLevelPyramid
    601 {
    602 public:
    603 									TextureLevelPyramid	(const TextureFormat& format, int numLevels);
    604 									TextureLevelPyramid	(const TextureLevelPyramid& other);
    605 									~TextureLevelPyramid(void);
    606 
    607 	const TextureFormat&			getFormat			(void) const			{ return m_format;					}
    608 	int								getNumLevels		(void) const			{ return (int)m_access.size();		}
    609 
    610 	bool							isLevelEmpty		(int levelNdx) const	{ DE_ASSERT(de::inBounds(levelNdx, 0, getNumLevels())); return m_data[(size_t)levelNdx].empty();	}
    611 	const ConstPixelBufferAccess&	getLevel			(int levelNdx) const	{ DE_ASSERT(de::inBounds(levelNdx, 0, getNumLevels())); return m_access[(size_t)levelNdx];			}
    612 	const PixelBufferAccess&		getLevel			(int levelNdx)			{ DE_ASSERT(de::inBounds(levelNdx, 0, getNumLevels())); return m_access[(size_t)levelNdx];			}
    613 
    614 	const ConstPixelBufferAccess*	getLevels			(void) const			{ return &m_access[0];				}
    615 	const PixelBufferAccess*		getLevels			(void)					{ return &m_access[0];				}
    616 
    617 	void							allocLevel			(int levelNdx, int width, int height, int depth);
    618 	void							clearLevel			(int levelNdx);
    619 
    620 	TextureLevelPyramid&			operator=			(const TextureLevelPyramid& other);
    621 
    622 private:
    623 	typedef de::ArrayBuffer<deUint8> LevelData;
    624 
    625 	TextureFormat					m_format;
    626 	std::vector<LevelData>			m_data;
    627 	std::vector<PixelBufferAccess>	m_access;
    628 } DE_WARN_UNUSED_TYPE;
    629 
    630 /*--------------------------------------------------------------------*//*!
    631  * \brief 1D Texture reference implementation
    632  *//*--------------------------------------------------------------------*/
    633 class Texture1D : private TextureLevelPyramid
    634 {
    635 public:
    636 									Texture1D			(const TextureFormat& format, int width);
    637 									Texture1D			(const Texture1D& other);
    638 									~Texture1D			(void);
    639 
    640 	int								getWidth			(void) const	{ return m_width;	}
    641 	const Texture1DView&			getView				(void) const	{ return m_view;	}
    642 
    643 	void							allocLevel			(int levelNdx);
    644 
    645 	// Sampling
    646 	Vec4							sample				(const Sampler& sampler, float s, float lod) const;
    647 	Vec4							sampleOffset		(const Sampler& sampler, float s, float lod, deInt32 offset) const;
    648 
    649 	using TextureLevelPyramid::getFormat;
    650 	using TextureLevelPyramid::getNumLevels;
    651 	using TextureLevelPyramid::getLevel;
    652 	using TextureLevelPyramid::clearLevel;
    653 	using TextureLevelPyramid::isLevelEmpty;
    654 
    655 	Texture1D&						operator=			(const Texture1D& other);
    656 
    657 	operator Texture1DView (void) const { return m_view; }
    658 
    659 private:
    660 	int								m_width;
    661 	Texture1DView					m_view;
    662 } DE_WARN_UNUSED_TYPE;
    663 
    664 inline Vec4 Texture1D::sample (const Sampler& sampler, float s, float lod) const
    665 {
    666 	return m_view.sample(sampler, s, lod);
    667 }
    668 
    669 inline Vec4 Texture1D::sampleOffset (const Sampler& sampler, float s, float lod, deInt32 offset) const
    670 {
    671 	return m_view.sampleOffset(sampler, s, lod, offset);
    672 }
    673 
    674 /*--------------------------------------------------------------------*//*!
    675  * \brief 2D Texture reference implementation
    676  *//*--------------------------------------------------------------------*/
    677 class Texture2D : private TextureLevelPyramid
    678 {
    679 public:
    680 									Texture2D			(const TextureFormat& format, int width, int height);
    681 									Texture2D			(const Texture2D& other);
    682 									~Texture2D			(void);
    683 
    684 	int								getWidth			(void) const	{ return m_width;	}
    685 	int								getHeight			(void) const	{ return m_height;	}
    686 	const Texture2DView&			getView				(void) const	{ return m_view;	}
    687 
    688 	void							allocLevel			(int levelNdx);
    689 
    690 	// Sampling
    691 	Vec4							sample				(const Sampler& sampler, float s, float t, float lod) const;
    692 	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float lod, const IVec2& offset) const;
    693 	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float lod) const;
    694 	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float lod, const IVec2& offset) const;
    695 
    696 	Vec4							gatherOffsets		(const Sampler& sampler, float s, float t, int componentNdx, const IVec2 (&offsets)[4]) const;
    697 	Vec4							gatherOffsetsCompare(const Sampler& sampler, float ref, float s, float t, const IVec2 (&offsets)[4]) const;
    698 
    699 	using TextureLevelPyramid::getFormat;
    700 	using TextureLevelPyramid::getNumLevels;
    701 	using TextureLevelPyramid::getLevel;
    702 	using TextureLevelPyramid::clearLevel;
    703 	using TextureLevelPyramid::isLevelEmpty;
    704 
    705 	Texture2D&						operator=			(const Texture2D& other);
    706 
    707 	operator Texture2DView (void) const { return m_view; }
    708 
    709 private:
    710 	int								m_width;
    711 	int								m_height;
    712 	Texture2DView					m_view;
    713 } DE_WARN_UNUSED_TYPE;
    714 
    715 inline Vec4 Texture2D::sample (const Sampler& sampler, float s, float t, float lod) const
    716 {
    717 	return m_view.sample(sampler, s, t, lod);
    718 }
    719 
    720 inline Vec4 Texture2D::sampleOffset (const Sampler& sampler, float s, float t, float lod, const IVec2& offset) const
    721 {
    722 	return m_view.sampleOffset(sampler, s, t, lod, offset);
    723 }
    724 
    725 inline float Texture2D::sampleCompare (const Sampler& sampler, float ref, float s, float t, float lod) const
    726 {
    727 	return m_view.sampleCompare(sampler, ref, s, t, lod);
    728 }
    729 
    730 inline float Texture2D::sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float lod, const IVec2& offset) const
    731 {
    732 	return m_view.sampleCompareOffset(sampler, ref, s, t, lod, offset);
    733 }
    734 
    735 inline Vec4 Texture2D::gatherOffsets (const Sampler& sampler, float s, float t, int componentNdx, const IVec2 (&offsets)[4]) const
    736 {
    737 	return m_view.gatherOffsets(sampler, s, t, componentNdx, offsets);
    738 }
    739 
    740 inline Vec4 Texture2D::gatherOffsetsCompare (const Sampler& sampler, float ref, float s, float t, const IVec2 (&offsets)[4]) const
    741 {
    742 	return m_view.gatherOffsetsCompare(sampler, ref, s, t, offsets);
    743 }
    744 
    745 /*--------------------------------------------------------------------*//*!
    746  * \brief Cube Map Texture View
    747  *//*--------------------------------------------------------------------*/
    748 class TextureCubeView
    749 {
    750 public:
    751 									TextureCubeView		(void);
    752 									TextureCubeView		(int numLevels, const ConstPixelBufferAccess* const (&levels)[CUBEFACE_LAST]);
    753 
    754 	int								getNumLevels		(void) const	{ return m_numLevels;										}
    755 	int								getSize				(void) const	{ return m_numLevels > 0 ? m_levels[0][0].getWidth() : 0;	}
    756 	const ConstPixelBufferAccess&	getLevelFace		(int ndx, CubeFace face) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[face][ndx];	}
    757 	const ConstPixelBufferAccess*	getFaceLevels		(CubeFace face) const			{ return m_levels[face];					}
    758 
    759 	Vec4							sample				(const Sampler& sampler, float s, float t, float p, float lod) const;
    760 	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float r, float lod) const;
    761 
    762 	Vec4							gather				(const Sampler& sampler, float s, float t, float r, int componentNdx) const;
    763 	Vec4							gatherCompare		(const Sampler& sampler, float ref, float s, float t, float r) const;
    764 
    765 protected:
    766 	int								m_numLevels;
    767 	const ConstPixelBufferAccess*	m_levels[CUBEFACE_LAST];
    768 } DE_WARN_UNUSED_TYPE;
    769 
    770 /*--------------------------------------------------------------------*//*!
    771  * \brief Cube Map Texture reference implementation
    772  *//*--------------------------------------------------------------------*/
    773 class TextureCube
    774 {
    775 public:
    776 									TextureCube			(const TextureFormat& format, int size);
    777 									TextureCube			(const TextureCube& other);
    778 									~TextureCube		(void);
    779 
    780 	const TextureFormat&			getFormat			(void) const	{ return m_format;	}
    781 	int								getSize				(void) const	{ return m_size;	}
    782 
    783 	int								getNumLevels		(void) const					{ return (int)m_access[0].size();	}
    784 	const ConstPixelBufferAccess&	getLevelFace		(int ndx, CubeFace face) const	{ DE_ASSERT(de::inBounds(ndx, 0, getNumLevels())); return m_access[face][(size_t)ndx];	}
    785 	const PixelBufferAccess&		getLevelFace		(int ndx, CubeFace face)		{ DE_ASSERT(de::inBounds(ndx, 0, getNumLevels())); return m_access[face][(size_t)ndx];	}
    786 
    787 	void							allocLevel			(CubeFace face, int levelNdx);
    788 	void							clearLevel			(CubeFace face, int levelNdx);
    789 	bool							isLevelEmpty		(CubeFace face, int levelNdx) const	{ DE_ASSERT(de::inBounds(levelNdx, 0, getNumLevels())); return m_data[face][(size_t)levelNdx].empty();	}
    790 
    791 	Vec4							sample				(const Sampler& sampler, float s, float t, float p, float lod) const;
    792 	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float r, float lod) const;
    793 
    794 	Vec4							gather				(const Sampler& sampler, float s, float t, float r, int componentNdx) const;
    795 	Vec4							gatherCompare		(const Sampler& sampler, float ref, float s, float t, float r) const;
    796 
    797 	TextureCube&					operator=			(const TextureCube& other);
    798 
    799 	operator TextureCubeView (void) const { return m_view; }
    800 
    801 private:
    802 	typedef de::ArrayBuffer<deUint8> LevelData;
    803 
    804 	TextureFormat					m_format;
    805 	int								m_size;
    806 	std::vector<LevelData>			m_data[CUBEFACE_LAST];
    807 	std::vector<PixelBufferAccess>	m_access[CUBEFACE_LAST];
    808 	TextureCubeView					m_view;
    809 } DE_WARN_UNUSED_TYPE;
    810 
    811 inline Vec4 TextureCube::sample (const Sampler& sampler, float s, float t, float p, float lod) const
    812 {
    813 	return m_view.sample(sampler, s, t, p, lod);
    814 }
    815 
    816 inline float TextureCube::sampleCompare (const Sampler& sampler, float ref, float s, float t, float r, float lod) const
    817 {
    818 	return m_view.sampleCompare(sampler, ref, s, t, r, lod);
    819 }
    820 
    821 inline Vec4 TextureCube::gather (const Sampler& sampler, float s, float t, float r, int componentNdx) const
    822 {
    823 	return m_view.gather(sampler, s, t, r, componentNdx);
    824 }
    825 
    826 inline Vec4 TextureCube::gatherCompare (const Sampler& sampler, float ref, float s, float t, float r) const
    827 {
    828 	return m_view.gatherCompare(sampler, ref, s, t, r);
    829 }
    830 
    831 /*--------------------------------------------------------------------*//*!
    832  * \brief 1D Array Texture View
    833  *//*--------------------------------------------------------------------*/
    834 class Texture1DArrayView
    835 {
    836 public:
    837 									Texture1DArrayView	(int numLevels, const ConstPixelBufferAccess* levels);
    838 
    839 	int								getWidth			(void) const	{ return m_numLevels > 0 ? m_levels[0].getWidth()	: 0;	}
    840 	int								getNumLayers		(void) const	{ return m_numLevels > 0 ? m_levels[0].getHeight()	: 0;	}
    841 	int								getNumLevels		(void) const	{ return m_numLevels;										}
    842 	const ConstPixelBufferAccess&	getLevel			(int ndx) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx];	}
    843 	const ConstPixelBufferAccess*	getLevels			(void) const	{ return m_levels;											}
    844 
    845 	Vec4							sample				(const Sampler& sampler, float s, float t, float lod) const;
    846 	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float lod, deInt32 offset) const;
    847 	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float lod) const;
    848 	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float lod, deInt32 offset) const;
    849 
    850 protected:
    851 	int								selectLayer			(float r) const;
    852 
    853 	int								m_numLevels;
    854 	const ConstPixelBufferAccess*	m_levels;
    855 } DE_WARN_UNUSED_TYPE;
    856 
    857 /*--------------------------------------------------------------------*//*!
    858  * \brief 2D Array Texture View
    859  *//*--------------------------------------------------------------------*/
    860 class Texture2DArrayView
    861 {
    862 public:
    863 									Texture2DArrayView	(int numLevels, const ConstPixelBufferAccess* levels);
    864 
    865 	int								getWidth			(void) const	{ return m_numLevels > 0 ? m_levels[0].getWidth()	: 0;	}
    866 	int								getHeight			(void) const	{ return m_numLevels > 0 ? m_levels[0].getHeight()	: 0;	}
    867 	int								getNumLayers		(void) const	{ return m_numLevels > 0 ? m_levels[0].getDepth()	: 0;	}
    868 	int								getNumLevels		(void) const	{ return m_numLevels;										}
    869 	const ConstPixelBufferAccess&	getLevel			(int ndx) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx];	}
    870 	const ConstPixelBufferAccess*	getLevels			(void) const	{ return m_levels;											}
    871 
    872 	Vec4							sample				(const Sampler& sampler, float s, float t, float r, float lod) const;
    873 	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float r, float lod, const IVec2& offset) const;
    874 	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float r, float lod) const;
    875 	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float r, float lod, const IVec2& offset) const;
    876 
    877 	Vec4							gatherOffsets		(const Sampler& sampler, float s, float t, float r, int componentNdx, const IVec2 (&offsets)[4]) const;
    878 	Vec4							gatherOffsetsCompare(const Sampler& sampler, float ref, float s, float t, float r, const IVec2 (&offsets)[4]) const;
    879 
    880 protected:
    881 	int								selectLayer			(float r) const;
    882 
    883 	int								m_numLevels;
    884 	const ConstPixelBufferAccess*	m_levels;
    885 } DE_WARN_UNUSED_TYPE;
    886 
    887 /*--------------------------------------------------------------------*//*!
    888  * \brief 1D Array Texture reference implementation
    889  *//*--------------------------------------------------------------------*/
    890 class Texture1DArray : private TextureLevelPyramid
    891 {
    892 public:
    893 									Texture1DArray		(const TextureFormat& format, int width, int numLayers);
    894 									Texture1DArray		(const Texture1DArray& other);
    895 									~Texture1DArray		(void);
    896 
    897 	int								getWidth			(void) const	{ return m_width;		}
    898 	int								getNumLayers		(void) const	{ return m_numLayers;	}
    899 
    900 	void							allocLevel			(int levelNdx);
    901 
    902 	using TextureLevelPyramid::getFormat;
    903 	using TextureLevelPyramid::getNumLevels;
    904 	using TextureLevelPyramid::getLevel;
    905 	using TextureLevelPyramid::clearLevel;
    906 	using TextureLevelPyramid::isLevelEmpty;
    907 
    908 	Vec4							sample				(const Sampler& sampler, float s, float t, float lod) const;
    909 	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float lod, deInt32 offset) const;
    910 	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float lod) const;
    911 	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float lod, deInt32 offset) const;
    912 
    913 	Texture1DArray&					operator=			(const Texture1DArray& other);
    914 
    915 	operator Texture1DArrayView (void) const { return m_view; }
    916 
    917 private:
    918 	int								m_width;
    919 	int								m_numLayers;
    920 	Texture1DArrayView				m_view;
    921 } DE_WARN_UNUSED_TYPE;
    922 
    923 inline Vec4 Texture1DArray::sample (const Sampler& sampler, float s, float t, float lod) const
    924 {
    925 	return m_view.sample(sampler, s, t, lod);
    926 }
    927 
    928 inline Vec4 Texture1DArray::sampleOffset (const Sampler& sampler, float s, float t, float lod, deInt32 offset) const
    929 {
    930 	return m_view.sampleOffset(sampler, s, t, lod, offset);
    931 }
    932 
    933 inline float Texture1DArray::sampleCompare (const Sampler& sampler, float ref, float s, float t, float lod) const
    934 {
    935 	return m_view.sampleCompare(sampler, ref, s, t, lod);
    936 }
    937 
    938 inline float Texture1DArray::sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float lod, deInt32 offset) const
    939 {
    940 	return m_view.sampleCompareOffset(sampler, ref, s, t, lod, offset);
    941 }
    942 
    943 /*--------------------------------------------------------------------*//*!
    944  * \brief 2D Array Texture reference implementation
    945  *//*--------------------------------------------------------------------*/
    946 class Texture2DArray : private TextureLevelPyramid
    947 {
    948 public:
    949 									Texture2DArray		(const TextureFormat& format, int width, int height, int numLayers);
    950 									Texture2DArray		(const Texture2DArray& other);
    951 									~Texture2DArray		(void);
    952 
    953 	int								getWidth			(void) const	{ return m_width;		}
    954 	int								getHeight			(void) const	{ return m_height;		}
    955 	int								getNumLayers		(void) const	{ return m_numLayers;	}
    956 
    957 	void							allocLevel			(int levelNdx);
    958 
    959 	using TextureLevelPyramid::getFormat;
    960 	using TextureLevelPyramid::getNumLevels;
    961 	using TextureLevelPyramid::getLevel;
    962 	using TextureLevelPyramid::clearLevel;
    963 	using TextureLevelPyramid::isLevelEmpty;
    964 
    965 	Vec4							sample				(const Sampler& sampler, float s, float t, float r, float lod) const;
    966 	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float r, float lod, const IVec2& offset) const;
    967 	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float r, float lod) const;
    968 	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float r, float lod, const IVec2& offset) const;
    969 
    970 	Vec4							gatherOffsets		(const Sampler& sampler, float s, float t, float r, int componentNdx, const IVec2 (&offsets)[4]) const;
    971 	Vec4							gatherOffsetsCompare(const Sampler& sampler, float ref, float s, float t, float r, const IVec2 (&offsets)[4]) const;
    972 
    973 	Texture2DArray&					operator=			(const Texture2DArray& other);
    974 
    975 	operator Texture2DArrayView (void) const { return m_view; }
    976 
    977 private:
    978 	int								m_width;
    979 	int								m_height;
    980 	int								m_numLayers;
    981 	Texture2DArrayView				m_view;
    982 } DE_WARN_UNUSED_TYPE;
    983 
    984 inline Vec4 Texture2DArray::sample (const Sampler& sampler, float s, float t, float r, float lod) const
    985 {
    986 	return m_view.sample(sampler, s, t, r, lod);
    987 }
    988 
    989 inline Vec4 Texture2DArray::sampleOffset (const Sampler& sampler, float s, float t, float r, float lod, const IVec2& offset) const
    990 {
    991 	return m_view.sampleOffset(sampler, s, t, r, lod, offset);
    992 }
    993 
    994 inline float Texture2DArray::sampleCompare (const Sampler& sampler, float ref, float s, float t, float r, float lod) const
    995 {
    996 	return m_view.sampleCompare(sampler, ref, s, t, r, lod);
    997 }
    998 
    999 inline float Texture2DArray::sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float r, float lod, const IVec2& offset) const
   1000 {
   1001 	return m_view.sampleCompareOffset(sampler, ref, s, t, r, lod, offset);
   1002 }
   1003 
   1004 inline Vec4 Texture2DArray::gatherOffsets (const Sampler& sampler, float s, float t, float r, int componentNdx, const IVec2 (&offsets)[4]) const
   1005 {
   1006 	return m_view.gatherOffsets(sampler, s, t, r, componentNdx, offsets);
   1007 }
   1008 
   1009 inline Vec4 Texture2DArray::gatherOffsetsCompare (const Sampler& sampler, float ref, float s, float t, float r, const IVec2 (&offsets)[4]) const
   1010 {
   1011 	return m_view.gatherOffsetsCompare(sampler, ref, s, t, r, offsets);
   1012 }
   1013 
   1014 /*--------------------------------------------------------------------*//*!
   1015  * \brief 3D Texture View
   1016  *//*--------------------------------------------------------------------*/
   1017 class Texture3DView
   1018 {
   1019 public:
   1020 									Texture3DView		(int numLevels, const ConstPixelBufferAccess* levels);
   1021 
   1022 	int								getWidth			(void) const	{ return m_numLevels > 0 ? m_levels[0].getWidth()	: 0;	}
   1023 	int								getHeight			(void) const	{ return m_numLevels > 0 ? m_levels[0].getHeight()	: 0;	}
   1024 	int								getDepth			(void) const	{ return m_numLevels > 0 ? m_levels[0].getDepth()	: 0;	}
   1025 	int								getNumLevels		(void) const	{ return m_numLevels;										}
   1026 	const ConstPixelBufferAccess&	getLevel			(int ndx) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx];	}
   1027 	const ConstPixelBufferAccess*	getLevels			(void) const	{ return m_levels;											}
   1028 
   1029 	Vec4							sample				(const Sampler& sampler, float s, float t, float r, float lod) const;
   1030 	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset) const;
   1031 
   1032 protected:
   1033 	int								m_numLevels;
   1034 	const ConstPixelBufferAccess*	m_levels;
   1035 } DE_WARN_UNUSED_TYPE;
   1036 
   1037 inline Vec4 Texture3DView::sample (const Sampler& sampler, float s, float t, float r, float lod) const
   1038 {
   1039 	return sampleLevelArray3D(m_levels, m_numLevels, sampler, s, t, r, lod);
   1040 }
   1041 
   1042 inline Vec4 Texture3DView::sampleOffset (const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset) const
   1043 {
   1044 	return sampleLevelArray3DOffset(m_levels, m_numLevels, sampler, s, t, r, lod, offset);
   1045 }
   1046 
   1047 /*--------------------------------------------------------------------*//*!
   1048  * \brief 3D Texture reference implementation
   1049  *//*--------------------------------------------------------------------*/
   1050 class Texture3D : private TextureLevelPyramid
   1051 {
   1052 public:
   1053 									Texture3D			(const TextureFormat& format, int width, int height, int depth);
   1054 									Texture3D			(const Texture3D& other);
   1055 									~Texture3D			(void);
   1056 
   1057 	int								getWidth			(void) const	{ return m_width;	}
   1058 	int								getHeight			(void) const	{ return m_height;	}
   1059 	int								getDepth			(void) const	{ return m_depth;	}
   1060 
   1061 	void							allocLevel			(int levelNdx);
   1062 
   1063 	using TextureLevelPyramid::getFormat;
   1064 	using TextureLevelPyramid::getNumLevels;
   1065 	using TextureLevelPyramid::getLevel;
   1066 	using TextureLevelPyramid::clearLevel;
   1067 	using TextureLevelPyramid::isLevelEmpty;
   1068 
   1069 	Vec4							sample				(const Sampler& sampler, float s, float t, float r, float lod) const;
   1070 	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset) const;
   1071 
   1072 	Texture3D&						operator=			(const Texture3D& other);
   1073 
   1074 	operator Texture3DView (void) const { return m_view; }
   1075 
   1076 private:
   1077 	int								m_width;
   1078 	int								m_height;
   1079 	int								m_depth;
   1080 	Texture3DView					m_view;
   1081 } DE_WARN_UNUSED_TYPE;
   1082 
   1083 inline Vec4 Texture3D::sample (const Sampler& sampler, float s, float t, float r, float lod) const
   1084 {
   1085 	return m_view.sample(sampler, s, t, r, lod);
   1086 }
   1087 
   1088 inline Vec4 Texture3D::sampleOffset (const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset) const
   1089 {
   1090 	return m_view.sampleOffset(sampler, s, t, r, lod, offset);
   1091 }
   1092 
   1093 /*--------------------------------------------------------------------*//*!
   1094  * \brief Cube Map Array Texture View
   1095  *//*--------------------------------------------------------------------*/
   1096 class TextureCubeArrayView
   1097 {
   1098 public:
   1099 									TextureCubeArrayView	(int numLevels, const ConstPixelBufferAccess* levels);
   1100 
   1101 	int								getSize					(void) const	{ return m_numLevels > 0 ? m_levels[0].getWidth()	: 0;	}
   1102 	int								getDepth				(void) const	{ return m_numLevels > 0 ? m_levels[0].getDepth()	: 0;	}
   1103 	int								getNumLayers			(void) const	{ return getDepth()	/ 6;	}
   1104 	int								getNumLevels			(void) const	{ return m_numLevels;										}
   1105 	const ConstPixelBufferAccess&	getLevel				(int ndx) const	{ DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx];	}
   1106 	const ConstPixelBufferAccess*	getLevels				(void) const	{ return m_levels;											}
   1107 
   1108 	Vec4							sample					(const Sampler& sampler, float s, float t, float r, float q, float lod) const;
   1109 	Vec4							sampleOffset			(const Sampler& sampler, float s, float t, float r, float q, float lod, const IVec2& offset) const;
   1110 	float							sampleCompare			(const Sampler& sampler, float ref, float s, float t, float r, float q, float lod) const;
   1111 	float							sampleCompareOffset		(const Sampler& sampler, float ref, float s, float t, float r, float q, float lod, const IVec2& offset) const;
   1112 
   1113 protected:
   1114 	int								selectLayer				(float q) const;
   1115 
   1116 	int								m_numLevels;
   1117 	const ConstPixelBufferAccess*	m_levels;
   1118 } DE_WARN_UNUSED_TYPE;
   1119 
   1120 /*--------------------------------------------------------------------*//*!
   1121  * \brief Cube Map Array Texture reference implementation
   1122  *//*--------------------------------------------------------------------*/
   1123 class TextureCubeArray : private TextureLevelPyramid
   1124 {
   1125 public:
   1126 									TextureCubeArray	(const TextureFormat& format, int size, int depth);
   1127 									TextureCubeArray	(const TextureCubeArray& other);
   1128 									~TextureCubeArray	(void);
   1129 
   1130 	int								getSize				(void) const	{ return m_size;	}
   1131 	int								getDepth			(void) const	{ return m_depth;	}
   1132 
   1133 	void							allocLevel			(int levelNdx);
   1134 
   1135 	using TextureLevelPyramid::getFormat;
   1136 	using TextureLevelPyramid::getNumLevels;
   1137 	using TextureLevelPyramid::getLevel;
   1138 	using TextureLevelPyramid::clearLevel;
   1139 	using TextureLevelPyramid::isLevelEmpty;
   1140 
   1141 	Vec4							sample				(const Sampler& sampler, float s, float t, float r, float q, float lod) const;
   1142 	Vec4							sampleOffset		(const Sampler& sampler, float s, float t, float r, float q, float lod, const IVec2& offset) const;
   1143 	float							sampleCompare		(const Sampler& sampler, float ref, float s, float t, float r, float q, float lod) const;
   1144 	float							sampleCompareOffset	(const Sampler& sampler, float ref, float s, float t, float r, float q, float lod, const IVec2& offset) const;
   1145 
   1146 	TextureCubeArray&				operator=			(const TextureCubeArray& other);
   1147 
   1148 	operator TextureCubeArrayView (void) const { return m_view; }
   1149 
   1150 private:
   1151 	int								m_size;
   1152 	int								m_depth;
   1153 	TextureCubeArrayView			m_view;
   1154 } DE_WARN_UNUSED_TYPE;
   1155 
   1156 inline Vec4 TextureCubeArray::sample (const Sampler& sampler, float s, float t, float r, float q, float lod) const
   1157 {
   1158 	return m_view.sample(sampler, s, t, r, q, lod);
   1159 }
   1160 
   1161 inline Vec4 TextureCubeArray::sampleOffset (const Sampler& sampler, float s, float t, float r, float q, float lod, const IVec2& offset) const
   1162 {
   1163 	return m_view.sampleOffset(sampler, s, t, r, q, lod, offset);
   1164 }
   1165 
   1166 inline float TextureCubeArray::sampleCompare (const Sampler& sampler, float ref, float s, float t, float r, float q, float lod) const
   1167 {
   1168 	return m_view.sampleCompare(sampler, ref, s, t, r, q, lod);
   1169 }
   1170 
   1171 inline float TextureCubeArray::sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float r, float q, float lod, const IVec2& offset) const
   1172 {
   1173 	return m_view.sampleCompareOffset(sampler, ref, s, t, r, q, lod, offset);
   1174 }
   1175 
   1176 // Stream operators.
   1177 std::ostream&		operator<<		(std::ostream& str, TextureFormat::ChannelOrder order);
   1178 std::ostream&		operator<<		(std::ostream& str, TextureFormat::ChannelType type);
   1179 std::ostream&		operator<<		(std::ostream& str, TextureFormat format);
   1180 std::ostream&		operator<<		(std::ostream& str, CubeFace face);
   1181 std::ostream&		operator<<		(std::ostream& str, const ConstPixelBufferAccess& access);
   1182 
   1183 } // tcu
   1184 
   1185 #endif // _TCUTEXTURE_HPP
   1186