1 #ifndef _TCUCOMPRESSEDTEXTURE_HPP
2 #define _TCUCOMPRESSEDTEXTURE_HPP
3 /*-------------------------------------------------------------------------
4  * drawElements Quality Program Tester Core
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 Compressed Texture Utilities.
24  *//*--------------------------------------------------------------------*/
25 
26 #include "tcuDefs.hpp"
27 #include "tcuTexture.hpp"
28 
29 #include <vector>
30 
31 namespace tcu
32 {
33 
34 enum CompressedTexFormat
35 {
36 	COMPRESSEDTEXFORMAT_ETC1_RGB8 = 0,
37 	COMPRESSEDTEXFORMAT_EAC_R11,
38 	COMPRESSEDTEXFORMAT_EAC_SIGNED_R11,
39 	COMPRESSEDTEXFORMAT_EAC_RG11,
40 	COMPRESSEDTEXFORMAT_EAC_SIGNED_RG11,
41 	COMPRESSEDTEXFORMAT_ETC2_RGB8,
42 	COMPRESSEDTEXFORMAT_ETC2_SRGB8,
43 	COMPRESSEDTEXFORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1,
44 	COMPRESSEDTEXFORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1,
45 	COMPRESSEDTEXFORMAT_ETC2_EAC_RGBA8,
46 	COMPRESSEDTEXFORMAT_ETC2_EAC_SRGB8_ALPHA8,
47 
48 	COMPRESSEDTEXFORMAT_ASTC_4x4_RGBA,
49 	COMPRESSEDTEXFORMAT_ASTC_5x4_RGBA,
50 	COMPRESSEDTEXFORMAT_ASTC_5x5_RGBA,
51 	COMPRESSEDTEXFORMAT_ASTC_6x5_RGBA,
52 	COMPRESSEDTEXFORMAT_ASTC_6x6_RGBA,
53 	COMPRESSEDTEXFORMAT_ASTC_8x5_RGBA,
54 	COMPRESSEDTEXFORMAT_ASTC_8x6_RGBA,
55 	COMPRESSEDTEXFORMAT_ASTC_8x8_RGBA,
56 	COMPRESSEDTEXFORMAT_ASTC_10x5_RGBA,
57 	COMPRESSEDTEXFORMAT_ASTC_10x6_RGBA,
58 	COMPRESSEDTEXFORMAT_ASTC_10x8_RGBA,
59 	COMPRESSEDTEXFORMAT_ASTC_10x10_RGBA,
60 	COMPRESSEDTEXFORMAT_ASTC_12x10_RGBA,
61 	COMPRESSEDTEXFORMAT_ASTC_12x12_RGBA,
62 	COMPRESSEDTEXFORMAT_ASTC_4x4_SRGB8_ALPHA8,
63 	COMPRESSEDTEXFORMAT_ASTC_5x4_SRGB8_ALPHA8,
64 	COMPRESSEDTEXFORMAT_ASTC_5x5_SRGB8_ALPHA8,
65 	COMPRESSEDTEXFORMAT_ASTC_6x5_SRGB8_ALPHA8,
66 	COMPRESSEDTEXFORMAT_ASTC_6x6_SRGB8_ALPHA8,
67 	COMPRESSEDTEXFORMAT_ASTC_8x5_SRGB8_ALPHA8,
68 	COMPRESSEDTEXFORMAT_ASTC_8x6_SRGB8_ALPHA8,
69 	COMPRESSEDTEXFORMAT_ASTC_8x8_SRGB8_ALPHA8,
70 	COMPRESSEDTEXFORMAT_ASTC_10x5_SRGB8_ALPHA8,
71 	COMPRESSEDTEXFORMAT_ASTC_10x6_SRGB8_ALPHA8,
72 	COMPRESSEDTEXFORMAT_ASTC_10x8_SRGB8_ALPHA8,
73 	COMPRESSEDTEXFORMAT_ASTC_10x10_SRGB8_ALPHA8,
74 	COMPRESSEDTEXFORMAT_ASTC_12x10_SRGB8_ALPHA8,
75 	COMPRESSEDTEXFORMAT_ASTC_12x12_SRGB8_ALPHA8,
76 
77 	COMPRESSEDTEXFORMAT_LAST
78 };
79 
80 int 				getBlockSize				(CompressedTexFormat format);
81 IVec3				getBlockPixelSize			(CompressedTexFormat format);
82 
83 bool				isEtcFormat					(CompressedTexFormat format);
84 bool				isAstcFormat				(CompressedTexFormat format);
85 bool				isAstcSRGBFormat			(CompressedTexFormat format);
86 
87 TextureFormat		getUncompressedFormat		(CompressedTexFormat format);
88 CompressedTexFormat getAstcFormatByBlockSize	(const IVec3& size, bool isSRGB);
89 
90 struct TexDecompressionParams
91 {
92 	enum AstcMode
93 	{
94 		ASTCMODE_LDR = 0,
95 		ASTCMODE_HDR,
96 		ASTCMODE_LAST
97 	};
98 
TexDecompressionParamstcu::TexDecompressionParams99 	TexDecompressionParams (AstcMode astcMode_ = ASTCMODE_LAST) : astcMode(astcMode_) {}
100 
101 	AstcMode astcMode;
102 };
103 
104 /*--------------------------------------------------------------------*//*!
105  * \brief Compressed texture
106  *
107  * This class implements container for common compressed texture formats.
108  * Reference decoding to uncompressed formats is supported.
109  *//*--------------------------------------------------------------------*/
110 class CompressedTexture
111 {
112 public:
113 
114 							CompressedTexture			(CompressedTexFormat format, int width, int height, int depth = 1);
115 							CompressedTexture			(void);
116 							~CompressedTexture			(void);
117 
118 	void					setStorage					(CompressedTexFormat format, int width, int height, int depth = 1);
119 
getWidth(void) const120 	int						getWidth					(void) const	{ return m_width;				}
getHeight(void) const121 	int						getHeight					(void) const	{ return m_height;				}
getDepth(void) const122 	int						getDepth					(void) const	{ return m_depth;				}
getFormat(void) const123 	CompressedTexFormat		getFormat					(void) const	{ return m_format;				}
getDataSize(void) const124 	int						getDataSize					(void) const	{ return (int)m_data.size();	}
getData(void) const125 	const void*				getData						(void) const	{ return &m_data[0];			}
getData(void)126 	void*					getData						(void)			{ return &m_data[0];			}
127 
128 	void					decompress					(const PixelBufferAccess& dst, const TexDecompressionParams& params = TexDecompressionParams()) const;
129 
130 private:
131 	CompressedTexFormat		m_format;
132 	int						m_width;
133 	int						m_height;
134 	int						m_depth;
135 	std::vector<deUint8>	m_data;
136 } DE_WARN_UNUSED_TYPE;
137 
138 void decompress (const PixelBufferAccess& dst, CompressedTexFormat fmt, const deUint8* src, const TexDecompressionParams& params = TexDecompressionParams());
139 
140 } // tcu
141 
142 #endif // _TCUCOMPRESSEDTEXTURE_HPP
143