forked from sascha/godot
BPTC support
parent
0e6551d8e2
commit
35f6ba5c5d
@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
Import('env')
|
||||
Import('env_modules')
|
||||
|
||||
env_cvtt = env_modules.Clone()
|
||||
|
||||
# Thirdparty source files
|
||||
if env['builtin_squish']:
|
||||
thirdparty_dir = "#thirdparty/cvtt/"
|
||||
thirdparty_sources = [
|
||||
"ConvectionKernels.cpp"
|
||||
]
|
||||
|
||||
thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources]
|
||||
|
||||
env_cvtt.add_source_files(env.modules_sources, thirdparty_sources)
|
||||
env_cvtt.Append(CPPPATH=[thirdparty_dir])
|
||||
|
||||
# Godot source files
|
||||
env_cvtt.add_source_files(env.modules_sources, "*.cpp")
|
||||
@ -0,0 +1,5 @@
|
||||
def can_build(env, platform):
|
||||
return env['tools']
|
||||
|
||||
def configure(env):
|
||||
pass
|
||||
@ -0,0 +1,300 @@
|
||||
/*************************************************************************/
|
||||
/* image_compress_cvtt.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#include "image_compress_cvtt.h"
|
||||
|
||||
#include "print_string.h"
|
||||
|
||||
#include <ConvectionKernels.h>
|
||||
|
||||
void image_compress_cvtt(Image *p_image, float p_lossy_quality, Image::CompressSource p_source) {
|
||||
|
||||
if (p_image->get_format() >= Image::FORMAT_BPTC_RGBA)
|
||||
return; //do not compress, already compressed
|
||||
|
||||
int w = p_image->get_width();
|
||||
int h = p_image->get_height();
|
||||
|
||||
bool is_ldr = (p_image->get_format() <= Image::FORMAT_RGBA8);
|
||||
bool is_hdr = (p_image->get_format() == Image::FORMAT_RGBH);
|
||||
|
||||
if (!is_ldr && !is_hdr) {
|
||||
return; // Not a usable source format
|
||||
}
|
||||
|
||||
cvtt::Options options;
|
||||
uint32_t flags = cvtt::Flags::Fastest;
|
||||
|
||||
if (p_lossy_quality > 0.85)
|
||||
flags = cvtt::Flags::Ultra;
|
||||
else if (p_lossy_quality > 0.75)
|
||||
flags = cvtt::Flags::Better;
|
||||
else if (p_lossy_quality > 0.55)
|
||||
flags = cvtt::Flags::Default;
|
||||
else if (p_lossy_quality > 0.35)
|
||||
flags = cvtt::Flags::Fast;
|
||||
else if (p_lossy_quality > 0.15)
|
||||
flags = cvtt::Flags::Faster;
|
||||
|
||||
flags |= cvtt::Flags::BC7_RespectPunchThrough;
|
||||
|
||||
if (p_source == Image::COMPRESS_SOURCE_NORMAL) {
|
||||
flags |= cvtt::Flags::Uniform;
|
||||
}
|
||||
|
||||
Image::Format target_format = Image::FORMAT_BPTC_RGBA;
|
||||
|
||||
bool is_signed = false;
|
||||
if (is_hdr) {
|
||||
PoolVector<uint8_t>::Read rb = p_image->get_data().read();
|
||||
|
||||
const uint16_t *source_data = reinterpret_cast<const uint16_t *>(&rb[0]);
|
||||
int pixel_element_count = w * h * 3;
|
||||
for (int i = 0; i < pixel_element_count; i++) {
|
||||
if ((source_data[i] & 0x8000) != 0 && (source_data[i] & 0x7fff) != 0) {
|
||||
is_signed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
target_format = is_signed ? Image::FORMAT_BPTC_RGBF : Image::FORMAT_BPTC_RGBFU;
|
||||
} else {
|
||||
p_image->convert(Image::FORMAT_RGBA8); //still uses RGBA to convert
|
||||
}
|
||||
|
||||
PoolVector<uint8_t>::Read rb = p_image->get_data().read();
|
||||
|
||||
PoolVector<uint8_t> data;
|
||||
int target_size = Image::get_image_data_size(w, h, target_format, p_image->has_mipmaps());
|
||||
int mm_count = p_image->has_mipmaps() ? Image::get_image_required_mipmaps(w, h, target_format) : 0;
|
||||
data.resize(target_size);
|
||||
int shift = Image::get_format_pixel_rshift(target_format);
|
||||
|
||||
PoolVector<uint8_t>::Write wb = data.write();
|
||||
|
||||
int dst_ofs = 0;
|
||||
|
||||
for (int i = 0; i <= mm_count; i++) {
|
||||
|
||||
int bw = w % 4 != 0 ? w + (4 - w % 4) : w;
|
||||
int bh = h % 4 != 0 ? h + (4 - h % 4) : h;
|
||||
|
||||
int src_ofs = p_image->get_mipmap_offset(i);
|
||||
|
||||
const uint8_t *in_bytes = &rb[src_ofs];
|
||||
uint8_t *out_bytes = &wb[dst_ofs];
|
||||
|
||||
cvtt::PixelBlockU8 input_blocks_ldr[cvtt::NumParallelBlocks];
|
||||
cvtt::PixelBlockF16 input_blocks_hdr[cvtt::NumParallelBlocks];
|
||||
|
||||
int bytes_per_pixel = is_hdr ? 6 : 4;
|
||||
|
||||
for (int y_start = 0; y_start < h; y_start += 4) {
|
||||
int y_end = y_start + 4;
|
||||
|
||||
for (int x_start = 0; x_start < w; x_start += 4 * cvtt::NumParallelBlocks) {
|
||||
int x_end = x_start + 4 * cvtt::NumParallelBlocks;
|
||||
|
||||
for (int y = y_start; y < y_end; y++) {
|
||||
int first_input_element = (y - y_start) * 4;
|
||||
const uint8_t *row_start;
|
||||
if (y >= h) {
|
||||
row_start = in_bytes + (h - 1) * (w * bytes_per_pixel);
|
||||
} else {
|
||||
row_start = in_bytes + y * (w * bytes_per_pixel);
|
||||
}
|
||||
|
||||
for (int x = x_start; x < x_end; x++) {
|
||||
const uint8_t *pixel_start;
|
||||
if (x >= w) {
|
||||
pixel_start = row_start + (w - 1) * bytes_per_pixel;
|
||||
} else {
|
||||
pixel_start = row_start + x * bytes_per_pixel;
|
||||
}
|
||||
|
||||
int block_index = (x - x_start) / 4;
|
||||
int block_element = (x - x_start) % 4 + first_input_element;
|
||||
if (is_hdr) {
|
||||
memcpy(input_blocks_hdr[block_index].m_pixels[block_element], pixel_start, bytes_per_pixel);
|
||||
input_blocks_hdr[block_index].m_pixels[block_element][3] = 0x3c00; // 1.0 (unused)
|
||||
} else {
|
||||
memcpy(input_blocks_ldr[block_index].m_pixels[block_element], pixel_start, bytes_per_pixel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t output_blocks[16 * cvtt::NumParallelBlocks];
|
||||
|
||||
if (is_hdr) {
|
||||
if (is_signed) {
|
||||
cvtt::Kernels::EncodeBC6HS(output_blocks, input_blocks_hdr, options);
|
||||
} else {
|
||||
cvtt::Kernels::EncodeBC6HU(output_blocks, input_blocks_hdr, options);
|
||||
}
|
||||
} else {
|
||||
cvtt::Kernels::EncodeBC7(output_blocks, input_blocks_ldr, options);
|
||||
}
|
||||
|
||||
int num_real_blocks = ((w - x_start) + 3) / 4;
|
||||
if (num_real_blocks > cvtt::NumParallelBlocks) {
|
||||
num_real_blocks = cvtt::NumParallelBlocks;
|
||||
}
|
||||
|
||||
memcpy(out_bytes, output_blocks, 16 * num_real_blocks);
|
||||
out_bytes += 16 * num_real_blocks;
|
||||
}
|
||||
}
|
||||
|
||||
dst_ofs += (MAX(4, bw) * MAX(4, bh)) >> shift;
|
||||
w >>= 1;
|
||||
h >>= 1;
|
||||
}
|
||||
|
||||
rb = PoolVector<uint8_t>::Read();
|
||||
wb = PoolVector<uint8_t>::Write();
|
||||
|
||||
p_image->create(p_image->get_width(), p_image->get_height(), p_image->has_mipmaps(), target_format, data);
|
||||
}
|
||||
|
||||
void image_decompress_cvtt(Image *p_image) {
|
||||
|
||||
Image::Format target_format;
|
||||
bool is_signed = false;
|
||||
bool is_hdr = false;
|
||||
|
||||
Image::Format input_format = p_image->get_format();
|
||||
|
||||
switch (input_format) {
|
||||
case Image::FORMAT_BPTC_RGBA:
|
||||
target_format = Image::FORMAT_RGBA8;
|
||||
break;
|
||||
case Image::FORMAT_BPTC_RGBF:
|
||||
case Image::FORMAT_BPTC_RGBFU:
|
||||
target_format = Image::FORMAT_RGBH;
|
||||
is_signed = (input_format == Image::FORMAT_BPTC_RGBF);
|
||||
is_hdr = true;
|
||||
break;
|
||||
default:
|
||||
return; // Invalid input format
|
||||
};
|
||||
|
||||
int w = p_image->get_width();
|
||||
int h = p_image->get_height();
|
||||
|
||||
PoolVector<uint8_t>::Read rb = p_image->get_data().read();
|
||||
|
||||
PoolVector<uint8_t> data;
|
||||
int target_size = Image::get_image_data_size(w, h, target_format, p_image->has_mipmaps());
|
||||
int mm_count = p_image->get_mipmap_count();
|
||||
data.resize(target_size);
|
||||
int shift = Image::get_format_pixel_rshift(target_format);
|
||||
|
||||
PoolVector<uint8_t>::Write wb = data.write();
|
||||
|
||||
int bytes_per_pixel = is_hdr ? 6 : 4;
|
||||
|
||||
int dst_ofs = 0;
|
||||
|
||||
for (int i = 0; i <= mm_count; i++) {
|
||||
|
||||
int src_ofs = p_image->get_mipmap_offset(i);
|
||||
|
||||
const uint8_t *in_bytes = &rb[src_ofs];
|
||||
uint8_t *out_bytes = &wb[dst_ofs];
|
||||
|
||||
cvtt::PixelBlockU8 output_blocks_ldr[cvtt::NumParallelBlocks];
|
||||
cvtt::PixelBlockF16 output_blocks_hdr[cvtt::NumParallelBlocks];
|
||||
|
||||
for (int y_start = 0; y_start < h; y_start += 4) {
|
||||
int y_end = y_start + 4;
|
||||
|
||||
for (int x_start = 0; x_start < w; x_start += 4 * cvtt::NumParallelBlocks) {
|
||||
int x_end = x_start + 4 * cvtt::NumParallelBlocks;
|
||||
|
||||
uint8_t input_blocks[16 * cvtt::NumParallelBlocks];
|
||||
memset(input_blocks, 0, sizeof(input_blocks));
|
||||
|
||||
int num_real_blocks = ((w - x_start) + 3) / 4;
|
||||
if (num_real_blocks > cvtt::NumParallelBlocks) {
|
||||
num_real_blocks = cvtt::NumParallelBlocks;
|
||||
}
|
||||
|
||||
memcpy(input_blocks, in_bytes, 16 * num_real_blocks);
|
||||
in_bytes += 16 * num_real_blocks;
|
||||
|
||||
if (is_hdr) {
|
||||
if (is_signed) {
|
||||
cvtt::Kernels::DecodeBC6HS(output_blocks_hdr, input_blocks);
|
||||
} else {
|
||||
cvtt::Kernels::DecodeBC6HU(output_blocks_hdr, input_blocks);
|
||||
}
|
||||
} else {
|
||||
cvtt::Kernels::DecodeBC7(output_blocks_ldr, input_blocks);
|
||||
}
|
||||
|
||||
for (int y = y_start; y < y_end; y++) {
|
||||
int first_input_element = (y - y_start) * 4;
|
||||
uint8_t *row_start;
|
||||
if (y >= h) {
|
||||
row_start = out_bytes + (h - 1) * (w * bytes_per_pixel);
|
||||
} else {
|
||||
row_start = out_bytes + y * (w * bytes_per_pixel);
|
||||
}
|
||||
|
||||
for (int x = x_start; x < x_end; x++) {
|
||||
uint8_t *pixel_start;
|
||||
if (x >= w) {
|
||||
pixel_start = row_start + (w - 1) * bytes_per_pixel;
|
||||
} else {
|
||||
pixel_start = row_start + x * bytes_per_pixel;
|
||||
}
|
||||
|
||||
int block_index = (x - x_start) / 4;
|
||||
int block_element = (x - x_start) % 4 + first_input_element;
|
||||
if (is_hdr) {
|
||||
memcpy(pixel_start, output_blocks_hdr[block_index].m_pixels[block_element], bytes_per_pixel);
|
||||
} else {
|
||||
memcpy(pixel_start, output_blocks_ldr[block_index].m_pixels[block_element], bytes_per_pixel);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dst_ofs += w * h * bytes_per_pixel;
|
||||
w >>= 1;
|
||||
h >>= 1;
|
||||
}
|
||||
|
||||
rb = PoolVector<uint8_t>::Read();
|
||||
wb = PoolVector<uint8_t>::Write();
|
||||
|
||||
p_image->create(p_image->get_width(), p_image->get_height(), p_image->has_mipmaps(), target_format, data);
|
||||
}
|
||||
@ -0,0 +1,39 @@
|
||||
/*************************************************************************/
|
||||
/* image_compress_cvtt.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#ifndef IMAGE_COMPRESS_CVTT_H
|
||||
#define IMAGE_COMPRESS_CVTT_H
|
||||
|
||||
#include "image.h"
|
||||
|
||||
void image_compress_cvtt(Image *p_image, float p_lossy_quality, Image::CompressSource p_source);
|
||||
void image_decompress_cvtt(Image *p_image);
|
||||
|
||||
#endif // IMAGE_COMPRESS_CVTT_H
|
||||
@ -0,0 +1,45 @@
|
||||
/*************************************************************************/
|
||||
/* register_types.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#include "register_types.h"
|
||||
|
||||
#ifdef TOOLS_ENABLED
|
||||
|
||||
#include "image_compress_cvtt.h"
|
||||
|
||||
void register_cvtt_types() {
|
||||
|
||||
Image::set_compress_bptc_func(image_compress_cvtt);
|
||||
Image::_image_decompress_bptc = image_decompress_cvtt;
|
||||
}
|
||||
|
||||
void unregister_cvtt_types() {}
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,34 @@
|
||||
/*************************************************************************/
|
||||
/* register_types.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#ifdef TOOLS_ENABLED
|
||||
void register_cvtt_types();
|
||||
void unregister_cvtt_types();
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,145 @@
|
||||
/*
|
||||
Convection Texture Tools
|
||||
Copyright (c) 2018 Eric Lasota
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject
|
||||
to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#pragma once
|
||||
#ifndef __CVTT_CONVECTION_KERNELS__
|
||||
#define __CVTT_CONVECTION_KERNELS__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
namespace cvtt
|
||||
{
|
||||
namespace Flags
|
||||
{
|
||||
// Enable partitioned modes in BC7 encoding (slower, better quality)
|
||||
const uint32_t BC7_EnablePartitioning = 0x001;
|
||||
|
||||
// Enable 3-partition modes in BC7 encoding (slower, better quality, requires BC7_EnablePartitioning)
|
||||
const uint32_t BC7_Enable3Subsets = 0x002;
|
||||
|
||||
// Enable dual-plane modes in BC7 encoding (slower, better quality)
|
||||
const uint32_t BC7_EnableDualPlane = 0x004;
|
||||
|
||||
// Use fast indexing in BC7 encoding (about 2x faster, slightly worse quality)
|
||||
const uint32_t BC7_FastIndexing = 0x008;
|
||||
|
||||
// Try precomputed single-color lookups where applicable (slightly slower, small quality increase on specific blocks)
|
||||
const uint32_t BC7_TrySingleColor = 0x010;
|
||||
|
||||
// Don't allow non-zero or non-max alpha values in blocks that only contain one or the other
|
||||
const uint32_t BC7_RespectPunchThrough = 0x020;
|
||||
|
||||
// Use fast indexing in HDR formats (faster, worse quality)
|
||||
const uint32_t BC6H_FastIndexing = 0x040;
|
||||
|
||||
// Exhaustive search RGB orderings when encoding BC1-BC3 (much slower, better quality)
|
||||
const uint32_t S3TC_Exhaustive = 0x080;
|
||||
|
||||
// Penalize distant endpoints, improving quality on inaccurate GPU decoders
|
||||
const uint32_t S3TC_Paranoid = 0x100;
|
||||
|
||||
// Uniform color channel importance
|
||||
const uint32_t Uniform = 0x200;
|
||||
|
||||
// Misc useful default flag combinations
|
||||
const uint32_t Fastest = (BC6H_FastIndexing | S3TC_Paranoid);
|
||||
const uint32_t Faster = (BC7_EnableDualPlane | BC6H_FastIndexing | S3TC_Paranoid);
|
||||
const uint32_t Fast = (BC7_EnablePartitioning | BC7_EnableDualPlane | BC7_FastIndexing | S3TC_Paranoid);
|
||||
const uint32_t Default = (BC7_EnablePartitioning | BC7_EnableDualPlane | BC7_Enable3Subsets | BC7_FastIndexing | S3TC_Paranoid);
|
||||
const uint32_t Better = (BC7_EnablePartitioning | BC7_EnableDualPlane | BC7_Enable3Subsets | S3TC_Paranoid | S3TC_Exhaustive);
|
||||
const uint32_t Ultra = (BC7_EnablePartitioning | BC7_EnableDualPlane | BC7_Enable3Subsets | BC7_TrySingleColor | S3TC_Paranoid | S3TC_Exhaustive);
|
||||
}
|
||||
|
||||
const unsigned int NumParallelBlocks = 8;
|
||||
|
||||
struct Options
|
||||
{
|
||||
uint32_t flags; // Bitmask of cvtt::Flags values
|
||||
float threshold; // Alpha test threshold for BC1
|
||||
float redWeight; // Red channel importance
|
||||
float greenWeight; // Green channel importance
|
||||
float blueWeight; // Blue channel importance
|
||||
float alphaWeight; // Alpha channel importance
|
||||
|
||||
int refineRoundsBC7; // Number of refine rounds for BC7
|
||||
int refineRoundsBC6H; // Number of refine rounds for BC6H (max 3)
|
||||
int refineRoundsIIC; // Number of refine rounds for independent interpolated channels (BC3 alpha, BC4, BC5)
|
||||
int refineRoundsS3TC; // Number of refine rounds for S3TC RGB
|
||||
|
||||
int seedPoints; // Number of seed points (min 1, max 4)
|
||||
|
||||
Options()
|
||||
: flags(Flags::Default)
|
||||
, threshold(0.5f)
|
||||
, redWeight(0.2125f / 0.7154f)
|
||||
, greenWeight(1.0f)
|
||||
, blueWeight(0.0721f / 0.7154f)
|
||||
, alphaWeight(1.0f)
|
||||
, refineRoundsBC7(2)
|
||||
, refineRoundsBC6H(3)
|
||||
, refineRoundsIIC(8)
|
||||
, refineRoundsS3TC(2)
|
||||
, seedPoints(4)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
// RGBA input block for unsigned 8-bit formats
|
||||
struct PixelBlockU8
|
||||
{
|
||||
uint8_t m_pixels[16][4];
|
||||
};
|
||||
|
||||
// RGBA input block for signed 8-bit formats
|
||||
struct PixelBlockS8
|
||||
{
|
||||
int8_t m_pixels[16][4];
|
||||
};
|
||||
|
||||
// RGBA input block for half-precision float formats (bit-cast to int16_t)
|
||||
struct PixelBlockF16
|
||||
{
|
||||
int16_t m_pixels[16][4];
|
||||
};
|
||||
|
||||
namespace Kernels
|
||||
{
|
||||
// NOTE: All functions accept and output NumParallelBlocks blocks at once
|
||||
void EncodeBC1(uint8_t *pBC, const PixelBlockU8 *pBlocks, const Options &options);
|
||||
void EncodeBC2(uint8_t *pBC, const PixelBlockU8 *pBlocks, const Options &options);
|
||||
void EncodeBC3(uint8_t *pBC, const PixelBlockU8 *pBlocks, const Options &options);
|
||||
void EncodeBC4U(uint8_t *pBC, const PixelBlockU8 *pBlocks, const Options &options);
|
||||
void EncodeBC4S(uint8_t *pBC, const PixelBlockS8 *pBlocks, const Options &options);
|
||||
void EncodeBC5U(uint8_t *pBC, const PixelBlockU8 *pBlocks, const Options &options);
|
||||
void EncodeBC5S(uint8_t *pBC, const PixelBlockS8 *pBlocks, const Options &options);
|
||||
void EncodeBC6HU(uint8_t *pBC, const PixelBlockF16 *pBlocks, const Options &options);
|
||||
void EncodeBC6HS(uint8_t *pBC, const PixelBlockF16 *pBlocks, const Options &options);
|
||||
void EncodeBC7(uint8_t *pBC, const PixelBlockU8 *pBlocks, const Options &options);
|
||||
|
||||
void DecodeBC6HU(PixelBlockF16 *pBlocks, const uint8_t *pBC);
|
||||
void DecodeBC6HS(PixelBlockF16 *pBlocks, const uint8_t *pBC);
|
||||
void DecodeBC7(PixelBlockU8 *pBlocks, const uint8_t *pBC);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,45 @@
|
||||
Convection Texture Tools Stand-Alone Kernels
|
||||
|
||||
Copyright (c) 2018 Eric Lasota
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject
|
||||
to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
**************************************************************************
|
||||
|
||||
Based on DirectX Texture Library
|
||||
|
||||
Copyright (c) 2018 Microsoft Corp
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify,
|
||||
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies
|
||||
or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
||||
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
||||
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
Loading…
Reference in New Issue