Thanks to visit codestin.com
Credit goes to github.com

Skip to content

serious BC7 decoder bugs #12

@richgel999

Description

@richgel999

The BC7 encoder has a couple easily fixed bugs that cause it to fail on some blocks:

detexGetBits64() fails when bit1 is 63 (when built with VS2015 x64). I believe the original implementation relied on undefined behavior (shift left of 1 by 64 bits != 0 on some platforms). Here's the fix:

static DETEX_INLINE_ONLY uint32_t detexGetBits64(uint64_t data, int bit0, int bit1) 
{
    uint64_t mask;
    if (bit1 == 63)
	mask = UINT64_MAX;
    else
	mask = ((uint64_t)1 << (bit1 + 1)) - 1;

    return (data & mask) >> bit0;
}   

The other bug is in FullyDecodeEndpoints() - sometimes the endpoints do across between the two 64-bit values in a block:

static void FullyDecodeEndpoints(uint8_t * DETEX_RESTRICT endpoint_array, int nu_subsets,
int mode, detexBlock128 * DETEX_RESTRICT block) {
if (mode_has_p_bits[mode]) {
// Mode 1 (shared P-bits) handled elsewhere.
// Extract end-point P-bits.
uint32_t bits;
if (block->index < 64)
{
bits = block->data0 >> block->index;
// Bugfix!
if ((block->index + nu_subsets * 2) > 64)
{
bits |= (block->data1 << (64 - block->index));
}
}

Once these 2 fixes are made this decoder outputs the same pixels as DirectXTex's.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions