10 #ifndef khronos_khr_hpp
11 #define khronos_khr_hpp
13 #include <unordered_map>
20 enum class Type : uint32_t {
22 UNSIGNED_BYTE = 0x1401,
24 UNSIGNED_SHORT = 0x1403,
26 UNSIGNED_INT = 0x1405,
30 UNSIGNED_BYTE_3_3_2 = 0x8032,
31 UNSIGNED_BYTE_2_3_3_REV = 0x8362,
32 UNSIGNED_SHORT_5_6_5 = 0x8363,
33 UNSIGNED_SHORT_5_6_5_REV = 0x8364,
34 UNSIGNED_SHORT_4_4_4_4 = 0x8033,
35 UNSIGNED_SHORT_4_4_4_4_REV = 0x8365,
36 UNSIGNED_SHORT_5_5_5_1 = 0x8034,
37 UNSIGNED_SHORT_1_5_5_5_REV = 0x8366,
38 UNSIGNED_INT_8_8_8_8 = 0x8035,
39 UNSIGNED_INT_8_8_8_8_REV = 0x8367,
40 UNSIGNED_INT_10_10_10_2 = 0x8036,
41 UNSIGNED_INT_2_10_10_10_REV = 0x8368,
42 UNSIGNED_INT_24_8 = 0x84FA,
43 UNSIGNED_INT_10F_11F_11F_REV = 0x8C3B,
44 UNSIGNED_INT_5_9_9_9_REV = 0x8C3E,
45 FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8DAD,
50 enum class Format : uint32_t {
51 COMPRESSED_FORMAT = 0,
54 STENCIL_INDEX = 0x1901,
55 DEPTH_COMPONENT = 0x1902,
56 DEPTH_STENCIL = 0x84F9,
69 GREEN_INTEGER = 0x8D95,
70 BLUE_INTEGER = 0x8D96,
72 RGBA_INTEGER = 0x8D99,
74 BGRA_INTEGER = 0x8D9B,
77 enum class InternalFormat : uint32_t {
102 RGB16_SNORM = 0x8F9A,
108 RGBA8_SNORM = 0x8F97,
115 RGBA16_SNORM = 0x8F9B,
118 SRGB8_ALPHA8 = 0x8C43,
130 R11F_G11F_B10F = 0x8C3A,
163 DEPTH_COMPONENT16 = 0x81A5,
164 DEPTH_COMPONENT24 = 0x81A6,
165 DEPTH_COMPONENT32 = 0x81A7,
167 DEPTH_COMPONENT32F = 0x8CAC,
168 DEPTH24_STENCIL8 = 0x88F0,
169 DEPTH32F_STENCIL8 = 0x8CAD,
171 STENCIL_INDEX1 = 0x8D46,
172 STENCIL_INDEX4 = 0x8D47,
173 STENCIL_INDEX8 = 0x8D48,
174 STENCIL_INDEX16 = 0x8D49,
177 COMPRESSED_RED = 0x8225,
178 COMPRESSED_RG = 0x8226,
179 COMPRESSED_RGB = 0x84ED,
180 COMPRESSED_RGBA = 0x84EE,
182 COMPRESSED_SRGB = 0x8C48,
183 COMPRESSED_SRGB_ALPHA = 0x8C49,
185 COMPRESSED_ETC1_RGB8_OES = 0x8D64,
187 COMPRESSED_SRGB_S3TC_DXT1_EXT = 0x8C4C,
188 COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 0x8C4D,
189 COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 0x8C4E,
190 COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 0x8C4F,
192 COMPRESSED_RED_RGTC1 = 0x8DBB,
193 COMPRESSED_SIGNED_RED_RGTC1 = 0x8DBC,
194 COMPRESSED_RG_RGTC2 = 0x8DBD,
195 COMPRESSED_SIGNED_RG_RGTC2 = 0x8DBE,
197 COMPRESSED_RGBA_BPTC_UNORM = 0x8E8C,
198 COMPRESSED_SRGB_ALPHA_BPTC_UNORM = 0x8E8D,
199 COMPRESSED_RGB_BPTC_SIGNED_FLOAT = 0x8E8E,
200 COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT = 0x8E8F,
202 COMPRESSED_RGB8_ETC2 = 0x9274,
203 COMPRESSED_SRGB8_ETC2 = 0x9275,
204 COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9276,
205 COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9277,
206 COMPRESSED_RGBA8_ETC2_EAC = 0x9278,
207 COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9279,
209 COMPRESSED_R11_EAC = 0x9270,
210 COMPRESSED_SIGNED_R11_EAC = 0x9271,
211 COMPRESSED_RG11_EAC = 0x9272,
212 COMPRESSED_SIGNED_RG11_EAC = 0x9273,
215 static std::unordered_map<std::string, InternalFormat> nameToFormat {
216 {
"COMPRESSED_RED", InternalFormat::COMPRESSED_RED },
217 {
"COMPRESSED_RG", InternalFormat::COMPRESSED_RG },
218 {
"COMPRESSED_RGB", InternalFormat::COMPRESSED_RGB },
219 {
"COMPRESSED_RGBA", InternalFormat::COMPRESSED_RGBA },
221 {
"COMPRESSED_SRGB", InternalFormat::COMPRESSED_SRGB },
222 {
"COMPRESSED_SRGB_ALPHA", InternalFormat::COMPRESSED_SRGB_ALPHA },
224 {
"COMPRESSED_ETC1_RGB8_OES", InternalFormat::COMPRESSED_ETC1_RGB8_OES },
226 {
"COMPRESSED_SRGB_S3TC_DXT1_EXT", InternalFormat::COMPRESSED_SRGB_S3TC_DXT1_EXT },
227 {
"COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT", InternalFormat::COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT },
228 {
"COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT", InternalFormat::COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT },
229 {
"COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT", InternalFormat::COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT },
231 {
"COMPRESSED_RED_RGTC1", InternalFormat::COMPRESSED_RED_RGTC1 },
232 {
"COMPRESSED_SIGNED_RED_RGTC1", InternalFormat::COMPRESSED_SIGNED_RED_RGTC1 },
233 {
"COMPRESSED_RG_RGTC2", InternalFormat::COMPRESSED_RG_RGTC2 },
234 {
"COMPRESSED_SIGNED_RG_RGTC2", InternalFormat::COMPRESSED_SIGNED_RG_RGTC2 },
236 {
"COMPRESSED_RGBA_BPTC_UNORM", InternalFormat::COMPRESSED_RGBA_BPTC_UNORM },
237 {
"COMPRESSED_SRGB_ALPHA_BPTC_UNORM", InternalFormat::COMPRESSED_SRGB_ALPHA_BPTC_UNORM },
238 {
"COMPRESSED_RGB_BPTC_SIGNED_FLOAT", InternalFormat::COMPRESSED_RGB_BPTC_SIGNED_FLOAT },
239 {
"COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT", InternalFormat::COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT },
241 {
"COMPRESSED_RGB8_ETC2", InternalFormat::COMPRESSED_RGB8_ETC2 },
242 {
"COMPRESSED_SRGB8_ETC2", InternalFormat::COMPRESSED_SRGB8_ETC2 },
243 {
"COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2", InternalFormat::COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 },
244 {
"COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2", InternalFormat::COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 },
245 {
"COMPRESSED_RGBA8_ETC2_EAC", InternalFormat::COMPRESSED_RGBA8_ETC2_EAC },
246 {
"COMPRESSED_SRGB8_ALPHA8_ETC2_EAC", InternalFormat::COMPRESSED_SRGB8_ALPHA8_ETC2_EAC },
248 {
"COMPRESSED_R11_EAC", InternalFormat::COMPRESSED_R11_EAC },
249 {
"COMPRESSED_SIGNED_R11_EAC", InternalFormat::COMPRESSED_SIGNED_R11_EAC },
250 {
"COMPRESSED_RG11_EAC", InternalFormat::COMPRESSED_RG11_EAC },
251 {
"COMPRESSED_SIGNED_RG11_EAC", InternalFormat::COMPRESSED_SIGNED_RG11_EAC }
254 inline const char* toString(InternalFormat format) {
255 for (
auto& pair : nameToFormat) {
256 if (pair.second == format) {
257 return pair.first.data();
263 inline bool fromString(
const char* name, InternalFormat* format) {
264 auto it = nameToFormat.find(name);
265 if (it == nameToFormat.end()) {
268 *format = it->second;
272 inline uint8_t evalUncompressedBlockBitSize(InternalFormat format) {
274 case InternalFormat::R8:
275 case InternalFormat::R8_SNORM:
277 case InternalFormat::R16:
278 case InternalFormat::R16_SNORM:
279 case InternalFormat::RG8:
280 case InternalFormat::RG8_SNORM:
282 case InternalFormat::RG16:
283 case InternalFormat::RG16_SNORM:
285 case InternalFormat::R3_G3_B2:
287 case InternalFormat::RGB4:
289 case InternalFormat::RGB5:
290 case InternalFormat::RGB565:
292 case InternalFormat::RGB8:
293 case InternalFormat::RGB8_SNORM:
295 case InternalFormat::RGB10:
298 case InternalFormat::RGB12:
301 case InternalFormat::RGB16:
302 case InternalFormat::RGB16_SNORM:
304 case InternalFormat::RGBA2:
306 case InternalFormat::RGBA4:
307 case InternalFormat::RGB5_A1:
309 case InternalFormat::RGBA8:
310 case InternalFormat::RGBA8_SNORM:
311 case InternalFormat::RGB10_A2:
312 case InternalFormat::RGB10_A2UI:
314 case InternalFormat::RGBA12:
316 case InternalFormat::RGBA16:
317 case InternalFormat::RGBA16_SNORM:
319 case InternalFormat::SRGB8:
321 case InternalFormat::SRGB8_ALPHA8:
323 case InternalFormat::R16F:
325 case InternalFormat::RG16F:
327 case InternalFormat::RGB16F:
329 case InternalFormat::RGBA16F:
331 case InternalFormat::R32F:
333 case InternalFormat::RG32F:
335 case InternalFormat::RGB32F:
337 case InternalFormat::RGBA32F:
339 case InternalFormat::R11F_G11F_B10F:
340 case InternalFormat::RGB9_E5:
342 case InternalFormat::R8I:
343 case InternalFormat::R8UI:
345 case InternalFormat::R16I:
346 case InternalFormat::R16UI:
348 case InternalFormat::R32I:
349 case InternalFormat::R32UI:
351 case InternalFormat::RG8I:
352 case InternalFormat::RG8UI:
354 case InternalFormat::RG16I:
355 case InternalFormat::RG16UI:
357 case InternalFormat::RG32I:
358 case InternalFormat::RG32UI:
360 case InternalFormat::RGB8I:
361 case InternalFormat::RGB8UI:
363 case InternalFormat::RGB16I:
364 case InternalFormat::RGB16UI:
366 case InternalFormat::RGB32I:
367 case InternalFormat::RGB32UI:
369 case InternalFormat::RGBA8I:
370 case InternalFormat::RGBA8UI:
372 case InternalFormat::RGBA16I:
373 case InternalFormat::RGBA16UI:
375 case InternalFormat::RGBA32I:
376 case InternalFormat::RGBA32UI:
378 case InternalFormat::DEPTH_COMPONENT16:
380 case InternalFormat::DEPTH_COMPONENT24:
382 case InternalFormat::DEPTH_COMPONENT32:
383 case InternalFormat::DEPTH_COMPONENT32F:
384 case InternalFormat::DEPTH24_STENCIL8:
386 case InternalFormat::DEPTH32F_STENCIL8:
389 case InternalFormat::STENCIL_INDEX1:
391 case InternalFormat::STENCIL_INDEX4:
393 case InternalFormat::STENCIL_INDEX8:
395 case InternalFormat::STENCIL_INDEX16:
403 template <u
int32_t ALIGNMENT>
404 inline uint32_t evalAlignedCompressedBlockCount(uint32_t value) {
405 enum { val = ALIGNMENT && !(ALIGNMENT & (ALIGNMENT - 1)) };
406 static_assert(val,
"template parameter ALIGNMENT must be a power of 2");
408 static uint32_t ALIGNMENT_REMAINDER = ALIGNMENT - 1;
409 return (value + ALIGNMENT_REMAINDER) / ALIGNMENT;
412 inline uint32_t evalCompressedBlockCount(InternalFormat format, uint32_t value) {
414 case InternalFormat::COMPRESSED_SRGB_S3TC_DXT1_EXT:
415 case InternalFormat::COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
416 case InternalFormat::COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
417 case InternalFormat::COMPRESSED_RED_RGTC1:
418 case InternalFormat::COMPRESSED_RG_RGTC2:
419 case InternalFormat::COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT:
420 case InternalFormat::COMPRESSED_SRGB_ALPHA_BPTC_UNORM:
422 case InternalFormat::COMPRESSED_RGB8_ETC2:
423 case InternalFormat::COMPRESSED_SRGB8_ETC2:
424 case InternalFormat::COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
425 case InternalFormat::COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
426 case InternalFormat::COMPRESSED_RGBA8_ETC2_EAC:
427 case InternalFormat::COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
428 case InternalFormat::COMPRESSED_R11_EAC:
429 case InternalFormat::COMPRESSED_SIGNED_R11_EAC:
430 case InternalFormat::COMPRESSED_RG11_EAC:
431 case InternalFormat::COMPRESSED_SIGNED_RG11_EAC:
432 return evalAlignedCompressedBlockCount<4>(value);
435 throw std::runtime_error(
"Unknown format");
439 inline uint8_t evalCompressedBlockSize(InternalFormat format) {
441 case InternalFormat::COMPRESSED_SRGB_S3TC_DXT1_EXT:
442 case InternalFormat::COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
443 case InternalFormat::COMPRESSED_RED_RGTC1:
444 case InternalFormat::COMPRESSED_RGB8_ETC2:
445 case InternalFormat::COMPRESSED_SRGB8_ETC2:
446 case InternalFormat::COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
447 case InternalFormat::COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
448 case InternalFormat::COMPRESSED_R11_EAC:
449 case InternalFormat::COMPRESSED_SIGNED_R11_EAC:
452 case InternalFormat::COMPRESSED_SRGB_ALPHA_BPTC_UNORM:
453 case InternalFormat::COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT:
454 case InternalFormat::COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
455 case InternalFormat::COMPRESSED_RG_RGTC2:
456 case InternalFormat::COMPRESSED_RGBA8_ETC2_EAC:
457 case InternalFormat::COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
458 case InternalFormat::COMPRESSED_RG11_EAC:
459 case InternalFormat::COMPRESSED_SIGNED_RG11_EAC:
467 inline uint8_t evalCompressedBlockBitSize(InternalFormat format) {
468 return evalCompressedBlockSize(format) * 8;
471 enum class BaseInternalFormat : uint32_t {
473 DEPTH_COMPONENT = 0x1902,
474 DEPTH_STENCIL = 0x84F9,
479 STENCIL_INDEX = 0x1901,
482 inline uint8_t evalComponentCount(BaseInternalFormat format) {
484 case BaseInternalFormat::DEPTH_COMPONENT:
485 case BaseInternalFormat::STENCIL_INDEX:
486 case BaseInternalFormat::RED:
489 case BaseInternalFormat::DEPTH_STENCIL:
490 case BaseInternalFormat::RG:
493 case BaseInternalFormat::RGB:
496 case BaseInternalFormat::RGBA:
508 NUM_CUBEMAPFACES = 6,