diff --git a/src/GLideNHQ/TxCache.cpp b/src/GLideNHQ/TxCache.cpp index 449dc6a1..a3962a48 100644 --- a/src/GLideNHQ/TxCache.cpp +++ b/src/GLideNHQ/TxCache.cpp @@ -607,8 +607,12 @@ TxFileStorage::TxFileStorage(uint32 options, void TxFileStorage::buildFullPath() { - char cbuf[MAX_PATH * 2]; + char cbuf[MAX_PATH * 2]; +#ifdef RELATIVE_PATHS + tx_wstring filename = _filename; +#else tx_wstring filename = _cachePath + OSAL_DIR_SEPARATOR_STR + _filename; +#endif wcstombs(cbuf, filename.c_str(), MAX_PATH * 2); _fullPath = cbuf; } diff --git a/src/GLideNHQ/TxCache.h b/src/GLideNHQ/TxCache.h index 5596e12f..48228779 100644 --- a/src/GLideNHQ/TxCache.h +++ b/src/GLideNHQ/TxCache.h @@ -31,6 +31,33 @@ #include "TxInternal.h" #include "TxUtil.h" +struct Checksum +{ + union + { + uint64 _checksum; /* checksum hi:palette low:texture */ + struct + { + uint32 _low; + uint32 _hi; + }; + }; + + Checksum(uint64 checksum) : _checksum(checksum) {} + operator bool() { + return _checksum != 0; + } + operator uint64() { + return _checksum; + } + bool operator ==(const Checksum& rhs) { + return _checksum == rhs._checksum; + } + bool operator !=(const Checksum& rhs) { + return _checksum != rhs._checksum; + } +}; + class TxCacheImpl; class TxCache diff --git a/src/GLideNHQ/TxUtil.cpp b/src/GLideNHQ/TxUtil.cpp index fa6e4fce..2ce1820a 100644 --- a/src/GLideNHQ/TxUtil.cpp +++ b/src/GLideNHQ/TxUtil.cpp @@ -38,6 +38,11 @@ #include #endif +#define SWAP32(data) \ +( (((data) >> 24) & 0x000000FF) | (((data) >> 8) & 0x0000FF00) | \ + (((data) << 8) & 0x00FF0000) | (((data) << 24) & 0xFF000000) ) + + /* * Utilities ******************************************************************************/ @@ -140,6 +145,7 @@ TxUtil::checksum64(uint8 *src, int width, int height, int size, int rowStride, u * (unsigned short)(rdp.tiles[tile].format << 8 | rdp.tiles[tile].size), * bpl); */ + uint32 TxUtil::RiceCRC32(const uint8* src, int width, int height, int size, int rowStride) { @@ -193,6 +199,11 @@ loop1: while (x >= 0) { esi = *(uint32*)(src + x); + +#ifdef NATIVE + esi = SWAP32(esi); +#endif + esi ^= x; crc32Ret = (crc32Ret << 4) + ((crc32Ret >> 28) & 15); @@ -215,17 +226,18 @@ loop1: static uint8 CalculateMaxCI8b(const uint8* src, uint32 width, uint32 height, uint32 rowStride) { - uint8 val = 0; + uint8 max = 0; + for (uint32 y = 0; y < height; ++y) { const uint8 * buf = src + rowStride * y; - for (uint32 x = 0; x val) - val = buf[x]; - if (val == 0xFF) + for (uint32 x = 0; x < width; ++x) { + if (buf[x] > max) + max = buf[x]; + if (max == 0xFF) return 0xFF; } } - return val; + return max; } static @@ -236,7 +248,7 @@ uint8 CalculateMaxCI4b(const uint8* src, uint32 width, uint32 height, uint32 row width >>= 1; for (uint32 y = 0; y < height; ++y) { const uint8 * buf = src + rowStride * y; - for (uint32 x = 0; x> 4; val2 = buf[x] & 0xF; if (val1 > val) val = val1; diff --git a/src/RSP.cpp b/src/RSP.cpp index c1f2bf34..22ba0561 100644 --- a/src/RSP.cpp +++ b/src/RSP.cpp @@ -33,7 +33,11 @@ RSPInfo RSP; static void _ProcessDList() { +#ifdef NATIVE + for (int i = 0; !RSP.halt && i < 1000*1000*1000; ++i) { +#else while (!RSP.halt) { +#endif #ifndef NATIVE if ((RSP.PC[RSP.PCi] + sizeof(Gwords)) > RDRAMSize) { #ifdef DEBUG_DUMP diff --git a/src/native/Native.cpp b/src/native/Native.cpp index 9ef3d3be..55a2d2d8 100644 --- a/src/native/Native.cpp +++ b/src/native/Native.cpp @@ -18,6 +18,8 @@ static u64 g_originalWidth = START_WIDTH;//Size set by the end-user static u64 g_width = START_WIDTH;//Current size static u64 g_height = START_HEIGHT; +static int highres_enabled = 0;//1 if HD texture mode is enabled +static bool highres_hts = true; extern "C" { u64 gfx_width() @@ -139,6 +141,24 @@ extern "C" { RDRAMSize = (word)-1; api().RomOpen(romName); + + config.textureFilter.txHiresEnable = highres_enabled; + wsprintf(config.textureFilter.txCachePath, L"."); + config.textureFilter.txHiresTextureFileStorage = highres_hts ? 1 : 0; + } + + void gfx_switch_to_htc(bool enable) { + highres_hts = !enable; + config.textureFilter.txHiresTextureFileStorage = enable ? 0 : 1; + } + + bool gfx_is_highres_enabled() { + highres_enabled = 1; + return config.textureFilter.txHiresEnable; + } + + void gfx_highres_enable(bool enable) { + config.textureFilter.txHiresEnable = enable; } void gfx_force_43(bool enable) {