377 lines
10 KiB
C
377 lines
10 KiB
C
|
|
// SPDX-License-Identifier: Apache-2.0
|
||
|
|
// ----------------------------------------------------------------------------
|
||
|
|
// Copyright 2011-2021 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 and data declarations.
|
||
|
|
*/
|
||
|
|
|
||
|
|
#ifndef ASTCENCCLI_INTERNAL_INCLUDED
|
||
|
|
#define ASTCENCCLI_INTERNAL_INCLUDED
|
||
|
|
|
||
|
|
#include <cstddef>
|
||
|
|
#include <cstdint>
|
||
|
|
#include <cstdio>
|
||
|
|
#include <cstdlib>
|
||
|
|
|
||
|
|
#include "astcenc.h"
|
||
|
|
#include "astcenc_mathlib.h"
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief The payload stored in a compressed ASTC image.
|
||
|
|
*/
|
||
|
|
struct astc_compressed_image
|
||
|
|
{
|
||
|
|
/** @brief The block width in texels. */
|
||
|
|
unsigned int block_x;
|
||
|
|
|
||
|
|
/** @brief The block height in texels. */
|
||
|
|
unsigned int block_y;
|
||
|
|
|
||
|
|
/** @brief The block depth in texels. */
|
||
|
|
unsigned int block_z;
|
||
|
|
|
||
|
|
/** @brief The image width in texels. */
|
||
|
|
unsigned int dim_x;
|
||
|
|
|
||
|
|
/** @brief The image height in texels. */
|
||
|
|
unsigned int dim_y;
|
||
|
|
|
||
|
|
/** @brief The image depth in texels. */
|
||
|
|
unsigned int dim_z;
|
||
|
|
|
||
|
|
/** @brief The binary data payload. */
|
||
|
|
uint8_t* data;
|
||
|
|
|
||
|
|
/** @brief The binary data length in bytes. */
|
||
|
|
size_t data_len;
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Config options that have been read from command line.
|
||
|
|
*/
|
||
|
|
struct cli_config_options
|
||
|
|
{
|
||
|
|
/** @brief The number of threads to use for processing. */
|
||
|
|
unsigned int thread_count;
|
||
|
|
|
||
|
|
/** @brief The number of repeats to execute for benchmarking. */
|
||
|
|
unsigned int repeat_count;
|
||
|
|
|
||
|
|
/** @brief The number of image slices to load for a 3D image. */
|
||
|
|
unsigned int array_size;
|
||
|
|
|
||
|
|
/** @brief @c true if running in silent mode with minimal output. */
|
||
|
|
bool silentmode;
|
||
|
|
|
||
|
|
/** @brief @c true if the images should be y-flipped. */
|
||
|
|
bool y_flip;
|
||
|
|
|
||
|
|
/** @brief @c true if diagnostic images should be stored. */
|
||
|
|
bool diagnostic_images;
|
||
|
|
|
||
|
|
/** @brief The low exposure fstop for error computation. */
|
||
|
|
int low_fstop;
|
||
|
|
|
||
|
|
/** @brief The high exposure fstop for error computation. */
|
||
|
|
int high_fstop;
|
||
|
|
|
||
|
|
/** @brief The pre-encode swizzle. */
|
||
|
|
astcenc_swizzle swz_encode;
|
||
|
|
|
||
|
|
/** @brief The post-decode swizzle. */
|
||
|
|
astcenc_swizzle swz_decode;
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Load uncompressed image.
|
||
|
|
*
|
||
|
|
* @param filename The file path on disk.
|
||
|
|
* @param y_flip Should this image be Y flipped?
|
||
|
|
* @param[out] is_hdr Is the loaded image HDR?
|
||
|
|
* @param[out] component_count The number of components in the loaded image.
|
||
|
|
*
|
||
|
|
* @return The astc image file, or nullptr on error.
|
||
|
|
*/
|
||
|
|
astcenc_image* load_ncimage(
|
||
|
|
const char* filename,
|
||
|
|
bool y_flip,
|
||
|
|
bool& is_hdr,
|
||
|
|
unsigned int& component_count);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Load uncompressed PNG image.
|
||
|
|
*
|
||
|
|
* @param filename The file path on disk.
|
||
|
|
* @param y_flip Should this image be Y flipped?
|
||
|
|
* @param[out] is_hdr Is the loaded image HDR?
|
||
|
|
* @param[out] component_count The number of components in the loaded image.
|
||
|
|
*
|
||
|
|
* @return The astc image file, or nullptr on error.
|
||
|
|
*/
|
||
|
|
astcenc_image* load_png_with_wuffs(
|
||
|
|
const char* filename,
|
||
|
|
bool y_flip,
|
||
|
|
bool& is_hdr,
|
||
|
|
unsigned int& component_count);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Save an uncompressed image.
|
||
|
|
*
|
||
|
|
* @param img The source data for the image.
|
||
|
|
* @param filename The name of the file to save.
|
||
|
|
* @param y_flip Should the image be vertically flipped?
|
||
|
|
*
|
||
|
|
* @return @c true if the image saved OK, @c false on error.
|
||
|
|
*/
|
||
|
|
bool store_ncimage(
|
||
|
|
const astcenc_image* img,
|
||
|
|
const char* filename,
|
||
|
|
int y_flip);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Check if the output file type requires a specific bitness.
|
||
|
|
*
|
||
|
|
* @param filename The file name, containing hte extension to check.
|
||
|
|
*
|
||
|
|
* @return Valid values are:
|
||
|
|
* * -1 - error - unknown file type.
|
||
|
|
* * 0 - no enforced bitness.
|
||
|
|
* * 8 - enforced 8-bit UNORM.
|
||
|
|
* * 16 - enforced 16-bit FP16.
|
||
|
|
*/
|
||
|
|
int get_output_filename_enforced_bitness(
|
||
|
|
const char* filename);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Allocate a new image in a canonical format.
|
||
|
|
*
|
||
|
|
* Allocated images must be freed with a @c free_image() call.
|
||
|
|
*
|
||
|
|
* @param bitness The number of bits per component (8, 16, or 32).
|
||
|
|
* @param dim_x The width of the image, in texels.
|
||
|
|
* @param dim_y The height of the image, in texels.
|
||
|
|
* @param dim_z The depth of the image, in texels.
|
||
|
|
*
|
||
|
|
* @return The allocated image, or @c nullptr on error.
|
||
|
|
*/
|
||
|
|
astcenc_image* alloc_image(
|
||
|
|
unsigned int bitness,
|
||
|
|
unsigned int dim_x,
|
||
|
|
unsigned int dim_y,
|
||
|
|
unsigned int dim_z);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Free an image.
|
||
|
|
*
|
||
|
|
* @param img The image to free.
|
||
|
|
*/
|
||
|
|
void free_image(
|
||
|
|
astcenc_image* img);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Determine the number of active components in an image.
|
||
|
|
*
|
||
|
|
* @param img The image to analyze.
|
||
|
|
*
|
||
|
|
* @return The number of active components in the image.
|
||
|
|
*/
|
||
|
|
int determine_image_components(
|
||
|
|
const astcenc_image* img);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Load a compressed .astc image.
|
||
|
|
*
|
||
|
|
* @param filename The file to load.
|
||
|
|
* @param img The image to populate with loaded data.
|
||
|
|
*
|
||
|
|
* @return Non-zero on error, zero on success.
|
||
|
|
*/
|
||
|
|
int load_cimage(
|
||
|
|
const char* filename,
|
||
|
|
astc_compressed_image& img);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Store a compressed .astc image.
|
||
|
|
*
|
||
|
|
* @param img The image to store.
|
||
|
|
* @param filename The file to save.
|
||
|
|
*
|
||
|
|
* @return Non-zero on error, zero on success.
|
||
|
|
*/
|
||
|
|
int store_cimage(
|
||
|
|
const astc_compressed_image& img,
|
||
|
|
const char* filename);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Load a compressed .ktx image.
|
||
|
|
*
|
||
|
|
* @param filename The file to load.
|
||
|
|
* @param is_srgb Is this an sRGB encoded file?
|
||
|
|
* @param img The image to populate with loaded data.
|
||
|
|
*
|
||
|
|
* @return Non-zero on error, zero on success.
|
||
|
|
*/
|
||
|
|
bool load_ktx_compressed_image(
|
||
|
|
const char* filename,
|
||
|
|
bool& is_srgb,
|
||
|
|
astc_compressed_image& img) ;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Store a compressed .ktx image.
|
||
|
|
*
|
||
|
|
* @param img The image to store.
|
||
|
|
* @param filename The file to store.
|
||
|
|
* @param is_srgb Is this an sRGB encoded file?
|
||
|
|
*
|
||
|
|
* @return Non-zero on error, zero on success.
|
||
|
|
*/
|
||
|
|
bool store_ktx_compressed_image(
|
||
|
|
const astc_compressed_image& img,
|
||
|
|
const char* filename,
|
||
|
|
bool is_srgb);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Create an image from a 2D float data array.
|
||
|
|
*
|
||
|
|
* @param data The raw input data.
|
||
|
|
* @param dim_x The width of the image, in texels.
|
||
|
|
* @param dim_y The height of the image, in texels.
|
||
|
|
* @param y_flip Should this image be vertically flipped?
|
||
|
|
*
|
||
|
|
* @return The populated image.
|
||
|
|
*/
|
||
|
|
astcenc_image* astc_img_from_floatx4_array(
|
||
|
|
const float* data,
|
||
|
|
unsigned int dim_x,
|
||
|
|
unsigned int dim_y,
|
||
|
|
bool y_flip);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Create an image from a 2D byte data array.
|
||
|
|
*
|
||
|
|
* @param data The raw input data.
|
||
|
|
* @param dim_x The width of the image, in texels.
|
||
|
|
* @param dim_y The height of the image, in texels.
|
||
|
|
* @param y_flip Should this image be vertically flipped?
|
||
|
|
*
|
||
|
|
* @return The populated image.
|
||
|
|
*/
|
||
|
|
astcenc_image* astc_img_from_unorm8x4_array(
|
||
|
|
const uint8_t* data,
|
||
|
|
unsigned int dim_x,
|
||
|
|
unsigned int dim_y,
|
||
|
|
bool y_flip);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Create a flattened RGBA FLOAT32 data array from an image structure.
|
||
|
|
*
|
||
|
|
* The returned data array is allocated with @c new[] and must be freed with a @c delete[] call.
|
||
|
|
*
|
||
|
|
* @param img The input image.
|
||
|
|
* @param y_flip Should the data in the array be Y flipped?
|
||
|
|
*
|
||
|
|
* @return The data array.
|
||
|
|
*/
|
||
|
|
float* floatx4_array_from_astc_img(
|
||
|
|
const astcenc_image* img,
|
||
|
|
bool y_flip);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Create a flattened RGBA UNORM8 data array from an image structure.
|
||
|
|
*
|
||
|
|
* The returned data array is allocated with @c new[] and must be freed with a @c delete[] call.
|
||
|
|
*
|
||
|
|
* @param img The input image.
|
||
|
|
* @param y_flip Should the data in the array be Y flipped?
|
||
|
|
*
|
||
|
|
* @return The data array.
|
||
|
|
*/
|
||
|
|
uint8_t* unorm8x4_array_from_astc_img(
|
||
|
|
const astcenc_image* img,
|
||
|
|
bool y_flip);
|
||
|
|
|
||
|
|
/* ============================================================================
|
||
|
|
Functions for printing build info and help messages
|
||
|
|
============================================================================ */
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Print the tool copyright and version header to stdout.
|
||
|
|
*/
|
||
|
|
void astcenc_print_header();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Print the tool copyright, version, and short-form help to stdout.
|
||
|
|
*/
|
||
|
|
void astcenc_print_shorthelp();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Print the tool copyright, version, and long-form help to stdout.
|
||
|
|
*/
|
||
|
|
void astcenc_print_longhelp();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Compute error metrics comparing two images.
|
||
|
|
*
|
||
|
|
* @param compute_hdr_metrics True if HDR metrics should be computed.
|
||
|
|
* @param compute_normal_metrics True if normal map metrics should be computed.
|
||
|
|
* @param input_components The number of input color components.
|
||
|
|
* @param img1 The original image.
|
||
|
|
* @param img2 The compressed image.
|
||
|
|
* @param fstop_lo The low exposure fstop (HDR only).
|
||
|
|
* @param fstop_hi The high exposure fstop (HDR only).
|
||
|
|
*/
|
||
|
|
void compute_error_metrics(
|
||
|
|
bool compute_hdr_metrics,
|
||
|
|
bool compute_normal_metrics,
|
||
|
|
int input_components,
|
||
|
|
const astcenc_image* img1,
|
||
|
|
const astcenc_image* img2,
|
||
|
|
int fstop_lo,
|
||
|
|
int fstop_hi);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Get the current time.
|
||
|
|
*
|
||
|
|
* @return The current time in seconds since arbitrary epoch.
|
||
|
|
*/
|
||
|
|
double get_time();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Get the number of CPU cores.
|
||
|
|
*
|
||
|
|
* @return The number of online or onlineable CPU cores in the system.
|
||
|
|
*/
|
||
|
|
int get_cpu_count();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Launch N worker threads and wait for them to complete.
|
||
|
|
*
|
||
|
|
* All threads run the same thread function, and have the same thread payload, but are given a
|
||
|
|
* unique thread ID (0 .. N-1) as a parameter to the run function to allow thread-specific behavior.
|
||
|
|
*
|
||
|
|
|* @param thread_count The number of threads to spawn.
|
||
|
|
* @param func The function to execute. Must have the signature:
|
||
|
|
* void (int thread_count, int thread_id, void* payload)
|
||
|
|
* @param payload Pointer to an opaque thread payload object.
|
||
|
|
*/
|
||
|
|
void launch_threads(
|
||
|
|
int thread_count,
|
||
|
|
void (*func)(int, int, void*),
|
||
|
|
void *payload);
|
||
|
|
|
||
|
|
#endif
|