size_t GetCompressedByteSize(GLsizei w, GLsizei h, GLsizei d, GLenum internalformat, int mip) { if(!IsCompressedFormat(internalformat)) { RDCERR("Not compressed format"); return GetByteSize(w, h, d, GetBaseFormat(internalformat), GetDataType(internalformat)); } switch(internalformat) { // BC1 case eGL_COMPRESSED_RGB_S3TC_DXT1_EXT: case eGL_COMPRESSED_RGBA_S3TC_DXT1_EXT: case eGL_COMPRESSED_SRGB_S3TC_DXT1_EXT: case eGL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: return (AlignUp4(w) * AlignUp4(h) * d) / 2; // BC2 case eGL_COMPRESSED_RGBA_S3TC_DXT3_EXT: case eGL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: return (AlignUp4(w) * AlignUp4(h) * d); // BC3 case eGL_COMPRESSED_RGBA_S3TC_DXT5_EXT: case eGL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: return (AlignUp4(w) * AlignUp4(h) * d); // BC4 case eGL_COMPRESSED_RED_RGTC1: case eGL_COMPRESSED_SIGNED_RED_RGTC1: return (AlignUp4(w) * AlignUp4(h) * d) / 2; // BC5 case eGL_COMPRESSED_RG_RGTC2: case eGL_COMPRESSED_SIGNED_RG_RGTC2: return (AlignUp4(w) * AlignUp4(h) * d); // BC6 case eGL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB: case eGL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB: return (AlignUp4(w) * AlignUp4(h) * d); // BC7 case eGL_COMPRESSED_RGBA_BPTC_UNORM_ARB: case eGL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB: return (AlignUp4(w) * AlignUp4(h) * d); // ETC2 case eGL_COMPRESSED_RGB8_ETC2: case eGL_COMPRESSED_SRGB8_ETC2: case eGL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: case eGL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: return (AlignUp4(w) * AlignUp4(h) * d) / 2; // EAC case eGL_COMPRESSED_RGBA8_ETC2_EAC: case eGL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: return (AlignUp4(w) * AlignUp4(h) * d); case eGL_COMPRESSED_R11_EAC: case eGL_COMPRESSED_SIGNED_R11_EAC: return (AlignUp4(w) * AlignUp4(h) * d) / 2; case eGL_COMPRESSED_RG11_EAC: case eGL_COMPRESSED_SIGNED_RG11_EAC: return (AlignUp4(w) * AlignUp4(h) * d); default: break; } RDCERR("Unrecognised compressed format"); return GetByteSize(w, h, d, GetBaseFormat(internalformat), GetDataType(internalformat)); }
size_t GetCompressedByteSize(GLsizei w, GLsizei h, GLsizei d, GLenum internalformat, int mip) { if(!IsCompressedFormat(internalformat)) { RDCERR("Not compressed format %s", ToStr::Get(internalformat).c_str()); return GetByteSize(w, h, d, GetBaseFormat(internalformat), GetDataType(internalformat)); } uint32_t astc[2] = {0, 0}; switch(internalformat) { // BC1 case eGL_COMPRESSED_RGB_S3TC_DXT1_EXT: case eGL_COMPRESSED_RGBA_S3TC_DXT1_EXT: case eGL_COMPRESSED_SRGB_S3TC_DXT1_EXT: case eGL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: return (AlignUp4(w) * AlignUp4(h) * d) / 2; // BC2 case eGL_COMPRESSED_RGBA_S3TC_DXT3_EXT: case eGL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: return (AlignUp4(w) * AlignUp4(h) * d); // BC3 case eGL_COMPRESSED_RGBA_S3TC_DXT5_EXT: case eGL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: return (AlignUp4(w) * AlignUp4(h) * d); // BC4 case eGL_COMPRESSED_RED_RGTC1: case eGL_COMPRESSED_SIGNED_RED_RGTC1: return (AlignUp4(w) * AlignUp4(h) * d) / 2; // BC5 case eGL_COMPRESSED_RG_RGTC2: case eGL_COMPRESSED_SIGNED_RG_RGTC2: return (AlignUp4(w) * AlignUp4(h) * d); // BC6 case eGL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB: case eGL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB: return (AlignUp4(w) * AlignUp4(h) * d); // BC7 case eGL_COMPRESSED_RGBA_BPTC_UNORM_ARB: case eGL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB: return (AlignUp4(w) * AlignUp4(h) * d); // ETC2 case eGL_COMPRESSED_RGB8_ETC2: case eGL_COMPRESSED_SRGB8_ETC2: case eGL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: case eGL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: return (AlignUp4(w) * AlignUp4(h) * d) / 2; // EAC case eGL_COMPRESSED_RGBA8_ETC2_EAC: case eGL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: return (AlignUp4(w) * AlignUp4(h) * d); case eGL_COMPRESSED_R11_EAC: case eGL_COMPRESSED_SIGNED_R11_EAC: return (AlignUp4(w) * AlignUp4(h) * d) / 2; case eGL_COMPRESSED_RG11_EAC: case eGL_COMPRESSED_SIGNED_RG11_EAC: return (AlignUp4(w) * AlignUp4(h) * d); case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: astc[0] = 4; astc[1] = 4; break; case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: astc[0] = 5; astc[1] = 4; break; case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: astc[0] = 5; astc[1] = 5; break; case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: astc[0] = 6; astc[1] = 5; break; case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: astc[0] = 6; astc[1] = 6; break; case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: astc[0] = 8; astc[1] = 5; break; case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: astc[0] = 8; astc[1] = 6; break; case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: astc[0] = 8; astc[1] = 8; break; case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: astc[0] = 10; astc[1] = 5; break; case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: astc[0] = 10; astc[1] = 6; break; case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: astc[0] = 10; astc[1] = 8; break; case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: astc[0] = 10; astc[1] = 10; break; case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: astc[0] = 12; astc[1] = 10; break; case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: astc[0] = 12; astc[1] = 12; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: astc[0] = 4; astc[1] = 4; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: astc[0] = 5; astc[1] = 4; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: astc[0] = 5; astc[1] = 5; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: astc[0] = 6; astc[1] = 5; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: astc[0] = 6; astc[1] = 6; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: astc[0] = 8; astc[1] = 5; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: astc[0] = 8; astc[1] = 6; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: astc[0] = 8; astc[1] = 8; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: astc[0] = 10; astc[1] = 5; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: astc[0] = 10; astc[1] = 6; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: astc[0] = 10; astc[1] = 8; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: astc[0] = 10; astc[1] = 10; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: astc[0] = 12; astc[1] = 10; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: astc[0] = 12; astc[1] = 12; break; default: break; } if(astc[0] > 0 && astc[1] > 0) { uint32_t blocks[2] = {(w / astc[0]), (h / astc[1])}; // how many blocks are needed - including any extra partial blocks blocks[0] += (w % astc[0]) ? 1 : 0; blocks[1] += (h % astc[1]) ? 1 : 0; // ASTC blocks are all 128 bits each return blocks[0] * blocks[1] * 16 * d; } RDCERR("Unrecognised compressed format %s", ToStr::Get(internalformat).c_str()); return GetByteSize(w, h, d, GetBaseFormat(internalformat), GetDataType(internalformat)); }