From 3050ca4a709a3a6625cc29b49ab276b6436fdf9e Mon Sep 17 00:00:00 2001 From: Rich Geldreich Date: Wed, 29 May 2019 12:11:48 -0700 Subject: [PATCH] Optimizing basisu_frontend::init_endpoint_training_vectors() so it doesn't go recompute the ETC1S block basecolor/inten tables again. We already do this in basisu_frontend::init_etc1_images(). This change should not change the output files in any way. --- basisu_etc.h | 26 +++++++++++++++++ basisu_frontend.cpp | 68 ++++++++++++++++++--------------------------- 2 files changed, 53 insertions(+), 41 deletions(-) diff --git a/basisu_etc.h b/basisu_etc.h index fe08e62..9e4a104 100644 --- a/basisu_etc.h +++ b/basisu_etc.h @@ -470,6 +470,32 @@ namespace basisu return dc; } + bool get_block_low_high_colors(color_rgba* pBlock_colors, uint32_t subblock_index) const + { + color_rgba b; + + if (get_diff_bit()) + { + if (subblock_index) + unpack_color5(b, get_base5_color(), get_delta3_color(), true); + else + unpack_color5(b, get_base5_color(), true); + } + else + { + b = unpack_color4(get_base4_color(subblock_index), true); + } + + const int* pInten_table = g_etc1_inten_tables[get_inten_table(subblock_index)]; + + bool dc = false; + + pBlock_colors[0].set(clamp255(b.r + pInten_table[0], dc), clamp255(b.g + pInten_table[0], dc), clamp255(b.b + pInten_table[0], dc), 255); + pBlock_colors[1].set(clamp255(b.r + pInten_table[3], dc), clamp255(b.g + pInten_table[3], dc), clamp255(b.b + pInten_table[3], dc), 255); + + return dc; + } + static void get_block_colors5(color_rgba *pBlock_colors, const color_rgba &base_color5, uint32_t inten_table, bool scaled = false) { color_rgba b(base_color5); diff --git a/basisu_frontend.cpp b/basisu_frontend.cpp index e3b8729..6e225be 100644 --- a/basisu_frontend.cpp +++ b/basisu_frontend.cpp @@ -263,37 +263,12 @@ namespace basisu { const pixel_block &source_blk = get_source_pixel_block(block_index); - pack_etc1_block_context pack_context; - - basis_etc1_pack_params etc1_pack_params; - etc1_pack_params.m_perceptual = m_params.m_perceptual; - etc1_pack_params.m_force_etc1s = true; - etc1_pack_params.m_flip_bias = 0.0f; - - pack_etc1_block(m_etc1_blocks_etc1s[block_index], source_blk.get_ptr(), etc1_pack_params, pack_context, NULL); - assert(m_etc1_blocks_etc1s[block_index].get_flip_bit()); - - unpack_etc1(m_etc1_blocks_etc1s[block_index], m_etc1_blocks_etc1s_unpacked[block_index].get_ptr()); - } - } - - void basisu_frontend::init_endpoint_training_vectors() - { - debug_printf("init_endpoint_training_vectors\n"); - - std::vector training_vecs(m_total_blocks); - -#pragma omp parallel for - for (int block_index = 0; block_index < (int)m_total_blocks; block_index++) - { - const color_rgba *pSource_pixels = get_source_pixel_block(block_index).get_ptr(); - etc1_optimizer optimizer; etc1_optimizer::params optimizer_params; etc1_optimizer::results optimizer_results; optimizer_params.m_num_src_pixels = 16; - optimizer_params.m_pSrc_pixels = pSource_pixels; + optimizer_params.m_pSrc_pixels = source_blk.get_ptr(); optimizer_params.m_perceptual = m_params.m_perceptual; uint8_t selectors[16]; @@ -302,29 +277,40 @@ namespace basisu optimizer.init(optimizer_params, optimizer_results); optimizer.compute(); + + etc_block &blk = m_etc1_blocks_etc1s[block_index]; - color_rgba block_colors[4]; - etc_block::get_block_colors5(block_colors, optimizer_results.m_block_color_unscaled, optimizer_results.m_block_inten_table, false); + blk.set_block_color5_etc1s(optimizer_results.m_block_color_unscaled); + blk.set_inten_tables_etc1s(optimizer_results.m_block_inten_table); + blk.set_flip_bit(true); + + unpack_etc1(m_etc1_blocks_etc1s[block_index], m_etc1_blocks_etc1s_unpacked[block_index].get_ptr()); + } + } + + void basisu_frontend::init_endpoint_training_vectors() + { + debug_printf("init_endpoint_training_vectors\n"); + + for (int block_index = 0; block_index < (int)m_total_blocks; block_index++) + { + const etc_block &blk = m_etc1_blocks_etc1s[block_index]; + + color_rgba block_colors[2]; + blk.get_block_low_high_colors(block_colors, 0); vec6F v; v[0] = block_colors[0].r * (1.0f / 255.0f); v[1] = block_colors[0].g * (1.0f / 255.0f); v[2] = block_colors[0].b * (1.0f / 255.0f); - v[3] = block_colors[3].r * (1.0f / 255.0f); - v[4] = block_colors[3].g * (1.0f / 255.0f); - v[5] = block_colors[3].b * (1.0f / 255.0f); + v[3] = block_colors[1].r * (1.0f / 255.0f); + v[4] = block_colors[1].g * (1.0f / 255.0f); + v[5] = block_colors[1].b * (1.0f / 255.0f); + + m_endpoint_clusterizer.add_training_vec(v, 1); + m_endpoint_clusterizer.add_training_vec(v, 1); - training_vecs[block_index] = v; - } // block_index - - for (int block_index = 0; block_index < (int)m_total_blocks; block_index++) - { - const vec6F &v = training_vecs[block_index]; - - m_endpoint_clusterizer.add_training_vec(v, 1); - m_endpoint_clusterizer.add_training_vec(v, 1); - } } void basisu_frontend::generate_endpoint_clusters()