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