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>
namespace
{
+ int getNumBlocks(int w, int h, int blockSizeX, int blockSizeY)
+ {
+ return ((w + blockSizeX - 1) / blockSizeX) * ((h + blockSizeY - 1) / blockSizeY);
+ }
+
enum DataType
{
Alpha,
sw::Format SelectInternalFormat(GLenum format, GLenum type)
{
- if(format == GL_ETC1_RGB8_OES)
+ switch(format)
{
+ case GL_ETC1_RGB8_OES:
return sw::FORMAT_ETC1;
- }
- else
+ case GL_COMPRESSED_R11_EAC:
+ return sw::FORMAT_R11_EAC;
+ case GL_COMPRESSED_SIGNED_R11_EAC:
+ return sw::FORMAT_SIGNED_R11_EAC;
+ case GL_COMPRESSED_RG11_EAC:
+ return sw::FORMAT_RG11_EAC;
+ case GL_COMPRESSED_SIGNED_RG11_EAC:
+ return sw::FORMAT_SIGNED_RG11_EAC;
+ case GL_COMPRESSED_RGB8_ETC2:
+ return sw::FORMAT_RGB8_ETC2;
+ case GL_COMPRESSED_SRGB8_ETC2:
+ return sw::FORMAT_SRGB8_ETC2;
+ case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+ return sw::FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
+ case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+ return sw::FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
+ case GL_COMPRESSED_RGBA8_ETC2_EAC:
+ return sw::FORMAT_RGBA8_ETC2_EAC;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
+ return sw::FORMAT_SRGB8_ALPHA8_ETC2_EAC;
+ case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
+ return sw::FORMAT_RGBA_ASTC_4x4_KHR;
+ case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
+ return sw::FORMAT_RGBA_ASTC_5x4_KHR;
+ case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
+ return sw::FORMAT_RGBA_ASTC_5x5_KHR;
+ case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:
+ return sw::FORMAT_RGBA_ASTC_6x5_KHR;
+ case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
+ return sw::FORMAT_RGBA_ASTC_6x6_KHR;
+ case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
+ return sw::FORMAT_RGBA_ASTC_8x5_KHR;
+ case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:
+ return sw::FORMAT_RGBA_ASTC_8x6_KHR;
+ case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:
+ return sw::FORMAT_RGBA_ASTC_8x8_KHR;
+ case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:
+ return sw::FORMAT_RGBA_ASTC_10x5_KHR;
+ case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:
+ return sw::FORMAT_RGBA_ASTC_10x6_KHR;
+ case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:
+ return sw::FORMAT_RGBA_ASTC_10x8_KHR;
+ case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:
+ return sw::FORMAT_RGBA_ASTC_10x10_KHR;
+ case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:
+ return sw::FORMAT_RGBA_ASTC_12x10_KHR;
+ case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:
+ return sw::FORMAT_RGBA_ASTC_12x12_KHR;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
+ return sw::FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
+ return sw::FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
+ return sw::FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
+ return sw::FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
+ return sw::FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
+ return sw::FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
+ return sw::FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
+ return sw::FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
+ return sw::FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
+ return sw::FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
+ return sw::FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
+ return sw::FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
+ return sw::FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
+ return sw::FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR;
#if S3TC_SUPPORT
- if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
- format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT)
- {
- return sw::FORMAT_DXT1;
- }
- else if(format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE)
- {
- return sw::FORMAT_DXT3;
- }
- else if(format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE)
- {
- return sw::FORMAT_DXT5;
- }
- else
+ case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
+ case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+ return sw::FORMAT_DXT1;
+ case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
+ return sw::FORMAT_DXT3;
+ case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
+ return sw::FORMAT_DXT5;
#endif
+ default:
+ break;
+ }
+
if(type == GL_FLOAT)
{
return sw::FORMAT_A32B32G32R32F;
case GL_COMPRESSED_SRGB8_ETC2:
case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
- return 8 * (GLsizei)ceil((float)width / 4.0f) * (GLsizei)ceil((float)height / 4.0f);
+ return 8 * getNumBlocks(width, height, 4, 4);
case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
case GL_COMPRESSED_RG11_EAC:
case GL_COMPRESSED_SIGNED_RG11_EAC:
case GL_COMPRESSED_RGBA8_ETC2_EAC:
case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
- return 16 * (GLsizei)ceil((float)width / 4.0f) * (GLsizei)ceil((float)height / 4.0f);
+ case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
+ return 16 * getNumBlocks(width, height, 4, 4);
+ case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
+ return 16 * getNumBlocks(width, height, 5, 4);
+ case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
+ return 16 * getNumBlocks(width, height, 5, 5);
+ case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
+ return 16 * getNumBlocks(width, height, 6, 5);
+ case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
+ return 16 * getNumBlocks(width, height, 6, 6);
+ case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
+ return 16 * getNumBlocks(width, height, 8, 5);
+ case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
+ return 16 * getNumBlocks(width, height, 8, 6);
+ case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
+ return 16 * getNumBlocks(width, height, 8, 8);
+ case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
+ return 16 * getNumBlocks(width, height, 10, 5);
+ case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
+ return 16 * getNumBlocks(width, height, 10, 6);
+ case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
+ return 16 * getNumBlocks(width, height, 10, 8);
+ case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
+ return 16 * getNumBlocks(width, height, 10, 10);
+ case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
+ return 16 * getNumBlocks(width, height, 12, 10);
+ case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
+ return 16 * getNumBlocks(width, height, 12, 12);
default:
return 0;
}
GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,\r
GL_COMPRESSED_RGBA8_ETC2_EAC,\r
GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,\r
+ GL_COMPRESSED_RGBA_ASTC_4x4_KHR,\r
+ GL_COMPRESSED_RGBA_ASTC_5x4_KHR,\r
+ GL_COMPRESSED_RGBA_ASTC_5x5_KHR,\r
+ GL_COMPRESSED_RGBA_ASTC_6x5_KHR,\r
+ GL_COMPRESSED_RGBA_ASTC_6x6_KHR,\r
+ GL_COMPRESSED_RGBA_ASTC_8x5_KHR,\r
+ GL_COMPRESSED_RGBA_ASTC_8x6_KHR,\r
+ GL_COMPRESSED_RGBA_ASTC_8x8_KHR,\r
+ GL_COMPRESSED_RGBA_ASTC_10x5_KHR,\r
+ GL_COMPRESSED_RGBA_ASTC_10x6_KHR,\r
+ GL_COMPRESSED_RGBA_ASTC_10x8_KHR,\r
+ GL_COMPRESSED_RGBA_ASTC_10x10_KHR,\r
+ GL_COMPRESSED_RGBA_ASTC_12x10_KHR,\r
+ GL_COMPRESSED_RGBA_ASTC_12x12_KHR,\r
+ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR,\r
+ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR,\r
+ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR,\r
+ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR,\r
+ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR,\r
+ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR,\r
+ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR,\r
+ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR,\r
+ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR,\r
+ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR,\r
+ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR,\r
+ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR,\r
+ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR,\r
+ GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR,\r
#endif\r
};\r
\r
{
GLenum format = colorbuffer->getFormat();
- if(IsCompressed(format) ||
+ if(IsCompressed(format, egl::getClientVersion()) ||
format == GL_ALPHA ||
format == GL_LUMINANCE ||
format == GL_LUMINANCE_ALPHA)
return error(GL_INVALID_VALUE);\r
}\r
\r
- if(IsCompressed(image->getFormat()))\r
+ if(IsCompressed(image->getFormat(), egl::getClientVersion()))\r
{\r
return error(GL_INVALID_OPERATION);\r
}\r
\r
bool Texture2D::isCompressed(GLenum target, GLint level) const\r
{\r
- return IsCompressed(getFormat(target, level));\r
+ return IsCompressed(getFormat(target, level), egl::getClientVersion());\r
}\r
\r
bool Texture2D::isDepth(GLenum target, GLint level) const\r
\r
bool TextureCubeMap::isCompressed(GLenum target, GLint level) const\r
{\r
- return IsCompressed(getFormat(target, level));\r
+ return IsCompressed(getFormat(target, level), egl::getClientVersion());\r
}\r
\r
bool TextureCubeMap::isDepth(GLenum target, GLint level) const\r
\r
bool Texture3D::isCompressed(GLenum target, GLint level) const\r
{\r
- return IsCompressed(getFormat(target, level));\r
+ return IsCompressed(getFormat(target, level), egl::getClientVersion());\r
}\r
\r
bool Texture3D::isDepth(GLenum target, GLint level) const\r
\r
static bool validateColorBufferFormat(GLenum textureFormat, GLenum colorbufferFormat)\r
{\r
+ GLenum formatError = ValidateCompressedFormat(textureFormat, egl::getClientVersion(), false);\r
+ if(formatError != GL_NONE)\r
+ {\r
+ return error(formatError, false);\r
+ }\r
+\r
// [OpenGL ES 2.0.24] table 3.9\r
switch(textureFormat)\r
{\r
return error(GL_INVALID_OPERATION, false);\r
}\r
break;\r
- case GL_ETC1_RGB8_OES:\r
- return error(GL_INVALID_OPERATION, false);\r
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
- if(S3TC_SUPPORT)\r
- {\r
- return error(GL_INVALID_OPERATION, false);\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_ENUM, false);\r
- }\r
case GL_DEPTH_COMPONENT:\r
case GL_DEPTH_STENCIL_OES:\r
return error(GL_INVALID_OPERATION, false);\r
return error(GL_INVALID_VALUE);\r
}\r
\r
- egl::GLint clientVersion = egl::getClientVersion();\r
-\r
switch(internalformat)\r
{\r
- case GL_ETC1_RGB8_OES:\r
- break;\r
- case GL_COMPRESSED_R11_EAC:\r
- case GL_COMPRESSED_SIGNED_R11_EAC:\r
- case GL_COMPRESSED_RG11_EAC:\r
- case GL_COMPRESSED_SIGNED_RG11_EAC:\r
- case GL_COMPRESSED_RGB8_ETC2:\r
- case GL_COMPRESSED_SRGB8_ETC2:\r
- case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
- case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
- case GL_COMPRESSED_RGBA8_ETC2_EAC:\r
- case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:\r
- if(clientVersion >= 3)\r
- {\r
- break;\r
- }\r
- return error(GL_INVALID_ENUM);\r
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
- if(!S3TC_SUPPORT)\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
- break;\r
case GL_DEPTH_COMPONENT:\r
case GL_DEPTH_COMPONENT16:\r
case GL_DEPTH_COMPONENT32_OES:\r
case GL_DEPTH24_STENCIL8_OES:\r
return error(GL_INVALID_OPERATION);\r
default:\r
- return error(GL_INVALID_ENUM);\r
+ {\r
+ GLenum formatError = ValidateCompressedFormat(internalformat, egl::getClientVersion(), true);\r
+ if(formatError != GL_NONE)\r
+ {\r
+ return error(formatError);\r
+ }\r
+ }\r
+ break;\r
}\r
\r
if(border != 0)\r
return error(GL_INVALID_VALUE);\r
}\r
\r
- egl::GLint clientVersion = egl::getClientVersion();\r
-\r
- switch(format)\r
+ GLenum formatError = ValidateCompressedFormat(format, egl::getClientVersion(), true);\r
+ if(formatError != GL_NONE)\r
{\r
- case GL_ETC1_RGB8_OES:\r
- break;\r
- case GL_COMPRESSED_R11_EAC:\r
- case GL_COMPRESSED_SIGNED_R11_EAC:\r
- case GL_COMPRESSED_RG11_EAC:\r
- case GL_COMPRESSED_SIGNED_RG11_EAC:\r
- case GL_COMPRESSED_RGB8_ETC2:\r
- case GL_COMPRESSED_SRGB8_ETC2:\r
- case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
- case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
- case GL_COMPRESSED_RGBA8_ETC2_EAC:\r
- case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:\r
- if(clientVersion >= 3)\r
- {\r
- break;\r
- }\r
- return error(GL_INVALID_ENUM);\r
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
- if(!S3TC_SUPPORT)\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
+ return error(formatError);\r
}\r
\r
if(width == 0 || height == 0 || data == NULL)\r
}\r
}\r
\r
+ GLenum formatError = ValidateCompressedFormat(format, clientVersion, false);\r
+ if(formatError != GL_NONE)\r
+ {\r
+ return error(formatError);\r
+ }\r
+\r
switch(format)\r
{\r
case GL_ALPHA:\r
return error(GL_INVALID_ENUM);\r
}\r
break;\r
- case GL_ETC1_RGB8_OES:\r
- return error(GL_INVALID_OPERATION);\r
- case GL_COMPRESSED_R11_EAC:\r
- case GL_COMPRESSED_SIGNED_R11_EAC:\r
- case GL_COMPRESSED_RG11_EAC:\r
- case GL_COMPRESSED_SIGNED_RG11_EAC:\r
- case GL_COMPRESSED_RGB8_ETC2:\r
- case GL_COMPRESSED_SRGB8_ETC2:\r
- case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
- case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
- case GL_COMPRESSED_RGBA8_ETC2_EAC:\r
- case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:\r
- if(clientVersion >= 3)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- return error(GL_INVALID_ENUM);\r
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
- if(S3TC_SUPPORT)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
case GL_DEPTH_COMPONENT:\r
switch(internalformat)\r
{\r
\r
switch(internalformat)\r
{\r
- case GL_ETC1_RGB8_OES:\r
- break;\r
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
- if(!S3TC_SUPPORT)\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
- break;\r
case GL_DEPTH_COMPONENT:\r
case GL_DEPTH_COMPONENT16:\r
case GL_DEPTH_COMPONENT32_OES:\r
case GL_DEPTH24_STENCIL8_OES:\r
return error(GL_INVALID_OPERATION);\r
default:\r
- return error(GL_INVALID_ENUM);\r
+ {\r
+ GLenum formatError = ValidateCompressedFormat(internalformat, egl::getClientVersion(), true);\r
+ if(formatError != GL_NONE)\r
+ {\r
+ return error(formatError);\r
+ }\r
+ }\r
}\r
\r
if(imageSize != egl::ComputeCompressedSize(width, height, internalformat) * depth)\r
return error(GL_INVALID_VALUE);\r
}\r
\r
- switch(format)\r
+ GLenum formatError = ValidateCompressedFormat(format, egl::getClientVersion(), true);\r
+ if(formatError != GL_NONE)\r
{\r
- case GL_ETC1_RGB8_OES:\r
- break;\r
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
- if(!S3TC_SUPPORT)\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
+ return error(formatError);\r
}\r
\r
if(width == 0 || height == 0 || depth == 0 || data == NULL)\r
\r
static bool validateColorBufferFormat(GLenum textureFormat, GLenum colorbufferFormat)\r
{\r
+ GLenum formatError = ValidateCompressedFormat(textureFormat, egl::getClientVersion(), false);\r
+ if(formatError != GL_NONE)\r
+ {\r
+ return error(formatError, false);\r
+ }\r
+\r
switch(textureFormat)\r
{\r
case GL_ALPHA:\r
return error(GL_INVALID_OPERATION, false);\r
}\r
break;\r
- case GL_ETC1_RGB8_OES:\r
- case GL_COMPRESSED_R11_EAC:\r
- case GL_COMPRESSED_SIGNED_R11_EAC:\r
- case GL_COMPRESSED_RG11_EAC:\r
- case GL_COMPRESSED_SIGNED_RG11_EAC:\r
- case GL_COMPRESSED_RGB8_ETC2:\r
- case GL_COMPRESSED_SRGB8_ETC2:\r
- case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
- case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
- case GL_COMPRESSED_RGBA8_ETC2_EAC:\r
- case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:\r
- return error(GL_INVALID_OPERATION, false);\r
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
- if(S3TC_SUPPORT)\r
- {\r
- return error(GL_INVALID_OPERATION, false);\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_ENUM, false);\r
- }\r
case GL_DEPTH_COMPONENT:\r
case GL_DEPTH_STENCIL:\r
return error(GL_INVALID_OPERATION, false);\r
\r
switch(internalformat)\r
{\r
- case GL_ETC1_RGB8_OES:\r
- case GL_COMPRESSED_R11_EAC:\r
- case GL_COMPRESSED_SIGNED_R11_EAC:\r
- case GL_COMPRESSED_RG11_EAC:\r
- case GL_COMPRESSED_SIGNED_RG11_EAC:\r
- case GL_COMPRESSED_RGB8_ETC2:\r
- case GL_COMPRESSED_SRGB8_ETC2:\r
- case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
- case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
- case GL_COMPRESSED_RGBA8_ETC2_EAC:\r
- case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:\r
- break;\r
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
- if(!S3TC_SUPPORT)\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
- break;\r
case GL_DEPTH_COMPONENT:\r
case GL_DEPTH_COMPONENT16:\r
case GL_DEPTH_COMPONENT32_OES:\r
case GL_DEPTH24_STENCIL8:\r
return error(GL_INVALID_OPERATION);\r
default:\r
- return error(GL_INVALID_ENUM);\r
+ {\r
+ GLenum formatError = ValidateCompressedFormat(internalformat, egl::getClientVersion(), true);\r
+ if(formatError != GL_NONE)\r
+ {\r
+ return error(formatError);\r
+ }\r
+ }\r
}\r
\r
if(imageSize != egl::ComputeCompressedSize(width, height, internalformat) * depth)\r
return error(GL_INVALID_VALUE);\r
}\r
\r
- switch(format)\r
+ GLenum formatError = ValidateCompressedFormat(format, egl::getClientVersion(), true);\r
+ if(formatError != GL_NONE)\r
{\r
- case GL_ETC1_RGB8_OES:\r
- case GL_COMPRESSED_R11_EAC:\r
- case GL_COMPRESSED_SIGNED_R11_EAC:\r
- case GL_COMPRESSED_RG11_EAC:\r
- case GL_COMPRESSED_SIGNED_RG11_EAC:\r
- case GL_COMPRESSED_RGB8_ETC2:\r
- case GL_COMPRESSED_SRGB8_ETC2:\r
- case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
- case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
- case GL_COMPRESSED_RGBA8_ETC2_EAC:\r
- case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:\r
- break;\r
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
- if(!S3TC_SUPPORT)\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
+ return error(formatError);\r
}\r
\r
if(width == 0 || height == 0 || depth == 0 || data == NULL)\r
return static_cast<GLint>((static_cast<GLfloat>(0xFFFFFFFF) * value - 1.0f) * 0.5f);\r
}\r
\r
- bool IsCompressed(GLenum format)\r
+ bool IsCompressed(GLenum format, egl::GLint clientVersion)\r
{\r
- return format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||\r
- format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||\r
- format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE ||\r
- format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE ||\r
- format == GL_ETC1_RGB8_OES ||\r
- format == GL_COMPRESSED_R11_EAC ||\r
- format == GL_COMPRESSED_SIGNED_R11_EAC ||\r
- format == GL_COMPRESSED_RG11_EAC ||\r
- format == GL_COMPRESSED_SIGNED_RG11_EAC ||\r
- format == GL_COMPRESSED_RGB8_ETC2 ||\r
- format == GL_COMPRESSED_SRGB8_ETC2 ||\r
- format == GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 ||\r
- format == GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 ||\r
- format == GL_COMPRESSED_RGBA8_ETC2_EAC ||\r
- format == GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;\r
+ return ValidateCompressedFormat(format, clientVersion, true) == GL_NONE;\r
+ }\r
+\r
+ GLenum ValidateCompressedFormat(GLenum format, egl::GLint clientVersion, bool expectCompressedFormats)\r
+ {\r
+ switch(format)\r
+ {\r
+ case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
+ case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+ case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
+ case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
+ return S3TC_SUPPORT ? (expectCompressedFormats ? GL_NONE : GL_INVALID_OPERATION) : GL_INVALID_ENUM;
+ case GL_ETC1_RGB8_OES:
+ return expectCompressedFormats ? GL_NONE : GL_INVALID_OPERATION;
+ case GL_COMPRESSED_R11_EAC:
+ case GL_COMPRESSED_SIGNED_R11_EAC:
+ case GL_COMPRESSED_RG11_EAC:
+ case GL_COMPRESSED_SIGNED_RG11_EAC:
+ case GL_COMPRESSED_RGB8_ETC2:
+ case GL_COMPRESSED_SRGB8_ETC2:
+ case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+ case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+ case GL_COMPRESSED_RGBA8_ETC2_EAC:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
+ case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
+ case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
+ case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
+ case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:
+ case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
+ case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
+ case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:
+ case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:
+ case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:
+ case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:
+ case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:
+ case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:
+ case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:
+ case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:\r
+ return (clientVersion >= 3) ? (expectCompressedFormats ? GL_NONE : GL_INVALID_OPERATION) : GL_INVALID_ENUM;\r
+ default:\r
+ return expectCompressedFormats ? GL_INVALID_ENUM : GL_NONE; // Not compressed format\r
+ }\r
}\r
\r
bool IsDepthTexture(GLenum format)\r
\r
GLint floatToInt(GLfloat value);\r
\r
- bool IsCompressed(GLenum format);\r
+ bool IsCompressed(GLenum format, egl::GLint clientVersion);\r
+ GLenum ValidateCompressedFormat(GLenum format, egl::GLint clientVersion, bool expectCompressedFormats);\r
bool IsDepthTexture(GLenum format);\r
bool IsStencilTexture(GLenum format);\r
bool IsCubemapTextureTarget(GLenum target);\r
#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:
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;
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:
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:
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;
}
}
}
}
+ 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
#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:
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;
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;
FORMAT_DXT5,\r
FORMAT_ATI1,\r
FORMAT_ATI2,\r
- FORMAT_ETC1,\r
+ FORMAT_ETC1,\r
+ FORMAT_R11_EAC,\r
+ FORMAT_SIGNED_R11_EAC,\r
+ FORMAT_RG11_EAC,\r
+ FORMAT_SIGNED_RG11_EAC,\r
+ FORMAT_RGB8_ETC2,\r
+ FORMAT_SRGB8_ETC2,\r
+ FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,\r
+ FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,\r
+ FORMAT_RGBA8_ETC2_EAC,\r
+ FORMAT_SRGB8_ALPHA8_ETC2_EAC,\r
+ FORMAT_RGBA_ASTC_4x4_KHR,\r
+ FORMAT_RGBA_ASTC_5x4_KHR,\r
+ FORMAT_RGBA_ASTC_5x5_KHR,\r
+ FORMAT_RGBA_ASTC_6x5_KHR,\r
+ FORMAT_RGBA_ASTC_6x6_KHR,\r
+ FORMAT_RGBA_ASTC_8x5_KHR,\r
+ FORMAT_RGBA_ASTC_8x6_KHR,\r
+ FORMAT_RGBA_ASTC_8x8_KHR,\r
+ FORMAT_RGBA_ASTC_10x5_KHR,\r
+ FORMAT_RGBA_ASTC_10x6_KHR,\r
+ FORMAT_RGBA_ASTC_10x8_KHR,\r
+ FORMAT_RGBA_ASTC_10x10_KHR,\r
+ FORMAT_RGBA_ASTC_12x10_KHR,\r
+ FORMAT_RGBA_ASTC_12x12_KHR,\r
+ FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR,\r
+ FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR,\r
+ FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR,\r
+ FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR,\r
+ FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR,\r
+ FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR,\r
+ FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR,\r
+ FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR,\r
+ FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR,\r
+ FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR,\r
+ FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR,\r
+ FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR,\r
+ FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR,\r
+ FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR,\r
// Floating-point formats\r
FORMAT_A16F,\r
FORMAT_R16F,\r
static void decodeATI1(Buffer &internal, const Buffer &external);\r
static void decodeATI2(Buffer &internal, const Buffer &external);\r
static void decodeETC1(Buffer &internal, const Buffer &external);\r
+ static void decodeEAC(Buffer &internal, const Buffer &external, int nbChannels, bool isSigned);\r
+ static void decodeETC2(Buffer &internal, const Buffer &external, int nbAlphaBits, bool isSRGB);\r
+ static void decodeASTC(Buffer &internal, const Buffer &external, int xSize, int ySize, int zSize, bool isSRGB);\r
\r
static void update(Buffer &destination, Buffer &source);\r
static void genericUpdate(Buffer &destination, Buffer &source);\r