mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-07 03:13:49 +00:00
Add new fb validity check method: by checksum.
It is more safe than filling RDRAM with fillcolor, but not compatible with Mario Tennis. Thus it is made optional. Fixed Perfect Dark - Crash often #323
This commit is contained in:
parent
6fa0204709
commit
3d55b086ee
|
@ -36,6 +36,8 @@ void Config::resetToDefaults()
|
||||||
frameBufferEmulation.copyToRDRAM = 1;
|
frameBufferEmulation.copyToRDRAM = 1;
|
||||||
frameBufferEmulation.detectCFB = 0;
|
frameBufferEmulation.detectCFB = 0;
|
||||||
frameBufferEmulation.N64DepthCompare = 0;
|
frameBufferEmulation.N64DepthCompare = 0;
|
||||||
|
frameBufferEmulation.aspect = 1;
|
||||||
|
frameBufferEmulation.validityCheckMethod = 0;
|
||||||
|
|
||||||
textureFilter.txCacheSize = 100 * gc_uMegabyte;
|
textureFilter.txCacheSize = 100 * gc_uMegabyte;
|
||||||
textureFilter.txDump = 0;
|
textureFilter.txDump = 0;
|
||||||
|
|
1
Config.h
1
Config.h
|
@ -53,6 +53,7 @@ struct Config
|
||||||
u32 detectCFB;
|
u32 detectCFB;
|
||||||
u32 N64DepthCompare;
|
u32 N64DepthCompare;
|
||||||
u32 aspect; // 0: stretch ; 1: 4/3 ; 2: 16/9
|
u32 aspect; // 0: stretch ; 1: 4/3 ; 2: 16/9
|
||||||
|
u32 validityCheckMethod; // 0: checksum; 1: fill RDRAM
|
||||||
} frameBufferEmulation;
|
} frameBufferEmulation;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
|
|
|
@ -364,8 +364,12 @@ void FrameBufferList::saveBuffer(u32 _address, u16 _format, u16 _size, u16 _widt
|
||||||
if (m_pCurrent->m_width == VI.width)
|
if (m_pCurrent->m_width == VI.width)
|
||||||
gDP.colorImage.height = min(gDP.colorImage.height, VI.height);
|
gDP.colorImage.height = min(gDP.colorImage.height, VI.height);
|
||||||
m_pCurrent->m_endAddress = min(RDRAMSize, m_pCurrent->m_startAddress + (((m_pCurrent->m_width * gDP.colorImage.height) << m_pCurrent->m_size >> 1) - 1));
|
m_pCurrent->m_endAddress = min(RDRAMSize, m_pCurrent->m_startAddress + (((m_pCurrent->m_width * gDP.colorImage.height) << m_pCurrent->m_size >> 1) - 1));
|
||||||
if (!config.frameBufferEmulation.copyFromRDRAM && !bMarioTennisScoreboard && !m_pCurrent->m_isDepthBuffer && m_pCurrent->m_RdramCrc == 0 && !m_pCurrent->m_cfb && !m_pCurrent->m_cleared && gDP.colorImage.height > 1)
|
if (!config.frameBufferEmulation.copyFromRDRAM && !bMarioTennisScoreboard && !m_pCurrent->m_isDepthBuffer && m_pCurrent->m_RdramCrc == 0 && !m_pCurrent->m_cfb && !m_pCurrent->m_cleared && gDP.colorImage.height > 1) {
|
||||||
gDPFillRDRAM(m_pCurrent->m_startAddress, 0, 0, m_pCurrent->m_width, gDP.colorImage.height, m_pCurrent->m_width, m_pCurrent->m_size, m_pCurrent->m_fillcolor, false);
|
if (config.frameBufferEmulation.validityCheckMethod == 0)
|
||||||
|
m_pCurrent->m_RdramCrc = textureCRC(RDRAM + m_pCurrent->m_startAddress, m_pCurrent->m_height, m_pCurrent->m_width << m_pCurrent->m_size >> 1);
|
||||||
|
else
|
||||||
|
gDPFillRDRAM(m_pCurrent->m_startAddress, 0, 0, m_pCurrent->m_width, gDP.colorImage.height, m_pCurrent->m_width, m_pCurrent->m_size, m_pCurrent->m_fillcolor, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
m_pCurrent = _findBuffer(m_pCurrent->m_startAddress, m_pCurrent->m_endAddress, m_pCurrent->m_width);
|
m_pCurrent = _findBuffer(m_pCurrent->m_startAddress, m_pCurrent->m_endAddress, m_pCurrent->m_width);
|
||||||
}
|
}
|
||||||
|
@ -397,6 +401,8 @@ void FrameBufferList::saveBuffer(u32 _address, u16 _format, u16 _size, u16 _widt
|
||||||
m_pCurrent->m_pResolveTexture->format = _format;
|
m_pCurrent->m_pResolveTexture->format = _format;
|
||||||
m_pCurrent->m_pResolveTexture->size = _size;
|
m_pCurrent->m_pResolveTexture->size = _size;
|
||||||
}
|
}
|
||||||
|
if (m_pCurrent->m_RdramCrc != 0)
|
||||||
|
m_pCurrent->m_RdramCrc = textureCRC(RDRAM + m_pCurrent->m_startAddress, m_pCurrent->m_height, m_pCurrent->m_width << m_pCurrent->m_size >> 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,6 +76,8 @@ bool Config_SetDefault()
|
||||||
assert(res == M64ERR_SUCCESS);
|
assert(res == M64ERR_SUCCESS);
|
||||||
res = ConfigSetDefaultBool(g_configVideoGliden64, "EnableN64DepthCompare", 0, "Enable N64 depth compare instead of OpenGL standard one. Experimental.");
|
res = ConfigSetDefaultBool(g_configVideoGliden64, "EnableN64DepthCompare", 0, "Enable N64 depth compare instead of OpenGL standard one. Experimental.");
|
||||||
assert(res == M64ERR_SUCCESS);
|
assert(res == M64ERR_SUCCESS);
|
||||||
|
res = ConfigSetDefaultBool(g_configVideoGliden64, "ValidityCheckMethod", 0, "Method to check validity of texture frame buffer (0=by checksum, 1=fill RDRAM.");
|
||||||
|
assert(res == M64ERR_SUCCESS);
|
||||||
//#Texture filter settings
|
//#Texture filter settings
|
||||||
res = ConfigSetDefaultInt(g_configVideoGliden64, "txFilterMode", 0, "Texture filter (0=none, 1=Smooth filtering 1, 2=Smooth filtering 2, 3=Smooth filtering 3, 4=Smooth filtering 4, 5=Sharp filtering 1, 6=Sharp filtering 2)");
|
res = ConfigSetDefaultInt(g_configVideoGliden64, "txFilterMode", 0, "Texture filter (0=none, 1=Smooth filtering 1, 2=Smooth filtering 2, 3=Smooth filtering 3, 4=Smooth filtering 4, 5=Sharp filtering 1, 6=Sharp filtering 2)");
|
||||||
assert(res == M64ERR_SUCCESS);
|
assert(res == M64ERR_SUCCESS);
|
||||||
|
@ -161,6 +163,7 @@ void Config_LoadConfig()
|
||||||
config.frameBufferEmulation.copyFromRDRAM = ConfigGetParamBool(g_configVideoGliden64, "EnableCopyColorFromRDRAM");
|
config.frameBufferEmulation.copyFromRDRAM = ConfigGetParamBool(g_configVideoGliden64, "EnableCopyColorFromRDRAM");
|
||||||
config.frameBufferEmulation.detectCFB = ConfigGetParamBool(g_configVideoGliden64, "EnableDetectCFB");
|
config.frameBufferEmulation.detectCFB = ConfigGetParamBool(g_configVideoGliden64, "EnableDetectCFB");
|
||||||
config.frameBufferEmulation.N64DepthCompare = ConfigGetParamBool(g_configVideoGliden64, "EnableN64DepthCompare");
|
config.frameBufferEmulation.N64DepthCompare = ConfigGetParamBool(g_configVideoGliden64, "EnableN64DepthCompare");
|
||||||
|
config.frameBufferEmulation.validityCheckMethod = ConfigGetParamBool(g_configVideoGliden64, "ValidityCheckMethod");
|
||||||
config.generalEmulation.hacks = 0;
|
config.generalEmulation.hacks = 0;
|
||||||
//#Texture filter settings
|
//#Texture filter settings
|
||||||
config.textureFilter.txFilterMode = ConfigGetParamInt(g_configVideoGliden64, "txFilterMode");
|
config.textureFilter.txFilterMode = ConfigGetParamInt(g_configVideoGliden64, "txFilterMode");
|
||||||
|
|
Loading…
Reference in New Issue
Block a user