Handling ETC2, EAC and ASTC related enums

Note that no decoding functionality is added here.
This cl merely acknowledges textures of the ETC2, EAC
and ASTC format by handling their related enums in
SwiftShader, and the byte data is then allowed to be
passed down all the way to the Surface object, where
the decoding code will be added. Also note that this
cl does not add the extensions strings required for
ASTC support, so ASTC is still unsupported after this cl.

Change-Id: I1d8aed0fb64b0d4c72846e87410750d1e485c46b
Reviewed-on: https://swiftshader-review.googlesource.com/3938
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Renderer/Surface.cpp b/src/Renderer/Surface.cpp
index 99dafd3..3a72601 100644
--- a/src/Renderer/Surface.cpp
+++ b/src/Renderer/Surface.cpp
@@ -764,7 +764,59 @@
 			#endif
 			case FORMAT_ATI1:
 			case FORMAT_ETC1:
+			case FORMAT_R11_EAC:
+			case FORMAT_SIGNED_R11_EAC:
+			case FORMAT_RGB8_ETC2:
+			case FORMAT_SRGB8_ETC2:
+			case FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+			case FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
 				return (unsigned char*)buffer + 8 * (x / 4) + (y / 4) * pitchB + z * sliceB;
+			case FORMAT_RG11_EAC:
+			case FORMAT_SIGNED_RG11_EAC:
+			case FORMAT_RGBA8_ETC2_EAC:
+			case FORMAT_SRGB8_ALPHA8_ETC2_EAC:
+			case FORMAT_RGBA_ASTC_4x4_KHR:
+			case FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR:
+				return (unsigned char*)buffer + 16 * (x / 4) + (y / 4) * pitchB + z * sliceB;
+			case FORMAT_RGBA_ASTC_5x4_KHR:
+			case FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR:
+				return (unsigned char*)buffer + 16 * (x / 5) + (y / 4) * pitchB + z * sliceB;
+			case FORMAT_RGBA_ASTC_5x5_KHR:
+			case FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR:
+				return (unsigned char*)buffer + 16 * (x / 5) + (y / 5) * pitchB + z * sliceB;
+			case FORMAT_RGBA_ASTC_6x5_KHR:
+			case FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR:
+				return (unsigned char*)buffer + 16 * (x / 6) + (y / 5) * pitchB + z * sliceB;
+			case FORMAT_RGBA_ASTC_6x6_KHR:
+			case FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR:
+				return (unsigned char*)buffer + 16 * (x / 6) + (y / 6) * pitchB + z * sliceB;
+			case FORMAT_RGBA_ASTC_8x5_KHR:
+			case FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR:
+				return (unsigned char*)buffer + 16 * (x / 8) + (y / 5) * pitchB + z * sliceB;
+			case FORMAT_RGBA_ASTC_8x6_KHR:
+			case FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR:
+				return (unsigned char*)buffer + 16 * (x / 8) + (y / 6) * pitchB + z * sliceB;
+			case FORMAT_RGBA_ASTC_8x8_KHR:
+			case FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR:
+				return (unsigned char*)buffer + 16 * (x / 8) + (y / 8) * pitchB + z * sliceB;
+			case FORMAT_RGBA_ASTC_10x5_KHR:
+			case FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR:
+				return (unsigned char*)buffer + 16 * (x / 10) + (y / 5) * pitchB + z * sliceB;
+			case FORMAT_RGBA_ASTC_10x6_KHR:
+			case FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR:
+				return (unsigned char*)buffer + 16 * (x / 10) + (y / 6) * pitchB + z * sliceB;
+			case FORMAT_RGBA_ASTC_10x8_KHR:
+			case FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR:
+				return (unsigned char*)buffer + 16 * (x / 10) + (y / 8) * pitchB + z * sliceB;
+			case FORMAT_RGBA_ASTC_10x10_KHR:
+			case FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR:
+				return (unsigned char*)buffer + 16 * (x / 10) + (y / 10) * pitchB + z * sliceB;
+			case FORMAT_RGBA_ASTC_12x10_KHR:
+			case FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR:
+				return (unsigned char*)buffer + 16 * (x / 12) + (y / 10) * pitchB + z * sliceB;
+			case FORMAT_RGBA_ASTC_12x12_KHR:
+			case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR:
+				return (unsigned char*)buffer + 16 * (x / 12) + (y / 12) * pitchB + z * sliceB;
 			#if S3TC_SUPPORT
 			case FORMAT_DXT3:
 			case FORMAT_DXT5:
