summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/Src/TextureDecoder.cpp
diff options
context:
space:
mode:
authorhrydgard <hrydgard@gmail.com>2008-11-25 23:56:57 +0000
committerhrydgard <hrydgard@gmail.com>2008-11-25 23:56:57 +0000
commitd0a48f654ae010d8a96d5a124514efa27e620f6c (patch)
tree14b9948550f53d495f2d3aad7a40f316f5d75a71 /Source/Core/VideoCommon/Src/TextureDecoder.cpp
parenta95e80468160c36f9bdef08f45461ed0b79e887d (diff)
Improve safe texture cache - now using sparse CRC to identify textures. Far less video glitches - metroid intro looks good.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1298 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/VideoCommon/Src/TextureDecoder.cpp')
-rw-r--r--Source/Core/VideoCommon/Src/TextureDecoder.cpp23
1 files changed, 23 insertions, 0 deletions
diff --git a/Source/Core/VideoCommon/Src/TextureDecoder.cpp b/Source/Core/VideoCommon/Src/TextureDecoder.cpp
index 295577ced7..f094139d27 100644
--- a/Source/Core/VideoCommon/Src/TextureDecoder.cpp
+++ b/Source/Core/VideoCommon/Src/TextureDecoder.cpp
@@ -57,6 +57,29 @@ int TexDecoder_GetTexelSizeInNibbles(int format)
}
}
+int TexDecoder_GetTextureSizeInBytes(int width, int height, int format)
+{
+ return (width * height * TexDecoder_GetTexelSizeInNibbles(format)) / 4;
+}
+
+u32 TexDecoder_GetSafeTextureHash(const u8 *src, int width, int height, int texformat)
+{
+ int sz = TexDecoder_GetTextureSizeInBytes(width, height, texformat);
+ u32 hash = 0x1337c0de;
+ if (sz < 2048) {
+ for (int i = 0; i < sz / 4; i += 13) {
+ hash = _rotl(hash, 17) ^ ((u32 *)src)[i];
+ }
+ return hash;
+ } else {
+ int step = sz / 13 / 4;
+ for (int i = 0; i < sz / 4; i += step) {
+ hash = _rotl(hash, 17) ^ ((u32 *)src)[i];
+ }
+ }
+ return hash;
+}
+
int TexDecoder_GetBlockWidthInTexels(int format)
{
switch (format) {