1 #ifndef _GLUTEXTURE_HPP 2 #define _GLUTEXTURE_HPP 3 /*------------------------------------------------------------------------- 4 * drawElements Quality Program OpenGL ES Utilities 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 Texture classes. 24 *//*--------------------------------------------------------------------*/ 25 26 #include "gluDefs.hpp" 27 #include "tcuTexture.hpp" 28 #include "tcuCompressedTexture.hpp" 29 #include "tcuResource.hpp" 30 #include "gluRenderContext.hpp" 31 #include "gluContextInfo.hpp" 32 #include "deArrayBuffer.hpp" 33 34 #include <vector> 35 #include <string> 36 37 namespace glu 38 { 39 40 /*--------------------------------------------------------------------*//*! 41 * \brief 1D Texture only supported on OpenGL 42 *//*--------------------------------------------------------------------*/ 43 class Texture1D 44 { 45 public: 46 Texture1D (const RenderContext& context, deUint32 format, deUint32 dataType, int width); 47 Texture1D (const RenderContext& context, deUint32 internalFormat, int width); 48 ~Texture1D (void); 49 getRefTexture(void)50 tcu::Texture1D& getRefTexture (void) { return m_refTexture; } getRefTexture(void) const51 const tcu::Texture1D& getRefTexture (void) const { return m_refTexture; } getGLTexture(void) const52 deUint32 getGLTexture (void) const { return m_glTexture; } 53 54 void upload (void); 55 56 private: 57 Texture1D (const Texture1D& other); // Not allowed! 58 Texture1D& operator= (const Texture1D& other); // Not allowed! 59 60 const RenderContext& m_context; 61 deUint32 m_format; //!< Internal format. 62 tcu::Texture1D m_refTexture; 63 deUint32 m_glTexture; 64 } DE_WARN_UNUSED_TYPE; 65 66 /*--------------------------------------------------------------------*//*! 67 * \brief 2D Texture 68 *//*--------------------------------------------------------------------*/ 69 class Texture2D 70 { 71 public: 72 Texture2D (const RenderContext& context, const ContextInfo& contextInfo, int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams = tcu::TexDecompressionParams()); 73 Texture2D (const RenderContext& context, deUint32 format, deUint32 dataType, int width, int height); 74 Texture2D (const RenderContext& context, deUint32 internalFormat, int width, int height); 75 virtual ~Texture2D (void); 76 77 virtual void upload (void); // Not supported on compressed textures. 78 getRefTexture(void)79 tcu::Texture2D& getRefTexture (void) { return m_refTexture; } getRefTexture(void) const80 const tcu::Texture2D& getRefTexture (void) const { return m_refTexture; } getGLTexture(void) const81 deUint32 getGLTexture (void) const { return m_glTexture; } 82 83 static Texture2D* create (const RenderContext& context, const ContextInfo& contextInfo, const tcu::Archive& archive, int numLevels, const std::vector<std::string>& filenames); 84 static Texture2D* create (const RenderContext& context, const ContextInfo& contextInfo, const tcu::Archive& archive, int numLevels, const char* const* filenames); create(const RenderContext & context,const ContextInfo & contextInfo,const tcu::Archive & archive,const char * filename)85 static Texture2D* create (const RenderContext& context, const ContextInfo& contextInfo, const tcu::Archive& archive, const char* filename) { return create(context, contextInfo, archive, 1, &filename); } 86 87 protected: 88 const RenderContext& m_context; 89 90 bool m_isCompressed; 91 deUint32 m_format; //!< Internal format. 92 tcu::Texture2D m_refTexture; 93 94 deUint32 m_glTexture; 95 96 private: 97 Texture2D (const Texture2D& other); // Not allowed! 98 Texture2D& operator= (const Texture2D& other); // Not allowed! 99 100 void loadCompressed (int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams); 101 } DE_WARN_UNUSED_TYPE; 102 103 class ImmutableTexture2D : public Texture2D 104 { 105 public: 106 ImmutableTexture2D (const RenderContext& context, deUint32 internalFormat, int width, int height); 107 108 void upload (void); // Not supported on compressed textures. 109 110 private: 111 ImmutableTexture2D (const ImmutableTexture2D& other); // Not allowed! 112 ImmutableTexture2D& operator= (const ImmutableTexture2D& other); // Not allowed! 113 }; 114 115 /*--------------------------------------------------------------------*//*! 116 * \brief Cube Map Texture 117 *//*--------------------------------------------------------------------*/ 118 class TextureCube 119 { 120 public: 121 // For compressed cubemap constructor and create() function input level pointers / filenames are expected 122 // to laid out to array in following order: 123 // { l0_neg_x, l0_pos_x, l0_neg_y, l0_pos_y, l0_neg_z, l0_pos_z, l1_neg_x, l1_pos_x, ... } 124 125 TextureCube (const RenderContext& context, const ContextInfo& contextInfo, int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams = tcu::TexDecompressionParams()); 126 TextureCube (const RenderContext& context, deUint32 format, deUint32 dataType, int size); 127 TextureCube (const RenderContext& context, deUint32 internalFormat, int size); 128 ~TextureCube (void); 129 130 void upload (void); // Not supported on compressed textures. 131 getRefTexture(void)132 tcu::TextureCube& getRefTexture (void) { return m_refTexture; } getRefTexture(void) const133 const tcu::TextureCube& getRefTexture (void) const { return m_refTexture; } getGLTexture(void) const134 deUint32 getGLTexture (void) const { return m_glTexture; } 135 136 static TextureCube* create (const RenderContext& context, const ContextInfo& contextInfo, const tcu::Archive& archive, int numLevels, const std::vector<std::string>& filenames); 137 static TextureCube* create (const RenderContext& context, const ContextInfo& contextInfo, const tcu::Archive& archive, int numLevels, const char* const* filenames); 138 139 private: 140 TextureCube (const TextureCube& other); // Not allowed! 141 TextureCube& operator= (const TextureCube& other); // Not allowed! 142 143 void loadCompressed (int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams); 144 145 const RenderContext& m_context; 146 147 bool m_isCompressed; 148 deUint32 m_format; //!< Internal format. 149 150 tcu::TextureCube m_refTexture; 151 deUint32 m_glTexture; 152 } DE_WARN_UNUSED_TYPE; 153 154 /*--------------------------------------------------------------------*//*! 155 * \brief 2D Array Texture 156 * \note Not supported on OpenGL ES 2 157 *//*--------------------------------------------------------------------*/ 158 class Texture2DArray 159 { 160 public: 161 Texture2DArray (const RenderContext& context, deUint32 format, deUint32 dataType, int width, int height, int numLayers); 162 Texture2DArray (const RenderContext& context, deUint32 internalFormat, int width, int height, int numLayers); 163 Texture2DArray (const RenderContext& context, const ContextInfo& contextInfo, int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams = tcu::TexDecompressionParams()); 164 ~Texture2DArray (void); 165 166 void upload (void); 167 getRefTexture(void)168 tcu::Texture2DArray& getRefTexture (void) { return m_refTexture; } getRefTexture(void) const169 const tcu::Texture2DArray& getRefTexture (void) const { return m_refTexture; } getGLTexture(void) const170 deUint32 getGLTexture (void) const { return m_glTexture; } 171 172 private: 173 Texture2DArray (const Texture2DArray& other); // Not allowed! 174 Texture2DArray& operator= (const Texture2DArray& other); // Not allowed! 175 176 void loadCompressed (int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams); 177 178 179 const RenderContext& m_context; 180 181 bool m_isCompressed; 182 deUint32 m_format; //!< Internal format. 183 184 tcu::Texture2DArray m_refTexture; 185 deUint32 m_glTexture; 186 } DE_WARN_UNUSED_TYPE; 187 188 /*--------------------------------------------------------------------*//*! 189 * \brief 1D Array Texture 190 * \note Only supported on OpenGL 191 *//*--------------------------------------------------------------------*/ 192 class Texture1DArray 193 { 194 public: 195 Texture1DArray (const RenderContext& context, deUint32 format, deUint32 dataType, int width, int numLayers); 196 Texture1DArray (const RenderContext& context, deUint32 internalFormat, int width, int numLayers); 197 ~Texture1DArray (void); 198 199 void upload (void); 200 getRefTexture(void)201 tcu::Texture1DArray& getRefTexture (void) { return m_refTexture; } getRefTexture(void) const202 const tcu::Texture1DArray& getRefTexture (void) const { return m_refTexture; } getGLTexture(void) const203 deUint32 getGLTexture (void) const { return m_glTexture; } 204 205 private: 206 Texture1DArray (const Texture1DArray& other); // Not allowed! 207 Texture1DArray& operator= (const Texture1DArray& other); // Not allowed! 208 209 const RenderContext& m_context; 210 211 deUint32 m_format; //!< Internal format. 212 213 tcu::Texture1DArray m_refTexture; 214 deUint32 m_glTexture; 215 } DE_WARN_UNUSED_TYPE; 216 217 /*--------------------------------------------------------------------*//*! 218 * \brief 3D Texture 219 * \note Not supported on OpenGL ES 2 220 *//*--------------------------------------------------------------------*/ 221 class Texture3D 222 { 223 public: 224 Texture3D (const RenderContext& context, deUint32 format, deUint32 dataType, int width, int height, int depth); 225 Texture3D (const RenderContext& context, deUint32 internalFormat, int width, int height, int depth); 226 Texture3D (const RenderContext& context, const ContextInfo& contextInfo, int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams = tcu::TexDecompressionParams()); 227 ~Texture3D (void); 228 229 void upload (void); 230 getRefTexture(void)231 tcu::Texture3D& getRefTexture (void) { return m_refTexture; } getRefTexture(void) const232 const tcu::Texture3D& getRefTexture (void) const { return m_refTexture; } getGLTexture(void) const233 deUint32 getGLTexture (void) const { return m_glTexture; } 234 235 private: 236 Texture3D (const Texture3D& other); // Not allowed! 237 Texture3D& operator= (const Texture3D& other); // Not allowed! 238 239 void loadCompressed (int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams); 240 241 const RenderContext& m_context; 242 243 bool m_isCompressed; 244 deUint32 m_format; //!< Internal format. 245 246 tcu::Texture3D m_refTexture; 247 deUint32 m_glTexture; 248 } DE_WARN_UNUSED_TYPE; 249 250 /*--------------------------------------------------------------------*//*! 251 * \brief Cube Map Array Texture 252 * \note Not supported on OpenGL ES 3.0 or lower 253 *//*--------------------------------------------------------------------*/ 254 class TextureCubeArray 255 { 256 public: 257 TextureCubeArray (const RenderContext& context, deUint32 format, deUint32 dataType, int size, int numLayers); 258 TextureCubeArray (const RenderContext& context, deUint32 internalFormat, int size, int numLayers); 259 260 ~TextureCubeArray (void); 261 262 void upload (void); 263 getRefTexture(void)264 tcu::TextureCubeArray& getRefTexture (void) { return m_refTexture; } getRefTexture(void) const265 const tcu::TextureCubeArray& getRefTexture (void) const { return m_refTexture; } getGLTexture(void) const266 deUint32 getGLTexture (void) const { return m_glTexture; } 267 268 private: 269 TextureCubeArray (const TextureCubeArray& other); // Not allowed! 270 TextureCubeArray& operator= (const TextureCubeArray& other); // Not allowed! 271 272 const RenderContext& m_context; 273 274 bool m_isCompressed; 275 deUint32 m_format; //!< Internal format. 276 277 tcu::TextureCubeArray m_refTexture; 278 deUint32 m_glTexture; 279 } DE_WARN_UNUSED_TYPE; 280 281 /*--------------------------------------------------------------------*//*! 282 * \brief 1D Texture Buffer only supported on OpenGL 283 *//*--------------------------------------------------------------------*/ 284 class TextureBuffer 285 { 286 public: 287 TextureBuffer (const RenderContext& context, deUint32 internalFormat, size_t bufferSize); 288 TextureBuffer (const RenderContext& context, deUint32 internalFormat, size_t bufferSize, size_t offset, size_t size, const void* data = DE_NULL); 289 290 ~TextureBuffer (void); 291 292 // \note Effective pixel buffer access must be limited to w <= GL_MAX_TEXTURE_BUFFER_SIZE 293 const tcu::PixelBufferAccess getFullRefTexture (void); 294 const tcu::ConstPixelBufferAccess getFullRefTexture (void) const; 295 296 // \note mutating buffer storage will invalidate existing pixel buffer accesses getRefBuffer(void)297 de::ArrayBuffer<deUint8>& getRefBuffer (void) { return m_refBuffer; } getRefBuffer(void) const298 const de::ArrayBuffer<deUint8>& getRefBuffer (void) const { return m_refBuffer; } 299 getSize(void) const300 size_t getSize (void) const { return m_size; } getOffset(void) const301 size_t getOffset (void) const { return m_offset; } getBufferSize(void) const302 size_t getBufferSize (void) const { return m_refBuffer.size(); } 303 getGLTexture(void) const304 deUint32 getGLTexture (void) const { return m_glTexture; } getGLBuffer(void) const305 deUint32 getGLBuffer (void) const { return m_glBuffer; } 306 307 void upload (void); 308 309 private: 310 void init (deUint32 internalFormat, size_t bufferSize, size_t offset, size_t size, const void* data); 311 TextureBuffer (const TextureBuffer& other); // Not allowed! 312 TextureBuffer& operator= (const TextureBuffer& other); // Not allowed! 313 314 const RenderContext& m_context; 315 deUint32 m_format; //!< Internal format. 316 de::ArrayBuffer<deUint8> m_refBuffer; 317 size_t m_offset; 318 size_t m_size; 319 320 deUint32 m_glTexture; 321 deUint32 m_glBuffer; 322 } DE_WARN_UNUSED_TYPE; 323 324 } // glu 325 326 #endif // _GLUTEXTURE_HPP 327