// SPDX-License-Identifier: Apache-2.0 // ---------------------------------------------------------------------------- // Copyright 2011-2024 Arm Limited // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy // of the License at: // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations // under the License. // ---------------------------------------------------------------------------- /** * @brief Functions for the library entrypoint. */ #include <array> #include <cstring> #include <new> #include "astcenc.h" #include "astcenc_internal_entry.h" #include "astcenc_diagnostic_trace.h" /** * @brief Record of the quality tuning parameter values. * * See the @c astcenc_config structure for detailed parameter documentation. * * Note that the mse_overshoot entries are scaling factors relative to the base MSE to hit db_limit. * A 20% overshoot is harder to hit for a higher base db_limit, so we may actually use lower ratios * for the more through search presets because the underlying db_limit is so much higher. */ struct astcenc_preset_config { … }; /** * @brief The static presets for high bandwidth encodings (x < 25 texels per block). */ static const std::array<astcenc_preset_config, 6> preset_configs_high { … }; /** * @brief The static presets for medium bandwidth encodings (25 <= x < 64 texels per block). */ static const std::array<astcenc_preset_config, 6> preset_configs_mid { … }; /** * @brief The static presets for low bandwidth encodings (64 <= x texels per block). */ static const std::array<astcenc_preset_config, 6> preset_configs_low { … }; /** * @brief Validate CPU floating point meets assumptions made in the codec. * * The codec is written with the assumption that a float threaded through the @c if32 union will be * stored and reloaded as a 32-bit IEEE-754 float with round-to-nearest rounding. This is always the * case in an IEEE-754 compliant system, however not every system or compilation mode is actually * IEEE-754 compliant. This normally fails if the code is compiled with fast math enabled. * * @return Return @c ASTCENC_SUCCESS if validated, otherwise an error on failure. */ static astcenc_error validate_cpu_float() { … } /** * @brief Validate config profile. * * @param profile The profile to check. * * @return Return @c ASTCENC_SUCCESS if validated, otherwise an error on failure. */ static astcenc_error validate_profile( astcenc_profile profile ) { … } /** * @brief Validate block size. * * @param block_x The block x dimensions. * @param block_y The block y dimensions. * @param block_z The block z dimensions. * * @return Return @c ASTCENC_SUCCESS if validated, otherwise an error on failure. */ static astcenc_error validate_block_size( unsigned int block_x, unsigned int block_y, unsigned int block_z ) { … } /** * @brief Validate flags. * * @param profile The profile to check. * @param flags The flags to check. * * @return Return @c ASTCENC_SUCCESS if validated, otherwise an error on failure. */ static astcenc_error validate_flags( astcenc_profile profile, unsigned int flags ) { … } #if !defined(ASTCENC_DECOMPRESS_ONLY) /** * @brief Validate single channel compression swizzle. * * @param swizzle The swizzle to check. * * @return Return @c ASTCENC_SUCCESS if validated, otherwise an error on failure. */ static astcenc_error validate_compression_swz( astcenc_swz swizzle ) { … } /** * @brief Validate overall compression swizzle. * * @param swizzle The swizzle to check. * * @return Return @c ASTCENC_SUCCESS if validated, otherwise an error on failure. */ static astcenc_error validate_compression_swizzle( const astcenc_swizzle& swizzle ) { … } #endif /** * @brief Validate single channel decompression swizzle. * * @param swizzle The swizzle to check. * * @return Return @c ASTCENC_SUCCESS if validated, otherwise an error on failure. */ static astcenc_error validate_decompression_swz( astcenc_swz swizzle ) { … } /** * @brief Validate overall decompression swizzle. * * @param swizzle The swizzle to check. * * @return Return @c ASTCENC_SUCCESS if validated, otherwise an error on failure. */ static astcenc_error validate_decompression_swizzle( const astcenc_swizzle& swizzle ) { … } /** * Validate that an incoming configuration is in-spec. * * This function can respond in two ways: * * * Numerical inputs that have valid ranges are clamped to those valid ranges. No error is thrown * for out-of-range inputs in this case. * * Numerical inputs and logic inputs are are logically invalid and which make no sense * algorithmically will return an error. * * @param[in,out] config The input compressor configuration. * * @return Return @c ASTCENC_SUCCESS if validated, otherwise an error on failure. */ static astcenc_error validate_config( astcenc_config &config ) { … } /* See header for documentation. */ astcenc_error astcenc_config_init( astcenc_profile profile, unsigned int block_x, unsigned int block_y, unsigned int block_z, float quality, unsigned int flags, astcenc_config* configp ) { … } /* See header for documentation. */ astcenc_error astcenc_context_alloc( const astcenc_config* configp, unsigned int thread_count, astcenc_context** context ) { … } /* See header dor documentation. */ void astcenc_context_free( astcenc_context* ctxo ) { … } #if !defined(ASTCENC_DECOMPRESS_ONLY) /** * @brief Compress an image, after any preflight has completed. * * @param[out] ctxo The compressor context. * @param thread_index The thread index. * @param image The intput image. * @param swizzle The input swizzle. * @param[out] buffer The output array for the compressed data. */ static void compress_image( astcenc_context& ctxo, unsigned int thread_index, const astcenc_image& image, const astcenc_swizzle& swizzle, uint8_t* buffer ) { … } /** * @brief Compute regional averages in an image. * * This function can be called by multiple threads, but only after a single * thread calls the setup function @c init_compute_averages(). * * Results are written back into @c img->input_alpha_averages. * * @param[out] ctx The context. * @param ag The average and variance arguments created during setup. */ static void compute_averages( astcenc_context& ctx, const avg_args &ag ) { … } #endif /* See header for documentation. */ astcenc_error astcenc_compress_image( astcenc_context* ctxo, astcenc_image* imagep, const astcenc_swizzle* swizzle, uint8_t* data_out, size_t data_len, unsigned int thread_index ) { … } /* See header for documentation. */ astcenc_error astcenc_compress_reset( astcenc_context* ctxo ) { … } /* See header for documentation. */ astcenc_error astcenc_decompress_image( astcenc_context* ctxo, const uint8_t* data, size_t data_len, astcenc_image* image_outp, const astcenc_swizzle* swizzle, unsigned int thread_index ) { … } /* See header for documentation. */ astcenc_error astcenc_decompress_reset( astcenc_context* ctxo ) { … } /* See header for documentation. */ astcenc_error astcenc_get_block_info( astcenc_context* ctxo, const uint8_t data[16], astcenc_block_info* info ) { … } /* See header for documentation. */ const char* astcenc_get_error_string( astcenc_error status ) { … }