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_BC1_RGB_UNORM_BLOCK,
78 	COMPRESSEDTEXFORMAT_BC1_RGB_SRGB_BLOCK,
79 	COMPRESSEDTEXFORMAT_BC1_RGBA_UNORM_BLOCK,
80 	COMPRESSEDTEXFORMAT_BC1_RGBA_SRGB_BLOCK,
81 	COMPRESSEDTEXFORMAT_BC2_UNORM_BLOCK,
82 	COMPRESSEDTEXFORMAT_BC2_SRGB_BLOCK,
83 	COMPRESSEDTEXFORMAT_BC3_UNORM_BLOCK,
84 	COMPRESSEDTEXFORMAT_BC3_SRGB_BLOCK,
85 	COMPRESSEDTEXFORMAT_BC4_UNORM_BLOCK,
86 	COMPRESSEDTEXFORMAT_BC4_SNORM_BLOCK,
87 	COMPRESSEDTEXFORMAT_BC5_UNORM_BLOCK,
88 	COMPRESSEDTEXFORMAT_BC5_SNORM_BLOCK,
89 	COMPRESSEDTEXFORMAT_BC6H_UFLOAT_BLOCK,
90 	COMPRESSEDTEXFORMAT_BC6H_SFLOAT_BLOCK,
91 	COMPRESSEDTEXFORMAT_BC7_UNORM_BLOCK,
92 	COMPRESSEDTEXFORMAT_BC7_SRGB_BLOCK,
93 
94 	COMPRESSEDTEXFORMAT_LAST
95 };
96 
97 int					getBlockSize				(CompressedTexFormat format);
98 IVec3				getBlockPixelSize			(CompressedTexFormat format);
99 
100 bool				isEtcFormat					(CompressedTexFormat format);
101 bool				isAstcFormat				(CompressedTexFormat format);
102 bool				isAstcSRGBFormat			(CompressedTexFormat format);
103 bool				isBcFormat					(CompressedTexFormat format);
104 bool				isBcBitExactFormat			(CompressedTexFormat format);
105 bool				isBcSRGBFormat				(CompressedTexFormat format);
106 
107 TextureFormat		getUncompressedFormat		(CompressedTexFormat format);
108 CompressedTexFormat getAstcFormatByBlockSize	(const IVec3& size, bool isSRGB);
109 
110 struct TexDecompressionParams
111 {
112 	enum AstcMode
113 	{
114 		ASTCMODE_LDR = 0,
115 		ASTCMODE_HDR,
116 		ASTCMODE_LAST
117 	};
118 
TexDecompressionParamstcu::TexDecompressionParams119 	TexDecompressionParams (AstcMode astcMode_ = ASTCMODE_LAST) : astcMode(astcMode_) {}
120 
121 	AstcMode astcMode;
122 };
123 
124 /*--------------------------------------------------------------------*//*!
125  * \brief Compressed texture
126  *
127  * This class implements container for common compressed texture formats.
128  * Reference decoding to uncompressed formats is supported.
129  *//*--------------------------------------------------------------------*/
130 class CompressedTexture
131 {
132 public:
133 
134 							CompressedTexture			(CompressedTexFormat format, int width, int height, int depth = 1);
135 							CompressedTexture			(void);
136 							~CompressedTexture			(void);
137 
138 	void					setStorage					(CompressedTexFormat format, int width, int height, int depth = 1);
139 
getWidth(void) const140 	int						getWidth					(void) const	{ return m_width;				}
getHeight(void) const141 	int						getHeight					(void) const	{ return m_height;				}
getDepth(void) const142 	int						getDepth					(void) const	{ return m_depth;				}
getFormat(void) const143 	CompressedTexFormat		getFormat					(void) const	{ return m_format;				}
getDataSize(void) const144 	int						getDataSize					(void) const	{ return (int)m_data.size();	}
getData(void) const145 	const void*				getData						(void) const	{ return &m_data[0];			}
getData(void)146 	void*					getData						(void)			{ return &m_data[0];			}
147 
148 	void					decompress					(const PixelBufferAccess& dst, const TexDecompressionParams& params = TexDecompressionParams()) const;
149 
150 private:
151 	CompressedTexFormat		m_format;
152 	int						m_width;
153 	int						m_height;
154 	int						m_depth;
155 	std::vector<deUint8>	m_data;
156 } DE_WARN_UNUSED_TYPE;
157 
158 void decompress (const PixelBufferAccess& dst, CompressedTexFormat fmt, const deUint8* src, const TexDecompressionParams& params = TexDecompressionParams());
159 
160 } // tcu
161 
162 #endif // _TCUCOMPRESSEDTEXTURE_HPP
163