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 33 #include <vector> 34 #include <string> 35 36 namespace glu 37 { 38 39 /*--------------------------------------------------------------------*//*! 40 * \brief 1D Texture only supported on OpenGL 41 *//*--------------------------------------------------------------------*/ 42 class Texture1D 43 { 44 public: 45 Texture1D (const RenderContext& context, deUint32 format, deUint32 dataType, int width); 46 Texture1D (const RenderContext& context, deUint32 internalFormat, int width); 47 ~Texture1D (void); 48 getRefTexture(void)49 tcu::Texture1D& getRefTexture (void) { return m_refTexture; } getRefTexture(void) const50 const tcu::Texture1D& getRefTexture (void) const { return m_refTexture; } getGLTexture(void) const51 deUint32 getGLTexture (void) const { return m_glTexture; } 52 53 void upload (void); 54 55 private: 56 Texture1D (const Texture1D& other); // Not allowed! 57 Texture1D& operator= (const Texture1D& other); // Not allowed! 58 59 const RenderContext& m_context; 60 deUint32 m_format; //!< Internal format. 61 tcu::Texture1D m_refTexture; 62 deUint32 m_glTexture; 63 }; 64 65 /*--------------------------------------------------------------------*//*! 66 * \brief 2D Texture 67 *//*--------------------------------------------------------------------*/ 68 class Texture2D 69 { 70 public: 71 Texture2D (const RenderContext& context, const ContextInfo& contextInfo, int numLevels, const tcu::CompressedTexture* levels, const tcu::CompressedTexture::DecompressionParams& = tcu::CompressedTexture::DecompressionParams(false)); 72 Texture2D (const RenderContext& context, deUint32 format, deUint32 dataType, int width, int height); 73 Texture2D (const RenderContext& context, deUint32 internalFormat, int width, int height); 74 ~Texture2D (void); 75 76 void upload (void); // Not supported on compressed textures. 77 getRefTexture(void)78 tcu::Texture2D& getRefTexture (void) { return m_refTexture; } getRefTexture(void) const79 const tcu::Texture2D& getRefTexture (void) const { return m_refTexture; } getGLTexture(void) const80 deUint32 getGLTexture (void) const { return m_glTexture; } 81 82 static Texture2D* create (const RenderContext& context, const ContextInfo& contextInfo, const tcu::Archive& archive, int numLevels, const std::vector<std::string>& filenames); 83 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)84 static Texture2D* create (const RenderContext& context, const ContextInfo& contextInfo, const tcu::Archive& archive, const char* filename) { return create(context, contextInfo, archive, 1, &filename); } 85 86 private: 87 Texture2D (const Texture2D& other); // Not allowed! 88 Texture2D& operator= (const Texture2D& other); // Not allowed! 89 90 void loadCompressed (int numLevels, const tcu::CompressedTexture* levels, const tcu::CompressedTexture::DecompressionParams&); 91 92 const RenderContext& m_context; 93 94 bool m_isCompressed; 95 deUint32 m_format; //!< Internal format. 96 97 tcu::Texture2D m_refTexture; 98 deUint32 m_glTexture; 99 }; 100 101 /*--------------------------------------------------------------------*//*! 102 * \brief Cube Map Texture 103 *//*--------------------------------------------------------------------*/ 104 class TextureCube 105 { 106 public: 107 // For compressed cubemap constructor and create() function input level pointers / filenames are expected 108 // to laid out to array in following order: 109 // { l0_neg_x, l0_pos_x, l0_neg_y, l0_pos_y, l0_neg_z, l0_pos_z, l1_neg_x, l1_pos_x, ... } 110 111 TextureCube (const RenderContext& context, const ContextInfo& contextInfo, int numLevels, const tcu::CompressedTexture* levels, const tcu::CompressedTexture::DecompressionParams& = tcu::CompressedTexture::DecompressionParams(false)); 112 TextureCube (const RenderContext& context, deUint32 format, deUint32 dataType, int size); 113 TextureCube (const RenderContext& context, deUint32 internalFormat, int size); 114 ~TextureCube (void); 115 116 void upload (void); // Not supported on compressed textures. 117 getRefTexture(void)118 tcu::TextureCube& getRefTexture (void) { return m_refTexture; } getRefTexture(void) const119 const tcu::TextureCube& getRefTexture (void) const { return m_refTexture; } getGLTexture(void) const120 deUint32 getGLTexture (void) const { return m_glTexture; } 121 122 static TextureCube* create (const RenderContext& context, const ContextInfo& contextInfo, const tcu::Archive& archive, int numLevels, const std::vector<std::string>& filenames); 123 static TextureCube* create (const RenderContext& context, const ContextInfo& contextInfo, const tcu::Archive& archive, int numLevels, const char* const* filenames); 124 125 private: 126 TextureCube (const TextureCube& other); // Not allowed! 127 TextureCube& operator= (const TextureCube& other); // Not allowed! 128 129 void loadCompressed (int numLevels, const tcu::CompressedTexture* levels, const tcu::CompressedTexture::DecompressionParams&); 130 131 const RenderContext& m_context; 132 133 bool m_isCompressed; 134 deUint32 m_format; //!< Internal format. 135 136 tcu::TextureCube m_refTexture; 137 deUint32 m_glTexture; 138 }; 139 140 /*--------------------------------------------------------------------*//*! 141 * \brief 2D Array Texture 142 * \note Not supported on OpenGL ES 2 143 *//*--------------------------------------------------------------------*/ 144 class Texture2DArray 145 { 146 public: 147 Texture2DArray (const RenderContext& context, deUint32 format, deUint32 dataType, int width, int height, int numLayers); 148 Texture2DArray (const RenderContext& context, deUint32 internalFormat, int width, int height, int numLayers); 149 ~Texture2DArray (void); 150 151 void upload (void); 152 getRefTexture(void)153 tcu::Texture2DArray& getRefTexture (void) { return m_refTexture; } getRefTexture(void) const154 const tcu::Texture2DArray& getRefTexture (void) const { return m_refTexture; } getGLTexture(void) const155 deUint32 getGLTexture (void) const { return m_glTexture; } 156 157 private: 158 Texture2DArray (const Texture2DArray& other); // Not allowed! 159 Texture2DArray& operator= (const Texture2DArray& other); // Not allowed! 160 161 const RenderContext& m_context; 162 163 deUint32 m_format; //!< Internal format. 164 165 tcu::Texture2DArray m_refTexture; 166 deUint32 m_glTexture; 167 }; 168 169 /*--------------------------------------------------------------------*//*! 170 * \brief 1D Array Texture 171 * \note Only supported on OpenGL 172 *//*--------------------------------------------------------------------*/ 173 class Texture1DArray 174 { 175 public: 176 Texture1DArray (const RenderContext& context, deUint32 format, deUint32 dataType, int width, int numLayers); 177 Texture1DArray (const RenderContext& context, deUint32 internalFormat, int width, int numLayers); 178 ~Texture1DArray (void); 179 180 void upload (void); 181 getRefTexture(void)182 tcu::Texture1DArray& getRefTexture (void) { return m_refTexture; } getRefTexture(void) const183 const tcu::Texture1DArray& getRefTexture (void) const { return m_refTexture; } getGLTexture(void) const184 deUint32 getGLTexture (void) const { return m_glTexture; } 185 186 private: 187 Texture1DArray (const Texture1DArray& other); // Not allowed! 188 Texture1DArray& operator= (const Texture1DArray& other); // Not allowed! 189 190 const RenderContext& m_context; 191 192 deUint32 m_format; //!< Internal format. 193 194 tcu::Texture1DArray m_refTexture; 195 deUint32 m_glTexture; 196 }; 197 198 /*--------------------------------------------------------------------*//*! 199 * \brief 3D Texture 200 * \note Not supported on OpenGL ES 2 201 *//*--------------------------------------------------------------------*/ 202 class Texture3D 203 { 204 public: 205 Texture3D (const RenderContext& context, deUint32 format, deUint32 dataType, int width, int height, int depth); 206 Texture3D (const RenderContext& context, deUint32 internalFormat, int width, int height, int depth); 207 ~Texture3D (void); 208 209 void upload (void); 210 getRefTexture(void)211 tcu::Texture3D& getRefTexture (void) { return m_refTexture; } getRefTexture(void) const212 const tcu::Texture3D& getRefTexture (void) const { return m_refTexture; } getGLTexture(void) const213 deUint32 getGLTexture (void) const { return m_glTexture; } 214 215 private: 216 Texture3D (const Texture3D& other); // Not allowed! 217 Texture3D& operator= (const Texture3D& other); // Not allowed! 218 219 const RenderContext& m_context; 220 221 deUint32 m_format; //!< Internal format. 222 223 tcu::Texture3D m_refTexture; 224 deUint32 m_glTexture; 225 }; 226 227 /*--------------------------------------------------------------------*//*! 228 * \brief Cube Map Array Texture 229 * \note Not supported on OpenGL ES 3.0 or lower 230 *//*--------------------------------------------------------------------*/ 231 class TextureCubeArray 232 { 233 public: 234 TextureCubeArray (const RenderContext& context, deUint32 format, deUint32 dataType, int size, int numLayers); 235 TextureCubeArray (const RenderContext& context, deUint32 internalFormat, int size, int numLayers); 236 ~TextureCubeArray (void); 237 238 void upload (void); 239 getRefTexture(void)240 tcu::TextureCubeArray& getRefTexture (void) { return m_refTexture; } getRefTexture(void) const241 const tcu::TextureCubeArray& getRefTexture (void) const { return m_refTexture; } getGLTexture(void) const242 deUint32 getGLTexture (void) const { return m_glTexture; } 243 244 private: 245 TextureCubeArray (const TextureCubeArray& other); // Not allowed! 246 TextureCubeArray& operator= (const TextureCubeArray& other); // Not allowed! 247 248 const RenderContext& m_context; 249 250 deUint32 m_format; //!< Internal format. 251 252 tcu::TextureCubeArray m_refTexture; 253 deUint32 m_glTexture; 254 }; 255 256 /*--------------------------------------------------------------------*//*! 257 * \brief 1D Texture Buffer only supported on OpenGL 258 *//*--------------------------------------------------------------------*/ 259 class TextureBuffer 260 { 261 public: 262 TextureBuffer (const RenderContext& context, deUint32 internalFormat, size_t bufferSize); 263 TextureBuffer (const RenderContext& context, deUint32 internalFormat, size_t bufferSize, size_t offset, size_t size, const void* data = DE_NULL); 264 265 ~TextureBuffer (void); 266 getRefTexture(void)267 const tcu::PixelBufferAccess& getRefTexture (void) { return m_refTexture; } getRefTexture(void) const268 const tcu::ConstPixelBufferAccess& getRefTexture (void) const { return m_refTexture; } 269 getRefBuffer(void)270 deUint8* getRefBuffer (void) { return &(m_refBuffer[0]); } getRefBuffer(void) const271 const deUint8* getRefBuffer (void) const { return &(m_refBuffer[0]); } 272 getSize(void) const273 size_t getSize (void) const { return m_size; } getOffset(void) const274 size_t getOffset (void) const { return m_offset; } getBufferSize(void) const275 size_t getBufferSize (void) const { return m_refBuffer.size(); } 276 getGLTexture(void) const277 deUint32 getGLTexture (void) const { return m_glTexture; } getGLBuffer(void) const278 deUint32 getGLBuffer (void) const { return m_glBuffer; } 279 280 // \note Resizes reference buffer. Invalidates old pixel buffer acceses. 281 // \note Doesn't upload data. 282 void bufferData (const deUint8* data, size_t size); 283 void upload (void); 284 285 private: 286 void init (deUint32 internalFormat, size_t bufferSize, size_t offset, size_t size, const void* data); 287 TextureBuffer (const TextureBuffer& other); // Not allowed! 288 TextureBuffer& operator= (const TextureBuffer& other); // Not allowed! 289 290 const RenderContext& m_context; 291 deUint32 m_format; //!< Internal format. 292 std::vector<deUint8> m_refBuffer; 293 size_t m_offset; 294 size_t m_size; 295 296 tcu::PixelBufferAccess m_refTexture; 297 deUint32 m_glTexture; 298 deUint32 m_glBuffer; 299 }; 300 301 } // glu 302 303 #endif // _GLUTEXTURE_HPP 304