From cf53948cf6ee5cc570b36713f290c936fac7e960 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 30 Apr 2016 14:19:23 -0700 Subject: [PATCH] Implement some initial hashing so it's not broken. --- GPU/Common/TextureReplacer.cpp | 21 ++++++++++++++++++++- GPU/Common/TextureReplacer.h | 2 ++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/GPU/Common/TextureReplacer.cpp b/GPU/Common/TextureReplacer.cpp index 423780d32e..67c1beff6e 100644 --- a/GPU/Common/TextureReplacer.cpp +++ b/GPU/Common/TextureReplacer.cpp @@ -15,10 +15,12 @@ // Official git repository and contact information can be found at // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. +#include "ext/xxhash.h" #include "Common/FileUtil.h" #include "Core/Config.h" #include "Core/System.h" #include "Core/ELF/ParamSFO.h" +#include "GPU/Common/TextureDecoder.h" #include "GPU/Common/TextureReplacer.h" TextureReplacer::TextureReplacer() : enabled_(false) { @@ -51,7 +53,19 @@ void TextureReplacer::NotifyConfigChanged() { u32 TextureReplacer::ComputeHash(u32 addr, int bufw, int w, int h, GETextureFormat fmt, u16 maxSeenV) { _dbg_assert_msg_(G3D, enabled_, "Replacement not enabled"); - return 0; + + if (!LookupHashRange(addr, w, h)) { + // There wasn't any hash range, let's fall back to maxSeenV logic. + if (h == 512 && maxSeenV < 512 && maxSeenV != 0) { + h = (int)maxSeenV; + } + } + + // TODO: In order to have the most stable hash possible, skip space between w/bufw? + // TODO: Use hash based on ini file, or always crc32c, or etc. + const u32 sizeInRAM = (textureBitsPerPixel[fmt] * bufw * h) / 8; + const u32 *checkp = (const u32 *)Memory::GetPointer(addr); + return DoQuickTexHash(checkp, sizeInRAM); } ReplacedTexture TextureReplacer::FindReplacement(u32 hash) { @@ -77,6 +91,11 @@ void TextureReplacer::NotifyTextureDecoded(u32 hash, const void *data, int pitch // TODO } +bool TextureReplacer::LookupHashRange(u32 addr, int &w, int &h) { + // TODO: Pull from table loaded via ini. + return false; +} + void ReplacedTexture::Load(int level, void *out, int rowPitch) { _assert_msg_(G3D, (size_t)level < levels_.size(), "Invalid miplevel"); _assert_msg_(G3D, out != nullptr && rowPitch > 0, "Invalid out/pitch"); diff --git a/GPU/Common/TextureReplacer.h b/GPU/Common/TextureReplacer.h index 78ccc97175..5d2ce7026c 100644 --- a/GPU/Common/TextureReplacer.h +++ b/GPU/Common/TextureReplacer.h @@ -102,6 +102,8 @@ public: void NotifyTextureDecoded(u32 hash, const void *data, int pitch, int w, int h, ReplacedTextureFormat fmt); protected: + bool LookupHashRange(u32 addr, int &w, int &h); + bool enabled_; std::string gameID_; std::string basePath_;