mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-14 21:37:52 -07:00
CustomTexture: Drop old texture format.
This commit is contained in:
parent
0b466249e0
commit
a5a0599145
@ -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)
|
||||
|
@ -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();
|
||||
|
@ -44,8 +44,6 @@ static std::unordered_map<std::string, std::shared_ptr<HiresTexture>> 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<u32>(min, texture[i] & 0xf);
|
||||
min = std::min<u32>(min, texture[i] >> 4);
|
||||
max = std::max<u32>(max, texture[i] & 0xf);
|
||||
max = std::max<u32>(max, texture[i] >> 4);
|
||||
}
|
||||
break;
|
||||
case 256 * 2:
|
||||
for (size_t i = 0; i < texture_size; i++)
|
||||
{
|
||||
min = std::min<u32>(min, texture[i]);
|
||||
max = std::max<u32>(max, texture[i]);
|
||||
}
|
||||
break;
|
||||
case 16384 * 2:
|
||||
for (size_t i = 0; i < texture_size / 2; i++)
|
||||
{
|
||||
min = std::min<u32>(min, Common::swap16(((u16*)texture)[i]) & 0x3fff);
|
||||
max = std::max<u32>(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<u32>(min, texture[i] & 0xf);
|
||||
min = std::min<u32>(min, texture[i] >> 4);
|
||||
max = std::max<u32>(max, texture[i] & 0xf);
|
||||
max = std::max<u32>(max, texture[i] >> 4);
|
||||
}
|
||||
break;
|
||||
case 256 * 2:
|
||||
for (size_t i = 0; i < texture_size; i++)
|
||||
{
|
||||
min = std::min<u32>(min, texture[i]);
|
||||
max = std::max<u32>(max, texture[i]);
|
||||
}
|
||||
break;
|
||||
case 16384 * 2:
|
||||
for (size_t i = 0; i < texture_size / 2; i++)
|
||||
{
|
||||
min = std::min<u32>(min, Common::swap16(((u16*)texture)[i]) & 0x3fff);
|
||||
max = std::max<u32>(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<int>(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<int>(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)
|
||||
|
Loading…
Reference in New Issue
Block a user