Refactor compression functions, group them into class methods.

This commit is contained in:
castano
2008-05-06 23:55:19 +00:00
parent 2ffc4cd7ad
commit 70331a37fd
3 changed files with 135 additions and 92 deletions

View File

@ -57,17 +57,31 @@ using namespace nv;
using namespace nvtt; using namespace nvtt;
void nv::fastCompressDXT1(const Image * image, const OutputOptions::Private & outputOptions) nv::FastCompressor::FastCompressor() : m_image(NULL), m_alphaMode(AlphaMode_None)
{ {
const uint w = image->width(); }
const uint h = image->height();
nv::FastCompressor::~FastCompressor()
{
}
void nv::FastCompressor::setImage(const Image * image, nvtt::AlphaMode alphaMode)
{
m_image = image;
m_alphaMode = alphaMode;
}
void nv::FastCompressor::compressDXT1(const OutputOptions::Private & outputOptions)
{
const uint w = m_image->width();
const uint h = m_image->height();
ColorBlock rgba; ColorBlock rgba;
BlockDXT1 block; BlockDXT1 block;
for (uint y = 0; y < h; y += 4) { for (uint y = 0; y < h; y += 4) {
for (uint x = 0; x < w; x += 4) { for (uint x = 0; x < w; x += 4) {
rgba.init(image, x, y); rgba.init(m_image, x, y);
QuickCompress::compressDXT1(rgba, &block); QuickCompress::compressDXT1(rgba, &block);
@ -79,17 +93,17 @@ void nv::fastCompressDXT1(const Image * image, const OutputOptions::Private & ou
} }
void nv::fastCompressDXT1a(const Image * image, const OutputOptions::Private & outputOptions) void nv::FastCompressor::compressDXT1a(const OutputOptions::Private & outputOptions)
{ {
const uint w = image->width(); const uint w = m_image->width();
const uint h = image->height(); const uint h = m_image->height();
ColorBlock rgba; ColorBlock rgba;
BlockDXT1 block; BlockDXT1 block;
for (uint y = 0; y < h; y += 4) { for (uint y = 0; y < h; y += 4) {
for (uint x = 0; x < w; x += 4) { for (uint x = 0; x < w; x += 4) {
rgba.init(image, x, y); rgba.init(m_image, x, y);
QuickCompress::compressDXT1a(rgba, &block); QuickCompress::compressDXT1a(rgba, &block);
@ -101,17 +115,17 @@ void nv::fastCompressDXT1a(const Image * image, const OutputOptions::Private & o
} }
void nv::fastCompressDXT3(const Image * image, const nvtt::OutputOptions::Private & outputOptions) void nv::FastCompressor::compressDXT3(const nvtt::OutputOptions::Private & outputOptions)
{ {
const uint w = image->width(); const uint w = m_image->width();
const uint h = image->height(); const uint h = m_image->height();
ColorBlock rgba; ColorBlock rgba;
BlockDXT3 block; BlockDXT3 block;
for (uint y = 0; y < h; y += 4) { for (uint y = 0; y < h; y += 4) {
for (uint x = 0; x < w; x += 4) { for (uint x = 0; x < w; x += 4) {
rgba.init(image, x, y); rgba.init(m_image, x, y);
QuickCompress::compressDXT3(rgba, &block); QuickCompress::compressDXT3(rgba, &block);
@ -123,17 +137,17 @@ void nv::fastCompressDXT3(const Image * image, const nvtt::OutputOptions::Privat
} }
void nv::fastCompressDXT5(const Image * image, const nvtt::OutputOptions::Private & outputOptions) void nv::FastCompressor::compressDXT5(const nvtt::OutputOptions::Private & outputOptions)
{ {
const uint w = image->width(); const uint w = m_image->width();
const uint h = image->height(); const uint h = m_image->height();
ColorBlock rgba; ColorBlock rgba;
BlockDXT5 block; BlockDXT5 block;
for (uint y = 0; y < h; y += 4) { for (uint y = 0; y < h; y += 4) {
for (uint x = 0; x < w; x += 4) { for (uint x = 0; x < w; x += 4) {
rgba.init(image, x, y); rgba.init(m_image, x, y);
QuickCompress::compressDXT5(rgba, &block, 0); QuickCompress::compressDXT5(rgba, &block, 0);
@ -145,17 +159,17 @@ void nv::fastCompressDXT5(const Image * image, const nvtt::OutputOptions::Privat
} }
void nv::fastCompressDXT5n(const Image * image, const nvtt::OutputOptions::Private & outputOptions) void nv::FastCompressor::compressDXT5n(const nvtt::OutputOptions::Private & outputOptions)
{ {
const uint w = image->width(); const uint w = m_image->width();
const uint h = image->height(); const uint h = m_image->height();
ColorBlock rgba; ColorBlock rgba;
BlockDXT5 block; BlockDXT5 block;
for (uint y = 0; y < h; y += 4) { for (uint y = 0; y < h; y += 4) {
for (uint x = 0; x < w; x += 4) { for (uint x = 0; x < w; x += 4) {
rgba.init(image, x, y); rgba.init(m_image, x, y);
// copy X coordinate to alpha channel and Y coordinate to green channel. // copy X coordinate to alpha channel and Y coordinate to green channel.
rgba.swizzleDXT5n(); rgba.swizzleDXT5n();
@ -170,24 +184,24 @@ void nv::fastCompressDXT5n(const Image * image, const nvtt::OutputOptions::Priva
} }
void nv::fastCompressBC4(const Image * image, const nvtt::OutputOptions::Private & outputOptions) nv::SlowCompressor::SlowCompressor() : m_image(NULL), m_alphaMode(AlphaMode_None)
{ {
// @@ TODO
// compress red channel (X)
} }
nv::SlowCompressor::~SlowCompressor()
void nv::fastCompressBC5(const Image * image, const nvtt::OutputOptions::Private & outputOptions)
{ {
// @@ TODO
// compress red, green channels (X,Y)
} }
void nv::SlowCompressor::setImage(const Image * image, nvtt::AlphaMode alphaMode)
void nv::compressDXT1(const Image * image, const OutputOptions::Private & outputOptions, const CompressionOptions::Private & compressionOptions)
{ {
const uint w = image->width(); m_image = image;
const uint h = image->height(); m_alphaMode = alphaMode;
}
void nv::SlowCompressor::compressDXT1(const CompressionOptions::Private & compressionOptions, const OutputOptions::Private & outputOptions)
{
const uint w = m_image->width();
const uint h = m_image->height();
ColorBlock rgba; ColorBlock rgba;
BlockDXT1 block; BlockDXT1 block;
@ -200,7 +214,7 @@ void nv::compressDXT1(const Image * image, const OutputOptions::Private & output
for (uint y = 0; y < h; y += 4) { for (uint y = 0; y < h; y += 4) {
for (uint x = 0; x < w; x += 4) { for (uint x = 0; x < w; x += 4) {
rgba.init(image, x, y); rgba.init(m_image, x, y);
if (rgba.isSingleColor()) if (rgba.isSingleColor())
{ {
@ -221,10 +235,10 @@ void nv::compressDXT1(const Image * image, const OutputOptions::Private & output
} }
void nv::compressDXT1a(const Image * image, const OutputOptions::Private & outputOptions, const CompressionOptions::Private & compressionOptions) void nv::SlowCompressor::compressDXT1a(const CompressionOptions::Private & compressionOptions, const OutputOptions::Private & outputOptions)
{ {
const uint w = image->width(); const uint w = m_image->width();
const uint h = image->height(); const uint h = m_image->height();
ColorBlock rgba; ColorBlock rgba;
BlockDXT1 block; BlockDXT1 block;
@ -235,7 +249,7 @@ void nv::compressDXT1a(const Image * image, const OutputOptions::Private & outpu
for (uint y = 0; y < h; y += 4) { for (uint y = 0; y < h; y += 4) {
for (uint x = 0; x < w; x += 4) { for (uint x = 0; x < w; x += 4) {
rgba.init(image, x, y); rgba.init(m_image, x, y);
bool anyAlpha = false; bool anyAlpha = false;
bool allAlpha = true; bool allAlpha = true;
@ -265,21 +279,22 @@ void nv::compressDXT1a(const Image * image, const OutputOptions::Private & outpu
} }
void nv::compressDXT3(const Image * image, const OutputOptions::Private & outputOptions, const CompressionOptions::Private & compressionOptions) void nv::SlowCompressor::compressDXT3(const CompressionOptions::Private & compressionOptions, const OutputOptions::Private & outputOptions)
{ {
const uint w = image->width(); const uint w = m_image->width();
const uint h = image->height(); const uint h = m_image->height();
ColorBlock rgba; ColorBlock rgba;
BlockDXT3 block; BlockDXT3 block;
squish::WeightedClusterFit fit; squish::WeightedClusterFit fit;
//squish::FastClusterFit fit;
fit.SetMetric(compressionOptions.colorWeight.x(), compressionOptions.colorWeight.y(), compressionOptions.colorWeight.z()); fit.SetMetric(compressionOptions.colorWeight.x(), compressionOptions.colorWeight.y(), compressionOptions.colorWeight.z());
for (uint y = 0; y < h; y += 4) { for (uint y = 0; y < h; y += 4) {
for (uint x = 0; x < w; x += 4) { for (uint x = 0; x < w; x += 4) {
rgba.init(image, x, y); rgba.init(m_image, x, y);
// Compress explicit alpha. // Compress explicit alpha.
OptimalCompress::compressDXT3A(rgba, &block.alpha); OptimalCompress::compressDXT3A(rgba, &block.alpha);
@ -303,10 +318,10 @@ void nv::compressDXT3(const Image * image, const OutputOptions::Private & output
} }
} }
void nv::compressDXT5(const Image * image, const OutputOptions::Private & outputOptions, const CompressionOptions::Private & compressionOptions) void nv::SlowCompressor::compressDXT5(const CompressionOptions::Private & compressionOptions, const OutputOptions::Private & outputOptions)
{ {
const uint w = image->width(); const uint w = m_image->width();
const uint h = image->height(); const uint h = m_image->height();
ColorBlock rgba; ColorBlock rgba;
BlockDXT5 block; BlockDXT5 block;
@ -317,7 +332,7 @@ void nv::compressDXT5(const Image * image, const OutputOptions::Private & output
for (uint y = 0; y < h; y += 4) { for (uint y = 0; y < h; y += 4) {
for (uint x = 0; x < w; x += 4) { for (uint x = 0; x < w; x += 4) {
rgba.init(image, x, y); rgba.init(m_image, x, y);
// Compress alpha. // Compress alpha.
if (compressionOptions.quality == Quality_Highest) if (compressionOptions.quality == Quality_Highest)
@ -349,10 +364,10 @@ void nv::compressDXT5(const Image * image, const OutputOptions::Private & output
} }
void nv::compressDXT5n(const Image * image, const OutputOptions::Private & outputOptions, const CompressionOptions::Private & compressionOptions) void nv::SlowCompressor::compressDXT5n(const CompressionOptions::Private & compressionOptions, const OutputOptions::Private & outputOptions)
{ {
const uint w = image->width(); const uint w = m_image->width();
const uint h = image->height(); const uint h = m_image->height();
ColorBlock rgba; ColorBlock rgba;
BlockDXT5 block; BlockDXT5 block;
@ -360,7 +375,7 @@ void nv::compressDXT5n(const Image * image, const OutputOptions::Private & outpu
for (uint y = 0; y < h; y += 4) { for (uint y = 0; y < h; y += 4) {
for (uint x = 0; x < w; x += 4) { for (uint x = 0; x < w; x += 4) {
rgba.init(image, x, y); rgba.init(m_image, x, y);
// copy X coordinate to green channel and Y coordinate to alpha channel. // copy X coordinate to green channel and Y coordinate to alpha channel.
rgba.swizzleDXT5n(); rgba.swizzleDXT5n();
@ -386,10 +401,10 @@ void nv::compressDXT5n(const Image * image, const OutputOptions::Private & outpu
} }
void nv::compressBC4(const Image * image, const nvtt::OutputOptions::Private & outputOptions, const CompressionOptions::Private & compressionOptions) void nv::SlowCompressor::compressBC4(const CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions)
{ {
const uint w = image->width(); const uint w = m_image->width();
const uint h = image->height(); const uint h = m_image->height();
ColorBlock rgba; ColorBlock rgba;
AlphaBlockDXT5 block; AlphaBlockDXT5 block;
@ -397,7 +412,7 @@ void nv::compressBC4(const Image * image, const nvtt::OutputOptions::Private & o
for (uint y = 0; y < h; y += 4) { for (uint y = 0; y < h; y += 4) {
for (uint x = 0; x < w; x += 4) { for (uint x = 0; x < w; x += 4) {
rgba.init(image, x, y); rgba.init(m_image, x, y);
if (compressionOptions.quality == Quality_Highest) if (compressionOptions.quality == Quality_Highest)
{ {
@ -416,10 +431,10 @@ void nv::compressBC4(const Image * image, const nvtt::OutputOptions::Private & o
} }
void nv::compressBC5(const Image * image, const nvtt::OutputOptions::Private & outputOptions, const CompressionOptions::Private & compressionOptions) void nv::SlowCompressor::compressBC5(const CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions)
{ {
const uint w = image->width(); const uint w = m_image->width();
const uint h = image->height(); const uint h = m_image->height();
ColorBlock xcolor; ColorBlock xcolor;
ColorBlock ycolor; ColorBlock ycolor;
@ -429,10 +444,10 @@ void nv::compressBC5(const Image * image, const nvtt::OutputOptions::Private & o
for (uint y = 0; y < h; y += 4) { for (uint y = 0; y < h; y += 4) {
for (uint x = 0; x < w; x += 4) { for (uint x = 0; x < w; x += 4) {
xcolor.init(image, x, y); xcolor.init(m_image, x, y);
xcolor.splatX(); xcolor.splatX();
ycolor.init(image, x, y); ycolor.init(m_image, x, y);
ycolor.splatY(); ycolor.splatY();
if (compressionOptions.quality == Quality_Highest) if (compressionOptions.quality == Quality_Highest)

View File

@ -32,23 +32,45 @@ namespace nv
class Image; class Image;
class FloatImage; class FloatImage;
// Fast compressors. class FastCompressor
void fastCompressDXT1(const Image * image, const nvtt::OutputOptions::Private & outputOptions); {
void fastCompressDXT1a(const Image * image, const nvtt::OutputOptions::Private & outputOptions); public:
void fastCompressDXT3(const Image * image, const nvtt::OutputOptions::Private & outputOptions); FastCompressor();
void fastCompressDXT5(const Image * image, const nvtt::OutputOptions::Private & outputOptions); ~FastCompressor();
void fastCompressDXT5n(const Image * image, const nvtt::OutputOptions::Private & outputOptions);
void fastCompressBC4(const Image * image, const nvtt::OutputOptions::Private & outputOptions);
void fastCompressBC5(const Image * image, const nvtt::OutputOptions::Private & outputOptions);
// Normal compressors. void setImage(const Image * image, nvtt::AlphaMode alphaMode);
void compressDXT1(const Image * image, const nvtt::OutputOptions::Private & outputOptions, const nvtt::CompressionOptions::Private & compressionOptions);
void compressDXT1a(const Image * image, const nvtt::OutputOptions::Private & outputOptions, const nvtt::CompressionOptions::Private & compressionOptions); void compressDXT1(const nvtt::OutputOptions::Private & outputOptions);
void compressDXT3(const Image * image, const nvtt::OutputOptions::Private & outputOptions, const nvtt::CompressionOptions::Private & compressionOptions); void compressDXT1a(const nvtt::OutputOptions::Private & outputOptions);
void compressDXT5(const Image * image, const nvtt::OutputOptions::Private & outputOptions, const nvtt::CompressionOptions::Private & compressionOptions); void compressDXT3(const nvtt::OutputOptions::Private & outputOptions);
void compressDXT5n(const Image * image, const nvtt::OutputOptions::Private & outputOptions, const nvtt::CompressionOptions::Private & compressionOptions); void compressDXT5(const nvtt::OutputOptions::Private & outputOptions);
void compressBC4(const Image * image, const nvtt::OutputOptions::Private & outputOptions, const nvtt::CompressionOptions::Private & compressionOptions); void compressDXT5n(const nvtt::OutputOptions::Private & outputOptions);
void compressBC5(const Image * image, const nvtt::OutputOptions::Private & outputOptions, const nvtt::CompressionOptions::Private & compressionOptions);
private:
const Image * m_image;
nvtt::AlphaMode m_alphaMode;
};
class SlowCompressor
{
public:
SlowCompressor();
~SlowCompressor();
void setImage(const Image * image, nvtt::AlphaMode alphaMode);
void compressDXT1(const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions);
void compressDXT1a(const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions);
void compressDXT3(const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions);
void compressDXT5(const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions);
void compressDXT5n(const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions);
void compressBC4(const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions);
void compressBC5(const nvtt::CompressionOptions::Private & compressionOptions, const nvtt::OutputOptions::Private & outputOptions);
private:
const Image * m_image;
nvtt::AlphaMode m_alphaMode;
};
// External compressors. // External compressors.
#if defined(HAVE_S3QUANT) #if defined(HAVE_S3QUANT)

View File

@ -712,9 +712,15 @@ void Compressor::Private::quantizeMipmap(Mipmap & mipmap, const CompressionOptio
bool Compressor::Private::compressMipmap(const Mipmap & mipmap, const InputOptions::Private & inputOptions, const CompressionOptions::Private & compressionOptions, const OutputOptions::Private & outputOptions) const bool Compressor::Private::compressMipmap(const Mipmap & mipmap, const InputOptions::Private & inputOptions, const CompressionOptions::Private & compressionOptions, const OutputOptions::Private & outputOptions) const
{ {
const Image * image = mipmap.asFixedImage(); const Image * image = mipmap.asFixedImage();
nvDebugCheck(image != NULL); nvDebugCheck(image != NULL);
FastCompressor fast;
fast.setImage(image, inputOptions.alphaMode);
SlowCompressor slow;
slow.setImage(image, inputOptions.alphaMode);
if (compressionOptions.format == Format_RGBA || compressionOptions.format == Format_RGB) if (compressionOptions.format == Format_RGBA || compressionOptions.format == Format_RGB)
{ {
compressRGB(image, outputOptions, compressionOptions); compressRGB(image, outputOptions, compressionOptions);
@ -738,7 +744,7 @@ bool Compressor::Private::compressMipmap(const Mipmap & mipmap, const InputOptio
#endif #endif
if (compressionOptions.quality == Quality_Fastest) if (compressionOptions.quality == Quality_Fastest)
{ {
fastCompressDXT1(image, outputOptions); fast.compressDXT1(outputOptions);
} }
else else
{ {
@ -750,7 +756,7 @@ bool Compressor::Private::compressMipmap(const Mipmap & mipmap, const InputOptio
} }
else else
{ {
compressDXT1(image, outputOptions, compressionOptions); slow.compressDXT1(compressionOptions, outputOptions);
} }
} }
} }
@ -758,18 +764,18 @@ bool Compressor::Private::compressMipmap(const Mipmap & mipmap, const InputOptio
{ {
if (compressionOptions.quality == Quality_Fastest) if (compressionOptions.quality == Quality_Fastest)
{ {
fastCompressDXT1a(image, outputOptions); fast.compressDXT1a(outputOptions);
} }
else else
{ {
if (cudaEnabled) if (cudaEnabled)
{ {
nvDebugCheck(cudaSupported); nvDebugCheck(cudaSupported);
/*cuda*/compressDXT1a(image, outputOptions, compressionOptions); /*cuda*/slow.compressDXT1a(compressionOptions, outputOptions);
} }
else else
{ {
compressDXT1a(image, outputOptions, compressionOptions); slow.compressDXT1a(compressionOptions, outputOptions);
} }
} }
} }
@ -790,7 +796,7 @@ bool Compressor::Private::compressMipmap(const Mipmap & mipmap, const InputOptio
{ {
if (compressionOptions.quality == Quality_Fastest) if (compressionOptions.quality == Quality_Fastest)
{ {
fastCompressDXT3(image, outputOptions); fast.compressDXT3(outputOptions);
} }
else else
{ {
@ -802,7 +808,7 @@ bool Compressor::Private::compressMipmap(const Mipmap & mipmap, const InputOptio
} }
else else
{ {
compressDXT3(image, outputOptions, compressionOptions); slow.compressDXT3(compressionOptions, outputOptions);
} }
} }
} }
@ -810,7 +816,7 @@ bool Compressor::Private::compressMipmap(const Mipmap & mipmap, const InputOptio
{ {
if (compressionOptions.quality == Quality_Fastest) if (compressionOptions.quality == Quality_Fastest)
{ {
fastCompressDXT5(image, outputOptions); fast.compressDXT5(outputOptions);
} }
else else
{ {
@ -822,7 +828,7 @@ bool Compressor::Private::compressMipmap(const Mipmap & mipmap, const InputOptio
} }
else else
{ {
compressDXT5(image, outputOptions, compressionOptions); slow.compressDXT5(compressionOptions, outputOptions);
} }
} }
} }
@ -830,20 +836,20 @@ bool Compressor::Private::compressMipmap(const Mipmap & mipmap, const InputOptio
{ {
if (compressionOptions.quality == Quality_Fastest) if (compressionOptions.quality == Quality_Fastest)
{ {
fastCompressDXT5n(image, outputOptions); fast.compressDXT5n(outputOptions);
} }
else else
{ {
compressDXT5n(image, outputOptions, compressionOptions); slow.compressDXT5n(compressionOptions, outputOptions);
} }
} }
else if (compressionOptions.format == Format_BC4) else if (compressionOptions.format == Format_BC4)
{ {
compressBC4(image, outputOptions, compressionOptions); slow.compressBC4(compressionOptions, outputOptions);
} }
else if (compressionOptions.format == Format_BC5) else if (compressionOptions.format == Format_BC5)
{ {
compressBC5(image, outputOptions, compressionOptions); slow.compressBC5(compressionOptions, outputOptions);
} }
else if (compressionOptions.format == Format_CTX1) else if (compressionOptions.format == Format_CTX1)
{ {