1) fix texture caching issue (ie. MP1 "Main menu" fps drop).

2) "fix" Pokemon Coloseum font issue in SafeTextureCache mode. We should kill the unsafe one. TODO: get why it works :p
3) readjust FAKE_GP_WATCHDOG_PERIOD for omega's ZTP to boot in DC.
Too late to split, sorry.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1871 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
memberTwo.mb2 2009-01-14 23:55:55 +00:00
parent 1ba2708bbd
commit e8edc685ba
4 changed files with 35 additions and 47 deletions

View File

@ -132,11 +132,10 @@ int
IPC_HLE_PERIOD = GetTicksPerSecond() / 250,
// For DC watchdog hack
// Once every 10 frame-period seems to be enough (arbitrary taking 60fps as the ref).
// Once every 4 frame-period seems to be enough (arbitrary taking 60fps as the ref).
// TODO: make it VI output frame rate compliant (30/60 and 25/50)
// Assuming game's frame-finish-watchdog wait more than 10 emulated frame-period before starting its mess.
// Note: 1/4 sec is the very maximum for ZTP to work in DC... 1/6 for safety.
FAKE_GP_WATCHDOG_PERIOD = GetTicksPerSecond() / 6;
FAKE_GP_WATCHDOG_PERIOD = GetTicksPerSecond() / 15;
///////////////////////////////////

View File