@@ -1104,6 +1156,44 @@
 		case FORMAT_ATI1:				return 2;   // Column of four pixels
 		case FORMAT_ATI2:				return 4;   // Column of four pixels
 		case FORMAT_ETC1:				return 2;   // Column of four pixels
+		case FORMAT_R11_EAC:			return 2;
+		case FORMAT_SIGNED_R11_EAC:		return 2;
+		case FORMAT_RG11_EAC:			return 4;
+		case FORMAT_SIGNED_RG11_EAC:	return 4;
+		case FORMAT_RGB8_ETC2:			return 2;
+		case FORMAT_SRGB8_ETC2:			return 2;
+		case FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:	return 2;
+		case FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:	return 2;
+		case FORMAT_RGBA8_ETC2_EAC:			return 4;
+		case FORMAT_SRGB8_ALPHA8_ETC2_EAC:	return 4;
+		case FORMAT_RGBA_ASTC_4x4_KHR:
+		case FORMAT_RGBA_ASTC_5x4_KHR:
+		case FORMAT_RGBA_ASTC_5x5_KHR:
+		case FORMAT_RGBA_ASTC_6x5_KHR:
+		case FORMAT_RGBA_ASTC_6x6_KHR:
+		case FORMAT_RGBA_ASTC_8x5_KHR:
+		case FORMAT_RGBA_ASTC_8x6_KHR:
+		case FORMAT_RGBA_ASTC_8x8_KHR:
+		case FORMAT_RGBA_ASTC_10x5_KHR:
+		case FORMAT_RGBA_ASTC_10x6_KHR:
+		case FORMAT_RGBA_ASTC_10x8_KHR:
+		case FORMAT_RGBA_ASTC_10x10_KHR:
+		case FORMAT_RGBA_ASTC_12x10_KHR:
+		case FORMAT_RGBA_ASTC_12x12_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR: return 0; // FIXME
 		// Bumpmap formats
 		case FORMAT_V8U8:				return 2;
 		case FORMAT_L6V5U5:				return 2;
@@ -1171,7 +1261,51 @@
 		case FORMAT_DXT1:
 		#endif
 		case FORMAT_ETC1:
+		case FORMAT_R11_EAC:
+		case FORMAT_SIGNED_R11_EAC:
+		case FORMAT_RGB8_ETC2:
+		case FORMAT_SRGB8_ETC2:
+		case FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+		case FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
 			return 8 * ((width + 3) / 4);    // 64 bit per 4x4 block, computed per 4 rows
+		case FORMAT_RG11_EAC:
+		case FORMAT_SIGNED_RG11_EAC:
+		case FORMAT_RGBA8_ETC2_EAC:
+		case FORMAT_SRGB8_ALPHA8_ETC2_EAC:
+		case FORMAT_RGBA_ASTC_4x4_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR:
+			return 16 * ((width + 3) / 4);    // 128 bit per 4x4 block, computed per 4 rows
+		case FORMAT_RGBA_ASTC_5x4_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR:
+		case FORMAT_RGBA_ASTC_5x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR:
+			return 16 * ((width + 4) / 5);
+		case FORMAT_RGBA_ASTC_6x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR:
+		case FORMAT_RGBA_ASTC_6x6_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR:
+			return 16 * ((width + 5) / 6);
+		case FORMAT_RGBA_ASTC_8x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR:
+		case FORMAT_RGBA_ASTC_8x6_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR:
+		case FORMAT_RGBA_ASTC_8x8_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR:
+			return 16 * ((width + 7) / 8);
+		case FORMAT_RGBA_ASTC_10x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR:
+		case FORMAT_RGBA_ASTC_10x6_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR:
+		case FORMAT_RGBA_ASTC_10x8_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR:
+		case FORMAT_RGBA_ASTC_10x10_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR:
+			return 16 * ((width + 9) / 10);
+		case FORMAT_RGBA_ASTC_12x10_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR:
+		case FORMAT_RGBA_ASTC_12x12_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR:
+			return 16 * ((width + 11) / 12);
 		#if S3TC_SUPPORT
 		case FORMAT_DXT3:
 		case FORMAT_DXT5:
