| #ifndef _TCUTEXTURE_HPP |
| #define _TCUTEXTURE_HPP |
| /*------------------------------------------------------------------------- |
| * drawElements Quality Program Tester Core |
| * ---------------------------------------- |
| * |
| * Copyright 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| *//*! |
| * \file |
| * \brief Reference Texture Implementation. |
| *//*--------------------------------------------------------------------*/ |
| |
| #include "tcuDefs.hpp" |
| #include "tcuVector.hpp" |
| #include "rrGenericVector.hpp" |
| #include "deArrayBuffer.hpp" |
| |
| #include <vector> |
| #include <ostream> |
| |
| namespace tcu |
| { |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Texture format |
| *//*--------------------------------------------------------------------*/ |
| class TextureFormat |
| { |
| public: |
| enum ChannelOrder |
| { |
| R = 0, |
| A, |
| I, |
| L, |
| LA, |
| RG, |
| RA, |
| RGB, |
| RGBA, |
| ARGB, |
| BGR, |
| BGRA, |
| |
| sR, |
| sRG, |
| sRGB, |
| sRGBA, |
| sBGR, |
| sBGRA, |
| |
| D, |
| S, |
| DS, |
| |
| CHANNELORDER_LAST |
| }; |
| |
| enum ChannelType |
| { |
| SNORM_INT8 = 0, |
| SNORM_INT16, |
| SNORM_INT32, |
| UNORM_INT8, |
| UNORM_INT16, |
| UNORM_INT24, |
| UNORM_INT32, |
| UNORM_BYTE_44, |
| UNORM_SHORT_565, |
| UNORM_SHORT_555, |
| UNORM_SHORT_4444, |
| UNORM_SHORT_5551, |
| UNORM_SHORT_1555, |
| UNORM_INT_101010, |
| SNORM_INT_1010102_REV, |
| UNORM_INT_1010102_REV, |
| UNSIGNED_BYTE_44, |
| UNSIGNED_SHORT_565, |
| UNSIGNED_SHORT_4444, |
| UNSIGNED_SHORT_5551, |
| SIGNED_INT_1010102_REV, |
| UNSIGNED_INT_1010102_REV, |
| UNSIGNED_INT_11F_11F_10F_REV, |
| UNSIGNED_INT_999_E5_REV, |
| UNSIGNED_INT_16_8_8, |
| UNSIGNED_INT_24_8, |
| UNSIGNED_INT_24_8_REV, |
| SIGNED_INT8, |
| SIGNED_INT16, |
| SIGNED_INT32, |
| SIGNED_INT64, |
| UNSIGNED_INT8, |
| UNSIGNED_INT16, |
| UNSIGNED_INT24, |
| UNSIGNED_INT32, |
| UNSIGNED_INT64, |
| HALF_FLOAT, |
| FLOAT, |
| FLOAT64, |
| FLOAT_UNSIGNED_INT_24_8_REV, |
| |
| UNORM_SHORT_10, |
| UNORM_SHORT_12, |
| |
| USCALED_INT8, |
| USCALED_INT16, |
| SSCALED_INT8, |
| SSCALED_INT16, |
| USCALED_INT_1010102_REV, |
| SSCALED_INT_1010102_REV, |
| |
| CHANNELTYPE_LAST |
| }; |
| |
| ChannelOrder order; |
| ChannelType type; |
| |
| TextureFormat (ChannelOrder order_, ChannelType type_) |
| : order (order_) |
| , type (type_) |
| { |
| } |
| |
| TextureFormat (void) |
| : order (CHANNELORDER_LAST) |
| , type (CHANNELTYPE_LAST) |
| { |
| } |
| |
| int getPixelSize (void) const; //!< Deprecated, use tcu::getPixelSize(fmt) |
| |
| bool operator== (const TextureFormat& other) const { return !(*this != other); } |
| bool operator!= (const TextureFormat& other) const |
| { |
| return (order != other.order || type != other.type); |
| } |
| } DE_WARN_UNUSED_TYPE; |
| |
| bool isValid (TextureFormat format); |
| int getPixelSize (TextureFormat format); |
| int getNumUsedChannels (TextureFormat::ChannelOrder order); |
| int getChannelSize (TextureFormat::ChannelType type); |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Texture swizzle |
| *//*--------------------------------------------------------------------*/ |
| struct TextureSwizzle |
| { |
| enum Channel |
| { |
| // \note CHANNEL_N must equal int N |
| CHANNEL_0 = 0, |
| CHANNEL_1, |
| CHANNEL_2, |
| CHANNEL_3, |
| |
| CHANNEL_ZERO, |
| CHANNEL_ONE, |
| |
| CHANNEL_LAST |
| }; |
| |
| Channel components[4]; |
| }; |
| |
| //! get the swizzle used to expand texture data with a given channel order to RGBA form |
| const TextureSwizzle& getChannelReadSwizzle (TextureFormat::ChannelOrder order); |
| |
| //! get the swizzle used to narrow RGBA form data to native texture data with a given channel order |
| const TextureSwizzle& getChannelWriteSwizzle (TextureFormat::ChannelOrder order); |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Sampling parameters |
| *//*--------------------------------------------------------------------*/ |
| class Sampler |
| { |
| public: |
| enum WrapMode |
| { |
| CLAMP_TO_EDGE = 0, //! Clamp to edge |
| CLAMP_TO_BORDER, //! Use border color at edge |
| REPEAT_GL, //! Repeat with OpenGL semantics |
| REPEAT_CL, //! Repeat with OpenCL semantics |
| MIRRORED_REPEAT_GL, //! Mirrored repeat with OpenGL semantics |
| MIRRORED_REPEAT_CL, //! Mirrored repeat with OpenCL semantics |
| MIRRORED_ONCE, //! Mirrored once in negative directions |
| |
| WRAPMODE_LAST |
| }; |
| |
| enum FilterMode |
| { |
| NEAREST = 0, |
| LINEAR, |
| CUBIC, |
| |
| NEAREST_MIPMAP_NEAREST, |
| NEAREST_MIPMAP_LINEAR, |
| LINEAR_MIPMAP_NEAREST, |
| LINEAR_MIPMAP_LINEAR, |
| CUBIC_MIPMAP_NEAREST, |
| CUBIC_MIPMAP_LINEAR, |
| |
| FILTERMODE_LAST |
| }; |
| |
| enum ReductionMode |
| { |
| WEIGHTED_AVERAGE = 0, |
| MIN, |
| MAX, |
| |
| REDUCTIONMODE_LAST |
| }; |
| |
| enum CompareMode |
| { |
| COMPAREMODE_NONE = 0, |
| COMPAREMODE_LESS, |
| COMPAREMODE_LESS_OR_EQUAL, |
| COMPAREMODE_GREATER, |
| COMPAREMODE_GREATER_OR_EQUAL, |
| COMPAREMODE_EQUAL, |
| COMPAREMODE_NOT_EQUAL, |
| COMPAREMODE_ALWAYS, |
| COMPAREMODE_NEVER, |
| |
| COMPAREMODE_LAST |
| }; |
| |
| enum DepthStencilMode |
| { |
| MODE_DEPTH = 0, |
| MODE_STENCIL, |
| |
| MODE_LAST |
| }; |
| |
| // Wrap control |
| WrapMode wrapS; |
| WrapMode wrapT; |
| WrapMode wrapR; |
| |
| // Minifcation & magnification |
| FilterMode minFilter; |
| FilterMode magFilter; |
| |
| // min/max filtering reduction |
| ReductionMode reductionMode; |
| |
| float lodThreshold; // lod <= lodThreshold ? magnified : minified |
| |
| // Coordinate normalization |
| bool normalizedCoords; |
| |
| // Shadow comparison |
| CompareMode compare; |
| int compareChannel; |
| |
| // Border color. |
| // \note It is setter's responsibility to guarantee that the values are representable |
| // in sampled texture's internal format. |
| // \note It is setter's responsibility to guarantee that the format is compatible with the |
| // sampled texture's internal format. Otherwise results are undefined. |
| rr::GenericVec4 borderColor; |
| |
| // Seamless cube map filtering |
| bool seamlessCubeMap; |
| |
| // Depth stencil mode |
| DepthStencilMode depthStencilMode; |
| |
| Sampler (WrapMode wrapS_, |
| WrapMode wrapT_, |
| WrapMode wrapR_, |
| FilterMode minFilter_, |
| FilterMode magFilter_, |
| float lodThreshold_ = 0.0f, |
| bool normalizedCoords_ = true, |
| CompareMode compare_ = COMPAREMODE_NONE, |
| int compareChannel_ = 0, |
| const Vec4& borderColor_ = Vec4(0.0f, 0.0f, 0.0f, 0.0f), |
| bool seamlessCubeMap_ = false, |
| DepthStencilMode depthStencilMode_ = MODE_DEPTH, |
| ReductionMode reductionMode_ = WEIGHTED_AVERAGE) |
| : wrapS (wrapS_) |
| , wrapT (wrapT_) |
| , wrapR (wrapR_) |
| , minFilter (minFilter_) |
| , magFilter (magFilter_) |
| , reductionMode (reductionMode_) |
| , lodThreshold (lodThreshold_) |
| , normalizedCoords (normalizedCoords_) |
| , compare (compare_) |
| , compareChannel (compareChannel_) |
| , borderColor (borderColor_) |
| , seamlessCubeMap (seamlessCubeMap_) |
| , depthStencilMode (depthStencilMode_) |
| { |
| } |
| |
| Sampler (void) |
| : wrapS (WRAPMODE_LAST) |
| , wrapT (WRAPMODE_LAST) |
| , wrapR (WRAPMODE_LAST) |
| , minFilter (FILTERMODE_LAST) |
| , magFilter (FILTERMODE_LAST) |
| , reductionMode (REDUCTIONMODE_LAST) |
| , lodThreshold (0.0f) |
| , normalizedCoords (true) |
| , compare (COMPAREMODE_NONE) |
| , compareChannel (0) |
| , borderColor (Vec4(0.0f, 0.0f, 0.0f, 0.0f)) |
| , seamlessCubeMap (false) |
| , depthStencilMode (MODE_DEPTH) |
| { |
| } |
| } DE_WARN_UNUSED_TYPE; |
| |
| // Calculate pitches for pixel data with no padding. |
| IVec3 calculatePackedPitch (const TextureFormat& format, const IVec3& size); |
| |
| class TextureLevel; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Read-only pixel data access |
| * |
| * ConstPixelBufferAccess encapsulates pixel data pointer along with |
| * format and layout information. It can be used for read-only access |
| * to arbitrary pixel buffers. |
| * |
| * Access objects are like iterators or pointers. They can be passed around |
| * as values and are valid as long as the storage doesn't change. |
| *//*--------------------------------------------------------------------*/ |
| class ConstPixelBufferAccess |
| { |
| public: |
| ConstPixelBufferAccess (void); |
| ConstPixelBufferAccess (const TextureLevel& level); |
| ConstPixelBufferAccess (const TextureFormat& format, int width, int height, int depth, const void* data); |
| ConstPixelBufferAccess (const TextureFormat& format, const IVec3& size, const void* data); |
| ConstPixelBufferAccess (const TextureFormat& format, int width, int height, int depth, int rowPitch, int slicePitch, const void* data); |
| ConstPixelBufferAccess (const TextureFormat& format, const IVec3& size, const IVec3& pitch, const void* data); |
| ConstPixelBufferAccess (const TextureFormat& format, const IVec3& size, const IVec3& pitch, const IVec3& divider, const void* data); |
| |
| const TextureFormat& getFormat (void) const { return m_format; } |
| const IVec3& getSize (void) const { return m_size; } |
| int getWidth (void) const { return m_size.x(); } |
| int getHeight (void) const { return m_size.y(); } |
| int getDepth (void) const { return m_size.z(); } |
| int getPixelPitch (void) const { return m_pitch.x(); } |
| int getRowPitch (void) const { return m_pitch.y(); } |
| int getSlicePitch (void) const { return m_pitch.z(); } |
| const IVec3& getPitch (void) const { return m_pitch; } |
| const IVec3& getDivider (void) const { return m_divider; } |
| |
| const void* getDataPtr (void) const { return m_data; } |
| const void* getPixelPtr (int x, int y, int z = 0) const { return (const deUint8*)m_data + (x/m_divider.x()) * m_pitch.x() + (y/m_divider.y()) * m_pitch.y() + (z/m_divider.z()) * m_pitch.z(); } |
| |
| Vec4 getPixel (int x, int y, int z = 0) const; |
| IVec4 getPixelInt (int x, int y, int z = 0) const; |
| UVec4 getPixelUint (int x, int y, int z = 0) const { return getPixelInt(x, y, z).cast<deUint32>(); } |
| |
| template<typename T> |
| Vector<T, 4> getPixelT (int x, int y, int z = 0) const; |
| |
| float getPixDepth (int x, int y, int z = 0) const; |
| int getPixStencil (int x, int y, int z = 0) const; |
| |
| Vec4 sample1D (const Sampler& sampler, Sampler::FilterMode filter, float s, int level) const; |
| Vec4 sample2D (const Sampler& sampler, Sampler::FilterMode filter, float s, float t, int depth) const; |
| Vec4 sample3D (const Sampler& sampler, Sampler::FilterMode filter, float s, float t, float r) const; |
| |
| Vec4 sample1DOffset (const Sampler& sampler, Sampler::FilterMode filter, float s, const IVec2& offset) const; |
| Vec4 sample2DOffset (const Sampler& sampler, Sampler::FilterMode filter, float s, float t, const IVec3& offset) const; |
| Vec4 sample3DOffset (const Sampler& sampler, Sampler::FilterMode filter, float s, float t, float r, const IVec3& offset) const; |
| |
| float sample1DCompare (const Sampler& sampler, Sampler::FilterMode filter, float ref, float s, const IVec2& offset) const; |
| float sample2DCompare (const Sampler& sampler, Sampler::FilterMode filter, float ref, float s, float t, const IVec3& offset) const; |
| |
| protected: |
| TextureFormat m_format; |
| IVec3 m_size; |
| IVec3 m_pitch; //!< (pixelPitch, rowPitch, slicePitch) |
| IVec3 m_divider; |
| mutable void* m_data; |
| } DE_WARN_UNUSED_TYPE; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Read-write pixel data access |
| * |
| * This class extends read-only access object by providing write functionality. |
| * |
| * \note PixelBufferAccess may not have any data members nor add any |
| * virtual functions. It must be possible to reinterpret_cast<> |
| * PixelBufferAccess to ConstPixelBufferAccess. |
| *//*--------------------------------------------------------------------*/ |
| class PixelBufferAccess : public ConstPixelBufferAccess |
| { |
| public: |
| PixelBufferAccess (void) {} |
| PixelBufferAccess (TextureLevel& level); |
| PixelBufferAccess (const TextureFormat& format, int width, int height, int depth, void* data); |
| PixelBufferAccess (const TextureFormat& format, const IVec3& size, void* data); |
| PixelBufferAccess (const TextureFormat& format, int width, int height, int depth, int rowPitch, int slicePitch, void* data); |
| PixelBufferAccess (const TextureFormat& format, const IVec3& size, const IVec3& pitch, void* data); |
| PixelBufferAccess (const TextureFormat& format, const IVec3& size, const IVec3& pitch, const IVec3& block, void* data); |
| |
| void* getDataPtr (void) const { return m_data; } |
| void* getPixelPtr (int x, int y, int z = 0) const { return (deUint8*)m_data + (x/m_divider.x()) * m_pitch.x() + (y/m_divider.y()) * m_pitch.y() + (z/m_divider.z()) * m_pitch.z(); } |
| |
| void setPixel (const tcu::Vec4& color, int x, int y, int z = 0) const; |
| void setPixel (const tcu::IVec4& color, int x, int y, int z = 0) const; |
| void setPixel (const tcu::UVec4& color, int x, int y, int z = 0) const { setPixel(color.cast<int>(), x, y, z); } |
| |
| void setPixDepth (float depth, int x, int y, int z = 0) const; |
| void setPixStencil (int stencil, int x, int y, int z = 0) const; |
| } DE_WARN_UNUSED_TYPE; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Generic pixel data container |
| * |
| * This container supports all valid TextureFormat combinations and |
| * both 2D and 3D textures. To read or manipulate data access object must |
| * be queried using getAccess(). |
| *//*--------------------------------------------------------------------*/ |
| class TextureLevel |
| { |
| public: |
| TextureLevel (void); |
| TextureLevel (const TextureFormat& format); |
| TextureLevel (const TextureFormat& format, int width, int height, int depth = 1); |
| ~TextureLevel (void); |
| |
| const IVec3& getSize (void) const { return m_size; } |
| int getWidth (void) const { return m_size.x(); } |
| int getHeight (void) const { return m_size.y(); } |
| int getDepth (void) const { return m_size.z(); } |
| bool isEmpty (void) const { return m_size.x() * m_size.y() * m_size.z() == 0; } |
| const TextureFormat getFormat (void) const { return m_format; } |
| |
| void setStorage (const TextureFormat& format, int width, int heigth, int depth = 1); |
| void setSize (int width, int height, int depth = 1); |
| |
| PixelBufferAccess getAccess (void) { return isEmpty() ? PixelBufferAccess() : PixelBufferAccess(m_format, m_size, calculatePackedPitch(m_format, m_size), getPtr()); } |
| ConstPixelBufferAccess getAccess (void) const { return isEmpty() ? ConstPixelBufferAccess() : ConstPixelBufferAccess(m_format, m_size, calculatePackedPitch(m_format, m_size), getPtr()); } |
| |
| private: |
| void* getPtr (void) { return m_data.getPtr(); } |
| const void* getPtr (void) const { return m_data.getPtr(); } |
| |
| TextureFormat m_format; |
| IVec3 m_size; |
| de::ArrayBuffer<deUint8> m_data; |
| |
| friend class ConstPixelBufferAccess; |
| } DE_WARN_UNUSED_TYPE; |
| |
| Vec4 sampleLevelArray1D (const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, int level, float lod); |
| Vec4 sampleLevelArray2D (const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float t, int depth, float lod, bool es2 = false); |
| Vec4 sampleLevelArray3D (const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float t, float r, float lod); |
| |
| Vec4 sampleLevelArray1DOffset (const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float lod, const IVec2& offset); |
| Vec4 sampleLevelArray2DOffset (const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float t, float lod, const IVec3& offset, bool es2 = false); |
| Vec4 sampleLevelArray3DOffset (const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset); |
| |
| float sampleLevelArray1DCompare (const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float ref, float s, float lod, const IVec2& offset); |
| float sampleLevelArray2DCompare (const ConstPixelBufferAccess* levels, int numLevels, const Sampler& sampler, float ref, float s, float t, float lod, const IVec3& offset); |
| |
| Vec4 gatherArray2DOffsets (const ConstPixelBufferAccess& src, const Sampler& sampler, float s, float t, int depth, int componentNdx, const IVec2 (&offsets)[4]); |
| Vec4 gatherArray2DOffsetsCompare (const ConstPixelBufferAccess& src, const Sampler& sampler, float ref, float s, float t, int depth, const IVec2 (&offsets)[4]); |
| |
| enum CubeFace |
| { |
| CUBEFACE_NEGATIVE_X = 0, |
| CUBEFACE_POSITIVE_X, |
| CUBEFACE_NEGATIVE_Y, |
| CUBEFACE_POSITIVE_Y, |
| CUBEFACE_NEGATIVE_Z, |
| CUBEFACE_POSITIVE_Z, |
| |
| CUBEFACE_LAST |
| }; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Coordinates projected onto cube face. |
| *//*--------------------------------------------------------------------*/ |
| template<typename T> |
| struct CubeFaceCoords |
| { |
| CubeFace face; |
| T s; |
| T t; |
| |
| CubeFaceCoords (CubeFace face_, T s_, T t_) : face(face_), s(s_), t(t_) {} |
| CubeFaceCoords (CubeFace face_, const Vector<T, 2>& c) : face(face_), s(c.x()), t(c.y()) {} |
| } DE_WARN_UNUSED_TYPE; |
| |
| typedef CubeFaceCoords<float> CubeFaceFloatCoords; |
| typedef CubeFaceCoords<int> CubeFaceIntCoords; |
| |
| CubeFace selectCubeFace (const Vec3& coords); |
| Vec2 projectToFace (CubeFace face, const Vec3& coords); |
| CubeFaceFloatCoords getCubeFaceCoords (const Vec3& coords); |
| CubeFaceIntCoords remapCubeEdgeCoords (const CubeFaceIntCoords& coords, int size); |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief 1D Texture View |
| *//*--------------------------------------------------------------------*/ |
| class Texture1DView |
| { |
| public: |
| Texture1DView (int numLevels, const ConstPixelBufferAccess* levels, bool es2); |
| |
| int getNumLevels (void) const { return m_numLevels; } |
| int getWidth (void) const { return m_numLevels > 0 ? m_levels[0].getWidth() : 0; } |
| const ConstPixelBufferAccess& getLevel (int ndx) const { DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx]; } |
| const ConstPixelBufferAccess* getLevels (void) const { return m_levels; } |
| bool isES2 (void) const { return false; } |
| |
| Vec4 sample (const Sampler& sampler, float s, float lod) const; |
| Vec4 sampleOffset (const Sampler& sampler, float s, float lod, deInt32 offset) const; |
| float sampleCompare (const Sampler& sampler, float ref, float s, float lod) const; |
| float sampleCompareOffset (const Sampler& sampler, float ref, float s, float lod, deInt32 offset) const; |
| |
| protected: |
| int m_numLevels; |
| const ConstPixelBufferAccess* m_levels; |
| } DE_WARN_UNUSED_TYPE; |
| |
| inline Texture1DView::Texture1DView (int numLevels, const ConstPixelBufferAccess* levels, bool es2 DE_UNUSED_ATTR = false) |
| : m_numLevels (numLevels) |
| , m_levels (levels) |
| { |
| DE_ASSERT(m_numLevels >= 0 && ((m_numLevels == 0) == !m_levels)); |
| } |
| |
| inline Vec4 Texture1DView::sample (const Sampler& sampler, float s, float lod) const |
| { |
| return sampleLevelArray1D(m_levels, m_numLevels, sampler, s, 0 /* depth */, lod); |
| } |
| |
| inline Vec4 Texture1DView::sampleOffset (const Sampler& sampler, float s, float lod, deInt32 offset) const |
| { |
| return sampleLevelArray1DOffset(m_levels, m_numLevels, sampler, s, lod, IVec2(offset, 0)); |
| } |
| |
| inline float Texture1DView::sampleCompare (const Sampler& sampler, float ref, float s, float lod) const |
| { |
| return sampleLevelArray1DCompare(m_levels, m_numLevels, sampler, ref, s, lod, IVec2(0, 0)); |
| } |
| |
| inline float Texture1DView::sampleCompareOffset (const Sampler& sampler, float ref, float s, float lod, deInt32 offset) const |
| { |
| return sampleLevelArray1DCompare(m_levels, m_numLevels, sampler, ref, s, lod, IVec2(offset, 0)); |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief 2D Texture View |
| *//*--------------------------------------------------------------------*/ |
| class Texture2DView |
| { |
| public: |
| Texture2DView (int numLevels, const ConstPixelBufferAccess* levels, bool es2 = false); |
| |
| int getNumLevels (void) const { return m_numLevels; } |
| int getWidth (void) const { return m_numLevels > 0 ? m_levels[0].getWidth() : 0; } |
| int getHeight (void) const { return m_numLevels > 0 ? m_levels[0].getHeight() : 0; } |
| const ConstPixelBufferAccess& getLevel (int ndx) const { DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx]; } |
| const ConstPixelBufferAccess* getLevels (void) const { return m_levels; } |
| bool isES2 (void) const { return m_es2; } |
| |
| Vec4 sample (const Sampler& sampler, float s, float t, float lod) const; |
| Vec4 sampleOffset (const Sampler& sampler, float s, float t, float lod, const IVec2& offset) const; |
| float sampleCompare (const Sampler& sampler, float ref, float s, float t, float lod) const; |
| float sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float lod, const IVec2& offset) const; |
| |
| Vec4 gatherOffsets (const Sampler& sampler, float s, float t, int componentNdx, const IVec2 (&offsets)[4]) const; |
| Vec4 gatherOffsetsCompare(const Sampler& sampler, float ref, float s, float t, const IVec2 (&offsets)[4]) const; |
| |
| protected: |
| int m_numLevels; |
| const ConstPixelBufferAccess* m_levels; |
| bool m_es2; |
| } DE_WARN_UNUSED_TYPE; |
| |
| inline Texture2DView::Texture2DView (int numLevels, const ConstPixelBufferAccess* levels, bool es2) |
| : m_numLevels (numLevels) |
| , m_levels (levels) |
| , m_es2 (es2) |
| { |
| DE_ASSERT(m_numLevels >= 0 && ((m_numLevels == 0) == !m_levels)); |
| } |
| |
| inline Vec4 Texture2DView::sample (const Sampler& sampler, float s, float t, float lod) const |
| { |
| return sampleLevelArray2D(m_levels, m_numLevels, sampler, s, t, 0 /* depth */, lod, m_es2); |
| } |
| |
| inline Vec4 Texture2DView::sampleOffset (const Sampler& sampler, float s, float t, float lod, const IVec2& offset) const |
| { |
| return sampleLevelArray2DOffset(m_levels, m_numLevels, sampler, s, t, lod, IVec3(offset.x(), offset.y(), 0)); |
| } |
| |
| inline float Texture2DView::sampleCompare (const Sampler& sampler, float ref, float s, float t, float lod) const |
| { |
| return sampleLevelArray2DCompare(m_levels, m_numLevels, sampler, ref, s, t, lod, IVec3(0, 0, 0)); |
| } |
| |
| inline float Texture2DView::sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float lod, const IVec2& offset) const |
| { |
| return sampleLevelArray2DCompare(m_levels, m_numLevels, sampler, ref, s, t, lod, IVec3(offset.x(), offset.y(), 0)); |
| } |
| |
| inline Vec4 Texture2DView::gatherOffsets (const Sampler& sampler, float s, float t, int componentNdx, const IVec2 (&offsets)[4]) const |
| { |
| return gatherArray2DOffsets(m_levels[0], sampler, s, t, 0, componentNdx, offsets); |
| } |
| |
| inline Vec4 Texture2DView::gatherOffsetsCompare (const Sampler& sampler, float ref, float s, float t, const IVec2 (&offsets)[4]) const |
| { |
| return gatherArray2DOffsetsCompare(m_levels[0], sampler, ref, s, t, 0, offsets); |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Base class for textures that have single mip-map pyramid |
| *//*--------------------------------------------------------------------*/ |
| class TextureLevelPyramid |
| { |
| public: |
| TextureLevelPyramid (const TextureFormat& format, int numLevels); |
| TextureLevelPyramid (const TextureLevelPyramid& other); |
| ~TextureLevelPyramid(void); |
| |
| const TextureFormat& getFormat (void) const { return m_format; } |
| int getNumLevels (void) const { return (int)m_access.size(); } |
| |
| bool isLevelEmpty (int levelNdx) const { DE_ASSERT(de::inBounds(levelNdx, 0, getNumLevels())); return m_data[(size_t)levelNdx].empty(); } |
| const ConstPixelBufferAccess& getLevel (int levelNdx) const { DE_ASSERT(de::inBounds(levelNdx, 0, getNumLevels())); return m_access[(size_t)levelNdx]; } |
| const PixelBufferAccess& getLevel (int levelNdx) { DE_ASSERT(de::inBounds(levelNdx, 0, getNumLevels())); return m_access[(size_t)levelNdx]; } |
| |
| const ConstPixelBufferAccess* getLevels (void) const { return &m_access[0]; } |
| const PixelBufferAccess* getLevels (void) { return &m_access[0]; } |
| |
| void allocLevel (int levelNdx, int width, int height, int depth); |
| void clearLevel (int levelNdx); |
| |
| TextureLevelPyramid& operator= (const TextureLevelPyramid& other); |
| |
| private: |
| typedef de::ArrayBuffer<deUint8> LevelData; |
| |
| TextureFormat m_format; |
| std::vector<LevelData> m_data; |
| std::vector<PixelBufferAccess> m_access; |
| } DE_WARN_UNUSED_TYPE; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief 1D Texture reference implementation |
| *//*--------------------------------------------------------------------*/ |
| class Texture1D : private TextureLevelPyramid |
| { |
| public: |
| Texture1D (const TextureFormat& format, int width); |
| Texture1D (const Texture1D& other); |
| ~Texture1D (void); |
| |
| int getWidth (void) const { return m_width; } |
| const Texture1DView& getView (void) const { return m_view; } |
| |
| void allocLevel (int levelNdx); |
| |
| // Sampling |
| Vec4 sample (const Sampler& sampler, float s, float lod) const; |
| Vec4 sampleOffset (const Sampler& sampler, float s, float lod, deInt32 offset) const; |
| float sampleCompare (const Sampler& sampler, float ref, float s, float lod) const; |
| float sampleCompareOffset (const Sampler& sampler, float ref, float s, float lod, deInt32 offset) const; |
| |
| using TextureLevelPyramid::getFormat; |
| using TextureLevelPyramid::getNumLevels; |
| using TextureLevelPyramid::getLevel; |
| using TextureLevelPyramid::clearLevel; |
| using TextureLevelPyramid::isLevelEmpty; |
| |
| Texture1D& operator= (const Texture1D& other); |
| |
| operator Texture1DView (void) const { return m_view; } |
| |
| private: |
| int m_width; |
| Texture1DView m_view; |
| } DE_WARN_UNUSED_TYPE; |
| |
| inline Vec4 Texture1D::sample (const Sampler& sampler, float s, float lod) const |
| { |
| return m_view.sample(sampler, s, lod); |
| } |
| |
| inline Vec4 Texture1D::sampleOffset (const Sampler& sampler, float s, float lod, deInt32 offset) const |
| { |
| return m_view.sampleOffset(sampler, s, lod, offset); |
| } |
| |
| inline float Texture1D::sampleCompare (const Sampler& sampler, float ref, float s, float lod) const |
| { |
| return m_view.sampleCompare(sampler, ref, s, lod); |
| } |
| |
| inline float Texture1D::sampleCompareOffset (const Sampler& sampler, float ref, float s, float lod, deInt32 offset) const |
| { |
| return m_view.sampleCompareOffset(sampler, ref, s, lod, offset); |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief 2D Texture reference implementation |
| *//*--------------------------------------------------------------------*/ |
| class Texture2D : private TextureLevelPyramid |
| { |
| public: |
| Texture2D (const TextureFormat& format, int width, int height, bool es2 = false); |
| Texture2D (const TextureFormat& format, int width, int height, int mipmaps); |
| Texture2D (const Texture2D& other); |
| ~Texture2D (void); |
| |
| int getWidth (void) const { return m_width; } |
| int getHeight (void) const { return m_height; } |
| const Texture2DView& getView (void) const { return m_view; } |
| |
| void allocLevel (int levelNdx); |
| |
| // Sampling |
| Vec4 sample (const Sampler& sampler, float s, float t, float lod) const; |
| Vec4 sampleOffset (const Sampler& sampler, float s, float t, float lod, const IVec2& offset) const; |
| float sampleCompare (const Sampler& sampler, float ref, float s, float t, float lod) const; |
| float sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float lod, const IVec2& offset) const; |
| |
| Vec4 gatherOffsets (const Sampler& sampler, float s, float t, int componentNdx, const IVec2 (&offsets)[4]) const; |
| Vec4 gatherOffsetsCompare(const Sampler& sampler, float ref, float s, float t, const IVec2 (&offsets)[4]) const; |
| |
| using TextureLevelPyramid::getFormat; |
| using TextureLevelPyramid::getNumLevels; |
| using TextureLevelPyramid::getLevel; |
| using TextureLevelPyramid::clearLevel; |
| using TextureLevelPyramid::isLevelEmpty; |
| |
| Texture2D& operator= (const Texture2D& other); |
| |
| operator Texture2DView (void) const { return m_view; } |
| |
| private: |
| int m_width; |
| int m_height; |
| Texture2DView m_view; |
| } DE_WARN_UNUSED_TYPE; |
| |
| inline Vec4 Texture2D::sample (const Sampler& sampler, float s, float t, float lod) const |
| { |
| return m_view.sample(sampler, s, t, lod); |
| } |
| |
| inline Vec4 Texture2D::sampleOffset (const Sampler& sampler, float s, float t, float lod, const IVec2& offset) const |
| { |
| return m_view.sampleOffset(sampler, s, t, lod, offset); |
| } |
| |
| inline float Texture2D::sampleCompare (const Sampler& sampler, float ref, float s, float t, float lod) const |
| { |
| return m_view.sampleCompare(sampler, ref, s, t, lod); |
| } |
| |
| inline float Texture2D::sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float lod, const IVec2& offset) const |
| { |
| return m_view.sampleCompareOffset(sampler, ref, s, t, lod, offset); |
| } |
| |
| inline Vec4 Texture2D::gatherOffsets (const Sampler& sampler, float s, float t, int componentNdx, const IVec2 (&offsets)[4]) const |
| { |
| return m_view.gatherOffsets(sampler, s, t, componentNdx, offsets); |
| } |
| |
| inline Vec4 Texture2D::gatherOffsetsCompare (const Sampler& sampler, float ref, float s, float t, const IVec2 (&offsets)[4]) const |
| { |
| return m_view.gatherOffsetsCompare(sampler, ref, s, t, offsets); |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Cube Map Texture View |
| *//*--------------------------------------------------------------------*/ |
| class TextureCubeView |
| { |
| public: |
| TextureCubeView (void); |
| TextureCubeView (int numLevels, const ConstPixelBufferAccess* const (&levels)[CUBEFACE_LAST], bool es2 = false); |
| |
| int getNumLevels (void) const { return m_numLevels; } |
| bool isES2 (void) const { return m_es2; } |
| int getSize (void) const { return m_numLevels > 0 ? m_levels[0][0].getWidth() : 0; } |
| const ConstPixelBufferAccess& getLevelFace (int ndx, CubeFace face) const { DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[face][ndx]; } |
| const ConstPixelBufferAccess* getFaceLevels (CubeFace face) const { return m_levels[face]; } |
| |
| Vec4 sample (const Sampler& sampler, float s, float t, float p, float lod) const; |
| float sampleCompare (const Sampler& sampler, float ref, float s, float t, float r, float lod) const; |
| |
| Vec4 gather (const Sampler& sampler, float s, float t, float r, int componentNdx) const; |
| Vec4 gatherCompare (const Sampler& sampler, float ref, float s, float t, float r) const; |
| |
| protected: |
| int m_numLevels; |
| const ConstPixelBufferAccess* m_levels[CUBEFACE_LAST]; |
| bool m_es2; |
| } DE_WARN_UNUSED_TYPE; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Cube Map Texture reference implementation |
| *//*--------------------------------------------------------------------*/ |
| class TextureCube |
| { |
| public: |
| TextureCube (const TextureFormat& format, int size, bool es2 = false); |
| TextureCube (const TextureCube& other); |
| ~TextureCube (void); |
| |
| const TextureFormat& getFormat (void) const { return m_format; } |
| int getSize (void) const { return m_size; } |
| const TextureCubeView& getView (void) const { return m_view; } |
| |
| int getNumLevels (void) const { return (int)m_access[0].size(); } |
| const ConstPixelBufferAccess& getLevelFace (int ndx, CubeFace face) const { DE_ASSERT(de::inBounds(ndx, 0, getNumLevels())); return m_access[face][(size_t)ndx]; } |
| const PixelBufferAccess& getLevelFace (int ndx, CubeFace face) { DE_ASSERT(de::inBounds(ndx, 0, getNumLevels())); return m_access[face][(size_t)ndx]; } |
| |
| void allocLevel (CubeFace face, int levelNdx); |
| void clearLevel (CubeFace face, int levelNdx); |
| bool isLevelEmpty (CubeFace face, int levelNdx) const { DE_ASSERT(de::inBounds(levelNdx, 0, getNumLevels())); return m_data[face][(size_t)levelNdx].empty(); } |
| |
| Vec4 sample (const Sampler& sampler, float s, float t, float p, float lod) const; |
| float sampleCompare (const Sampler& sampler, float ref, float s, float t, float r, float lod) const; |
| |
| Vec4 gather (const Sampler& sampler, float s, float t, float r, int componentNdx) const; |
| Vec4 gatherCompare (const Sampler& sampler, float ref, float s, float t, float r) const; |
| |
| TextureCube& operator= (const TextureCube& other); |
| |
| operator TextureCubeView (void) const { return m_view; } |
| |
| private: |
| typedef de::ArrayBuffer<deUint8> LevelData; |
| |
| TextureFormat m_format; |
| int m_size; |
| std::vector<LevelData> m_data[CUBEFACE_LAST]; |
| std::vector<PixelBufferAccess> m_access[CUBEFACE_LAST]; |
| TextureCubeView m_view; |
| } DE_WARN_UNUSED_TYPE; |
| |
| inline Vec4 TextureCube::sample (const Sampler& sampler, float s, float t, float p, float lod) const |
| { |
| return m_view.sample(sampler, s, t, p, lod); |
| } |
| |
| inline float TextureCube::sampleCompare (const Sampler& sampler, float ref, float s, float t, float r, float lod) const |
| { |
| return m_view.sampleCompare(sampler, ref, s, t, r, lod); |
| } |
| |
| inline Vec4 TextureCube::gather (const Sampler& sampler, float s, float t, float r, int componentNdx) const |
| { |
| return m_view.gather(sampler, s, t, r, componentNdx); |
| } |
| |
| inline Vec4 TextureCube::gatherCompare (const Sampler& sampler, float ref, float s, float t, float r) const |
| { |
| return m_view.gatherCompare(sampler, ref, s, t, r); |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief 1D Array Texture View |
| *//*--------------------------------------------------------------------*/ |
| class Texture1DArrayView |
| { |
| public: |
| Texture1DArrayView (int numLevels, const ConstPixelBufferAccess* levels, bool es2 = false); |
| |
| int getWidth (void) const { return m_numLevels > 0 ? m_levels[0].getWidth() : 0; } |
| int getNumLayers (void) const { return m_numLevels > 0 ? m_levels[0].getHeight() : 0; } |
| int getNumLevels (void) const { return m_numLevels; } |
| const ConstPixelBufferAccess& getLevel (int ndx) const { DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx]; } |
| const ConstPixelBufferAccess* getLevels (void) const { return m_levels; } |
| bool isES2 (void) const { return false; } |
| |
| Vec4 sample (const Sampler& sampler, float s, float t, float lod) const; |
| Vec4 sampleOffset (const Sampler& sampler, float s, float t, float lod, deInt32 offset) const; |
| float sampleCompare (const Sampler& sampler, float ref, float s, float t, float lod) const; |
| float sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float lod, deInt32 offset) const; |
| |
| protected: |
| int selectLayer (float r) const; |
| |
| int m_numLevels; |
| const ConstPixelBufferAccess* m_levels; |
| } DE_WARN_UNUSED_TYPE; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief 2D Array Texture View |
| *//*--------------------------------------------------------------------*/ |
| class Texture2DArrayView |
| { |
| public: |
| Texture2DArrayView (int numLevels, const ConstPixelBufferAccess* levels, bool es2 = false); |
| |
| int getWidth (void) const { return m_numLevels > 0 ? m_levels[0].getWidth() : 0; } |
| int getHeight (void) const { return m_numLevels > 0 ? m_levels[0].getHeight() : 0; } |
| int getNumLayers (void) const { return m_numLevels > 0 ? m_levels[0].getDepth() : 0; } |
| int getNumLevels (void) const { return m_numLevels; } |
| const ConstPixelBufferAccess& getLevel (int ndx) const { DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx]; } |
| const ConstPixelBufferAccess* getLevels (void) const { return m_levels; } |
| bool isES2 (void) const { return false; } |
| |
| Vec4 sample (const Sampler& sampler, float s, float t, float r, float lod) const; |
| Vec4 sampleOffset (const Sampler& sampler, float s, float t, float r, float lod, const IVec2& offset) const; |
| float sampleCompare (const Sampler& sampler, float ref, float s, float t, float r, float lod) const; |
| float sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float r, float lod, const IVec2& offset) const; |
| |
| Vec4 gatherOffsets (const Sampler& sampler, float s, float t, float r, int componentNdx, const IVec2 (&offsets)[4]) const; |
| Vec4 gatherOffsetsCompare(const Sampler& sampler, float ref, float s, float t, float r, const IVec2 (&offsets)[4]) const; |
| |
| protected: |
| int selectLayer (float r) const; |
| |
| int m_numLevels; |
| const ConstPixelBufferAccess* m_levels; |
| } DE_WARN_UNUSED_TYPE; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief 1D Array Texture reference implementation |
| *//*--------------------------------------------------------------------*/ |
| class Texture1DArray : private TextureLevelPyramid |
| { |
| public: |
| Texture1DArray (const TextureFormat& format, int width, int numLayers); |
| Texture1DArray (const Texture1DArray& other); |
| ~Texture1DArray (void); |
| |
| int getWidth (void) const { return m_width; } |
| int getNumLayers (void) const { return m_numLayers; } |
| |
| void allocLevel (int levelNdx); |
| |
| using TextureLevelPyramid::getFormat; |
| using TextureLevelPyramid::getNumLevels; |
| using TextureLevelPyramid::getLevel; |
| using TextureLevelPyramid::clearLevel; |
| using TextureLevelPyramid::isLevelEmpty; |
| |
| Vec4 sample (const Sampler& sampler, float s, float t, float lod) const; |
| Vec4 sampleOffset (const Sampler& sampler, float s, float t, float lod, deInt32 offset) const; |
| float sampleCompare (const Sampler& sampler, float ref, float s, float t, float lod) const; |
| float sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float lod, deInt32 offset) const; |
| |
| Texture1DArray& operator= (const Texture1DArray& other); |
| |
| operator Texture1DArrayView (void) const { return m_view; } |
| |
| private: |
| int m_width; |
| int m_numLayers; |
| Texture1DArrayView m_view; |
| } DE_WARN_UNUSED_TYPE; |
| |
| inline Vec4 Texture1DArray::sample (const Sampler& sampler, float s, float t, float lod) const |
| { |
| return m_view.sample(sampler, s, t, lod); |
| } |
| |
| inline Vec4 Texture1DArray::sampleOffset (const Sampler& sampler, float s, float t, float lod, deInt32 offset) const |
| { |
| return m_view.sampleOffset(sampler, s, t, lod, offset); |
| } |
| |
| inline float Texture1DArray::sampleCompare (const Sampler& sampler, float ref, float s, float t, float lod) const |
| { |
| return m_view.sampleCompare(sampler, ref, s, t, lod); |
| } |
| |
| inline float Texture1DArray::sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float lod, deInt32 offset) const |
| { |
| return m_view.sampleCompareOffset(sampler, ref, s, t, lod, offset); |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief 2D Array Texture reference implementation |
| *//*--------------------------------------------------------------------*/ |
| class Texture2DArray : private TextureLevelPyramid |
| { |
| public: |
| Texture2DArray (const TextureFormat& format, int width, int height, int numLayers); |
| Texture2DArray (const Texture2DArray& other); |
| ~Texture2DArray (void); |
| |
| int getWidth (void) const { return m_width; } |
| int getHeight (void) const { return m_height; } |
| int getNumLayers (void) const { return m_numLayers; } |
| |
| void allocLevel (int levelNdx); |
| |
| using TextureLevelPyramid::getFormat; |
| using TextureLevelPyramid::getNumLevels; |
| using TextureLevelPyramid::getLevel; |
| using TextureLevelPyramid::clearLevel; |
| using TextureLevelPyramid::isLevelEmpty; |
| |
| Vec4 sample (const Sampler& sampler, float s, float t, float r, float lod) const; |
| Vec4 sampleOffset (const Sampler& sampler, float s, float t, float r, float lod, const IVec2& offset) const; |
| float sampleCompare (const Sampler& sampler, float ref, float s, float t, float r, float lod) const; |
| float sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float r, float lod, const IVec2& offset) const; |
| |
| Vec4 gatherOffsets (const Sampler& sampler, float s, float t, float r, int componentNdx, const IVec2 (&offsets)[4]) const; |
| Vec4 gatherOffsetsCompare(const Sampler& sampler, float ref, float s, float t, float r, const IVec2 (&offsets)[4]) const; |
| |
| Texture2DArray& operator= (const Texture2DArray& other); |
| |
| operator Texture2DArrayView (void) const { return m_view; } |
| |
| private: |
| int m_width; |
| int m_height; |
| int m_numLayers; |
| Texture2DArrayView m_view; |
| } DE_WARN_UNUSED_TYPE; |
| |
| inline Vec4 Texture2DArray::sample (const Sampler& sampler, float s, float t, float r, float lod) const |
| { |
| return m_view.sample(sampler, s, t, r, lod); |
| } |
| |
| inline Vec4 Texture2DArray::sampleOffset (const Sampler& sampler, float s, float t, float r, float lod, const IVec2& offset) const |
| { |
| return m_view.sampleOffset(sampler, s, t, r, lod, offset); |
| } |
| |
| inline float Texture2DArray::sampleCompare (const Sampler& sampler, float ref, float s, float t, float r, float lod) const |
| { |
| return m_view.sampleCompare(sampler, ref, s, t, r, lod); |
| } |
| |
| inline float Texture2DArray::sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float r, float lod, const IVec2& offset) const |
| { |
| return m_view.sampleCompareOffset(sampler, ref, s, t, r, lod, offset); |
| } |
| |
| inline Vec4 Texture2DArray::gatherOffsets (const Sampler& sampler, float s, float t, float r, int componentNdx, const IVec2 (&offsets)[4]) const |
| { |
| return m_view.gatherOffsets(sampler, s, t, r, componentNdx, offsets); |
| } |
| |
| inline Vec4 Texture2DArray::gatherOffsetsCompare (const Sampler& sampler, float ref, float s, float t, float r, const IVec2 (&offsets)[4]) const |
| { |
| return m_view.gatherOffsetsCompare(sampler, ref, s, t, r, offsets); |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief 3D Texture View |
| *//*--------------------------------------------------------------------*/ |
| class Texture3DView |
| { |
| public: |
| Texture3DView (int numLevels, const ConstPixelBufferAccess* levels, bool es2 = false); |
| |
| int getWidth (void) const { return m_numLevels > 0 ? m_levels[0].getWidth() : 0; } |
| int getHeight (void) const { return m_numLevels > 0 ? m_levels[0].getHeight() : 0; } |
| int getDepth (void) const { return m_numLevels > 0 ? m_levels[0].getDepth() : 0; } |
| int getNumLevels (void) const { return m_numLevels; } |
| const ConstPixelBufferAccess& getLevel (int ndx) const { DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx]; } |
| const ConstPixelBufferAccess* getLevels (void) const { return m_levels; } |
| bool isES2 (void) const { return false; } |
| |
| Vec4 sample (const Sampler& sampler, float s, float t, float r, float lod) const; |
| Vec4 sampleOffset (const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset) const; |
| |
| protected: |
| int m_numLevels; |
| const ConstPixelBufferAccess* m_levels; |
| } DE_WARN_UNUSED_TYPE; |
| |
| inline Vec4 Texture3DView::sample (const Sampler& sampler, float s, float t, float r, float lod) const |
| { |
| return sampleLevelArray3D(m_levels, m_numLevels, sampler, s, t, r, lod); |
| } |
| |
| inline Vec4 Texture3DView::sampleOffset (const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset) const |
| { |
| return sampleLevelArray3DOffset(m_levels, m_numLevels, sampler, s, t, r, lod, offset); |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief 3D Texture reference implementation |
| *//*--------------------------------------------------------------------*/ |
| class Texture3D : private TextureLevelPyramid |
| { |
| public: |
| Texture3D (const TextureFormat& format, int width, int height, int depth); |
| Texture3D (const Texture3D& other); |
| ~Texture3D (void); |
| |
| int getWidth (void) const { return m_width; } |
| int getHeight (void) const { return m_height; } |
| int getDepth (void) const { return m_depth; } |
| |
| void allocLevel (int levelNdx); |
| |
| using TextureLevelPyramid::getFormat; |
| using TextureLevelPyramid::getNumLevels; |
| using TextureLevelPyramid::getLevel; |
| using TextureLevelPyramid::clearLevel; |
| using TextureLevelPyramid::isLevelEmpty; |
| |
| Vec4 sample (const Sampler& sampler, float s, float t, float r, float lod) const; |
| Vec4 sampleOffset (const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset) const; |
| |
| Texture3D& operator= (const Texture3D& other); |
| |
| operator Texture3DView (void) const { return m_view; } |
| |
| private: |
| int m_width; |
| int m_height; |
| int m_depth; |
| Texture3DView m_view; |
| } DE_WARN_UNUSED_TYPE; |
| |
| inline Vec4 Texture3D::sample (const Sampler& sampler, float s, float t, float r, float lod) const |
| { |
| return m_view.sample(sampler, s, t, r, lod); |
| } |
| |
| inline Vec4 Texture3D::sampleOffset (const Sampler& sampler, float s, float t, float r, float lod, const IVec3& offset) const |
| { |
| return m_view.sampleOffset(sampler, s, t, r, lod, offset); |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Cube Map Array Texture View |
| *//*--------------------------------------------------------------------*/ |
| class TextureCubeArrayView |
| { |
| public: |
| TextureCubeArrayView (int numLevels, const ConstPixelBufferAccess* levels, bool es2 = false); |
| |
| int getSize (void) const { return m_numLevels > 0 ? m_levels[0].getWidth() : 0; } |
| int getDepth (void) const { return m_numLevels > 0 ? m_levels[0].getDepth() : 0; } |
| int getNumLayers (void) const { return getDepth() / 6; } |
| int getNumLevels (void) const { return m_numLevels; } |
| const ConstPixelBufferAccess& getLevel (int ndx) const { DE_ASSERT(de::inBounds(ndx, 0, m_numLevels)); return m_levels[ndx]; } |
| const ConstPixelBufferAccess* getLevels (void) const { return m_levels; } |
| bool isES2 (void) const { return false; } |
| |
| Vec4 sample (const Sampler& sampler, float s, float t, float r, float q, float lod) const; |
| Vec4 sampleOffset (const Sampler& sampler, float s, float t, float r, float q, float lod, const IVec2& offset) const; |
| float sampleCompare (const Sampler& sampler, float ref, float s, float t, float r, float q, float lod) const; |
| float sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float r, float q, float lod, const IVec2& offset) const; |
| |
| protected: |
| int selectLayer (float q) const; |
| |
| int m_numLevels; |
| const ConstPixelBufferAccess* m_levels; |
| } DE_WARN_UNUSED_TYPE; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Cube Map Array Texture reference implementation |
| *//*--------------------------------------------------------------------*/ |
| class TextureCubeArray : private TextureLevelPyramid |
| { |
| public: |
| TextureCubeArray (const TextureFormat& format, int size, int depth); |
| TextureCubeArray (const TextureCubeArray& other); |
| ~TextureCubeArray (void); |
| |
| int getSize (void) const { return m_size; } |
| int getDepth (void) const { return m_depth; } |
| |
| void allocLevel (int levelNdx); |
| |
| using TextureLevelPyramid::getFormat; |
| using TextureLevelPyramid::getNumLevels; |
| using TextureLevelPyramid::getLevel; |
| using TextureLevelPyramid::clearLevel; |
| using TextureLevelPyramid::isLevelEmpty; |
| |
| Vec4 sample (const Sampler& sampler, float s, float t, float r, float q, float lod) const; |
| Vec4 sampleOffset (const Sampler& sampler, float s, float t, float r, float q, float lod, const IVec2& offset) const; |
| float sampleCompare (const Sampler& sampler, float ref, float s, float t, float r, float q, float lod) const; |
| float sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float r, float q, float lod, const IVec2& offset) const; |
| |
| TextureCubeArray& operator= (const TextureCubeArray& other); |
| |
| operator TextureCubeArrayView (void) const { return m_view; } |
| |
| private: |
| int m_size; |
| int m_depth; |
| TextureCubeArrayView m_view; |
| } DE_WARN_UNUSED_TYPE; |
| |
| inline Vec4 TextureCubeArray::sample (const Sampler& sampler, float s, float t, float r, float q, float lod) const |
| { |
| return m_view.sample(sampler, s, t, r, q, lod); |
| } |
| |
| inline Vec4 TextureCubeArray::sampleOffset (const Sampler& sampler, float s, float t, float r, float q, float lod, const IVec2& offset) const |
| { |
| return m_view.sampleOffset(sampler, s, t, r, q, lod, offset); |
| } |
| |
| inline float TextureCubeArray::sampleCompare (const Sampler& sampler, float ref, float s, float t, float r, float q, float lod) const |
| { |
| return m_view.sampleCompare(sampler, ref, s, t, r, q, lod); |
| } |
| |
| inline float TextureCubeArray::sampleCompareOffset (const Sampler& sampler, float ref, float s, float t, float r, float q, float lod, const IVec2& offset) const |
| { |
| return m_view.sampleCompareOffset(sampler, ref, s, t, r, q, lod, offset); |
| } |
| |
| // Stream operators. |
| std::ostream& operator<< (std::ostream& str, TextureFormat::ChannelOrder order); |
| std::ostream& operator<< (std::ostream& str, TextureFormat::ChannelType type); |
| std::ostream& operator<< (std::ostream& str, TextureFormat format); |
| std::ostream& operator<< (std::ostream& str, CubeFace face); |
| std::ostream& operator<< (std::ostream& str, const ConstPixelBufferAccess& access); |
| |
| } // tcu |
| |
| #endif // _TCUTEXTURE_HPP |