From a5a05991458cd83b022491cf5ac020b7497272b9 Mon Sep 17 00:00:00 2001 From: degasus Date: Tue, 15 Nov 2016 22:25:35 +0100 Subject: [PATCH] CustomTexture: Drop old texture format. --- Source/Core/Common/Hash.cpp | 115 -------------------- Source/Core/Common/Hash.h | 1 - Source/Core/VideoCommon/HiresTextures.cpp | 127 +++++++++------------- 3 files changed, 49 insertions(+), 194 deletions(-) diff --git a/Source/Core/Common/Hash.cpp b/Source/Core/Common/Hash.cpp index 8ff20affe7..7074e12e55 100644 --- a/Source/Core/Common/Hash.cpp +++ b/Source/Core/Common/Hash.cpp @@ -332,64 +332,6 @@ static u64 GetCRC32(const u8* src, u32 len, u32 samples) #endif -/* - * NOTE: This hash function is used for custom texture loading/dumping, so - * it should not be changed, which would require all custom textures to be - * recalculated for their new hash values. If the hashing function is - * changed, make sure this one is still used when the legacy parameter is - * true. - */ -u64 GetHashHiresTexture(const u8* src, u32 len, u32 samples) -{ - const u64 m = 0xc6a4a7935bd1e995; - u64 h = len * m; - const int r = 47; - u32 Step = (len / 8); - const u64* data = (const u64*)src; - const u64* end = data + Step; - if (samples == 0) - samples = std::max(Step, 1u); - Step = Step / samples; - if (Step < 1) - Step = 1; - while (data < end) - { - u64 k = data[0]; - data += Step; - k *= m; - k ^= k >> r; - k *= m; - h ^= k; - h *= m; - } - - const u8* data2 = (const u8*)end; - - switch (len & 7) - { - case 7: - h ^= u64(data2[6]) << 48; - case 6: - h ^= u64(data2[5]) << 40; - case 5: - h ^= u64(data2[4]) << 32; - case 4: - h ^= u64(data2[3]) << 24; - case 3: - h ^= u64(data2[2]) << 16; - case 2: - h ^= u64(data2[1]) << 8; - case 1: - h ^= u64(data2[0]); - h *= m; - }; - - h ^= h >> r; - h *= m; - h ^= h >> r; - - return h; -} #else // CRC32 hash using the SSE4.2 instruction @@ -553,63 +495,6 @@ static u64 GetMurmurHash3(const u8* src, u32 len, u32 samples) return *((u64*)&out); } - -/* - * FIXME: The old 32-bit version of this hash made different hashes than the - * 64-bit version. Until someone can make a new version of the 32-bit one that - * makes identical hashes, this is just a c/p of the 64-bit one. - */ -u64 GetHashHiresTexture(const u8* src, u32 len, u32 samples) -{ - const u64 m = 0xc6a4a7935bd1e995ULL; - u64 h = len * m; - const int r = 47; - u32 Step = (len / 8); - const u64* data = (const u64*)src; - const u64* end = data + Step; - if (samples == 0) - samples = std::max(Step, 1u); - Step = Step / samples; - if (Step < 1) - Step = 1; - while (data < end) - { - u64 k = data[0]; - data += Step; - k *= m; - k ^= k >> r; - k *= m; - h ^= k; - h *= m; - } - - const u8* data2 = (const u8*)end; - - switch (len & 7) - { - case 7: - h ^= u64(data2[6]) << 48; - case 6: - h ^= u64(data2[5]) << 40; - case 5: - h ^= u64(data2[4]) << 32; - case 4: - h ^= u64(data2[3]) << 24; - case 3: - h ^= u64(data2[2]) << 16; - case 2: - h ^= u64(data2[1]) << 8; - case 1: - h ^= u64(data2[0]); - h *= m; - }; - - h ^= h >> r; - h *= m; - h ^= h >> r; - - return h; -} #endif u64 GetHash64(const u8* src, u32 len, u32 samples) diff --git a/Source/Core/Common/Hash.h b/Source/Core/Common/Hash.h index 4e5010d6ee..42f5741b40 100644 --- a/Source/Core/Common/Hash.h +++ b/Source/Core/Common/Hash.h @@ -11,6 +11,5 @@ u32 HashFletcher(const u8* data_u8, size_t length); // FAST. Length & 1 == 0. u32 HashAdler32(const u8* data, size_t len); // Fairly accurate, slightly slower u32 HashEctor(const u8* ptr, int length); // JUNK. DO NOT USE FOR NEW THINGS -u64 GetHashHiresTexture(const u8* src, u32 len, u32 samples = 0); u64 GetHash64(const u8* src, u32 len, u32 samples); void SetHash64Function(); diff --git a/Source/Core/VideoCommon/HiresTextures.cpp b/Source/Core/VideoCommon/HiresTextures.cpp index d658980999..6362636387 100644 --- a/Source/Core/VideoCommon/HiresTextures.cpp +++ b/Source/Core/VideoCommon/HiresTextures.cpp @@ -44,8 +44,6 @@ static std::unordered_map> s_textureC static std::mutex s_textureCacheMutex; static std::mutex s_textureCacheAquireMutex; // for high priority access static Common::Flag s_textureCacheAbortLoading; -static bool s_check_native_format; -static bool s_check_new_format; static std::thread s_prefetcher; @@ -57,9 +55,6 @@ HiresTexture::Level::Level() : data(nullptr, SOIL_free_image_data) void HiresTexture::Init() { - s_check_native_format = false; - s_check_new_format = false; - Update(); } @@ -112,12 +107,6 @@ void HiresTexture::Update() std::string filename; SplitPath(path, nullptr, &filename, nullptr); - if (filename.substr(0, code.length()) == code) - { - s_textureMap[filename] = {path, false}; - s_check_native_format = true; - } - if (filename.substr(0, s_format_prefix.length()) == s_format_prefix) { const size_t arb_index = filename.rfind("_arb"); @@ -125,7 +114,6 @@ void HiresTexture::Update() if (has_arbitrary_mipmaps) filename.erase(arb_index, 4); s_textureMap[filename] = {path, has_arbitrary_mipmaps}; - s_check_new_format = true; } } @@ -228,81 +216,64 @@ std::string HiresTexture::GenBaseName(const u8* texture, size_t texture_size, co size_t tlut_size, u32 width, u32 height, TextureFormat format, bool has_mipmaps, bool dump) { - std::string name = ""; - if (!dump && s_check_native_format) + if (!dump && s_textureMap.empty()) + return ""; + + // checking for min/max on paletted textures + u32 min = 0xffff; + u32 max = 0; + switch (tlut_size) { - // try to load the old format first - u64 tex_hash = GetHashHiresTexture(texture, (int)texture_size, - g_ActiveConfig.iSafeTextureCache_ColorSamples); - u64 tlut_hash = tlut_size ? GetHashHiresTexture(tlut, (int)tlut_size, - g_ActiveConfig.iSafeTextureCache_ColorSamples) : - 0; - name = StringFromFormat("%s_%08x_%i", SConfig::GetInstance().GetGameID().c_str(), - (u32)(tex_hash ^ tlut_hash), (u16)format); - if (s_textureMap.find(name) != s_textureMap.end()) + case 0: + break; + case 16 * 2: + for (size_t i = 0; i < texture_size; i++) { - return name; + min = std::min(min, texture[i] & 0xf); + min = std::min(min, texture[i] >> 4); + max = std::max(max, texture[i] & 0xf); + max = std::max(max, texture[i] >> 4); } + break; + case 256 * 2: + for (size_t i = 0; i < texture_size; i++) + { + min = std::min(min, texture[i]); + max = std::max(max, texture[i]); + } + break; + case 16384 * 2: + for (size_t i = 0; i < texture_size / 2; i++) + { + min = std::min(min, Common::swap16(((u16*)texture)[i]) & 0x3fff); + max = std::max(max, Common::swap16(((u16*)texture)[i]) & 0x3fff); + } + break; + } + if (tlut_size > 0) + { + tlut_size = 2 * (max + 1 - min); + tlut += 2 * min; } - if (dump || s_check_new_format) - { - // checking for min/max on paletted textures - u32 min = 0xffff; - u32 max = 0; - switch (tlut_size) - { - case 0: - break; - case 16 * 2: - for (size_t i = 0; i < texture_size; i++) - { - min = std::min(min, texture[i] & 0xf); - min = std::min(min, texture[i] >> 4); - max = std::max(max, texture[i] & 0xf); - max = std::max(max, texture[i] >> 4); - } - break; - case 256 * 2: - for (size_t i = 0; i < texture_size; i++) - { - min = std::min(min, texture[i]); - max = std::max(max, texture[i]); - } - break; - case 16384 * 2: - for (size_t i = 0; i < texture_size / 2; i++) - { - min = std::min(min, Common::swap16(((u16*)texture)[i]) & 0x3fff); - max = std::max(max, Common::swap16(((u16*)texture)[i]) & 0x3fff); - } - break; - } - if (tlut_size > 0) - { - tlut_size = 2 * (max + 1 - min); - tlut += 2 * min; - } + u64 tex_hash = XXH64(texture, texture_size, 0); + u64 tlut_hash = tlut_size ? XXH64(tlut, tlut_size, 0) : 0; - u64 tex_hash = XXH64(texture, texture_size, 0); - u64 tlut_hash = tlut_size ? XXH64(tlut, tlut_size, 0) : 0; + std::string basename = s_format_prefix + StringFromFormat("%dx%d%s_%016" PRIx64, width, height, + has_mipmaps ? "_m" : "", tex_hash); + std::string tlutname = tlut_size ? StringFromFormat("_%016" PRIx64, tlut_hash) : ""; + std::string formatname = StringFromFormat("_%d", static_cast(format)); + std::string fullname = basename + tlutname + formatname; - std::string basename = s_format_prefix + StringFromFormat("%dx%d%s_%016" PRIx64, width, height, - has_mipmaps ? "_m" : "", tex_hash); - std::string tlutname = tlut_size ? StringFromFormat("_%016" PRIx64, tlut_hash) : ""; - std::string formatname = StringFromFormat("_%d", static_cast(format)); - std::string fullname = basename + tlutname + formatname; + // try to match a wildcard template + if (!dump && s_textureMap.find(basename + "_*" + formatname) != s_textureMap.end()) + return basename + "_*" + formatname; - // try to match a wildcard template - if (!dump && s_textureMap.find(basename + "_*" + formatname) != s_textureMap.end()) - return basename + "_*" + formatname; + // else generate the complete texture + if (dump || s_textureMap.find(fullname) != s_textureMap.end()) + return fullname; - // else generate the complete texture - if (dump || s_textureMap.find(fullname) != s_textureMap.end()) - return fullname; - } - - return name; + return ""; } u32 HiresTexture::CalculateMipCount(u32 width, u32 height)