@@ -1212,7 +1346,50 @@
 		case FORMAT_DXT5:
 		#endif
 		case FORMAT_ETC1:
+		case FORMAT_R11_EAC:
+		case FORMAT_SIGNED_R11_EAC:
+		case FORMAT_RG11_EAC:
+		case FORMAT_SIGNED_RG11_EAC:
+		case FORMAT_RGB8_ETC2:
+		case FORMAT_SRGB8_ETC2:
+		case FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+		case FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+		case FORMAT_RGBA8_ETC2_EAC:
+		case FORMAT_SRGB8_ALPHA8_ETC2_EAC:
+		case FORMAT_RGBA_ASTC_4x4_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR:
+		case FORMAT_RGBA_ASTC_5x4_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR:
 			return pitchB(width, format, target) * ((height + 3) / 4);   // Pitch computed per 4 rows
+		case FORMAT_RGBA_ASTC_5x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR:
+		case FORMAT_RGBA_ASTC_6x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR:
+		case FORMAT_RGBA_ASTC_8x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR:
+		case FORMAT_RGBA_ASTC_10x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR:
+			return pitchB(width, format, target) * ((height + 4) / 5);   // Pitch computed per 5 rows
+		case FORMAT_RGBA_ASTC_6x6_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR:
+		case FORMAT_RGBA_ASTC_8x6_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR:
+		case FORMAT_RGBA_ASTC_10x6_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR:
+			return pitchB(width, format, target) * ((height + 5) / 6);   // Pitch computed per 6 rows
+		case FORMAT_RGBA_ASTC_8x8_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR:
+		case FORMAT_RGBA_ASTC_10x8_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR:
+			return pitchB(width, format, target) * ((height + 7) / 8);   // Pitch computed per 8 rows
+		case FORMAT_RGBA_ASTC_10x10_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR:
+		case FORMAT_RGBA_ASTC_12x10_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR:
+			return pitchB(width, format, target) * ((height + 9) / 10);   // Pitch computed per 10 rows
+		case FORMAT_RGBA_ASTC_12x12_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR:
+			return pitchB(width, format, target) * ((height + 11) / 12);   // Pitch computed per 12 rows
 		case FORMAT_ATI1:
 		case FORMAT_ATI2:
 		default:
@@ -1253,6 +1430,44 @@
 			case FORMAT_ATI1:		decodeATI1(destination, source);		break;   // FIXME: Check destination format
 			case FORMAT_ATI2:		decodeATI2(destination, source);		break;   // FIXME: Check destination format
 			case FORMAT_ETC1:		decodeETC1(destination, source);		break;   // FIXME: Check destination format
