mirror of
https://github.com/BinomialLLC/basis_universal.git
synced 2026-10-25 10:20:54 +00:00
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.
This commit is contained in:
26
basisu_etc.h
26
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);
|
||||
|
||||
@@ -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<vec6F> 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()
|
||||
|
||||
Reference in New Issue
Block a user