summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/Src/TextureDecoder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoCommon/Src/TextureDecoder.cpp')
-rw-r--r--Source/Core/VideoCommon/Src/TextureDecoder.cpp32
1 files changed, 31 insertions, 1 deletions
diff --git a/Source/Core/VideoCommon/Src/TextureDecoder.cpp b/Source/Core/VideoCommon/Src/TextureDecoder.cpp
index d49633609c..c6db5582bb 100644
--- a/Source/Core/VideoCommon/Src/TextureDecoder.cpp
+++ b/Source/Core/VideoCommon/Src/TextureDecoder.cpp
@@ -88,7 +88,7 @@ int TexDecoder_GetTextureSizeInBytes(int width, int height, int format)
return (width * height * TexDecoder_GetTexelSizeInNibbles(format)) / 2;
}
-u64 TexDecoder_GetTlutHash(const u8* src, int len)
+/*u64 TexDecoder_GetTlutHash(const u8* src, int len)
{
//char str[40000], st[20]; str[0]='\0';for (int i=0;i<len;i++){sprintf(st,"%02x ",src[i]);strcat(str,st);}
u64 hash = 0xbeefbabe1337c0de;
@@ -111,6 +111,36 @@ u64 TexDecoder_GetSafeTextureHash(const u8 *src, int width, int height, int texf
}
return hash;
}
+*/
+
+u32 TexDecoder_GetTlutHash(const u8* src, int len)
+{
+ //char str[40000], st[20]; str[0]='\0';for (int i=0;i<len;i++){sprintf(st,"%02x ",src[i]);strcat(str,st);}
+ u32 hash = 0xbeefbabe;
+ for (int i = 0; i < len / 4; i ++) {
+ hash = _rotl(hash, 7) ^ ((u32 *)src)[i];
+ hash += 7; // to add a bit more entropy/mess in here
+ }
+ return hash;
+}
+
+u32 TexDecoder_GetSafeTextureHash(const u8 *src, int width, int height, int texformat, u32 seed)
+{
+ int sz = TexDecoder_GetTextureSizeInBytes(width, height, texformat);
+ u32 hash = seed ? seed : 0x1337c0de;
+ if (sz < 2048) {
+ for (int i = 0; i < sz / 4; i += 13) {
+ hash = _rotl(hash, 19) ^ ((u32 *)src)[i];
+ }
+ return hash;
+ } else {
+ int step = sz / 23 / 4;
+ for (int i = 0; i < sz / 4; i += step) {
+ hash = _rotl(hash, 19) ^ ((u32 *)src)[i];
+ }
+ }
+ return hash;
+}
int TexDecoder_GetBlockWidthInTexels(u32 format)
{