+			case FORMAT_R11_EAC:         decodeEAC(destination, source, 1, false); break; // FIXME: Check destination format
+			case FORMAT_SIGNED_R11_EAC:  decodeEAC(destination, source, 1, true);  break; // FIXME: Check destination format
+			case FORMAT_RG11_EAC:        decodeEAC(destination, source, 2, false); break; // FIXME: Check destination format
+			case FORMAT_SIGNED_RG11_EAC: decodeEAC(destination, source, 2, true);  break; // FIXME: Check destination format
+			case FORMAT_RGB8_ETC2:                      decodeETC2(destination, source, 0, false); break; // FIXME: Check destination format
+			case FORMAT_SRGB8_ETC2:                     decodeETC2(destination, source, 0, true);  break; // FIXME: Check destination format
+			case FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:  decodeETC2(destination, source, 1, false); break; // FIXME: Check destination format
+			case FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: decodeETC2(destination, source, 1, true);  break; // FIXME: Check destination format
+			case FORMAT_RGBA8_ETC2_EAC:                 decodeETC2(destination, source, 8, false); break; // FIXME: Check destination format
+			case FORMAT_SRGB8_ALPHA8_ETC2_EAC:          decodeETC2(destination, source, 8, true);  break; // FIXME: Check destination format
+			case FORMAT_RGBA_ASTC_4x4_KHR:           decodeASTC(destination, source, 4,  4,  1, false); break; // FIXME: Check destination format
+			case FORMAT_RGBA_ASTC_5x4_KHR:           decodeASTC(destination, source, 5,  4,  1, false); break; // FIXME: Check destination format
+			case FORMAT_RGBA_ASTC_5x5_KHR:           decodeASTC(destination, source, 5,  5,  1, false); break; // FIXME: Check destination format
+			case FORMAT_RGBA_ASTC_6x5_KHR:           decodeASTC(destination, source, 6,  5,  1, false); break; // FIXME: Check destination format
+			case FORMAT_RGBA_ASTC_6x6_KHR:           decodeASTC(destination, source, 6,  6,  1, false); break; // FIXME: Check destination format
+			case FORMAT_RGBA_ASTC_8x5_KHR:           decodeASTC(destination, source, 8,  5,  1, false); break; // FIXME: Check destination format
+			case FORMAT_RGBA_ASTC_8x6_KHR:           decodeASTC(destination, source, 8,  6,  1, false); break; // FIXME: Check destination format
+			case FORMAT_RGBA_ASTC_8x8_KHR:           decodeASTC(destination, source, 8,  8,  1, false); break; // FIXME: Check destination format
+			case FORMAT_RGBA_ASTC_10x5_KHR:          decodeASTC(destination, source, 10, 5,  1, false); break; // FIXME: Check destination format
+			case FORMAT_RGBA_ASTC_10x6_KHR:          decodeASTC(destination, source, 10, 6,  1, false); break; // FIXME: Check destination format
+			case FORMAT_RGBA_ASTC_10x8_KHR:          decodeASTC(destination, source, 10, 8,  1, false); break; // FIXME: Check destination format
+			case FORMAT_RGBA_ASTC_10x10_KHR:         decodeASTC(destination, source, 10, 10, 1, false); break; // FIXME: Check destination format
+			case FORMAT_RGBA_ASTC_12x10_KHR:         decodeASTC(destination, source, 12, 10, 1, false); break; // FIXME: Check destination format
+			case FORMAT_RGBA_ASTC_12x12_KHR:         decodeASTC(destination, source, 12, 12, 1, false); break; // FIXME: Check destination format
+			case FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR:   decodeASTC(destination, source, 4,  4,  1, true);  break; // FIXME: Check destination format
+			case FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR:   decodeASTC(destination, source, 5,  4,  1, true);  break; // FIXME: Check destination format
+			case FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR:   decodeASTC(destination, source, 5,  5,  1, true);  break; // FIXME: Check destination format
+			case FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR:   decodeASTC(destination, source, 6,  5,  1, true);  break; // FIXME: Check destination format
+			case FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR:   decodeASTC(destination, source, 6,  6,  1, true);  break; // FIXME: Check destination format
+			case FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR:   decodeASTC(destination, source, 8,  5,  1, true);  break; // FIXME: Check destination format
+			case FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR:   decodeASTC(destination, source, 8,  6,  1, true);  break; // FIXME: Check destination format
+			case FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR:   decodeASTC(destination, source, 8,  8,  1, true);  break; // FIXME: Check destination format
+			case FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR:  decodeASTC(destination, source, 10, 5,  1, true);  break; // FIXME: Check destination format
+			case FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR:  decodeASTC(destination, source, 10, 6,  1, true);  break; // FIXME: Check destination format
+			case FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR:  decodeASTC(destination, source, 10, 8,  1, true);  break; // FIXME: Check destination format
+			case FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR: decodeASTC(destination, source, 10, 10, 1, true);  break; // FIXME: Check destination format
+			case FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR: decodeASTC(destination, source, 12, 10, 1, true);  break; // FIXME: Check destination format
+			case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR: decodeASTC(destination, source, 12, 12, 1, true);  break; // FIXME: Check destination format
 			default:				genericUpdate(destination, source);		break;
 			}
 		}
