110 lines
3.8 KiB
C++
110 lines
3.8 KiB
C++
////////////////////////////////////////////////////////////////////////////////
|
|
// Copyright 2017 Intel Corporation
|
|
//
|
|
// 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.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include <cstdint>
|
|
|
|
struct rgba_surface
|
|
{
|
|
uint8_t* ptr;
|
|
int32_t width;
|
|
int32_t height;
|
|
int32_t stride;
|
|
};
|
|
|
|
struct bc7_enc_settings
|
|
{
|
|
bool mode_selection[4];
|
|
int refineIterations[8];
|
|
|
|
bool skip_mode2;
|
|
int fastSkipTreshold_mode1;
|
|
int fastSkipTreshold_mode3;
|
|
int fastSkipTreshold_mode7;
|
|
|
|
int mode45_channel0;
|
|
int refineIterations_channel;
|
|
|
|
int channels;
|
|
};
|
|
|
|
struct bc6h_enc_settings
|
|
{
|
|
bool slow_mode;
|
|
bool fast_mode;
|
|
int refineIterations_1p;
|
|
int refineIterations_2p;
|
|
int fastSkipTreshold;
|
|
};
|
|
|
|
struct etc_enc_settings
|
|
{
|
|
int fastSkipTreshold;
|
|
};
|
|
|
|
struct astc_enc_settings
|
|
{
|
|
int block_width;
|
|
int block_height;
|
|
|
|
int fastSkipTreshold;
|
|
int refineIterations;
|
|
};
|
|
|
|
// profiles for RGB data (alpha channel will be ignored)
|
|
extern "C" void GetProfile_ultrafast(bc7_enc_settings* settings);
|
|
extern "C" void GetProfile_veryfast(bc7_enc_settings* settings);
|
|
extern "C" void GetProfile_fast(bc7_enc_settings* settings);
|
|
extern "C" void GetProfile_basic(bc7_enc_settings* settings);
|
|
extern "C" void GetProfile_slow(bc7_enc_settings* settings);
|
|
|
|
// profiles for RGBA inputs
|
|
extern "C" void GetProfile_alpha_ultrafast(bc7_enc_settings* settings);
|
|
extern "C" void GetProfile_alpha_veryfast(bc7_enc_settings* settings);
|
|
extern "C" void GetProfile_alpha_fast(bc7_enc_settings* settings);
|
|
extern "C" void GetProfile_alpha_basic(bc7_enc_settings* settings);
|
|
extern "C" void GetProfile_alpha_slow(bc7_enc_settings* settings);
|
|
|
|
// profiles for BC6H (RGB HDR)
|
|
extern "C" void GetProfile_bc6h_veryfast(bc6h_enc_settings* settings);
|
|
extern "C" void GetProfile_bc6h_fast(bc6h_enc_settings* settings);
|
|
extern "C" void GetProfile_bc6h_basic(bc6h_enc_settings* settings);
|
|
extern "C" void GetProfile_bc6h_slow(bc6h_enc_settings* settings);
|
|
extern "C" void GetProfile_bc6h_veryslow(bc6h_enc_settings* settings);
|
|
|
|
// profiles for ETC
|
|
extern "C" void GetProfile_etc_slow(etc_enc_settings* settings);
|
|
|
|
// profiles for ASTC
|
|
extern "C" void GetProfile_astc_fast(astc_enc_settings* settings, int block_width, int block_height);
|
|
|
|
/*
|
|
Notes:
|
|
- input width and height need to be a multiple of block size
|
|
- LDR input is 32 bit/pixel (sRGB), HDR is 64 bit/pixel (half float)
|
|
- dst buffer must be allocated with enough space for the compressed texture:
|
|
4 bytes/block for BC1/ETC1, 8 bytes/block for BC3/BC6H/BC7/ASTC
|
|
the blocks are stored in raster scan order (natural CPU texture layout)
|
|
- you can use GetProfile_* functions to select various speed/quality tradeoffs.
|
|
- the RGB profiles are slightly faster as they ignore the alpha channel
|
|
*/
|
|
|
|
extern "C" void CompressBlocksBC1(const rgba_surface* src, uint8_t* dst);
|
|
extern "C" void CompressBlocksBC3(const rgba_surface* src, uint8_t* dst);
|
|
extern "C" void CompressBlocksBC6H(const rgba_surface* src, uint8_t* dst, bc6h_enc_settings* settings);
|
|
extern "C" void CompressBlocksBC7(const rgba_surface* src, uint8_t* dst, bc7_enc_settings* settings);
|
|
extern "C" void CompressBlocksETC1(const rgba_surface* src, uint8_t* dst, etc_enc_settings* settings);
|
|
extern "C" void CompressBlocksASTC(const rgba_surface* src, uint8_t* dst, astc_enc_settings* settings);
|