Remove big endian support, write barriers, byte streams and dxt1 decoding optimization from the decompression code
This change makes the code more simple to modify. The removed functionality might be reintroduced in the future if necessary.
This commit is contained in:
Binary file not shown.
+16
-205
@@ -27,17 +27,6 @@
|
||||
|
||||
#define CRND_RESTRICT __restrict
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include <intrin.h>
|
||||
#pragma intrinsic(_WriteBarrier)
|
||||
#pragma intrinsic(_ReadWriteBarrier)
|
||||
#define CRND_WRITE_BARRIER _WriteBarrier();
|
||||
#define CRND_FULL_BARRIER _ReadWriteBarrier();
|
||||
#else
|
||||
#define CRND_WRITE_BARRIER
|
||||
#define CRND_FULL_BARRIER
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable : 4127) // warning C4127: conditional expression is constant
|
||||
#endif
|
||||
@@ -136,14 +125,6 @@ struct empty_type {};
|
||||
|
||||
// File: crnd_platform.h
|
||||
namespace crnd {
|
||||
#ifdef _XBOX
|
||||
const bool c_crnd_little_endian_platform = false;
|
||||
const bool c_crnd_big_endian_platform = true;
|
||||
#define CRND_BIG_ENDIAN_PLATFORM 1
|
||||
#else
|
||||
const bool c_crnd_little_endian_platform = true;
|
||||
const bool c_crnd_big_endian_platform = false;
|
||||
#endif
|
||||
|
||||
bool crnd_is_debugger_present();
|
||||
void crnd_debug_break();
|
||||
@@ -3053,16 +3034,8 @@ uint32 dxt5_block::get_block_values(uint32* pDst, uint32 l, uint32 h) {
|
||||
} // namespace crnd
|
||||
|
||||
// File: crnd_decode.cpp
|
||||
#define CRND_CREATE_BYTE_STREAMS 0
|
||||
|
||||
namespace crnd {
|
||||
#if CRND_CREATE_BYTE_STREAMS
|
||||
static void write_array_to_file(const char* pFilename, const vector<uint8>& buf) {
|
||||
FILE* pFile = fopen(pFilename, "wb");
|
||||
fwrite(&buf[0], buf.size(), 1, pFile);
|
||||
fclose(pFile);
|
||||
}
|
||||
#endif
|
||||
|
||||
struct crnd_chunk_tile_desc {
|
||||
// These values are in blocks
|
||||
@@ -3191,10 +3164,6 @@ class crn_unpacker {
|
||||
const uint32 chunks_x = (blocks_x + 1) >> 1;
|
||||
const uint32 chunks_y = (blocks_y + 1) >> 1;
|
||||
|
||||
#if CRND_CREATE_BYTE_STREAMS
|
||||
crnd_trace("Index stream: %u bytes\n", src_size_in_bytes);
|
||||
#endif
|
||||
|
||||
if (!m_codec.start_decoding(static_cast<const crnd::uint8*>(pSrc), src_size_in_bytes))
|
||||
return false;
|
||||
|
||||
@@ -3319,10 +3288,6 @@ class crn_unpacker {
|
||||
|
||||
CRND_HUFF_DECODE_BEGIN(m_codec);
|
||||
|
||||
#if CRND_CREATE_BYTE_STREAMS
|
||||
vector<uint8> byte_stream;
|
||||
#endif
|
||||
|
||||
for (uint32 i = 0; i < num_color_endpoints; i++) {
|
||||
uint32 da, db, dc, dd, de, df;
|
||||
CRND_HUFF_DECODE(m_codec, dm[0], da);
|
||||
@@ -3339,30 +3304,13 @@ class crn_unpacker {
|
||||
CRND_HUFF_DECODE(m_codec, dm[0], df);
|
||||
f = (f + df) & 31;
|
||||
|
||||
#if CRND_CREATE_BYTE_STREAMS
|
||||
byte_stream.push_back(da);
|
||||
byte_stream.push_back(db);
|
||||
byte_stream.push_back(dc);
|
||||
byte_stream.push_back(dd);
|
||||
byte_stream.push_back(de);
|
||||
byte_stream.push_back(df);
|
||||
#endif
|
||||
|
||||
if (c_crnd_little_endian_platform)
|
||||
*pDst++ = c | (b << 5U) | (a << 11U) | (f << 16U) | (e << 21U) | (d << 27U);
|
||||
else
|
||||
*pDst++ = f | (e << 5U) | (d << 11U) | (c << 16U) | (b << 21U) | (a << 27U);
|
||||
*pDst++ = c | (b << 5U) | (a << 11U) | (f << 16U) | (e << 21U) | (d << 27U);
|
||||
}
|
||||
|
||||
CRND_HUFF_DECODE_END(m_codec);
|
||||
|
||||
m_codec.stop_decoding();
|
||||
|
||||
#if CRND_CREATE_BYTE_STREAMS
|
||||
write_array_to_file(L"colorendpoints.bin", byte_stream);
|
||||
crnd_trace("color endpoints: %u\n", (uint)m_pHeader->m_color_endpoints.m_size);
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -3404,47 +3352,26 @@ class crn_unpacker {
|
||||
|
||||
CRND_HUFF_DECODE_BEGIN(m_codec);
|
||||
|
||||
#if CRND_CREATE_BYTE_STREAMS
|
||||
vector<uint8> byte_stream;
|
||||
#endif
|
||||
|
||||
for (uint32 i = 0; i < num_color_selectors; i++) {
|
||||
for (uint32 j = 0; j < 8; j++) {
|
||||
int32 sym;
|
||||
CRND_HUFF_DECODE(m_codec, dm, sym);
|
||||
|
||||
#if CRND_CREATE_BYTE_STREAMS
|
||||
byte_stream.push_back(sym);
|
||||
#endif
|
||||
|
||||
cur[j * 2 + 0] = (delta0[sym] + cur[j * 2 + 0]) & 3;
|
||||
cur[j * 2 + 1] = (delta1[sym] + cur[j * 2 + 1]) & 3;
|
||||
}
|
||||
|
||||
if (c_crnd_little_endian_platform) {
|
||||
*pDst++ =
|
||||
(pFrom_linear[cur[0]]) | (pFrom_linear[cur[1]] << 2) | (pFrom_linear[cur[2]] << 4) | (pFrom_linear[cur[3]] << 6) |
|
||||
(pFrom_linear[cur[4]] << 8) | (pFrom_linear[cur[5]] << 10) | (pFrom_linear[cur[6]] << 12) | (pFrom_linear[cur[7]] << 14) |
|
||||
(pFrom_linear[cur[8]] << 16) | (pFrom_linear[cur[9]] << 18) | (pFrom_linear[cur[10]] << 20) | (pFrom_linear[cur[11]] << 22) |
|
||||
(pFrom_linear[cur[12]] << 24) | (pFrom_linear[cur[13]] << 26) | (pFrom_linear[cur[14]] << 28) | (pFrom_linear[cur[15]] << 30);
|
||||
} else {
|
||||
*pDst++ =
|
||||
(pFrom_linear[cur[8]]) | (pFrom_linear[cur[9]] << 2) | (pFrom_linear[cur[10]] << 4) | (pFrom_linear[cur[11]] << 6) |
|
||||
(pFrom_linear[cur[12]] << 8) | (pFrom_linear[cur[13]] << 10) | (pFrom_linear[cur[14]] << 12) | (pFrom_linear[cur[15]] << 14) |
|
||||
(pFrom_linear[cur[0]] << 16) | (pFrom_linear[cur[1]] << 18) | (pFrom_linear[cur[2]] << 20) | (pFrom_linear[cur[3]] << 22) |
|
||||
(pFrom_linear[cur[4]] << 24) | (pFrom_linear[cur[5]] << 26) | (pFrom_linear[cur[6]] << 28) | (pFrom_linear[cur[7]] << 30);
|
||||
}
|
||||
*pDst++ =
|
||||
(pFrom_linear[cur[0]]) | (pFrom_linear[cur[1]] << 2) | (pFrom_linear[cur[2]] << 4) | (pFrom_linear[cur[3]] << 6) |
|
||||
(pFrom_linear[cur[4]] << 8) | (pFrom_linear[cur[5]] << 10) | (pFrom_linear[cur[6]] << 12) | (pFrom_linear[cur[7]] << 14) |
|
||||
(pFrom_linear[cur[8]] << 16) | (pFrom_linear[cur[9]] << 18) | (pFrom_linear[cur[10]] << 20) | (pFrom_linear[cur[11]] << 22) |
|
||||
(pFrom_linear[cur[12]] << 24) | (pFrom_linear[cur[13]] << 26) | (pFrom_linear[cur[14]] << 28) | (pFrom_linear[cur[15]] << 30);
|
||||
}
|
||||
|
||||
CRND_HUFF_DECODE_END(m_codec);
|
||||
|
||||
m_codec.stop_decoding();
|
||||
|
||||
#if CRND_CREATE_BYTE_STREAMS
|
||||
write_array_to_file(L"colorselectors.bin", byte_stream);
|
||||
crnd_trace("color selectors: %u\n", (uint)m_pHeader->m_color_selectors.m_size);
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -3607,12 +3534,6 @@ class crn_unpacker {
|
||||
|
||||
CRND_HUFF_DECODE_BEGIN(m_codec);
|
||||
|
||||
#if CRND_CREATE_BYTE_STREAMS
|
||||
vector<uint8> tile_encoding_stream;
|
||||
vector<uint8> endpoint_indices_stream;
|
||||
vector<uint8> selector_indices_stream;
|
||||
#endif
|
||||
|
||||
for (uint32 f = 0; f < num_faces; f++) {
|
||||
uint8* CRND_RESTRICT pRow = pDst[f];
|
||||
|
||||
@@ -3638,11 +3559,6 @@ class crn_unpacker {
|
||||
|
||||
if (chunk_encoding_bits == 1) {
|
||||
CRND_HUFF_DECODE(m_codec, m_chunk_encoding_dm, chunk_encoding_bits);
|
||||
#if CRND_CREATE_BYTE_STREAMS
|
||||
tile_encoding_stream.push_back(chunk_encoding_bits & 7);
|
||||
tile_encoding_stream.push_back((chunk_encoding_bits >> 3) & 7);
|
||||
tile_encoding_stream.push_back((chunk_encoding_bits >> 6) & 7);
|
||||
#endif
|
||||
chunk_encoding_bits |= 512;
|
||||
}
|
||||
|
||||
@@ -3654,9 +3570,6 @@ class crn_unpacker {
|
||||
for (uint32 i = 0; i < num_tiles; i++) {
|
||||
uint32 delta;
|
||||
CRND_HUFF_DECODE(m_codec, m_endpoint_delta_dm[0], delta);
|
||||
#if CRND_CREATE_BYTE_STREAMS
|
||||
endpoint_indices_stream.push_back(delta);
|
||||
#endif
|
||||
prev_color_endpoint_index += delta;
|
||||
limit(prev_color_endpoint_index, num_color_endpoints);
|
||||
color_endpoints[i] = m_color_endpoints[prev_color_endpoint_index];
|
||||
@@ -3668,74 +3581,17 @@ class crn_unpacker {
|
||||
|
||||
uint32* CRND_RESTRICT pD = (uint32*)pBlock;
|
||||
|
||||
if ((!skip_bottom_row) && (!skip_right_col)) {
|
||||
//CRND_ASSERT( ((uint8*)&pD[4 + row_pitch_in_dwords] - pDst) <= dst_size_in_bytes );
|
||||
for (uint32 by = 0; by < 2; by++) {
|
||||
pD = (uint32*)((uint8*)pBlock + row_pitch_in_bytes * by);
|
||||
for (uint32 bx = 0; bx < 2; bx++, pD += 2) {
|
||||
uint32 delta;
|
||||
CRND_HUFF_DECODE(m_codec, m_selector_delta_dm[0], delta);
|
||||
prev_color_selector_index += delta;
|
||||
limit(prev_color_selector_index, num_color_selectors);
|
||||
|
||||
pD[0] = color_endpoints[pTile_indices[0]];
|
||||
CRND_WRITE_BARRIER
|
||||
uint32 delta0;
|
||||
CRND_HUFF_DECODE(m_codec, m_selector_delta_dm[0], delta0);
|
||||
#if CRND_CREATE_BYTE_STREAMS
|
||||
selector_indices_stream.push_back(delta0);
|
||||
#endif
|
||||
prev_color_selector_index += delta0;
|
||||
limit(prev_color_selector_index, num_color_selectors);
|
||||
pD[1] = m_color_selectors[prev_color_selector_index];
|
||||
CRND_WRITE_BARRIER
|
||||
|
||||
pD[2] = color_endpoints[pTile_indices[1]];
|
||||
CRND_WRITE_BARRIER
|
||||
uint32 delta1;
|
||||
CRND_HUFF_DECODE(m_codec, m_selector_delta_dm[0], delta1);
|
||||
#if CRND_CREATE_BYTE_STREAMS
|
||||
selector_indices_stream.push_back(delta1);
|
||||
#endif
|
||||
prev_color_selector_index += delta1;
|
||||
limit(prev_color_selector_index, num_color_selectors);
|
||||
pD[3] = m_color_selectors[prev_color_selector_index];
|
||||
CRND_WRITE_BARRIER
|
||||
|
||||
pD[0 + row_pitch_in_dwords] = color_endpoints[pTile_indices[2]];
|
||||
CRND_WRITE_BARRIER
|
||||
uint32 delta2;
|
||||
CRND_HUFF_DECODE(m_codec, m_selector_delta_dm[0], delta2);
|
||||
#if CRND_CREATE_BYTE_STREAMS
|
||||
selector_indices_stream.push_back(delta2);
|
||||
#endif
|
||||
prev_color_selector_index += delta2;
|
||||
limit(prev_color_selector_index, num_color_selectors);
|
||||
pD[1 + row_pitch_in_dwords] = m_color_selectors[prev_color_selector_index];
|
||||
CRND_WRITE_BARRIER
|
||||
|
||||
pD[2 + row_pitch_in_dwords] = color_endpoints[pTile_indices[3]];
|
||||
CRND_WRITE_BARRIER
|
||||
uint32 delta3;
|
||||
CRND_HUFF_DECODE(m_codec, m_selector_delta_dm[0], delta3);
|
||||
#if CRND_CREATE_BYTE_STREAMS
|
||||
selector_indices_stream.push_back(delta3);
|
||||
#endif
|
||||
prev_color_selector_index += delta3;
|
||||
limit(prev_color_selector_index, num_color_selectors);
|
||||
pD[3 + row_pitch_in_dwords] = m_color_selectors[prev_color_selector_index];
|
||||
CRND_WRITE_BARRIER
|
||||
} else {
|
||||
for (uint32 by = 0; by < 2; by++) {
|
||||
pD = (uint32*)((uint8*)pBlock + row_pitch_in_bytes * by);
|
||||
for (uint32 bx = 0; bx < 2; bx++, pD += 2) {
|
||||
uint32 delta;
|
||||
CRND_HUFF_DECODE(m_codec, m_selector_delta_dm[0], delta);
|
||||
#if CRND_CREATE_BYTE_STREAMS
|
||||
selector_indices_stream.push_back(delta);
|
||||
#endif
|
||||
prev_color_selector_index += delta;
|
||||
limit(prev_color_selector_index, num_color_selectors);
|
||||
|
||||
if (!((bx && skip_right_col) || (by && skip_bottom_row))) {
|
||||
pD[0] = color_endpoints[pTile_indices[bx + by * 2]];
|
||||
CRND_WRITE_BARRIER
|
||||
pD[1] = m_color_selectors[prev_color_selector_index];
|
||||
CRND_WRITE_BARRIER
|
||||
}
|
||||
if (!((bx && skip_right_col) || (by && skip_bottom_row))) {
|
||||
pD[0] = color_endpoints[pTile_indices[bx + by * 2]];
|
||||
pD[1] = m_color_selectors[prev_color_selector_index];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3752,12 +3608,6 @@ class crn_unpacker {
|
||||
|
||||
CRND_HUFF_DECODE_END(m_codec);
|
||||
|
||||
#if CRND_CREATE_BYTE_STREAMS
|
||||
write_array_to_file(L"tile_encodings.bin", tile_encoding_stream);
|
||||
write_array_to_file(L"endpoint_indices.bin", endpoint_indices_stream);
|
||||
write_array_to_file(L"selector_indices.bin", selector_indices_stream);
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -3857,25 +3707,10 @@ class crn_unpacker {
|
||||
const uint32 tile_index = pTile_indices[bx + by * 2];
|
||||
const uint16* pAlpha_selectors = &m_alpha_selectors[prev_alpha_selector_index * 3];
|
||||
|
||||
#ifdef CRND_BIG_ENDIAN_PLATFORM
|
||||
pD[0] = (alpha_endpoints[tile_index] << 16) | pAlpha_selectors[0];
|
||||
CRND_WRITE_BARRIER
|
||||
pD[1] = (pAlpha_selectors[1] << 16) | pAlpha_selectors[2];
|
||||
CRND_WRITE_BARRIER
|
||||
pD[2] = color_endpoints[tile_index];
|
||||
CRND_WRITE_BARRIER
|
||||
pD[3] = m_color_selectors[prev_color_selector_index];
|
||||
CRND_WRITE_BARRIER
|
||||
#else
|
||||
pD[0] = alpha_endpoints[tile_index] | (pAlpha_selectors[0] << 16);
|
||||
CRND_WRITE_BARRIER
|
||||
pD[1] = pAlpha_selectors[1] | (pAlpha_selectors[2] << 16);
|
||||
CRND_WRITE_BARRIER
|
||||
pD[2] = color_endpoints[tile_index];
|
||||
CRND_WRITE_BARRIER
|
||||
pD[3] = m_color_selectors[prev_color_selector_index];
|
||||
CRND_WRITE_BARRIER
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3992,25 +3827,10 @@ class crn_unpacker {
|
||||
const uint16* pAlpha0_selectors = &m_alpha_selectors[prev_alpha0_selector_index * 3];
|
||||
const uint16* pAlpha1_selectors = &m_alpha_selectors[prev_alpha1_selector_index * 3];
|
||||
|
||||
#ifdef CRND_BIG_ENDIAN_PLATFORM
|
||||
pD[0] = (alpha0_endpoints[tile_index] << 16) | pAlpha0_selectors[0];
|
||||
CRND_WRITE_BARRIER
|
||||
pD[1] = (pAlpha0_selectors[1] << 16) | pAlpha0_selectors[2];
|
||||
CRND_WRITE_BARRIER
|
||||
pD[2] = (alpha1_endpoints[tile_index] << 16) | pAlpha1_selectors[0];
|
||||
CRND_WRITE_BARRIER
|
||||
pD[3] = (pAlpha1_selectors[1] << 16) | pAlpha1_selectors[2];
|
||||
CRND_WRITE_BARRIER
|
||||
#else
|
||||
pD[0] = alpha0_endpoints[tile_index] | (pAlpha0_selectors[0] << 16);
|
||||
CRND_WRITE_BARRIER
|
||||
pD[1] = pAlpha0_selectors[1] | (pAlpha0_selectors[2] << 16);
|
||||
CRND_WRITE_BARRIER
|
||||
pD[2] = alpha1_endpoints[tile_index] | (pAlpha1_selectors[0] << 16);
|
||||
CRND_WRITE_BARRIER
|
||||
pD[3] = pAlpha1_selectors[1] | (pAlpha1_selectors[2] << 16);
|
||||
CRND_WRITE_BARRIER
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4108,17 +3928,8 @@ class crn_unpacker {
|
||||
const uint32 tile_index = pTile_indices[bx + by * 2];
|
||||
const uint16* pAlpha0_selectors = &m_alpha_selectors[prev_alpha0_selector_index * 3];
|
||||
|
||||
#if CRND_BIG_ENDIAN_PLATFORM
|
||||
pD[0] = (alpha0_endpoints[tile_index] << 16) | pAlpha0_selectors[0];
|
||||
CRND_WRITE_BARRIER
|
||||
pD[1] = (pAlpha0_selectors[1] << 16) | pAlpha0_selectors[2];
|
||||
CRND_WRITE_BARRIER
|
||||
#else
|
||||
pD[0] = alpha0_endpoints[tile_index] | (pAlpha0_selectors[0] << 16);
|
||||
CRND_WRITE_BARRIER
|
||||
pD[1] = pAlpha0_selectors[1] | (pAlpha0_selectors[2] << 16);
|
||||
CRND_WRITE_BARRIER
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user