@@ -2077,6 +2292,19 @@
 		}
 	}
 
+	void Surface::decodeEAC(Buffer &internal, const Buffer &external, int nbChannels, bool isSigned)
+	{
+		ASSERT((nbChannels == 1) || (nbChannels == 2));
+	}
+
+	void Surface::decodeETC2(Buffer &internal, const Buffer &external, int nbAlphaBits, bool isSRGB)
+	{
+	}
+
+	void Surface::decodeASTC(Buffer &internal, const Buffer &external, int xBlockSize, int yBlockSize, int zBlockSize, bool isSRGB)
+	{
+	}
+
 	unsigned int Surface::size(int width, int height, int depth, Format format)
 	{
 		// Dimensions rounded up to multiples of 4, used for compressed formats
@@ -2090,13 +2318,64 @@
 		#endif
 		case FORMAT_ATI1:
 		case FORMAT_ETC1:
+		case FORMAT_R11_EAC:
+		case FORMAT_SIGNED_R11_EAC:
+		case FORMAT_RGB8_ETC2:
+		case FORMAT_SRGB8_ETC2:
+		case FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+		case FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
 			return width4 * height4 * depth / 2;
 		#if S3TC_SUPPORT
 		case FORMAT_DXT3:
 		case FORMAT_DXT5:
 		#endif
 		case FORMAT_ATI2:
+		case FORMAT_RG11_EAC:
+		case FORMAT_SIGNED_RG11_EAC:
+		case FORMAT_RGBA8_ETC2_EAC:
+		case FORMAT_SRGB8_ALPHA8_ETC2_EAC:
+		case FORMAT_RGBA_ASTC_4x4_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR:
 			return width4 * height4 * depth;
+		case FORMAT_RGBA_ASTC_5x4_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR:
+			return align(width, 5) * height4 * depth;
+		case FORMAT_RGBA_ASTC_5x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR:
+			return align(width, 5) * align(height, 5) * depth;
+		case FORMAT_RGBA_ASTC_6x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR:
+			return align(width, 6) * align(height, 5) * depth;
+		case FORMAT_RGBA_ASTC_6x6_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR:
+			return align(width, 6) * align(height, 6) * depth;
+		case FORMAT_RGBA_ASTC_8x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR:
+			return align(width, 8) * align(height, 5) * depth;
+		case FORMAT_RGBA_ASTC_8x6_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR:
+			return align(width, 8) * align(height, 6) * depth;
+		case FORMAT_RGBA_ASTC_8x8_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR:
+			return align(width, 8) * align(height, 8) * depth;
+		case FORMAT_RGBA_ASTC_10x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR:
+			return align(width, 10) * align(height, 5) * depth;
+		case FORMAT_RGBA_ASTC_10x6_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR:
+			return align(width, 10) * align(height, 6) * depth;
+		case FORMAT_RGBA_ASTC_10x8_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR:
+			return align(width, 10) * align(height, 8) * depth;
+		case FORMAT_RGBA_ASTC_10x10_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR:
+			return align(width, 10) * align(height, 10) * depth;
+		case FORMAT_RGBA_ASTC_12x10_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR:
+			return align(width, 12) * align(height, 10) * depth;
+		case FORMAT_RGBA_ASTC_12x12_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR:
+			return align(width, 12) * align(height, 12) * depth;
 		case FORMAT_YV12_BT601:
 		case FORMAT_YV12_BT709:
 		case FORMAT_YV12_JFIF:
@@ -2359,6 +2638,44 @@
 		case FORMAT_ATI1:
 		case FORMAT_ATI2:
 		case FORMAT_ETC1:
+		case FORMAT_R11_EAC:
+		case FORMAT_SIGNED_R11_EAC:
+		case FORMAT_RG11_EAC:
+		case FORMAT_SIGNED_RG11_EAC:
+		case FORMAT_RGB8_ETC2:
+		case FORMAT_SRGB8_ETC2:
+		case FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+		case FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+		case FORMAT_RGBA8_ETC2_EAC:
+		case FORMAT_SRGB8_ALPHA8_ETC2_EAC:
+		case FORMAT_RGBA_ASTC_4x4_KHR:
+		case FORMAT_RGBA_ASTC_5x4_KHR:
+		case FORMAT_RGBA_ASTC_5x5_KHR:
+		case FORMAT_RGBA_ASTC_6x5_KHR:
+		case FORMAT_RGBA_ASTC_6x6_KHR:
+		case FORMAT_RGBA_ASTC_8x5_KHR:
+		case FORMAT_RGBA_ASTC_8x6_KHR:
+		case FORMAT_RGBA_ASTC_8x8_KHR:
+		case FORMAT_RGBA_ASTC_10x5_KHR:
+		case FORMAT_RGBA_ASTC_10x6_KHR:
+		case FORMAT_RGBA_ASTC_10x8_KHR:
+		case FORMAT_RGBA_ASTC_10x10_KHR:
+		case FORMAT_RGBA_ASTC_12x10_KHR:
+		case FORMAT_RGBA_ASTC_12x12_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR:
 			return true;
 		default:
 			return false;
@@ -3306,13 +3623,53 @@
 		case FORMAT_DXT1:
 		case FORMAT_DXT3:
 		case FORMAT_DXT5:
-			return FORMAT_A8R8G8B8;
 		#endif
+		case FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+		case FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+		case FORMAT_RGBA8_ETC2_EAC:
+		case FORMAT_SRGB8_ALPHA8_ETC2_EAC:
+		case FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR:
+		case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR:
+			return FORMAT_A8R8G8B8;
+		case FORMAT_RGBA_ASTC_4x4_KHR:
+		case FORMAT_RGBA_ASTC_5x4_KHR:
+		case FORMAT_RGBA_ASTC_5x5_KHR:
+		case FORMAT_RGBA_ASTC_6x5_KHR:
+		case FORMAT_RGBA_ASTC_6x6_KHR:
+		case FORMAT_RGBA_ASTC_8x5_KHR:
+		case FORMAT_RGBA_ASTC_8x6_KHR:
+		case FORMAT_RGBA_ASTC_8x8_KHR:
+		case FORMAT_RGBA_ASTC_10x5_KHR:
+		case FORMAT_RGBA_ASTC_10x6_KHR:
+		case FORMAT_RGBA_ASTC_10x8_KHR:
+		case FORMAT_RGBA_ASTC_10x10_KHR:
+		case FORMAT_RGBA_ASTC_12x10_KHR:
+		case FORMAT_RGBA_ASTC_12x12_KHR:
+			// ASTC supports HDR, so a floating point format is required to represent it properly
+			return FORMAT_A32B32G32R32F; // FIXME: 16FP is probably sufficient, but it's currently unsupported
 		case FORMAT_ATI1:
+		case FORMAT_R11_EAC:
+		case FORMAT_SIGNED_R11_EAC:
 			return FORMAT_R8;
 		case FORMAT_ATI2:
+		case FORMAT_RG11_EAC:
+		case FORMAT_SIGNED_RG11_EAC:
 			return FORMAT_G8R8;
 		case FORMAT_ETC1:
+		case FORMAT_RGB8_ETC2:
+		case FORMAT_SRGB8_ETC2:
 			return FORMAT_X8R8G8B8;
 		// Bumpmap formats
 		case FORMAT_V8U8:			return FORMAT_V8U8;