From bca0ff8ba202c6d1de546abb2b6ef846ab689502 Mon Sep 17 00:00:00 2001 From: Arseny Kapoulkine Date: Sun, 3 Nov 2024 15:33:02 -0800 Subject: [PATCH 1/2] Precompute g_bc7_mode_N tables for solid color blocks uastc_init takes 140ms in Chrome; this delays time-to-first-paint with textures by 140ms per worker. The tables are just 2KB and 1KB respectively; additionally, errors for mode 5 are all 0, and errors for mode 6 are all 0 except for two values (0 and 255), so we can avoid storing the errors and compute them from color values. This reduces uastc_init cost to 30ms. --- transcoder/basisu_transcoder.cpp | 75 +++++++++++++++++++++++++--- transcoder/basisu_transcoder_uastc.h | 8 +-- 2 files changed, 72 insertions(+), 11 deletions(-) diff --git a/transcoder/basisu_transcoder.cpp b/transcoder/basisu_transcoder.cpp index ea994b0c..0a96c0cb 100644 --- a/transcoder/basisu_transcoder.cpp +++ b/transcoder/basisu_transcoder.cpp @@ -11930,8 +11930,61 @@ namespace basist const uint8_t g_bc7_alpha_index_bitcount[8] = { 0, 0, 0, 0, 3, 2, 4, 2 }; - endpoint_err g_bc7_mode_6_optimal_endpoints[256][2]; // [c][pbit] - endpoint_err g_bc7_mode_5_optimal_endpoints[256]; // [c] + const endpoint_sel g_bc7_mode_6_optimal_endpoints[256][2] = // [c][pbit] + { + { { 0,0 }, { 0,0 } }, { { 0,1 }, { 0,0 } }, { { 0,3 }, { 0,1 } }, { { 0,4 }, { 0,3 } }, { { 0,6 }, { 0,4 } }, { { 0,7 }, { 0,6 } }, { { 0,9 }, { 0,7 } }, { { 0,10 }, { 0,9 } }, + { { 0,12 }, { 0,10 } }, { { 0,13 }, { 0,12 } }, { { 0,15 }, { 0,13 } }, { { 0,16 }, { 0,15 } }, { { 0,18 }, { 0,16 } }, { { 0,20 }, { 0,18 } }, { { 0,21 }, { 0,20 } }, { { 0,23 }, { 0,21 } }, + { { 0,24 }, { 0,23 } }, { { 0,26 }, { 0,24 } }, { { 0,27 }, { 0,26 } }, { { 0,29 }, { 0,27 } }, { { 0,30 }, { 0,29 } }, { { 0,32 }, { 0,30 } }, { { 0,33 }, { 0,32 } }, { { 0,35 }, { 0,33 } }, + { { 0,36 }, { 0,35 } }, { { 0,38 }, { 0,36 } }, { { 0,39 }, { 0,38 } }, { { 0,41 }, { 0,39 } }, { { 0,42 }, { 0,41 } }, { { 0,44 }, { 0,42 } }, { { 0,45 }, { 0,44 } }, { { 0,47 }, { 0,45 } }, + { { 0,48 }, { 0,47 } }, { { 0,50 }, { 0,48 } }, { { 0,52 }, { 0,50 } }, { { 0,53 }, { 0,52 } }, { { 0,55 }, { 0,53 } }, { { 0,56 }, { 0,55 } }, { { 0,58 }, { 0,56 } }, { { 0,59 }, { 0,58 } }, + { { 0,61 }, { 0,59 } }, { { 0,62 }, { 0,61 } }, { { 0,64 }, { 0,62 } }, { { 0,65 }, { 0,64 } }, { { 0,67 }, { 0,65 } }, { { 0,68 }, { 0,67 } }, { { 0,70 }, { 0,68 } }, { { 0,71 }, { 0,70 } }, + { { 0,73 }, { 0,71 } }, { { 0,74 }, { 0,73 } }, { { 0,76 }, { 0,74 } }, { { 0,77 }, { 0,76 } }, { { 0,79 }, { 0,77 } }, { { 0,80 }, { 0,79 } }, { { 0,82 }, { 0,80 } }, { { 0,84 }, { 0,82 } }, + { { 0,85 }, { 0,84 } }, { { 0,87 }, { 0,85 } }, { { 0,88 }, { 0,87 } }, { { 0,90 }, { 0,88 } }, { { 0,91 }, { 0,90 } }, { { 0,93 }, { 0,91 } }, { { 0,94 }, { 0,93 } }, { { 0,96 }, { 0,94 } }, + { { 0,97 }, { 0,96 } }, { { 0,99 }, { 0,97 } }, { { 0,100 }, { 0,99 } }, { { 0,102 }, { 0,100 } }, { { 0,103 }, { 0,102 } }, { { 0,105 }, { 0,103 } }, { { 0,106 }, { 0,105 } }, { { 0,108 }, { 0,106 } }, + { { 0,109 }, { 0,108 } }, { { 0,111 }, { 0,109 } }, { { 0,112 }, { 0,111 } }, { { 0,114 }, { 0,112 } }, { { 0,116 }, { 0,114 } }, { { 0,117 }, { 0,116 } }, { { 0,119 }, { 0,117 } }, { { 0,120 }, { 0,119 } }, + { { 0,122 }, { 0,120 } }, { { 0,123 }, { 0,122 } }, { { 0,125 }, { 0,123 } }, { { 0,126 }, { 0,125 } }, { { 1,126 }, { 0,126 } }, { { 1,127 }, { 1,126 } }, { { 2,127 }, { 1,127 } }, { { 3,126 }, { 2,127 } }, + { { 4,126 }, { 3,126 } }, { { 4,127 }, { 4,126 } }, { { 5,127 }, { 4,127 } }, { { 6,126 }, { 5,127 } }, { { 7,126 }, { 6,126 } }, { { 7,127 }, { 7,126 } }, { { 8,127 }, { 7,127 } }, { { 9,126 }, { 8,127 } }, + { { 10,126 }, { 9,126 } }, { { 10,127 }, { 10,126 } }, { { 11,127 }, { 10,127 } }, { { 12,126 }, { 11,127 } }, { { 13,125 }, { 12,126 } }, { { 13,127 }, { 13,125 } }, { { 14,126 }, { 13,127 } }, { { 15,126 }, { 14,126 } }, + { { 15,127 }, { 15,126 } }, { { 16,127 }, { 15,127 } }, { { 17,126 }, { 16,127 } }, { { 18,126 }, { 17,126 } }, { { 18,127 }, { 18,126 } }, { { 19,127 }, { 18,127 } }, { { 20,126 }, { 19,127 } }, { { 21,126 }, { 20,126 } }, + { { 21,127 }, { 21,126 } }, { { 22,127 }, { 21,127 } }, { { 23,126 }, { 22,127 } }, { { 24,126 }, { 23,126 } }, { { 24,127 }, { 24,126 } }, { { 25,127 }, { 24,127 } }, { { 26,126 }, { 25,127 } }, { { 27,126 }, { 26,126 } }, + { { 27,127 }, { 27,126 } }, { { 28,127 }, { 27,127 } }, { { 29,126 }, { 28,127 } }, { { 30,126 }, { 29,126 } }, { { 30,127 }, { 30,126 } }, { { 31,127 }, { 30,127 } }, { { 32,126 }, { 31,127 } }, { { 33,126 }, { 32,126 } }, + { { 33,127 }, { 33,126 } }, { { 34,127 }, { 33,127 } }, { { 35,126 }, { 34,127 } }, { { 36,126 }, { 35,126 } }, { { 36,127 }, { 36,126 } }, { { 37,127 }, { 36,127 } }, { { 38,126 }, { 37,127 } }, { { 39,126 }, { 38,126 } }, + { { 39,127 }, { 39,126 } }, { { 40,127 }, { 39,127 } }, { { 41,126 }, { 40,127 } }, { { 42,126 }, { 41,126 } }, { { 42,127 }, { 42,126 } }, { { 43,127 }, { 42,127 } }, { { 44,126 }, { 43,127 } }, { { 45,125 }, { 44,126 } }, + { { 45,127 }, { 45,125 } }, { { 46,126 }, { 45,127 } }, { { 47,126 }, { 46,126 } }, { { 47,127 }, { 47,126 } }, { { 48,127 }, { 47,127 } }, { { 49,126 }, { 48,127 } }, { { 50,126 }, { 49,126 } }, { { 50,127 }, { 50,126 } }, + { { 51,127 }, { 50,127 } }, { { 52,126 }, { 51,127 } }, { { 53,126 }, { 52,126 } }, { { 53,127 }, { 53,126 } }, { { 54,127 }, { 53,127 } }, { { 55,126 }, { 54,127 } }, { { 56,126 }, { 55,126 } }, { { 56,127 }, { 56,126 } }, + { { 57,127 }, { 56,127 } }, { { 58,126 }, { 57,127 } }, { { 59,126 }, { 58,126 } }, { { 59,127 }, { 59,126 } }, { { 60,127 }, { 59,127 } }, { { 61,126 }, { 60,127 } }, { { 62,126 }, { 61,126 } }, { { 62,127 }, { 62,126 } }, + { { 63,127 }, { 62,127 } }, { { 64,126 }, { 63,127 } }, { { 65,126 }, { 64,126 } }, { { 65,127 }, { 65,126 } }, { { 66,127 }, { 65,127 } }, { { 67,126 }, { 66,127 } }, { { 68,126 }, { 67,126 } }, { { 68,127 }, { 68,126 } }, + { { 69,127 }, { 68,127 } }, { { 70,126 }, { 69,127 } }, { { 71,126 }, { 70,126 } }, { { 71,127 }, { 71,126 } }, { { 72,127 }, { 71,127 } }, { { 73,126 }, { 72,127 } }, { { 74,126 }, { 73,126 } }, { { 74,127 }, { 74,126 } }, + { { 75,127 }, { 74,127 } }, { { 76,126 }, { 75,127 } }, { { 77,125 }, { 76,126 } }, { { 77,127 }, { 77,125 } }, { { 78,126 }, { 77,127 } }, { { 79,126 }, { 78,126 } }, { { 79,127 }, { 79,126 } }, { { 80,127 }, { 79,127 } }, + { { 81,126 }, { 80,127 } }, { { 82,126 }, { 81,126 } }, { { 82,127 }, { 82,126 } }, { { 83,127 }, { 82,127 } }, { { 84,126 }, { 83,127 } }, { { 85,126 }, { 84,126 } }, { { 85,127 }, { 85,126 } }, { { 86,127 }, { 85,127 } }, + { { 87,126 }, { 86,127 } }, { { 88,126 }, { 87,126 } }, { { 88,127 }, { 88,126 } }, { { 89,127 }, { 88,127 } }, { { 90,126 }, { 89,127 } }, { { 91,126 }, { 90,126 } }, { { 91,127 }, { 91,126 } }, { { 92,127 }, { 91,127 } }, + { { 93,126 }, { 92,127 } }, { { 94,126 }, { 93,126 } }, { { 94,127 }, { 94,126 } }, { { 95,127 }, { 94,127 } }, { { 96,126 }, { 95,127 } }, { { 97,126 }, { 96,126 } }, { { 97,127 }, { 97,126 } }, { { 98,127 }, { 97,127 } }, + { { 99,126 }, { 98,127 } }, { { 100,126 }, { 99,126 } }, { { 100,127 }, { 100,126 } }, { { 101,127 }, { 100,127 } }, { { 102,126 }, { 101,127 } }, { { 103,126 }, { 102,126 } }, { { 103,127 }, { 103,126 } }, { { 104,127 }, { 103,127 } }, + { { 105,126 }, { 104,127 } }, { { 106,126 }, { 105,126 } }, { { 106,127 }, { 106,126 } }, { { 107,127 }, { 106,127 } }, { { 108,126 }, { 107,127 } }, { { 109,125 }, { 108,126 } }, { { 109,127 }, { 109,125 } }, { { 110,126 }, { 109,127 } }, + { { 111,126 }, { 110,126 } }, { { 111,127 }, { 111,126 } }, { { 112,127 }, { 111,127 } }, { { 113,126 }, { 112,127 } }, { { 114,126 }, { 113,126 } }, { { 114,127 }, { 114,126 } }, { { 115,127 }, { 114,127 } }, { { 116,126 }, { 115,127 } }, + { { 117,126 }, { 116,126 } }, { { 117,127 }, { 117,126 } }, { { 118,127 }, { 117,127 } }, { { 119,126 }, { 118,127 } }, { { 120,126 }, { 119,126 } }, { { 120,127 }, { 120,126 } }, { { 121,127 }, { 120,127 } }, { { 122,126 }, { 121,127 } }, + { { 123,126 }, { 122,126 } }, { { 123,127 }, { 123,126 } }, { { 124,127 }, { 123,127 } }, { { 125,126 }, { 124,127 } }, { { 126,126 }, { 125,126 } }, { { 126,127 }, { 126,126 } }, { { 127,127 }, { 126,127 } }, { { 127,127 }, { 127,127 } }, + }; + + const endpoint_sel g_bc7_mode_5_optimal_endpoints[256] = // [c] + { + { 0,0 }, { 0,1 }, { 0,3 }, { 0,4 }, { 0,6 }, { 0,7 }, { 0,9 }, { 0,10 }, { 0,12 }, { 0,13 }, { 0,15 }, { 0,16 }, { 0,18 }, { 0,20 }, { 0,21 }, { 0,23 }, + { 0,24 }, { 0,26 }, { 0,27 }, { 0,29 }, { 0,30 }, { 0,32 }, { 0,33 }, { 0,35 }, { 0,36 }, { 0,38 }, { 0,39 }, { 0,41 }, { 0,42 }, { 0,44 }, { 0,45 }, { 0,47 }, + { 0,48 }, { 0,50 }, { 0,52 }, { 0,53 }, { 0,55 }, { 0,56 }, { 0,58 }, { 0,59 }, { 0,61 }, { 0,62 }, { 0,64 }, { 0,65 }, { 0,66 }, { 0,68 }, { 0,69 }, { 0,71 }, + { 0,72 }, { 0,74 }, { 0,75 }, { 0,77 }, { 0,78 }, { 0,80 }, { 0,82 }, { 0,83 }, { 0,85 }, { 0,86 }, { 0,88 }, { 0,89 }, { 0,91 }, { 0,92 }, { 0,94 }, { 0,95 }, + { 0,97 }, { 0,98 }, { 0,100 }, { 0,101 }, { 0,103 }, { 0,104 }, { 0,106 }, { 0,107 }, { 0,109 }, { 0,110 }, { 0,112 }, { 0,114 }, { 0,115 }, { 0,117 }, { 0,118 }, { 0,120 }, + { 0,121 }, { 0,123 }, { 0,124 }, { 0,126 }, { 0,127 }, { 1,127 }, { 2,126 }, { 3,126 }, { 3,127 }, { 4,127 }, { 5,126 }, { 6,126 }, { 6,127 }, { 7,127 }, { 8,126 }, { 9,126 }, + { 9,127 }, { 10,127 }, { 11,126 }, { 12,126 }, { 12,127 }, { 13,127 }, { 14,126 }, { 15,125 }, { 15,127 }, { 16,126 }, { 17,126 }, { 17,127 }, { 18,127 }, { 19,126 }, { 20,126 }, { 20,127 }, + { 21,127 }, { 22,126 }, { 23,126 }, { 23,127 }, { 24,127 }, { 25,126 }, { 26,126 }, { 26,127 }, { 27,127 }, { 28,126 }, { 29,126 }, { 29,127 }, { 30,127 }, { 31,126 }, { 32,126 }, { 32,127 }, + { 33,127 }, { 34,126 }, { 35,126 }, { 35,127 }, { 36,127 }, { 37,126 }, { 38,126 }, { 38,127 }, { 39,127 }, { 40,126 }, { 41,126 }, { 41,127 }, { 42,127 }, { 43,126 }, { 44,126 }, { 44,127 }, + { 45,127 }, { 46,126 }, { 47,125 }, { 47,127 }, { 48,126 }, { 49,126 }, { 49,127 }, { 50,127 }, { 51,126 }, { 52,126 }, { 52,127 }, { 53,127 }, { 54,126 }, { 55,126 }, { 55,127 }, { 56,127 }, + { 57,126 }, { 58,126 }, { 58,127 }, { 59,127 }, { 60,126 }, { 61,126 }, { 61,127 }, { 62,127 }, { 63,126 }, { 64,125 }, { 64,126 }, { 65,126 }, { 65,127 }, { 66,127 }, { 67,126 }, { 68,126 }, + { 68,127 }, { 69,127 }, { 70,126 }, { 71,126 }, { 71,127 }, { 72,127 }, { 73,126 }, { 74,126 }, { 74,127 }, { 75,127 }, { 76,126 }, { 77,125 }, { 77,127 }, { 78,126 }, { 79,126 }, { 79,127 }, + { 80,127 }, { 81,126 }, { 82,126 }, { 82,127 }, { 83,127 }, { 84,126 }, { 85,126 }, { 85,127 }, { 86,127 }, { 87,126 }, { 88,126 }, { 88,127 }, { 89,127 }, { 90,126 }, { 91,126 }, { 91,127 }, + { 92,127 }, { 93,126 }, { 94,126 }, { 94,127 }, { 95,127 }, { 96,126 }, { 97,126 }, { 97,127 }, { 98,127 }, { 99,126 }, { 100,126 }, { 100,127 }, { 101,127 }, { 102,126 }, { 103,126 }, { 103,127 }, + { 104,127 }, { 105,126 }, { 106,126 }, { 106,127 }, { 107,127 }, { 108,126 }, { 109,125 }, { 109,127 }, { 110,126 }, { 111,126 }, { 111,127 }, { 112,127 }, { 113,126 }, { 114,126 }, { 114,127 }, { 115,127 }, + { 116,126 }, { 117,126 }, { 117,127 }, { 118,127 }, { 119,126 }, { 120,126 }, { 120,127 }, { 121,127 }, { 122,126 }, { 123,126 }, { 123,127 }, { 124,127 }, { 125,126 }, { 126,126 }, { 126,127 }, { 127,127 }, + }; static inline void bc7_set_block_bits(uint8_t* pBytes, uint32_t val, uint32_t num_bits, uint32_t* pCur_ofs) { @@ -13703,11 +13756,10 @@ namespace basist // Void-Extent: Solid Color RGBA (BC7 MODE5 or MODE6) const color32& solid_color = unpacked_src_blk.m_solid_color; - uint32_t best_err0 = g_bc7_mode_6_optimal_endpoints[solid_color.r][0].m_error + g_bc7_mode_6_optimal_endpoints[solid_color.g][0].m_error + - g_bc7_mode_6_optimal_endpoints[solid_color.b][0].m_error + g_bc7_mode_6_optimal_endpoints[solid_color.a][0].m_error; - - uint32_t best_err1 = g_bc7_mode_6_optimal_endpoints[solid_color.r][1].m_error + g_bc7_mode_6_optimal_endpoints[solid_color.g][1].m_error + - g_bc7_mode_6_optimal_endpoints[solid_color.b][1].m_error + g_bc7_mode_6_optimal_endpoints[solid_color.a][1].m_error; + // mode 6 with pbit 0 encodes every value except for 255 perfectly + // mode 6 with pbit 1 encodes every value except for 0 perfectly + uint32_t best_err0 = (solid_color.r == 255) + (solid_color.g == 255) + (solid_color.b == 255) + (solid_color.a == 255); + uint32_t best_err1 = (solid_color.r == 0) + (solid_color.g == 0) + (solid_color.b == 0) + (solid_color.a == 0); if (best_err0 > 0 && best_err1 > 0) { @@ -16961,6 +17013,14 @@ namespace basist } // i } + // BC7 mode 5 & 6 tables are precomputed + // Note: mode 5 errors are 0 for all values; mode 6 errors are 0 for all values except for 0 (error 1 for pbit 1) and 255 (error 1 for pbit 0) + #if 0 + struct endpoint_err + { + uint16_t m_error; uint8_t m_lo; uint8_t m_hi; + }; + // TODO: Precompute? // BC7 777.1 for (int c = 0; c < 256; c++) @@ -17024,6 +17084,7 @@ namespace basist g_bc7_mode_5_optimal_endpoints[c] = best; } // c + #endif } #endif // #if BASISD_SUPPORT_UASTC diff --git a/transcoder/basisu_transcoder_uastc.h b/transcoder/basisu_transcoder_uastc.h index 457bd51e..7ca13344 100644 --- a/transcoder/basisu_transcoder_uastc.h +++ b/transcoder/basisu_transcoder_uastc.h @@ -176,15 +176,15 @@ namespace basist inline int get_bc7_color_index_size(int mode, int index_selection_bit) { return g_bc7_color_index_bitcount[mode] + index_selection_bit; } inline int get_bc7_alpha_index_size(int mode, int index_selection_bit) { return g_bc7_alpha_index_bitcount[mode] - index_selection_bit; } - struct endpoint_err + struct endpoint_sel { - uint16_t m_error; uint8_t m_lo; uint8_t m_hi; + uint8_t m_lo; uint8_t m_hi; }; - extern endpoint_err g_bc7_mode_6_optimal_endpoints[256][2]; // [c][pbit] + extern const endpoint_sel g_bc7_mode_6_optimal_endpoints[256][2]; // [c][pbit] const uint32_t BC7ENC_MODE_6_OPTIMAL_INDEX = 5; - extern endpoint_err g_bc7_mode_5_optimal_endpoints[256]; // [c] + extern const endpoint_sel g_bc7_mode_5_optimal_endpoints[256]; // [c] const uint32_t BC7ENC_MODE_5_OPTIMAL_INDEX = 1; // Packs a BC7 block from a high-level description. Handles all BC7 modes. From 5a62344551762e0f2e59083d1dfd2c24f9488267 Mon Sep 17 00:00:00 2001 From: Arseny Kapoulkine Date: Sun, 3 Nov 2024 16:02:27 -0800 Subject: [PATCH 2/2] Remove BC7 mode 6 selection altogether Mode 5 already has zero errors on all solid blocks, so there's no point in using mode 6; this makes transcoding a little faster and simpler, and removes an extra table. --- transcoder/basisu_transcoder.cpp | 130 +++------------------------ transcoder/basisu_transcoder_uastc.h | 3 - 2 files changed, 14 insertions(+), 119 deletions(-) diff --git a/transcoder/basisu_transcoder.cpp b/transcoder/basisu_transcoder.cpp index 0a96c0cb..317c4c73 100644 --- a/transcoder/basisu_transcoder.cpp +++ b/transcoder/basisu_transcoder.cpp @@ -11930,42 +11930,6 @@ namespace basist const uint8_t g_bc7_alpha_index_bitcount[8] = { 0, 0, 0, 0, 3, 2, 4, 2 }; - const endpoint_sel g_bc7_mode_6_optimal_endpoints[256][2] = // [c][pbit] - { - { { 0,0 }, { 0,0 } }, { { 0,1 }, { 0,0 } }, { { 0,3 }, { 0,1 } }, { { 0,4 }, { 0,3 } }, { { 0,6 }, { 0,4 } }, { { 0,7 }, { 0,6 } }, { { 0,9 }, { 0,7 } }, { { 0,10 }, { 0,9 } }, - { { 0,12 }, { 0,10 } }, { { 0,13 }, { 0,12 } }, { { 0,15 }, { 0,13 } }, { { 0,16 }, { 0,15 } }, { { 0,18 }, { 0,16 } }, { { 0,20 }, { 0,18 } }, { { 0,21 }, { 0,20 } }, { { 0,23 }, { 0,21 } }, - { { 0,24 }, { 0,23 } }, { { 0,26 }, { 0,24 } }, { { 0,27 }, { 0,26 } }, { { 0,29 }, { 0,27 } }, { { 0,30 }, { 0,29 } }, { { 0,32 }, { 0,30 } }, { { 0,33 }, { 0,32 } }, { { 0,35 }, { 0,33 } }, - { { 0,36 }, { 0,35 } }, { { 0,38 }, { 0,36 } }, { { 0,39 }, { 0,38 } }, { { 0,41 }, { 0,39 } }, { { 0,42 }, { 0,41 } }, { { 0,44 }, { 0,42 } }, { { 0,45 }, { 0,44 } }, { { 0,47 }, { 0,45 } }, - { { 0,48 }, { 0,47 } }, { { 0,50 }, { 0,48 } }, { { 0,52 }, { 0,50 } }, { { 0,53 }, { 0,52 } }, { { 0,55 }, { 0,53 } }, { { 0,56 }, { 0,55 } }, { { 0,58 }, { 0,56 } }, { { 0,59 }, { 0,58 } }, - { { 0,61 }, { 0,59 } }, { { 0,62 }, { 0,61 } }, { { 0,64 }, { 0,62 } }, { { 0,65 }, { 0,64 } }, { { 0,67 }, { 0,65 } }, { { 0,68 }, { 0,67 } }, { { 0,70 }, { 0,68 } }, { { 0,71 }, { 0,70 } }, - { { 0,73 }, { 0,71 } }, { { 0,74 }, { 0,73 } }, { { 0,76 }, { 0,74 } }, { { 0,77 }, { 0,76 } }, { { 0,79 }, { 0,77 } }, { { 0,80 }, { 0,79 } }, { { 0,82 }, { 0,80 } }, { { 0,84 }, { 0,82 } }, - { { 0,85 }, { 0,84 } }, { { 0,87 }, { 0,85 } }, { { 0,88 }, { 0,87 } }, { { 0,90 }, { 0,88 } }, { { 0,91 }, { 0,90 } }, { { 0,93 }, { 0,91 } }, { { 0,94 }, { 0,93 } }, { { 0,96 }, { 0,94 } }, - { { 0,97 }, { 0,96 } }, { { 0,99 }, { 0,97 } }, { { 0,100 }, { 0,99 } }, { { 0,102 }, { 0,100 } }, { { 0,103 }, { 0,102 } }, { { 0,105 }, { 0,103 } }, { { 0,106 }, { 0,105 } }, { { 0,108 }, { 0,106 } }, - { { 0,109 }, { 0,108 } }, { { 0,111 }, { 0,109 } }, { { 0,112 }, { 0,111 } }, { { 0,114 }, { 0,112 } }, { { 0,116 }, { 0,114 } }, { { 0,117 }, { 0,116 } }, { { 0,119 }, { 0,117 } }, { { 0,120 }, { 0,119 } }, - { { 0,122 }, { 0,120 } }, { { 0,123 }, { 0,122 } }, { { 0,125 }, { 0,123 } }, { { 0,126 }, { 0,125 } }, { { 1,126 }, { 0,126 } }, { { 1,127 }, { 1,126 } }, { { 2,127 }, { 1,127 } }, { { 3,126 }, { 2,127 } }, - { { 4,126 }, { 3,126 } }, { { 4,127 }, { 4,126 } }, { { 5,127 }, { 4,127 } }, { { 6,126 }, { 5,127 } }, { { 7,126 }, { 6,126 } }, { { 7,127 }, { 7,126 } }, { { 8,127 }, { 7,127 } }, { { 9,126 }, { 8,127 } }, - { { 10,126 }, { 9,126 } }, { { 10,127 }, { 10,126 } }, { { 11,127 }, { 10,127 } }, { { 12,126 }, { 11,127 } }, { { 13,125 }, { 12,126 } }, { { 13,127 }, { 13,125 } }, { { 14,126 }, { 13,127 } }, { { 15,126 }, { 14,126 } }, - { { 15,127 }, { 15,126 } }, { { 16,127 }, { 15,127 } }, { { 17,126 }, { 16,127 } }, { { 18,126 }, { 17,126 } }, { { 18,127 }, { 18,126 } }, { { 19,127 }, { 18,127 } }, { { 20,126 }, { 19,127 } }, { { 21,126 }, { 20,126 } }, - { { 21,127 }, { 21,126 } }, { { 22,127 }, { 21,127 } }, { { 23,126 }, { 22,127 } }, { { 24,126 }, { 23,126 } }, { { 24,127 }, { 24,126 } }, { { 25,127 }, { 24,127 } }, { { 26,126 }, { 25,127 } }, { { 27,126 }, { 26,126 } }, - { { 27,127 }, { 27,126 } }, { { 28,127 }, { 27,127 } }, { { 29,126 }, { 28,127 } }, { { 30,126 }, { 29,126 } }, { { 30,127 }, { 30,126 } }, { { 31,127 }, { 30,127 } }, { { 32,126 }, { 31,127 } }, { { 33,126 }, { 32,126 } }, - { { 33,127 }, { 33,126 } }, { { 34,127 }, { 33,127 } }, { { 35,126 }, { 34,127 } }, { { 36,126 }, { 35,126 } }, { { 36,127 }, { 36,126 } }, { { 37,127 }, { 36,127 } }, { { 38,126 }, { 37,127 } }, { { 39,126 }, { 38,126 } }, - { { 39,127 }, { 39,126 } }, { { 40,127 }, { 39,127 } }, { { 41,126 }, { 40,127 } }, { { 42,126 }, { 41,126 } }, { { 42,127 }, { 42,126 } }, { { 43,127 }, { 42,127 } }, { { 44,126 }, { 43,127 } }, { { 45,125 }, { 44,126 } }, - { { 45,127 }, { 45,125 } }, { { 46,126 }, { 45,127 } }, { { 47,126 }, { 46,126 } }, { { 47,127 }, { 47,126 } }, { { 48,127 }, { 47,127 } }, { { 49,126 }, { 48,127 } }, { { 50,126 }, { 49,126 } }, { { 50,127 }, { 50,126 } }, - { { 51,127 }, { 50,127 } }, { { 52,126 }, { 51,127 } }, { { 53,126 }, { 52,126 } }, { { 53,127 }, { 53,126 } }, { { 54,127 }, { 53,127 } }, { { 55,126 }, { 54,127 } }, { { 56,126 }, { 55,126 } }, { { 56,127 }, { 56,126 } }, - { { 57,127 }, { 56,127 } }, { { 58,126 }, { 57,127 } }, { { 59,126 }, { 58,126 } }, { { 59,127 }, { 59,126 } }, { { 60,127 }, { 59,127 } }, { { 61,126 }, { 60,127 } }, { { 62,126 }, { 61,126 } }, { { 62,127 }, { 62,126 } }, - { { 63,127 }, { 62,127 } }, { { 64,126 }, { 63,127 } }, { { 65,126 }, { 64,126 } }, { { 65,127 }, { 65,126 } }, { { 66,127 }, { 65,127 } }, { { 67,126 }, { 66,127 } }, { { 68,126 }, { 67,126 } }, { { 68,127 }, { 68,126 } }, - { { 69,127 }, { 68,127 } }, { { 70,126 }, { 69,127 } }, { { 71,126 }, { 70,126 } }, { { 71,127 }, { 71,126 } }, { { 72,127 }, { 71,127 } }, { { 73,126 }, { 72,127 } }, { { 74,126 }, { 73,126 } }, { { 74,127 }, { 74,126 } }, - { { 75,127 }, { 74,127 } }, { { 76,126 }, { 75,127 } }, { { 77,125 }, { 76,126 } }, { { 77,127 }, { 77,125 } }, { { 78,126 }, { 77,127 } }, { { 79,126 }, { 78,126 } }, { { 79,127 }, { 79,126 } }, { { 80,127 }, { 79,127 } }, - { { 81,126 }, { 80,127 } }, { { 82,126 }, { 81,126 } }, { { 82,127 }, { 82,126 } }, { { 83,127 }, { 82,127 } }, { { 84,126 }, { 83,127 } }, { { 85,126 }, { 84,126 } }, { { 85,127 }, { 85,126 } }, { { 86,127 }, { 85,127 } }, - { { 87,126 }, { 86,127 } }, { { 88,126 }, { 87,126 } }, { { 88,127 }, { 88,126 } }, { { 89,127 }, { 88,127 } }, { { 90,126 }, { 89,127 } }, { { 91,126 }, { 90,126 } }, { { 91,127 }, { 91,126 } }, { { 92,127 }, { 91,127 } }, - { { 93,126 }, { 92,127 } }, { { 94,126 }, { 93,126 } }, { { 94,127 }, { 94,126 } }, { { 95,127 }, { 94,127 } }, { { 96,126 }, { 95,127 } }, { { 97,126 }, { 96,126 } }, { { 97,127 }, { 97,126 } }, { { 98,127 }, { 97,127 } }, - { { 99,126 }, { 98,127 } }, { { 100,126 }, { 99,126 } }, { { 100,127 }, { 100,126 } }, { { 101,127 }, { 100,127 } }, { { 102,126 }, { 101,127 } }, { { 103,126 }, { 102,126 } }, { { 103,127 }, { 103,126 } }, { { 104,127 }, { 103,127 } }, - { { 105,126 }, { 104,127 } }, { { 106,126 }, { 105,126 } }, { { 106,127 }, { 106,126 } }, { { 107,127 }, { 106,127 } }, { { 108,126 }, { 107,127 } }, { { 109,125 }, { 108,126 } }, { { 109,127 }, { 109,125 } }, { { 110,126 }, { 109,127 } }, - { { 111,126 }, { 110,126 } }, { { 111,127 }, { 111,126 } }, { { 112,127 }, { 111,127 } }, { { 113,126 }, { 112,127 } }, { { 114,126 }, { 113,126 } }, { { 114,127 }, { 114,126 } }, { { 115,127 }, { 114,127 } }, { { 116,126 }, { 115,127 } }, - { { 117,126 }, { 116,126 } }, { { 117,127 }, { 117,126 } }, { { 118,127 }, { 117,127 } }, { { 119,126 }, { 118,127 } }, { { 120,126 }, { 119,126 } }, { { 120,127 }, { 120,126 } }, { { 121,127 }, { 120,127 } }, { { 122,126 }, { 121,127 } }, - { { 123,126 }, { 122,126 } }, { { 123,127 }, { 123,126 } }, { { 124,127 }, { 123,127 } }, { { 125,126 }, { 124,127 } }, { { 126,126 }, { 125,126 } }, { { 126,127 }, { 126,126 } }, { { 127,127 }, { 126,127 } }, { { 127,127 }, { 127,127 } }, - }; - const endpoint_sel g_bc7_mode_5_optimal_endpoints[256] = // [c] { { 0,0 }, { 0,1 }, { 0,3 }, { 0,4 }, { 0,6 }, { 0,7 }, { 0,9 }, { 0,10 }, { 0,12 }, { 0,13 }, { 0,15 }, { 0,16 }, { 0,18 }, { 0,20 }, { 0,21 }, { 0,23 }, @@ -13753,49 +13717,23 @@ namespace basist } case UASTC_MODE_INDEX_SOLID_COLOR: { - // Void-Extent: Solid Color RGBA (BC7 MODE5 or MODE6) + // Void-Extent: Solid Color RGBA (BC7 MODE5) const color32& solid_color = unpacked_src_blk.m_solid_color; - // mode 6 with pbit 0 encodes every value except for 255 perfectly - // mode 6 with pbit 1 encodes every value except for 0 perfectly - uint32_t best_err0 = (solid_color.r == 255) + (solid_color.g == 255) + (solid_color.b == 255) + (solid_color.a == 255); - uint32_t best_err1 = (solid_color.r == 0) + (solid_color.g == 0) + (solid_color.b == 0) + (solid_color.a == 0); + dst_blk.m_mode = 5; - if (best_err0 > 0 && best_err1 > 0) + for (uint32_t c = 0; c < 3; c++) { - dst_blk.m_mode = 5; - - for (uint32_t c = 0; c < 3; c++) - { - dst_blk.m_low[0].m_c[c] = g_bc7_mode_5_optimal_endpoints[solid_color.c[c]].m_lo; - dst_blk.m_high[0].m_c[c] = g_bc7_mode_5_optimal_endpoints[solid_color.c[c]].m_hi; - } - - memset(dst_blk.m_selectors, BC7ENC_MODE_5_OPTIMAL_INDEX, 16); - - dst_blk.m_low[0].m_c[3] = solid_color.c[3]; - dst_blk.m_high[0].m_c[3] = solid_color.c[3]; - - //memset(dst_blk.m_alpha_selectors, 0, 16); + dst_blk.m_low[0].m_c[c] = g_bc7_mode_5_optimal_endpoints[solid_color.c[c]].m_lo; + dst_blk.m_high[0].m_c[c] = g_bc7_mode_5_optimal_endpoints[solid_color.c[c]].m_hi; } - else - { - dst_blk.m_mode = 6; - uint32_t best_p = 0; - if (best_err1 < best_err0) - best_p = 1; + memset(dst_blk.m_selectors, BC7ENC_MODE_5_OPTIMAL_INDEX, 16); - for (uint32_t c = 0; c < 4; c++) - { - dst_blk.m_low[0].m_c[c] = g_bc7_mode_6_optimal_endpoints[solid_color.c[c]][best_p].m_lo; - dst_blk.m_high[0].m_c[c] = g_bc7_mode_6_optimal_endpoints[solid_color.c[c]][best_p].m_hi; - } + dst_blk.m_low[0].m_c[3] = solid_color.c[3]; + dst_blk.m_high[0].m_c[3] = solid_color.c[3]; - dst_blk.m_pbits[0][0] = best_p; - dst_blk.m_pbits[0][1] = best_p; - memset(dst_blk.m_selectors, BC7ENC_MODE_6_OPTIMAL_INDEX, 16); - } + //memset(dst_blk.m_alpha_selectors, 0, 16); break; } @@ -17013,53 +16951,13 @@ namespace basist } // i } - // BC7 mode 5 & 6 tables are precomputed - // Note: mode 5 errors are 0 for all values; mode 6 errors are 0 for all values except for 0 (error 1 for pbit 1) and 255 (error 1 for pbit 0) + // BC7 mode 5 table is precomputed #if 0 - struct endpoint_err - { - uint16_t m_error; uint8_t m_lo; uint8_t m_hi; - }; - - // TODO: Precompute? - // BC7 777.1 - for (int c = 0; c < 256; c++) - { - for (uint32_t lp = 0; lp < 2; lp++) - { - endpoint_err best; - best.m_error = (uint16_t)UINT16_MAX; - - for (uint32_t l = 0; l < 128; l++) - { - const uint32_t low = (l << 1) | lp; - - for (uint32_t h = 0; h < 128; h++) - { - const uint32_t high = (h << 1) | lp; - - const int k = (low * (64 - g_bc7_weights4[BC7ENC_MODE_6_OPTIMAL_INDEX]) + high * g_bc7_weights4[BC7ENC_MODE_6_OPTIMAL_INDEX] + 32) >> 6; - - const int err = (k - c) * (k - c); - if (err < best.m_error) - { - best.m_error = (uint16_t)err; - best.m_lo = (uint8_t)l; - best.m_hi = (uint8_t)h; - } - } // h - } // l - - g_bc7_mode_6_optimal_endpoints[c][lp] = best; - } // lp - - } // c - // BC7 777 for (int c = 0; c < 256; c++) { - endpoint_err best; - best.m_error = (uint16_t)UINT16_MAX; + endpoint_sel best = {}; + uint16_t best_error = (uint16_t)UINT16_MAX; for (uint32_t l = 0; l < 128; l++) { @@ -17072,9 +16970,9 @@ namespace basist const int k = (low * (64 - g_bc7_weights2[BC7ENC_MODE_5_OPTIMAL_INDEX]) + high * g_bc7_weights2[BC7ENC_MODE_5_OPTIMAL_INDEX] + 32) >> 6; const int err = (k - c) * (k - c); - if (err < best.m_error) + if (err < best_error) { - best.m_error = (uint16_t)err; + best_error = (uint16_t)err; best.m_lo = (uint8_t)l; best.m_hi = (uint8_t)h; } diff --git a/transcoder/basisu_transcoder_uastc.h b/transcoder/basisu_transcoder_uastc.h index 7ca13344..63fdf523 100644 --- a/transcoder/basisu_transcoder_uastc.h +++ b/transcoder/basisu_transcoder_uastc.h @@ -181,9 +181,6 @@ namespace basist uint8_t m_lo; uint8_t m_hi; }; - extern const endpoint_sel g_bc7_mode_6_optimal_endpoints[256][2]; // [c][pbit] - const uint32_t BC7ENC_MODE_6_OPTIMAL_INDEX = 5; - extern const endpoint_sel g_bc7_mode_5_optimal_endpoints[256]; // [c] const uint32_t BC7ENC_MODE_5_OPTIMAL_INDEX = 1;