Actually pass block coordinates to shape selection function

This commit is contained in:
Pavel Krajcevski 2014-03-22 19:25:21 -04:00
parent 891e2cfee8
commit 9144db4de6
2 changed files with 20 additions and 10 deletions

View file

@ -120,8 +120,8 @@ namespace BPTCC {
// A shape selection function is one that selects a BPTC shape from a given
// block position and pixel array.
typedef ShapeSelection
(*ShapeSelectionFn)(uint32 x, uint32 y, const uint32 pixels[16]);
typedef ShapeSelection (*ShapeSelectionFn)
(uint32 x, uint32 y, const uint32 pixels[16], const void *userData);
// Compression parameters used to control the BPTC compressor. Each of the
// values has a default, so this is not strictly required to perform
@ -136,6 +136,9 @@ namespace BPTCC {
// every block mode is still available.
ShapeSelectionFn m_ShapeSelectionFn;
// The user data passed to the shape selection function.
void *m_ShapeSelectionUserData;
// The block modes that the compressor will consider during compression.
// This variable is a bit mask of EBlockMode values and by default contains
// every mode. This setting can be used to further restrict the search space
@ -144,6 +147,7 @@ namespace BPTCC {
CompressionSettings()
: m_ShapeSelectionFn(NULL)
, m_ShapeSelectionUserData(NULL)
, m_BlockModes(static_cast<EBlockMode>(0xFF))
{ }
};

View file

@ -1493,10 +1493,12 @@ std::ostream &operator<<(const BlockLogger &bl, const T &v) {
// Function prototypes
static void CompressBC7Block(
const uint32 x, const uint32 y,
const uint32 block[16], uint8 *outBuf,
const CompressionSettings = CompressionSettings()
);
static void CompressBC7Block(
const uint32 x, const uint32 y,
const uint32 block[16], uint8 *outBuf, const BlockLogger &logStream,
const CompressionSettings = CompressionSettings()
);
@ -1594,7 +1596,7 @@ void Compress(const FasTC::CompressionJob &cj, CompressionSettings settings) {
uint32 block[16];
GetBlock(i, j, cj.Width(), inPixels, block);
CompressBC7Block(block, outBuf, settings);
CompressBC7Block(i, j, block, outBuf, settings);
#ifndef NDEBUG
const uint8 *inBlock = reinterpret_cast<const uint8 *>(block);
@ -1669,7 +1671,7 @@ void CompressAtomic(FasTC::CompressionJobList &cjl) {
uint32 y = cj->YStart() + 4 * (blockIdx / (cj->Width() / 4));
const uint32 *inPixels = reinterpret_cast<const uint32 *>(cj->InBuf());
GetBlock(x, y, cj->Width(), inPixels, block);
CompressBC7Block(block, out);
CompressBC7Block(x, y, block, out);
}
if(TestAndSet(cjl.GetFinishedFlag(jobIdx)) == 0) {
@ -1699,9 +1701,9 @@ void CompressAtomic(FasTC::CompressionJobList &cjl) {
if(logStream) {
uint64 blockIdx = cj.CoordsToBlockIdx(i, j);
CompressBC7Block(block, outBuf, BlockLogger(blockIdx, *logStream), settings);
CompressBC7Block(i, j, block, outBuf, BlockLogger(blockIdx, *logStream), settings);
} else {
CompressBC7Block(block, outBuf, settings);
CompressBC7Block(i, j, block, outBuf, settings);
}
#ifndef NDEBUG
@ -1775,8 +1777,9 @@ static uint32 kAlphaModes =
static_cast<uint32>(eBlockMode_Six) |
static_cast<uint32>(eBlockMode_Seven);
static ShapeSelection BoxSelection(uint32 x, uint32 y,
const uint32 pixels[16]) {
static ShapeSelection BoxSelection(
uint32, uint32, const uint32 pixels[16], const void *
) {
ShapeSelection result;
@ -1897,7 +1900,8 @@ static void CompressClusters(ShapeSelection selection, const uint32 pixels[16],
}
}
static void CompressBC7Block(const uint32 block[16], uint8 *outBuf,
static void CompressBC7Block(const uint32 x, const uint32 y,
const uint32 block[16], uint8 *outBuf,
const CompressionSettings settings) {
// All a single color?
if(AllOneColor(block)) {
@ -1930,7 +1934,8 @@ static void CompressBC7Block(const uint32 block[16], uint8 *outBuf,
}
assert(selectionFn);
ShapeSelection selection = selectionFn(0, 0, block);
ShapeSelection selection =
selectionFn(x, y, block, settings.m_ShapeSelectionUserData);
selection.m_SelectedModes &= settings.m_BlockModes;
assert(selection.m_SelectedModes);
CompressClusters(selection, block, outBuf, NULL, NULL);
@ -2029,6 +2034,7 @@ static void PrintStat(const BlockLogger &lgr, const char *stat, const T &v) {
// Compress a single block but collect statistics as well...
static void CompressBC7Block(
const uint32 x, const uint32 y,
const uint32 block[16], uint8 *outBuf, const BlockLogger &logStream,
const CompressionSettings settings
) {