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
31namespace tcu
32{
33
34enum 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
80int 				getBlockSize				(CompressedTexFormat format);
81IVec3				getBlockPixelSize			(CompressedTexFormat format);
82
83bool				isEtcFormat					(CompressedTexFormat format);
84bool				isAstcFormat				(CompressedTexFormat format);
85bool				isAstcSRGBFormat			(CompressedTexFormat format);
86
87TextureFormat		getUncompressedFormat		(CompressedTexFormat format);
88CompressedTexFormat getAstcFormatByBlockSize	(const IVec3& size, bool isSRGB);
89
90struct TexDecompressionParams
91{
92	enum AstcMode
93	{
94		ASTCMODE_LDR = 0,
95		ASTCMODE_HDR,
96		ASTCMODE_LAST
97	};
98
99	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 *//*--------------------------------------------------------------------*/
110class CompressedTexture
111{
112public:
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
120	int						getWidth					(void) const	{ return m_width;				}
121	int						getHeight					(void) const	{ return m_height;				}
122	int						getDepth					(void) const	{ return m_depth;				}
123	CompressedTexFormat		getFormat					(void) const	{ return m_format;				}
124	int						getDataSize					(void) const	{ return (int)m_data.size();	}
125	const void*				getData						(void) const	{ return &m_data[0];			}
126	void*					getData						(void)			{ return &m_data[0];			}
127
128	void					decompress					(const PixelBufferAccess& dst, const TexDecompressionParams& params = TexDecompressionParams()) const;
129
130private:
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
138void decompress (const PixelBufferAccess& dst, CompressedTexFormat fmt, const deUint8* src, const TexDecompressionParams& params = TexDecompressionParams());
139
140} // tcu
141
142#endif // _TCUCOMPRESSEDTEXTURE_HPP
143