@ -65,11 +65,12 @@ int TexDecoder_GetTextureSizeInBytes(int width, int height, int format)
return (width * height * TexDecoder_GetTexelSizeInNibbles(format)) / 2;
}
u32 TexDecoder_GetTlutHash(const u16 *src, int len)
u32 TexDecoder_GetTlutHash(const u8* src, int len)
{
u32 hash = 0xbeefbabe;
for (int i = 0; i < len / 2; i += 2) {
hash = _rotl(hash, 17) ^ ((u32 *)src)[i];
for (int i = 0; i < len ; i++) {
hash = _rotl(hash, 7) ^ src[i];
hash += 7;
}
return hash;
}

View File

@ -78,7 +78,7 @@ enum PC_TexFormat
PC_TexFormat TexDecoder_Decode(u8 *dst, const u8 *src, int width, int height, int texformat, int tlutaddr, int tlutfmt);
u32 TexDecoder_GetSafeTextureHash(const u8 *src, int width, int height, int texformat, u32 seed=0);
u32 TexDecoder_GetTlutHash(const u16 *src, int len);
u32 TexDecoder_GetTlutHash(const u8* src, int len);
void TexDecoder_SetTexFmtOverlayOptions(bool enable, bool center);

View File

@ -219,65 +219,50 @@ void TextureMngr::Cleanup()
TextureMngr::TCacheEntry* TextureMngr::Load(int texstage, u32 address, int width, int height, int format, int tlutaddr, int tlutfmt)
{
// TODO: - clean this up when ready to kill old "unsafe texture cache"
// - fix pokemun coloseum font for bSafeTextureCache (works with !bSafeTextureCache)
// TODO (mb2): get why other fmt needs a tlut hash too (pokemon coloseum font -> fmt 1 or 8 or 14 iirc)
if (address == 0)
return NULL;
TexCache::iterator iter = textures.find(address);
TexMode0 &tm0 = bpmem.tex[texstage > 3].texMode0[texstage & 3];
u8 *ptr = g_VideoInitialize.pGetMemoryPointer(address);
u32 hash_value;
// Needed for texture format using tlut.
// TODO: Slower == Safer. Recalculate tlut length for each cases just to be sure.
u32 hashseed = 0;
switch (format) {
case GX_TF_C4:
hashseed = TexDecoder_GetTlutHash((u16*)(texMem + tlutaddr), 128);
break;
case GX_TF_C8:
hashseed = TexDecoder_GetTlutHash((u16*)(texMem + tlutaddr), 256);
break;
case GX_TF_C14X2:
hashseed = TexDecoder_GetTlutHash((u16*)(texMem + tlutaddr), 512);
break;
}
int palSize = TexDecoder_GetPaletteSize(format);
u32 palhash = 0xc0debabe;
if (palSize) {
if (palSize > 32)
palSize = 32; //let's not do excessive amount of checking
u8 *pal = g_VideoInitialize.pGetMemoryPointer(tlutaddr);
if (pal != 0) {
for (int i = 0; i < palSize; i++) {
palhash = _rotl(palhash,13);
palhash ^= pal[i];
palhash += 31;
}
}
}
u32 hashseed;
//if ( (format == GX_TF_C4) || (format == GX_TF_C8) || (format == GX_TF_C14X2) )
// tlut size mask can be up to 0x3FFF (GX_TF_C14X2) but Safer == Slower.
//hashseed = TexDecoder_GetTlutHash(&texMem[tlutaddr], TexDecoder_GetPaletteSize(format)&0x7FFF);
hashseed = TexDecoder_GetTlutHash(texMem + tlutaddr, 32);
//else
// hashseed = address;
int bs = TexDecoder_GetBlockWidthInTexels(format) - 1;
int expandedWidth = (width + bs) & (~bs);
if (g_Config.bSafeTextureCache)
hash_value = TexDecoder_GetSafeTextureHash(ptr, expandedWidth, height, format, hashseed);
bool skip_texture_create = false;
if (iter != textures.end()) {
TexCache::iterator iter = textures.find(g_Config.bSafeTextureCache ? hash_value : address);
if (iter != textures.end()) {
TCacheEntry &entry = iter->second;
u32 hash_value;
if (g_Config.bSafeTextureCache)
hash_value = TexDecoder_GetSafeTextureHash(ptr, expandedWidth, height, format, hashseed);
else
if (!g_Config.bSafeTextureCache)
hash_value = ((u32 *)ptr)[entry.hashoffset];
if (entry.isRenderTarget || (hash_value == entry.hash && palhash == entry.paletteHash)) {
if (entry.isRenderTarget || ((address == entry.addr) && (hash_value == entry.hash))) {
entry.frameCount = frameCount;
//glEnable(entry.isNonPow2?GL_TEXTURE_RECTANGLE_ARB:GL_TEXTURE_2D);
glBindTexture(entry.isNonPow2 ? GL_TEXTURE_RECTANGLE_ARB:GL_TEXTURE_2D, entry.texture);
if (entry.mode.hex != tm0.hex)
entry.SetTextureParameters(tm0);
return &entry;
//DebugLog("%cC addr: %08x | fmt: %i | e.hash: %08x | w:%04i h:%04i", g_Config.bSafeTextureCache ? 'S' : 'U'
// , address, format, entry.hash, width, height);
return &entry;
}
else
{
@ -302,17 +287,20 @@ TextureMngr::TCacheEntry* TextureMngr::Load(int texstage, u32 address, int width
PC_TexFormat dfmt = TexDecoder_Decode(temp, ptr, expandedWidth, height, format, tlutaddr, tlutfmt);
//Make an entry in the table
TCacheEntry& entry = textures[address];
TCacheEntry& entry = textures[ g_Config.bSafeTextureCache ? hash_value : address ];
entry.hashoffset = 0;
entry.paletteHash = palhash;
entry.paletteHash = hashseed;
entry.oldpixel = ((u32 *)ptr)[entry.hashoffset];
if (g_Config.bSafeTextureCache) {
entry.hash = TexDecoder_GetSafeTextureHash(ptr, expandedWidth, height, format, hashseed);
entry.hash = hash_value;
} else {
entry.hash = (u32)(((double)rand() / RAND_MAX) * 0xFFFFFFFF);
((u32 *)ptr)[entry.hashoffset] = entry.hash;
}
//DebugLog("%c addr: %08x | fmt: %i | e.hash: %08x | w:%04i h:%04i", g_Config.bSafeTextureCache ? 'S' : 'U'
// , address, format, entry.hash, width, height);
entry.addr = address;
entry.isRenderTarget = false;