Add implementation for loading interchange texture formats with multiple runtime formats support
119 lines
5.0 KiB
C++
119 lines
5.0 KiB
C++
// File: basisu_astc_ldr_encode.cpp
|
|
#pragma once
|
|
#include "basisu_enc.h"
|
|
#include "../transcoder/basisu_astc_helpers.h"
|
|
|
|
namespace basisu {
|
|
namespace astc_ldr {
|
|
|
|
void encoder_init();
|
|
|
|
const int EFFORT_LEVEL_MIN = 0, EFFORT_LEVEL_MAX = 10, EFFORT_LEVEL_DEF = 3;
|
|
const int DCT_QUALITY_MIN = 1, DCT_QUALITY_MAX = 100;
|
|
|
|
struct astc_ldr_encode_config
|
|
{
|
|
astc_ldr_encode_config()
|
|
{
|
|
}
|
|
|
|
void clear()
|
|
{
|
|
*this = astc_ldr_encode_config();
|
|
}
|
|
|
|
// ASTC LDR block dimensions. Must be a valid ASTC block dimension. Any supported from 4x4-12x12, including unequal dimensions.
|
|
uint32_t m_astc_block_width = 6;
|
|
uint32_t m_astc_block_height = 6;
|
|
|
|
// If true, the encoder assumes all ASTC blocks will be decompressed using sRGB vs. LDR8 mode. This corresponds to astcenc's -cs vs. cl color profiles.
|
|
// This should match how the texture is later decoded by the GPU for maximum quality. This bit is stored into the output file.
|
|
bool m_astc_decode_mode_srgb = true;
|
|
|
|
// If true, trade off some compression (3-10%) for faster decompression.
|
|
// If false, favor highest compression, but slower decompression.
|
|
//bool m_use_faster_format = true;
|
|
|
|
basist::astc_ldr_t::xuastc_ldr_syntax m_compressed_syntax = basist::astc_ldr_t::xuastc_ldr_syntax::cFullArith;
|
|
|
|
// Encoder CPU effort vs. quality. [0,10], higher=better.
|
|
// 0=extremely fast but very brittle (no subsets)
|
|
// 1=first 2 subset effort level
|
|
// 10=extremely high CPU requirements.
|
|
uint32_t m_effort_level = 3;
|
|
|
|
// Weight grid DCT quality [1,100] - higher=better quality (JPEG-style).
|
|
float m_dct_quality = 85;
|
|
|
|
// true=use weight grid DCT, false=always use DPCM
|
|
bool m_use_dct = false;
|
|
|
|
// true=use lossy supercompression, false=supercompression stage is always lossless.
|
|
bool m_lossy_supercompression = false;
|
|
|
|
// Channel weights used to compute RGBA colorspace L2 errors. Must be >= 1.
|
|
uint32_t m_comp_weights[4] = { 1, 1, 1, 1 };
|
|
|
|
// Lossy supercompression stage parameters for RGB vs. RGBA image inputs.
|
|
// (Bounded RDO - explictly not Lagrangian.)
|
|
float m_replacement_min_psnr = 35.0f; // if the block's base PSNR is less than this, it cannot be changed
|
|
float m_psnr_trial_diff_thresh = 1.5f; // reject candidates if their PSNR is lower than m_replacement_min_psnr-m_psnr_trial_diff_thresh
|
|
float m_psnr_trial_diff_thresh_edge = 1.0f; // edge variant
|
|
|
|
// Lossy supercompression settings - alpha texture variants
|
|
float m_replacement_min_psnr_alpha = 38.0f;
|
|
float m_psnr_trial_diff_thresh_alpha = .75f;
|
|
float m_psnr_trial_diff_thresh_edge_alpha = .5f;
|
|
|
|
// If true, try encoding blurred blocks, in addition to unblurred, for superpass 1 and 2.
|
|
// Higher quality, but massively slower and not yet tuned/refined.
|
|
bool m_block_blurring_p1 = false, m_block_blurring_p2 = false;
|
|
|
|
// If true, no matter what effort level subset usage will be disabled.
|
|
bool m_force_disable_subsets = false;
|
|
|
|
// If true, no matter what effort level RGB dual plane usage will be disabled.
|
|
bool m_force_disable_rgb_dual_plane = false;
|
|
|
|
bool m_debug_images = false;
|
|
bool m_debug_output = false;
|
|
|
|
std::string m_debug_file_prefix;
|
|
|
|
void debug_print() const
|
|
{
|
|
fmt_debug_printf("ASTC block dimensions: {}x{}\n", m_astc_block_width, m_astc_block_height);
|
|
fmt_debug_printf("ASTC decode profile mode sRGB: {}\n", m_astc_decode_mode_srgb);
|
|
fmt_debug_printf("Syntax: {}\n", (uint32_t)m_compressed_syntax);
|
|
fmt_debug_printf("Effort level: {}\n", m_effort_level);
|
|
fmt_debug_printf("Use DCT: {}\n", m_use_dct);
|
|
fmt_debug_printf("DCT quality level (1-100): {}\n", m_dct_quality);
|
|
fmt_debug_printf("Comp weights: {} {} {} {}\n", m_comp_weights[0], m_comp_weights[1], m_comp_weights[2], m_comp_weights[3]);
|
|
fmt_debug_printf("Block blurring: {} {}\n", m_block_blurring_p1, m_block_blurring_p2);
|
|
fmt_debug_printf("Force disable subsets: {}\n", m_force_disable_subsets);
|
|
fmt_debug_printf("Force disable RGB dual plane: {}\n", m_force_disable_rgb_dual_plane);
|
|
|
|
fmt_debug_printf("\nLossy supercompression: {}\n", m_lossy_supercompression);
|
|
fmt_debug_printf("m_replacement_min_psnr: {}\n", m_replacement_min_psnr);
|
|
fmt_debug_printf("m_psnr_trial_diff_thresh: {}\n", m_psnr_trial_diff_thresh);
|
|
fmt_debug_printf("m_psnr_trial_diff_thresh_edge: {}\n", m_psnr_trial_diff_thresh_edge);
|
|
fmt_debug_printf("m_replacement_min_psnr_alpha: {}\n", m_replacement_min_psnr_alpha);
|
|
fmt_debug_printf("m_psnr_trial_diff_thresh_alpha: {}\n", m_psnr_trial_diff_thresh_alpha);
|
|
fmt_debug_printf("m_psnr_trial_diff_thresh_edge_alpha: {}\n", m_psnr_trial_diff_thresh_edge_alpha);
|
|
|
|
fmt_debug_printf("m_debug_images: {}\n", m_debug_images);
|
|
}
|
|
};
|
|
|
|
bool compress_image(
|
|
const image& orig_img, uint8_vec &comp_data, vector2D<astc_helpers::log_astc_block>& coded_blocks,
|
|
const astc_ldr_encode_config& global_cfg,
|
|
job_pool& job_pool);
|
|
|
|
void deblock_filter(uint32_t filter_block_width, uint32_t filter_block_height, const image& src_img, image& dst_img, bool stronger_filtering = false, int SKIP_THRESH = 24);
|
|
|
|
} // namespace astc_ldr
|
|
} // namespace basisu
|
|
|
|
|