Home | History | Annotate | Download | only in opengl
      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 
     50 	tcu::Texture1D&			getRefTexture			(void)			{ return m_refTexture;	}
     51 	const tcu::Texture1D&	getRefTexture			(void) const	{ return m_refTexture;	}
     52 	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 							~Texture2D				(void);
     76 
     77 	void					upload					(void); // Not supported on compressed textures.
     78 
     79 	tcu::Texture2D&			getRefTexture			(void)			{ return m_refTexture;	}
     80 	const tcu::Texture2D&	getRefTexture			(void) const	{ return m_refTexture;	}
     81 	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);
     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 private:
     88 							Texture2D				(const Texture2D& other); // Not allowed!
     89 	Texture2D&				operator=				(const Texture2D& other); // Not allowed!
     90 
     91 	void					loadCompressed			(int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams);
     92 
     93 	const RenderContext&	m_context;
     94 
     95 	bool					m_isCompressed;
     96 	deUint32				m_format;				//!< Internal format.
     97 
     98 	tcu::Texture2D			m_refTexture;
     99 	deUint32				m_glTexture;
    100 } DE_WARN_UNUSED_TYPE;
    101 
    102 /*--------------------------------------------------------------------*//*!
    103  * \brief Cube Map Texture
    104  *//*--------------------------------------------------------------------*/
    105 class TextureCube
    106 {
    107 public:
    108 	// For compressed cubemap constructor and create() function input level pointers / filenames are expected
    109 	// to laid out to array in following order:
    110 	//   { l0_neg_x, l0_pos_x, l0_neg_y, l0_pos_y, l0_neg_z, l0_pos_z, l1_neg_x, l1_pos_x, ... }
    111 
    112 							TextureCube				(const RenderContext& context, const ContextInfo& contextInfo, int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams = tcu::TexDecompressionParams());
    113 							TextureCube				(const RenderContext& context, deUint32 format, deUint32 dataType, int size);
    114 							TextureCube				(const RenderContext& context, deUint32 internalFormat, int size);
    115 							~TextureCube			(void);
    116 
    117 	void					upload					(void); // Not supported on compressed textures.
    118 
    119 	tcu::TextureCube&		getRefTexture			(void)			{ return m_refTexture;	}
    120 	const tcu::TextureCube&	getRefTexture			(void) const	{ return m_refTexture;	}
    121 	deUint32				getGLTexture			(void) const	{ return m_glTexture;	}
    122 
    123 	static TextureCube*		create					(const RenderContext& context, const ContextInfo& contextInfo, const tcu::Archive& archive, int numLevels, const std::vector<std::string>& filenames);
    124 	static TextureCube*		create					(const RenderContext& context, const ContextInfo& contextInfo, const tcu::Archive& archive, int numLevels, const char* const* filenames);
    125 
    126 private:
    127 							TextureCube				(const TextureCube& other); // Not allowed!
    128 	TextureCube&			operator=				(const TextureCube& other); // Not allowed!
    129 
    130 	void					loadCompressed			(int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams);
    131 
    132 	const RenderContext&	m_context;
    133 
    134 	bool					m_isCompressed;
    135 	deUint32				m_format;				//!< Internal format.
    136 
    137 	tcu::TextureCube		m_refTexture;
    138 	deUint32				m_glTexture;
    139 } DE_WARN_UNUSED_TYPE;
    140 
    141 /*--------------------------------------------------------------------*//*!
    142  * \brief 2D Array Texture
    143  * \note Not supported on OpenGL ES 2
    144  *//*--------------------------------------------------------------------*/
    145 class Texture2DArray
    146 {
    147 public:
    148 								Texture2DArray			(const RenderContext& context, deUint32 format, deUint32 dataType, int width, int height, int numLayers);
    149 								Texture2DArray			(const RenderContext& context, deUint32 internalFormat, int width, int height, int numLayers);
    150 								Texture2DArray			(const RenderContext& context, const ContextInfo& contextInfo, int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams = tcu::TexDecompressionParams());
    151 								~Texture2DArray			(void);
    152 
    153 	void						upload					(void);
    154 
    155 	tcu::Texture2DArray&		getRefTexture			(void)			{ return m_refTexture;	}
    156 	const tcu::Texture2DArray&	getRefTexture			(void) const	{ return m_refTexture;	}
    157 	deUint32					getGLTexture			(void) const	{ return m_glTexture;	}
    158 
    159 private:
    160 								Texture2DArray			(const Texture2DArray& other); // Not allowed!
    161 	Texture2DArray&				operator=				(const Texture2DArray& other); // Not allowed!
    162 
    163 	void						loadCompressed			(int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams);
    164 
    165 
    166 	const RenderContext&		m_context;
    167 
    168 	bool						m_isCompressed;
    169 	deUint32					m_format;				//!< Internal format.
    170 
    171 	tcu::Texture2DArray			m_refTexture;
    172 	deUint32					m_glTexture;
    173 } DE_WARN_UNUSED_TYPE;
    174 
    175 /*--------------------------------------------------------------------*//*!
    176  * \brief 1D Array Texture
    177  * \note Only supported on OpenGL
    178  *//*--------------------------------------------------------------------*/
    179 class Texture1DArray
    180 {
    181 public:
    182 								Texture1DArray			(const RenderContext& context, deUint32 format, deUint32 dataType, int width, int numLayers);
    183 								Texture1DArray			(const RenderContext& context, deUint32 internalFormat, int width, int numLayers);
    184 								~Texture1DArray			(void);
    185 
    186 	void						upload					(void);
    187 
    188 	tcu::Texture1DArray&		getRefTexture			(void)			{ return m_refTexture;	}
    189 	const tcu::Texture1DArray&	getRefTexture			(void) const	{ return m_refTexture;	}
    190 	deUint32					getGLTexture			(void) const	{ return m_glTexture;	}
    191 
    192 private:
    193 								Texture1DArray			(const Texture1DArray& other); // Not allowed!
    194 	Texture1DArray&				operator=				(const Texture1DArray& other); // Not allowed!
    195 
    196 	const RenderContext&		m_context;
    197 
    198 	deUint32					m_format;				//!< Internal format.
    199 
    200 	tcu::Texture1DArray			m_refTexture;
    201 	deUint32					m_glTexture;
    202 } DE_WARN_UNUSED_TYPE;
    203 
    204 /*--------------------------------------------------------------------*//*!
    205  * \brief 3D Texture
    206  * \note Not supported on OpenGL ES 2
    207  *//*--------------------------------------------------------------------*/
    208 class Texture3D
    209 {
    210 public:
    211 								Texture3D			(const RenderContext& context, deUint32 format, deUint32 dataType, int width, int height, int depth);
    212 								Texture3D			(const RenderContext& context, deUint32 internalFormat, int width, int height, int depth);
    213 								Texture3D			(const RenderContext& context, const ContextInfo& contextInfo, int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams = tcu::TexDecompressionParams());
    214 								~Texture3D			(void);
    215 
    216 	void						upload				(void);
    217 
    218 	tcu::Texture3D&				getRefTexture		(void)			{ return m_refTexture;	}
    219 	const tcu::Texture3D&		getRefTexture		(void) const	{ return m_refTexture;	}
    220 	deUint32					getGLTexture		(void) const	{ return m_glTexture;	}
    221 
    222 private:
    223 								Texture3D			(const Texture3D& other); // Not allowed!
    224 	Texture3D&					operator=			(const Texture3D& other); // Not allowed!
    225 
    226 	void						loadCompressed		(int numLevels, const tcu::CompressedTexture* levels, const tcu::TexDecompressionParams& decompressionParams);
    227 
    228 	const RenderContext&		m_context;
    229 
    230 	bool						m_isCompressed;
    231 	deUint32					m_format;			//!< Internal format.
    232 
    233 	tcu::Texture3D				m_refTexture;
    234 	deUint32					m_glTexture;
    235 } DE_WARN_UNUSED_TYPE;
    236 
    237 /*--------------------------------------------------------------------*//*!
    238  * \brief Cube Map Array Texture
    239  * \note Not supported on OpenGL ES 3.0 or lower
    240  *//*--------------------------------------------------------------------*/
    241 class TextureCubeArray
    242 {
    243 public:
    244 									TextureCubeArray	(const RenderContext& context, deUint32 format, deUint32 dataType, int size, int numLayers);
    245 									TextureCubeArray	(const RenderContext& context, deUint32 internalFormat, int size, int numLayers);
    246 
    247 									~TextureCubeArray	(void);
    248 
    249 	void							upload				(void);
    250 
    251 	tcu::TextureCubeArray&			getRefTexture		(void)			{ return m_refTexture;	}
    252 	const tcu::TextureCubeArray&	getRefTexture		(void) const	{ return m_refTexture;	}
    253 	deUint32						getGLTexture		(void) const	{ return m_glTexture;	}
    254 
    255 private:
    256 									TextureCubeArray	(const TextureCubeArray& other); // Not allowed!
    257 	TextureCubeArray&				operator=			(const TextureCubeArray& other); // Not allowed!
    258 
    259 	const RenderContext&			m_context;
    260 
    261 	bool							m_isCompressed;
    262 	deUint32						m_format;			//!< Internal format.
    263 
    264 	tcu::TextureCubeArray			m_refTexture;
    265 	deUint32						m_glTexture;
    266 } DE_WARN_UNUSED_TYPE;
    267 
    268 /*--------------------------------------------------------------------*//*!
    269  * \brief 1D Texture Buffer only supported on OpenGL
    270  *//*--------------------------------------------------------------------*/
    271 class TextureBuffer
    272 {
    273 public:
    274 										TextureBuffer		(const RenderContext& context, deUint32 internalFormat, size_t bufferSize);
    275 										TextureBuffer		(const RenderContext& context, deUint32 internalFormat, size_t bufferSize, size_t offset, size_t size, const void* data = DE_NULL);
    276 
    277 										~TextureBuffer		(void);
    278 
    279 	// \note Effective pixel buffer access must be limited to w <= GL_MAX_TEXTURE_BUFFER_SIZE
    280 	const tcu::PixelBufferAccess		getFullRefTexture	(void);
    281 	const tcu::ConstPixelBufferAccess	getFullRefTexture	(void) const;
    282 
    283 	// \note mutating buffer storage will invalidate existing pixel buffer accesses
    284 	de::ArrayBuffer<deUint8>&			getRefBuffer		(void)			{ return m_refBuffer;			}
    285 	const de::ArrayBuffer<deUint8>&		getRefBuffer		(void) const	{ return m_refBuffer;			}
    286 
    287 	size_t								getSize				(void) const	{ return m_size;				}
    288 	size_t								getOffset			(void) const	{ return m_offset;				}
    289 	size_t								getBufferSize		(void) const	{ return m_refBuffer.size();	}
    290 
    291 	deUint32							getGLTexture		(void) const	{ return m_glTexture;			}
    292 	deUint32							getGLBuffer			(void) const	{ return m_glBuffer;			}
    293 
    294 	void								upload				(void);
    295 
    296 private:
    297 	void								init				(deUint32 internalFormat, size_t bufferSize, size_t offset, size_t size, const void* data);
    298 										TextureBuffer		(const TextureBuffer& other); // Not allowed!
    299 	TextureBuffer&						operator=			(const TextureBuffer& other); // Not allowed!
    300 
    301 	const RenderContext&				m_context;
    302 	deUint32							m_format;		//!< Internal format.
    303 	de::ArrayBuffer<deUint8>			m_refBuffer;
    304 	size_t								m_offset;
    305 	size_t								m_size;
    306 
    307 	deUint32							m_glTexture;
    308 	deUint32							m_glBuffer;
    309 } DE_WARN_UNUSED_TYPE;
    310 
    311 } // glu
    312 
    313 #endif // _GLUTEXTURE_HPP
    314