mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-19 02:36:27 +01:00
Change the recent speedup to the hashing function to fall back to the old version for custom textures.
Re-fixed custom textures higher than 1024x1024. (It must have accidentally got reverted somewhere during the video plugin merge) git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7064 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
f7d757b46e
commit
cd9e6a8d23
@ -133,18 +133,23 @@ u64 GetCRC32(const u8 *src, int len, u32 samples)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 GetHash64(const u8 *src, int len, u32 samples)
|
u64 GetHash64(const u8 *src, int len, u32 samples, bool legacy)
|
||||||
{
|
{
|
||||||
const u64 m = 0xc6a4a7935bd1e995;
|
const u64 m = 0xc6a4a7935bd1e995;
|
||||||
u64 h = len * m;
|
u64 h = len * m;
|
||||||
|
|
||||||
#if _M_SSE >= 0x402
|
#if _M_SSE >= 0x402
|
||||||
if (cpu_info.bSSE4_2)
|
if (cpu_info.bSSE4_2 && !legacy)
|
||||||
{
|
{
|
||||||
h = GetCRC32(src, len, samples);
|
h = GetCRC32(src, len, samples);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#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. */
|
||||||
{
|
{
|
||||||
const int r = 47;
|
const int r = 47;
|
||||||
u32 Step = (len / 8);
|
u32 Step = (len / 8);
|
||||||
|
@ -25,5 +25,5 @@ u32 HashAdler32(const u8* data, size_t len); // Fairly accurate, slightl
|
|||||||
u32 HashFNV(const u8* ptr, int length); // Another fast and decent hash
|
u32 HashFNV(const u8* ptr, int length); // Another fast and decent hash
|
||||||
u32 HashEctor(const u8* ptr, int length); // JUNK. DO NOT USE FOR NEW THINGS
|
u32 HashEctor(const u8* ptr, int length); // JUNK. DO NOT USE FOR NEW THINGS
|
||||||
u64 GetCRC32(const u8 *src, int len, u32 samples); // SSE4.2 version of CRC32
|
u64 GetCRC32(const u8 *src, int len, u32 samples); // SSE4.2 version of CRC32
|
||||||
u64 GetHash64(const u8 *src, int len, u32 samples);
|
u64 GetHash64(const u8 *src, int len, u32 samples, bool legacy = false);
|
||||||
#endif // _HASH_H_
|
#endif // _HASH_H_
|
||||||
|
@ -17,7 +17,7 @@ extern int frameCount;
|
|||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
TEMP_SIZE = (1024 * 1024 * 4),
|
TEMP_SIZE = (2048 * 2048 * 4),
|
||||||
TEXTURE_KILL_THRESHOLD = 200,
|
TEXTURE_KILL_THRESHOLD = 200,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -180,6 +180,7 @@ TextureCache::TCacheEntryBase* TextureCache::Load(unsigned int stage,
|
|||||||
const u32 texture_size = TexDecoder_GetTextureSizeInBytes(expandedWidth, expandedHeight, texformat);
|
const u32 texture_size = TexDecoder_GetTextureSizeInBytes(expandedWidth, expandedHeight, texformat);
|
||||||
const u32 palette_size = TexDecoder_GetPaletteSize(texformat);
|
const u32 palette_size = TexDecoder_GetPaletteSize(texformat);
|
||||||
bool texture_is_dynamic = false;
|
bool texture_is_dynamic = false;
|
||||||
|
bool forceLegacyHash = (g_ActiveConfig.bHiresTextures || g_ActiveConfig.bDumpTextures);
|
||||||
unsigned int texLevels;
|
unsigned int texLevels;
|
||||||
PC_TexFormat pcfmt = PC_TEX_FMT_NONE;
|
PC_TexFormat pcfmt = PC_TEX_FMT_NONE;
|
||||||
|
|
||||||
@ -190,9 +191,9 @@ TextureCache::TCacheEntryBase* TextureCache::Load(unsigned int stage,
|
|||||||
full_format = texformat | (tlutfmt << 16);
|
full_format = texformat | (tlutfmt << 16);
|
||||||
|
|
||||||
// hires texture loading and texture dumping require accurate hashes
|
// hires texture loading and texture dumping require accurate hashes
|
||||||
if (g_ActiveConfig.bSafeTextureCache || g_ActiveConfig.bHiresTextures || g_ActiveConfig.bDumpTextures)
|
if (g_ActiveConfig.bSafeTextureCache || forceLegacyHash)
|
||||||
{
|
{
|
||||||
texHash = GetHash64(ptr, texture_size, g_ActiveConfig.iSafeTextureCache_ColorSamples);
|
texHash = GetHash64(ptr, texture_size, g_ActiveConfig.iSafeTextureCache_ColorSamples, forceLegacyHash);
|
||||||
|
|
||||||
if (isC4_C8_C14X2)
|
if (isC4_C8_C14X2)
|
||||||
{
|
{
|
||||||
@ -205,7 +206,7 @@ TextureCache::TCacheEntryBase* TextureCache::Load(unsigned int stage,
|
|||||||
// we must make sure that texture with different tluts get different IDs.
|
// we must make sure that texture with different tluts get different IDs.
|
||||||
|
|
||||||
const u64 tlutHash = GetHash64(texMem + tlutaddr, palette_size,
|
const u64 tlutHash = GetHash64(texMem + tlutaddr, palette_size,
|
||||||
g_ActiveConfig.iSafeTextureCache_ColorSamples);
|
g_ActiveConfig.iSafeTextureCache_ColorSamples, forceLegacyHash);
|
||||||
|
|
||||||
texHash ^= tlutHash;
|
texHash ^= tlutHash;
|
||||||
|
|
||||||
@ -285,7 +286,7 @@ TextureCache::TCacheEntryBase* TextureCache::Load(unsigned int stage,
|
|||||||
unsigned int newWidth = width;
|
unsigned int newWidth = width;
|
||||||
unsigned int newHeight = height;
|
unsigned int newHeight = height;
|
||||||
|
|
||||||
sprintf(texPathTemp, "%s_%08llx_%i", SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str(), texHash, texformat);
|
sprintf(texPathTemp, "%s_%08lx_%i", SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str(), (u32) (texHash & 0x00000000FFFFFFFFLL), texformat);
|
||||||
pcfmt = HiresTextures::GetHiresTex(texPathTemp, &newWidth, &newHeight, texformat, temp);
|
pcfmt = HiresTextures::GetHiresTex(texPathTemp, &newWidth, &newHeight, texformat, temp);
|
||||||
|
|
||||||
if (pcfmt != PC_TEX_FMT_NONE)
|
if (pcfmt != PC_TEX_FMT_NONE)
|
||||||
@ -386,7 +387,7 @@ TextureCache::TCacheEntryBase* TextureCache::Load(unsigned int stage,
|
|||||||
if (false == File::Exists(szDir) || false == File::IsDirectory(szDir))
|
if (false == File::Exists(szDir) || false == File::IsDirectory(szDir))
|
||||||
File::CreateDir(szDir);
|
File::CreateDir(szDir);
|
||||||
|
|
||||||
sprintf(szTemp, "%s/%s_%08llx_%i.png", szDir, SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str(), texHash, texformat);
|
sprintf(szTemp, "%s/%s_%08lx_%i.png", szDir, SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str(), (u32) (texHash & 0x00000000FFFFFFFFLL), texformat);
|
||||||
|
|
||||||
if (false == File::Exists(szTemp))
|
if (false == File::Exists(szTemp))
|
||||||
entry->Save(szTemp);
|
entry->Save(szTemp);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user