From eed2f72466e654e12f8eaac9ff3c8cc7e99a7eae Mon Sep 17 00:00:00 2001 From: Philip Rideout Date: Thu, 4 Oct 2018 12:58:05 -0700 Subject: [PATCH] Implement TODO items for ASTC encoding. These presets are copied over from the ARM standalone tool. I have not tested them but they seem reasonable. --- libs/imageio/src/BlockCompression.cpp | 112 ++++++++++++++++++++++++-- 1 file changed, 107 insertions(+), 5 deletions(-) diff --git a/libs/imageio/src/BlockCompression.cpp b/libs/imageio/src/BlockCompression.cpp index 43d9168a20..3d7a937a37 100644 --- a/libs/imageio/src/BlockCompression.cpp +++ b/libs/imageio/src/BlockCompression.cpp @@ -126,8 +126,6 @@ CompressedTexture astcCompress(const LinearImage& original, AstcConfig config) { int pcdiv; switch (config.quality) { - // TODO: honor the other presets - default: case AstcPreset::VERYFAST: plimit_autoset = 2; oplimit_autoset = 1.0; @@ -146,6 +144,78 @@ CompressedTexture astcCompress(const LinearImage& original, AstcConfig config) { default: pcdiv = 30; break; } break; + case AstcPreset::FAST: + plimit_autoset = 4; + oplimit_autoset = 1.0; + dblimit_autoset_2d = fmax(85 - 35 * log10_texels_2d, 63 - 19 * log10_texels_2d); + dblimit_autoset_3d = fmax(85 - 35 * log10_texels_3d, 63 - 19 * log10_texels_3d); + bmc_autoset = 50; + mincorrel_autoset = 0.5; + maxiters_autoset = 1; + switch (ydim_2d) { + case 4: pcdiv = 60; break; + case 5: pcdiv = 27; break; + case 6: pcdiv = 30; break; + case 8: pcdiv = 24; break; + case 10: pcdiv = 16; break; + case 12: pcdiv = 20; break; + default: pcdiv = 20; break; + } + break; + case AstcPreset::MEDIUM: + plimit_autoset = 25; + oplimit_autoset = 1.2; + dblimit_autoset_2d = fmax(95 - 35 * log10_texels_2d, 70 - 19 * log10_texels_2d); + dblimit_autoset_3d = fmax(95 - 35 * log10_texels_3d, 70 - 19 * log10_texels_3d); + bmc_autoset = 75; + mincorrel_autoset = 0.75; + maxiters_autoset = 2; + switch (ydim_2d) { + case 4: pcdiv = 25; break; + case 5: pcdiv = 15; break; + case 6: pcdiv = 15; break; + case 8: pcdiv = 10; break; + case 10: pcdiv = 8; break; + case 12: pcdiv = 6; break; + default: pcdiv = 6; break; + } + break; + case AstcPreset::THOROUGH: + plimit_autoset = 100; + oplimit_autoset = 2.5; + dblimit_autoset_2d = fmax(105 - 35 * log10_texels_2d, 77 - 19 * log10_texels_2d); + dblimit_autoset_3d = fmax(105 - 35 * log10_texels_3d, 77 - 19 * log10_texels_3d); + bmc_autoset = 95; + mincorrel_autoset = 0.95f; + maxiters_autoset = 4; + switch (ydim_2d) { + case 4: pcdiv = 12; break; + case 5: pcdiv = 7; break; + case 6: pcdiv = 7; break; + case 8: pcdiv = 5; break; + case 10: pcdiv = 4; break; + case 12: pcdiv = 3; break; + default: pcdiv = 3; break; + } + break; + case AstcPreset::EXHAUSTIVE: + plimit_autoset = 1 << 10; + oplimit_autoset = 1000.0; + dblimit_autoset_2d = 999.0f; + dblimit_autoset_3d = 999.0f; + bmc_autoset = 100; + mincorrel_autoset = 0.99; + maxiters_autoset = 4; + switch (ydim_2d) { + case 4: pcdiv = 3; break; + case 5: pcdiv = 1; break; + case 6: pcdiv = 1; break; + case 8: pcdiv = 1; break; + case 10: pcdiv = 1; break; + case 12: pcdiv = 1; break; + default: pcdiv = 1; break; + } + break; } if (plimit_autoset < 1) { @@ -187,10 +257,42 @@ CompressedTexture astcCompress(const LinearImage& original, AstcConfig config) { // Perform compression. + swizzlepattern swz_encode = { 0, 1, 2, 3 }; + swizzlepattern swz_decode = { 0, 1, 2, 3 }; + astc_decode_mode decode_mode; + switch (config.semantic) { + case AstcSemantic::COLORS_LDR: + decode_mode = config.srgb ? DECODE_LDR_SRGB : DECODE_LDR; + break; + case AstcSemantic::COLORS_HDR: + decode_mode = DECODE_HDR; + break; + case AstcSemantic::NORMALS: + decode_mode = config.srgb ? DECODE_LDR_SRGB : DECODE_LDR; + ewp.rgba_weights[0] = 1.0f; + ewp.rgba_weights[1] = 0.0f; + ewp.rgba_weights[2] = 0.0f; + ewp.rgba_weights[3] = 1.0f; + ewp.ra_normal_angular_scale = 1; + swz_encode.r = 0; + swz_encode.g = 0; + swz_encode.b = 0; + swz_encode.a = 1; + swz_decode.r = 0; + swz_decode.g = 3; + swz_decode.b = 6; + swz_decode.a = 5; + ewp.block_artifact_suppression = 1.8f; + ewp.mean_stdev_radius = 3; + ewp.rgb_mean_weight = 0; + ewp.rgb_stdev_weight = 50; + ewp.rgb_mean_and_stdev_mixing = 0.0; + ewp.alpha_mean_weight = 0; + ewp.alpha_stdev_weight = 50; + break; + } + const int threadcount = std::thread::hardware_concurrency(); - constexpr astc_decode_mode decode_mode = DECODE_LDR; // TODO: honor the config semantic - constexpr swizzlepattern swz_encode = { 0, 1, 2, 3 }; - constexpr swizzlepattern swz_decode = { 0, 1, 2, 3 }; const int xsize = input_image->xsize; const int ysize = input_image->ysize;