Merge pull request #1281 from RadWolfie/check-hle-cache-file-for-lle-stat

Temporary check HLE cache file for LLE flags used.
This commit is contained in:
Luke Usher 2018-06-12 20:12:53 +01:00 committed by GitHub
commit c2b4162a9b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 93 additions and 80 deletions

View File

@ -1320,7 +1320,6 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
case ID_EMULATION_LLE_JIT:
{
m_FlagsLLE = m_FlagsLLE ^ LLE_JIT;
ClearHLECache();
RefreshMenus();
}
break;
@ -1328,7 +1327,6 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
case ID_EMULATION_LLE_APU:
{
m_FlagsLLE = m_FlagsLLE ^ LLE_APU;
ClearHLECache();
RefreshMenus();
}
break;
@ -1336,7 +1334,6 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
case ID_EMULATION_LLE_GPU:
{
m_FlagsLLE = m_FlagsLLE ^ LLE_GPU;
ClearHLECache();
RefreshMenus();
}
break;

View File

@ -350,6 +350,9 @@ void EmuUpdateLLEStatus(uint32_t XbLibScan)
// NOTE: EmuHLEIntercept do not get to be in XbSymbolDatabase, do the intecept in Cxbx project only.
void EmuHLEIntercept(Xbe::Header *pXbeHeader)
{
// NOTE: Increase this revision number any time we changed something inside Cxbx-Reloaded.
int revisionCache = 4;
Xbe::LibraryVersion *pLibraryVersion = (Xbe::LibraryVersion*)pXbeHeader->dwLibraryVersionsAddr;
uint16 xdkVersion = 0;
@ -383,6 +386,8 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
}
EmuUpdateLLEStatus(XbLibScan);
int gFlagsLLE;
g_EmuShared->GetFlagsLLE(&gFlagsLLE);
printf("\n");
printf("*******************************************************************************\n");
@ -422,7 +427,19 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
if (HLECacheHash == XbSymbolLibraryVersion()) {
char buffer[SHRT_MAX] = { 0 };
char* bufferPtr = buffer;
g_HLECacheUsed = true;
const uint32 cacheRevision = GetPrivateProfileInt("Info", "revision", 0, filename.c_str());
const uint32 cacheFlagsLLE = GetPrivateProfileInt("Info", "FlagsLLE", 0, filename.c_str());
if (cacheFlagsLLE != gFlagsLLE) {
g_HLECacheUsed = false;
}
else if (cacheRevision != revisionCache) {
g_HLECacheUsed = false;
}
if (g_HLECacheUsed) {
printf("Using HLE Cache\n");
GetPrivateProfileSection("Symbols", buffer, sizeof(buffer), filename.c_str());
@ -449,30 +466,21 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
output << "HLECache: 0x" << std::setfill('0') << std::setw(8) << std::hex << location
<< " -> " << functionName;
void* pFunc = GetEmuPatchAddr(functionName);
if (pFunc != nullptr)
{
if (pFunc != nullptr) {
// skip entries that weren't located at all
if (location == NULL)
{
if (location == NULL) {
output << "\t(not patched)";
}
// Prevent patching illegal addresses
else if (location < XBE_IMAGE_BASE)
{
else if (location < XBE_IMAGE_BASE) {
output << "\t*ADDRESS TOO LOW!*";
}
else if (location > g_SystemMaxMemory)
{
} else if (location > g_SystemMaxMemory) {
output << "\t*ADDRESS TOO HIGH!*";
}
else
{
} else {
EmuInstallPatch(functionName, location, pFunc);
output << "\t*PATCHED*";
}
}
else
{
} else {
if (location != NULL)
output << "\t(no patch)";
}
@ -498,8 +506,7 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
}
EmuD3D_Init_DeferredStates();
g_HLECacheUsed = true;
}
}
// If g_SymbolAddresses didn't get filled, the HLE cache is invalid
@ -572,6 +579,15 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
WritePrivateProfileString("Info", "HLECacheHash", HLECacheHashString.c_str(), filename.c_str());
}
std::stringstream revision;
revision << std::dec << revisionCache;
WritePrivateProfileString("Info", "revision", revision.str().c_str(), filename.c_str());
std::stringstream flagsLLE;
flagsLLE << std::dec << gFlagsLLE;
WritePrivateProfileString("Info", "FlagsLLE", flagsLLE.str().c_str(), filename.c_str());
// Write the Certificate Details to the cache file
WritePrivateProfileString("Certificate", "Name", tAsciiTitle, filename.c_str());