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