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