#ifndef _GLUTEXTURE_HPP #define _GLUTEXTURE_HPP /*------------------------------------------------------------------------- * drawElements Quality Program OpenGL ES Utilities * ------------------------------------------------ * * 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 Texture classes. *//*--------------------------------------------------------------------*/ #include "gluDefs.hpp" #include "tcuTexture.hpp" #include "tcuCompressedTexture.hpp" #include "tcuResource.hpp" #include "gluRenderContext.hpp" #include "gluContextInfo.hpp" #include "deArrayBuffer.hpp" #include <vector> #include <string> namespace glu { /*--------------------------------------------------------------------*//*! * \brief 1D Texture only supported on OpenGL *//*--------------------------------------------------------------------*/ class Texture1D { public: Texture1D (const RenderContext& context, deUint32 format, deUint32 dataType, int width); Texture1D (const RenderContext& context, deUint32 internalFormat, int width); ~Texture1D (void); tcu::Texture1D& getRefTexture (void) { return m_refTexture; } const tcu::Texture1D& getRefTexture (void) const { return m_refTexture; } deUint32 getGLTexture (void) const { return m_glTexture; } void upload (void); private: Texture1D (const Texture1D& other); // Not allowed! Texture1D& operator= (const Texture1D& other); // Not allowed! const RenderContext& m_context; deUint32 m_format; //!< Internal format. tcu::Texture1D m_refTexture; deUint32 m_glTexture; } DE_WARN_UNUSED_TYPE; /*--------------------------------------------------------------------*//*! * \brief 2D Texture *//*--------------------------------------------------------------------*/ class Texture2D { public: Texture2D (const RenderContext& context, const ContextInfo& contextInfo, int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams = tcu::TexDecompressionParams()); Texture2D (const RenderContext& context, deUint32 format, deUint32 dataType, int width, int height); Texture2D (const RenderContext& context, deUint32 internalFormat, int width, int height); virtual ~Texture2D (void); virtual void upload (void); // Not supported on compressed textures. tcu::Texture2D& getRefTexture (void) { return m_refTexture; } const tcu::Texture2D& getRefTexture (void) const { return m_refTexture; } deUint32 getGLTexture (void) const { return m_glTexture; } static Texture2D* create (const RenderContext& context, const ContextInfo& contextInfo, const tcu::Archive& archive, int numLevels, const std::vector<std::string>& filenames); static Texture2D* create (const RenderContext& context, const ContextInfo& contextInfo, const tcu::Archive& archive, int numLevels, const char* const* filenames); static Texture2D* create (const RenderContext& context, const ContextInfo& contextInfo, const tcu::Archive& archive, const char* filename) { return create(context, contextInfo, archive, 1, &filename); } protected: const RenderContext& m_context; bool m_isCompressed; deUint32 m_format; //!< Internal format. tcu::Texture2D m_refTexture; deUint32 m_glTexture; private: Texture2D (const Texture2D& other); // Not allowed! Texture2D& operator= (const Texture2D& other); // Not allowed! void loadCompressed (int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams); } DE_WARN_UNUSED_TYPE; class ImmutableTexture2D : public Texture2D { public: ImmutableTexture2D (const RenderContext& context, deUint32 internalFormat, int width, int height); void upload (void); // Not supported on compressed textures. private: ImmutableTexture2D (const ImmutableTexture2D& other); // Not allowed! ImmutableTexture2D& operator= (const ImmutableTexture2D& other); // Not allowed! }; /*--------------------------------------------------------------------*//*! * \brief Cube Map Texture *//*--------------------------------------------------------------------*/ class TextureCube { public: // For compressed cubemap constructor and create() function input level pointers / filenames are expected // to laid out to array in following order: // { l0_neg_x, l0_pos_x, l0_neg_y, l0_pos_y, l0_neg_z, l0_pos_z, l1_neg_x, l1_pos_x, ... } TextureCube (const RenderContext& context, const ContextInfo& contextInfo, int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams = tcu::TexDecompressionParams()); TextureCube (const RenderContext& context, deUint32 format, deUint32 dataType, int size); TextureCube (const RenderContext& context, deUint32 internalFormat, int size); ~TextureCube (void); void upload (void); // Not supported on compressed textures. tcu::TextureCube& getRefTexture (void) { return m_refTexture; } const tcu::TextureCube& getRefTexture (void) const { return m_refTexture; } deUint32 getGLTexture (void) const { return m_glTexture; } static TextureCube* create (const RenderContext& context, const ContextInfo& contextInfo, const tcu::Archive& archive, int numLevels, const std::vector<std::string>& filenames); static TextureCube* create (const RenderContext& context, const ContextInfo& contextInfo, const tcu::Archive& archive, int numLevels, const char* const* filenames); private: TextureCube (const TextureCube& other); // Not allowed! TextureCube& operator= (const TextureCube& other); // Not allowed! void loadCompressed (int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams); const RenderContext& m_context; bool m_isCompressed; deUint32 m_format; //!< Internal format. tcu::TextureCube m_refTexture; deUint32 m_glTexture; } DE_WARN_UNUSED_TYPE; /*--------------------------------------------------------------------*//*! * \brief 2D Array Texture * \note Not supported on OpenGL ES 2 *//*--------------------------------------------------------------------*/ class Texture2DArray { public: Texture2DArray (const RenderContext& context, deUint32 format, deUint32 dataType, int width, int height, int numLayers); Texture2DArray (const RenderContext& context, deUint32 internalFormat, int width, int height, int numLayers); Texture2DArray (const RenderContext& context, const ContextInfo& contextInfo, int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams = tcu::TexDecompressionParams()); ~Texture2DArray (void); void upload (void); tcu::Texture2DArray& getRefTexture (void) { return m_refTexture; } const tcu::Texture2DArray& getRefTexture (void) const { return m_refTexture; } deUint32 getGLTexture (void) const { return m_glTexture; } private: Texture2DArray (const Texture2DArray& other); // Not allowed! Texture2DArray& operator= (const Texture2DArray& other); // Not allowed! void loadCompressed (int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams); const RenderContext& m_context; bool m_isCompressed; deUint32 m_format; //!< Internal format. tcu::Texture2DArray m_refTexture; deUint32 m_glTexture; } DE_WARN_UNUSED_TYPE; /*--------------------------------------------------------------------*//*! * \brief 1D Array Texture * \note Only supported on OpenGL *//*--------------------------------------------------------------------*/ class Texture1DArray { public: Texture1DArray (const RenderContext& context, deUint32 format, deUint32 dataType, int width, int numLayers); Texture1DArray (const RenderContext& context, deUint32 internalFormat, int width, int numLayers); ~Texture1DArray (void); void upload (void); tcu::Texture1DArray& getRefTexture (void) { return m_refTexture; } const tcu::Texture1DArray& getRefTexture (void) const { return m_refTexture; } deUint32 getGLTexture (void) const { return m_glTexture; } private: Texture1DArray (const Texture1DArray& other); // Not allowed! Texture1DArray& operator= (const Texture1DArray& other); // Not allowed! const RenderContext& m_context; deUint32 m_format; //!< Internal format. tcu::Texture1DArray m_refTexture; deUint32 m_glTexture; } DE_WARN_UNUSED_TYPE; /*--------------------------------------------------------------------*//*! * \brief 3D Texture * \note Not supported on OpenGL ES 2 *//*--------------------------------------------------------------------*/ class Texture3D { public: Texture3D (const RenderContext& context, deUint32 format, deUint32 dataType, int width, int height, int depth); Texture3D (const RenderContext& context, deUint32 internalFormat, int width, int height, int depth); Texture3D (const RenderContext& context, const ContextInfo& contextInfo, int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams = tcu::TexDecompressionParams()); ~Texture3D (void); void upload (void); tcu::Texture3D& getRefTexture (void) { return m_refTexture; } const tcu::Texture3D& getRefTexture (void) const { return m_refTexture; } deUint32 getGLTexture (void) const { return m_glTexture; } private: Texture3D (const Texture3D& other); // Not allowed! Texture3D& operator= (const Texture3D& other); // Not allowed! void loadCompressed (int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams); const RenderContext& m_context; bool m_isCompressed; deUint32 m_format; //!< Internal format. tcu::Texture3D m_refTexture; deUint32 m_glTexture; } DE_WARN_UNUSED_TYPE; /*--------------------------------------------------------------------*//*! * \brief Cube Map Array Texture * \note Not supported on OpenGL ES 3.0 or lower *//*--------------------------------------------------------------------*/ class TextureCubeArray { public: TextureCubeArray (const RenderContext& context, deUint32 format, deUint32 dataType, int size, int numLayers); TextureCubeArray (const RenderContext& context, deUint32 internalFormat, int size, int numLayers); ~TextureCubeArray (void); void upload (void); tcu::TextureCubeArray& getRefTexture (void) { return m_refTexture; } const tcu::TextureCubeArray& getRefTexture (void) const { return m_refTexture; } deUint32 getGLTexture (void) const { return m_glTexture; } private: TextureCubeArray (const TextureCubeArray& other); // Not allowed! TextureCubeArray& operator= (const TextureCubeArray& other); // Not allowed! const RenderContext& m_context; bool m_isCompressed; deUint32 m_format; //!< Internal format. tcu::TextureCubeArray m_refTexture; deUint32 m_glTexture; } DE_WARN_UNUSED_TYPE; /*--------------------------------------------------------------------*//*! * \brief 1D Texture Buffer only supported on OpenGL *//*--------------------------------------------------------------------*/ class TextureBuffer { public: TextureBuffer (const RenderContext& context, deUint32 internalFormat, size_t bufferSize); TextureBuffer (const RenderContext& context, deUint32 internalFormat, size_t bufferSize, size_t offset, size_t size, const void* data = DE_NULL); ~TextureBuffer (void); // \note Effective pixel buffer access must be limited to w <= GL_MAX_TEXTURE_BUFFER_SIZE const tcu::PixelBufferAccess getFullRefTexture (void); const tcu::ConstPixelBufferAccess getFullRefTexture (void) const; // \note mutating buffer storage will invalidate existing pixel buffer accesses de::ArrayBuffer<deUint8>& getRefBuffer (void) { return m_refBuffer; } const de::ArrayBuffer<deUint8>& getRefBuffer (void) const { return m_refBuffer; } size_t getSize (void) const { return m_size; } size_t getOffset (void) const { return m_offset; } size_t getBufferSize (void) const { return m_refBuffer.size(); } deUint32 getGLTexture (void) const { return m_glTexture; } deUint32 getGLBuffer (void) const { return m_glBuffer; } void upload (void); private: void init (deUint32 internalFormat, size_t bufferSize, size_t offset, size_t size, const void* data); TextureBuffer (const TextureBuffer& other); // Not allowed! TextureBuffer& operator= (const TextureBuffer& other); // Not allowed! const RenderContext& m_context; deUint32 m_format; //!< Internal format. de::ArrayBuffer<deUint8> m_refBuffer; size_t m_offset; size_t m_size; deUint32 m_glTexture; deUint32 m_glBuffer; } DE_WARN_UNUSED_TYPE; } // glu #endif // _GLUTEXTURE_HPP