diff --git a/src/CxbxKrnl/HLEDataBase.cpp b/src/CxbxKrnl/HLEDataBase.cpp index 0e59ed0bd..71dbcc623 100644 --- a/src/CxbxKrnl/HLEDataBase.cpp +++ b/src/CxbxKrnl/HLEDataBase.cpp @@ -39,8 +39,16 @@ extern "C" const char *szHLELastCompileTime = __TIMESTAMP__; -// Uncomment this line for experimental DSOUND LLE -// #define DSOUND_LLE +const char *Lib_D3D8 = "D3D8"; +const char *Lib_D3D8LTCG = "D3D8LTCG"; +const char *Lib_D3DX8 = "D3DX8"; +const char *Lib_DSOUND = "DSOUND"; +const char *Lib_XACTENG = "XACTENG"; +const char *Lib_XAPILIB = "XAPILIB"; +const char *Lib_XGRAPHC = "XGRAPHC"; +const char *Lib_XNETS = "XNETS"; +const char *Lib_XONLINE = "XONLINE"; // TODO : Typo for XONLINES? +const char *Lib_XONLINES = "XONLINES"; #include "Emu.h" #include "EmuXTL.h" @@ -95,261 +103,259 @@ HLEData HLEDataBase[] = { // Xapilib Version 1.0.3911 { - "XAPILIB", + Lib_XAPILIB, 1, 0, 3911, XAPI_1_0_3911, XAPI_1_0_3911_SIZE }, // Xapilib Version 1.0.4034 { - "XAPILIB", + Lib_XAPILIB, 1, 0, 4034, XAPI_1_0_4034, XAPI_1_0_4034_SIZE }, // Xapilib Version 1.0.4134 { - "XAPILIB", + Lib_XAPILIB, 1, 0, 4134, XAPI_1_0_4134, XAPI_1_0_4134_SIZE }, // Xapilib Version 1.0.4361 { - "XAPILIB", + Lib_XAPILIB, 1, 0, 4361, XAPI_1_0_4361, XAPI_1_0_4361_SIZE }, // Xapilib Version 1.0.4432 { - "XAPILIB", + Lib_XAPILIB, 1, 0, 4432, XAPI_1_0_4432, XAPI_1_0_4432_SIZE }, // Xapilib Version 1.0.4627 { - "XAPILIB", + Lib_XAPILIB, 1, 0, 4627, XAPI_1_0_4627, XAPI_1_0_4627_SIZE }, // Xapilib Version 1.0.5233 { - "XAPILIB", + Lib_XAPILIB, 1, 0, 5233, XAPI_1_0_5233, XAPI_1_0_5233_SIZE }, // Xapilib Version 1.0.5558 { - "XAPILIB", + Lib_XAPILIB, 1, 0, 5558, XAPI_1_0_5558, XAPI_1_0_5558_SIZE }, // Xapilib Version 1.0.5849 { - "XAPILIB", + Lib_XAPILIB, 1, 0, 5849, XAPI_1_0_5849, XAPI_1_0_5849_SIZE }, // D3D8 Version 1.0.3925 { - "D3D8", + Lib_D3D8, 1, 0, 3925, D3D8_1_0_3925, D3D8_1_0_3925_SIZE }, // D3D8 Version 1.0.4034 { - "D3D8", + Lib_D3D8, 1, 0, 4034, D3D8_1_0_4034, D3D8_1_0_4034_SIZE }, // D3D8 Version 1.0.4134 { - "D3D8", + Lib_D3D8, 1, 0, 4134, D3D8_1_0_4134, D3D8_1_0_4134_SIZE }, // D3D8 Version 1.0.4361 { - "D3D8", + Lib_D3D8, 1, 0, 4361, D3D8_1_0_4361, D3D8_1_0_4361_SIZE }, // D3D8 Version 1.0.4432 { - "D3D8", + Lib_D3D8, 1, 0, 4432, D3D8_1_0_4432, D3D8_1_0_4432_SIZE }, // D3D8 Version 1.0.4627 { - "D3D8", + Lib_D3D8, 1, 0, 4627, D3D8_1_0_4627, D3D8_1_0_4627_SIZE }, // D3D8 Version 1.0.5233 { - "D3D8", + Lib_D3D8, 1, 0, 5233, D3D8_1_0_5233, D3D8_1_0_5233_SIZE }, // D3D8 Version 1.0.5558 { - "D3D8", + Lib_D3D8, 1, 0, 5558, D3D8_1_0_5558, D3D8_1_0_5558_SIZE }, // D3D8 Version 1.0.5849 { - "D3D8", + Lib_D3D8, 1, 0, 5849, D3D8_1_0_5849, D3D8_1_0_5849_SIZE }, // D3D8LTCG Version 1.0.5849 { - "D3D8LTCG", + Lib_D3D8LTCG, 1, 0, 5849, D3D8LTCG_1_0_5849, D3D8LTCG_1_0_5849_SIZE }, -#ifndef DSOUND_LLE // DSound Version 1.0.3936 { - "DSOUND", + Lib_DSOUND, 1, 0, 3936, DSound_1_0_3936, DSound_1_0_3936_SIZE }, // DSound Version 1.0.4134 { - "DSOUND", + Lib_DSOUND, 1, 0, 4134, DSound_1_0_4134, DSound_1_0_4134_SIZE }, // DSound Version 1.0.4361 { - "DSOUND", + Lib_DSOUND, 1, 0, 4361, DSound_1_0_4361, DSound_1_0_4361_SIZE }, // DSound Version 1.0.4432 { - "DSOUND", + Lib_DSOUND, 1, 0, 4432, DSound_1_0_4432, DSound_1_0_4432_SIZE }, // DSound Version 1.0.4627 { - "DSOUND", + Lib_DSOUND, 1, 0, 4627, DSound_1_0_4627, DSound_1_0_4627_SIZE }, // DSound Version 1.0.5233 { - "DSOUND", + Lib_DSOUND, 1, 0, 5233, DSound_1_0_5233, DSound_1_0_5233_SIZE }, // DSound Version 1.0.5558 { - "DSOUND", + Lib_DSOUND, 1, 0, 5558, DSound_1_0_5558, DSound_1_0_5558_SIZE }, // DSound Version 1.0.5849 { - "DSOUND", + Lib_DSOUND, 1, 0, 5849, DSound_1_0_5849, DSound_1_0_5849_SIZE }, -#endif // XG Version 1.0.3911 { - "XGRAPHC", + Lib_XGRAPHC, 1, 0, 3911, XG_1_0_3911, XG_1_0_3911_SIZE }, // XG Version 1.0.4034 { - "XGRAPHC", + Lib_XGRAPHC, 1, 0, 4034, XG_1_0_4034, XG_1_0_4034_SIZE }, // XG Version 1.0.4361 { - "XGRAPHC", + Lib_XGRAPHC, 1, 0, 4361, XG_1_0_4361, XG_1_0_4361_SIZE }, // XG Version 1.0.4432 { - "XGRAPHC", + Lib_XGRAPHC, 1, 0, 4432, XG_1_0_4432, XG_1_0_4432_SIZE }, // XG Version 1.0.4627 { - "XGRAPHC", + Lib_XGRAPHC, 1, 0, 4627, XG_1_0_4627, XG_1_0_4627_SIZE }, // XG Version 1.0.5233 { - "XGRAPHC", + Lib_XGRAPHC, 1, 0, 5233, XG_1_0_5233, XG_1_0_5233_SIZE }, // XG Version 1.0.5558 { - "XGRAPHC", + Lib_XGRAPHC, 1, 0, 5558, XG_1_0_5558, XG_1_0_5558_SIZE }, // XG Version 1.0.5849 { - "XGRAPHC", + Lib_XGRAPHC, 1, 0, 5849, XG_1_0_5849, XG_1_0_5849_SIZE }, // XNet Version 1.0.3911 { - "XNETS", + Lib_XNETS, 1, 0, 3911, XNet_1_0_3911, XNet_1_0_3911_SIZE }, // XOnline Version 1.0.4361 { - "XONLINE", + Lib_XONLINE, // TODO : Typo for XONLINES? 1, 0, 4361, XOnline_1_0_4361, XOnline_1_0_4361_SIZE @@ -357,35 +363,35 @@ HLEData HLEDataBase[] = // XOnline(s) Version 1.0.4627 // TODO: Verify differences between XONLINE and XONLINES (if any) { - "XONLINES", + Lib_XONLINES, 1, 0, 4627, XOnline_1_0_4627, XOnline_1_0_4627_SIZE }, // XOnline(s) Version 1.0.5233 { - "XONLINES", + Lib_XONLINES, 1, 0, 5233, XOnline_1_0_5233, XOnline_1_0_5233_SIZE }, // XOnline(s) Version 1.0.5558 { - "XONLINES", + Lib_XONLINES, 1, 0, 5558, XOnline_1_0_5558, XOnline_1_0_5558_SIZE }, // XOnline(s) Version 1.0.5849 { - "XONLINES", + Lib_XONLINES, 1, 0, 5849, XOnline_1_0_5849, XOnline_1_0_5849_SIZE }, // XactEng Version 1.0.4627 { - "XACTENG", + Lib_XACTENG, 1, 0, 4627, XactEng_1_0_4627, XactEng_1_0_4627_SIZE diff --git a/src/CxbxKrnl/HLEDataBase.h b/src/CxbxKrnl/HLEDataBase.h index 45724497f..7cef79823 100644 --- a/src/CxbxKrnl/HLEDataBase.h +++ b/src/CxbxKrnl/HLEDataBase.h @@ -82,12 +82,23 @@ // ****************************************************************** extern "C" const char *szHLELastCompileTime; +extern const char *Lib_D3D8; +extern const char *Lib_D3D8LTCG; +extern const char *Lib_D3DX8; +extern const char *Lib_DSOUND; +extern const char *Lib_XACTENG; +extern const char *Lib_XAPILIB; +extern const char *Lib_XGRAPHC; +extern const char *Lib_XNETS; +extern const char *Lib_XONLINE; // TODO : Typo for XONLINES? +extern const char *Lib_XONLINES; + // ****************************************************************** // * HLEDataBase // ****************************************************************** extern struct HLEData { - char *Library; + const char *Library; uint16 MajorVersion; uint16 MinorVersion; diff --git a/src/CxbxKrnl/HLEIntercept.cpp b/src/CxbxKrnl/HLEIntercept.cpp index b371de69d..0c33d9427 100644 --- a/src/CxbxKrnl/HLEIntercept.cpp +++ b/src/CxbxKrnl/HLEIntercept.cpp @@ -162,7 +162,11 @@ void EmuHLEIntercept(Xbe::LibraryVersion *pLibraryVersion, Xbe::Header *pXbeHead uint32 LastUnResolvedXRefs = UnResolvedXRefs+1; uint32 OrigUnResolvedXRefs = UnResolvedXRefs; - for(int p=0;UnResolvedXRefs < LastUnResolvedXRefs;p++) + // Set these for experimental APU(sound) / GPU (graphics) LLE + bool bLLE_APU = false; + bool bLLE_GPU = false; + + for(int p=0;UnResolvedXRefs < LastUnResolvedXRefs;p++) { DbgPrintf("HLE: Starting pass #%d...\n", p+1); @@ -216,27 +220,54 @@ void EmuHLEIntercept(Xbe::LibraryVersion *pLibraryVersion, Xbe::Header *pXbeHead szOrigLibraryName[c] = pLibraryVersion[v].szName[c]; } - // Test - if(strcmp(szLibraryName, "XGRAPHC") == 0) + // TODO: HACK: D3DX8 is packed into D3D8 database + if (strcmp(szLibraryName, Lib_D3DX8) == 0) { - // if(BuildVersion == 4432) - // BuildVersion = 4361; - if(BuildVersion == 3944) - BuildVersion = 3911; - if(OrigBuildVersion == 4531) - BuildVersion = 4361; - // Quick test (JSRF) - if(OrigBuildVersion == 4134) - BuildVersion = 4361; - // Quick test (Simpsons: RoadRage) - // if(BuildVersion == 4034) - // BuildVersion = 3911; + strcpy(szLibraryName, Lib_D3D8); } - // Several 3911 titles has different DSound builds. - if(strcmp(szLibraryName, "DSOUND") == 0) + if(strcmp(szLibraryName, Lib_D3D8LTCG) == 0) + { + // Skip scanning for D3D8LTCG symbols when LLE GPU is selected + if (bLLE_GPU) + continue; + + // Test (do not release uncommented!) + /*strcpy(szLibraryName, Lib_D3D8);*/ + } + + if (strcmp(szLibraryName, Lib_D3D8) == 0) + { + // Skip scanning for D3D8 symbols when LLE GPU is selected + if (bLLE_GPU) + continue; + + // Prevent scanning D3D8 again (since D3D8X is packed into it above) + if (bFoundD3D) + { + //DbgPrintf("Redundant\n"); + continue; + } + + bFoundD3D = true; + + // Some 3911 titles have different D3D8 builds + if (BuildVersion <= 3948) + BuildVersion = 3925; + + // Testing... don't release with this code in it! + // TODO: 5233 and 5558 + // if(BuildVersion == 4134) + // BuildVersion = 4627; + } + else if(strcmp(szLibraryName, Lib_DSOUND) == 0) { - if(BuildVersion < 4034) + // Skip scanning for DSOUND symbols when LLE APU is selected + if (bLLE_APU) + continue; + + // Several 3911 titles has different DSound builds. + if(BuildVersion < 4034) { BuildVersion = 3936; } @@ -246,22 +277,9 @@ void EmuHLEIntercept(Xbe::LibraryVersion *pLibraryVersion, Xbe::Header *pXbeHead BuildVersion == 4531 ) BuildVersion = 4627; } - - // Some 3911 titles have different D3D8 builds - if(strcmp(szLibraryName, "D3D8") == 0) - { - if(BuildVersion <= 3948) - BuildVersion = 3925; - - // Testing... don't release with this code in it! - // TODO: 5233 and 5558 - // if(BuildVersion == 4134) - // BuildVersion = 4627; - } - - // Change a few XAPILIB versions to similar counterparts - if(strcmp(szLibraryName, "XAPILIB") == 0) + else if(strcmp(szLibraryName, Lib_XAPILIB) == 0) { + // Change a few XAPILIB versions to similar counterparts if(BuildVersion == 3944) BuildVersion = 3911; if(BuildVersion == 3950) @@ -269,33 +287,29 @@ void EmuHLEIntercept(Xbe::LibraryVersion *pLibraryVersion, Xbe::Header *pXbeHead if(OrigBuildVersion == 4531) BuildVersion = 4627; } - - // Test (do not release uncommented!) - /*if(strcmp(szLibraryName, "D3D8LTCG") == 0) + else if (strcmp(szLibraryName, Lib_XGRAPHC) == 0) { - strcpy(szLibraryName, "D3D8"); - }*/ + // Skip scanning for XGRAPHC (XG) symbols when LLE GPU is selected + if (bLLE_GPU) + continue; - // TODO: HACK: These libraries are packed into one database - if(strcmp(szLibraryName, "D3DX8") == 0) + // if(BuildVersion == 4432) + // BuildVersion = 4361; + if (BuildVersion == 3944) + BuildVersion = 3911; + if (OrigBuildVersion == 4531) + BuildVersion = 4361; + // Quick test (JSRF) + if (OrigBuildVersion == 4134) + BuildVersion = 4361; + // Quick test (Simpsons: RoadRage) + // if(BuildVersion == 4034) + // BuildVersion = 3911; + } + + if(bXRefFirstPass) { - strcpy(szLibraryName, "D3D8"); - } - - if(strcmp(szLibraryName, "D3D8") == 0) - { - if(bFoundD3D) - { - //DbgPrintf("Redundant\n"); - continue; - } - - bFoundD3D = true; - } - - if(bXRefFirstPass) - { - if(strcmp("XAPILIB", szLibraryName) == 0 && MajorVersion == 1 && MinorVersion == 0 && + if(strcmp(Lib_XAPILIB, szLibraryName) == 0 && MajorVersion == 1 && MinorVersion == 0 && (BuildVersion == 3911 || BuildVersion == 4034 || BuildVersion == 4134 || BuildVersion == 4361 || BuildVersion == 4432 || BuildVersion == 4627 || BuildVersion == 5233 || BuildVersion == 5558 || BuildVersion == 5849)) @@ -303,7 +317,7 @@ void EmuHLEIntercept(Xbe::LibraryVersion *pLibraryVersion, Xbe::Header *pXbeHead uint32 lower = pXbeHeader->dwBaseAddr; uint32 upper = pXbeHeader->dwBaseAddr + pXbeHeader->dwSizeofImage; } - else if(strcmp("D3D8", szLibraryName) == 0 /*&& strcmp("D3D8LTCG", szOrigLibraryName)*/ && + else if(strcmp(Lib_D3D8, szLibraryName) == 0 /*&& strcmp(Lib_D3D8LTCG, szOrigLibraryName)*/ && MajorVersion == 1 && MinorVersion == 0 && (BuildVersion == 3925 || BuildVersion == 4134 || BuildVersion == 4361 || BuildVersion == 4432 || BuildVersion == 4627 || BuildVersion == 5233 || BuildVersion == 5558 || BuildVersion == 5849)) @@ -315,7 +329,7 @@ void EmuHLEIntercept(Xbe::LibraryVersion *pLibraryVersion, Xbe::Header *pXbeHead uint32 lower = pXbeHeader->dwBaseAddr; uint32 upper = pXbeHeader->dwBaseAddr + pXbeHeader->dwSizeofImage; - void *pFunc = 0; + void *pFunc = nullptr; if(BuildVersion == 3925) pFunc = EmuLocateFunction((OOVPA*)&IDirect3DDevice8_SetRenderState_CullMode_1_0_3925, lower, upper); @@ -325,7 +339,7 @@ void EmuHLEIntercept(Xbe::LibraryVersion *pLibraryVersion, Xbe::Header *pXbeHead pFunc = EmuLocateFunction((OOVPA*)&IDirect3DDevice8_SetRenderState_CullMode_1_0_5233, lower, upper); // locate D3DDeferredRenderState - if(pFunc != 0) + if(pFunc != nullptr) { // offset for stencil cull enable render state in the deferred render state buffer int patchOffset = 0; @@ -378,13 +392,13 @@ void EmuHLEIntercept(Xbe::LibraryVersion *pLibraryVersion, Xbe::Header *pXbeHead } else { - XTL::EmuD3DDeferredRenderState = 0; + XTL::EmuD3DDeferredRenderState = nullptr; CxbxKrnlCleanup("EmuD3DDeferredRenderState was not found!"); } // locate D3DDeferredTextureState { - pFunc = 0; + pFunc = nullptr; if(BuildVersion == 3925) pFunc = EmuLocateFunction((OOVPA*)&IDirect3DDevice8_SetTextureState_TexCoordIndex_1_0_3925, lower, upper); @@ -395,7 +409,7 @@ void EmuHLEIntercept(Xbe::LibraryVersion *pLibraryVersion, Xbe::Header *pXbeHead else if(BuildVersion == 4627 || BuildVersion == 5233 || BuildVersion == 5558 || BuildVersion == 5849) pFunc = EmuLocateFunction((OOVPA*)&IDirect3DDevice8_SetTextureState_TexCoordIndex_1_0_4627, lower, upper); - if(pFunc != 0) + if(pFunc != nullptr) { if(BuildVersion == 3925) // 0x18F180 XTL::EmuD3DDeferredTextureState = (DWORD*)(*(DWORD*)((uint32)pFunc + 0x11) - 0x70); // TODO: Verify @@ -414,12 +428,12 @@ void EmuHLEIntercept(Xbe::LibraryVersion *pLibraryVersion, Xbe::Header *pXbeHead } else { - XTL::EmuD3DDeferredTextureState = 0; + XTL::EmuD3DDeferredTextureState = nullptr; CxbxKrnlCleanup("EmuD3DDeferredTextureState was not found!"); } } } - //else if(strcmp("D3D8LTCG", szLibraryName) == 0 && MajorVersion == 1 && MinorVersion == 0 && + //else if(strcmp(Lib_D3D8LTCG, szLibraryName) == 0 && MajorVersion == 1 && MinorVersion == 0 && // (BuildVersion == 5849)) // 5849 only so far... // { // // Save D3D8 build version @@ -429,13 +443,13 @@ void EmuHLEIntercept(Xbe::LibraryVersion *pLibraryVersion, Xbe::Header *pXbeHead // uint32 lower = pXbeHeader->dwBaseAddr; // uint32 upper = pXbeHeader->dwBaseAddr + pXbeHeader->dwSizeofImage; - // void *pFunc = 0; + // void *pFunc = nullptr; // if(BuildVersion == 5849) // pFunc = EmuLocateFunction((OOVPA*)&IDirect3DDevice8_SetRenderState_CullMode_1_0_5849_LTCG, lower, upper); // // locate D3DDeferredRenderState - // if(pFunc != 0) + // if(pFunc != nullptr) // { // // offset for stencil cull enable render state in the deferred render state buffer // int patchOffset = 0; @@ -464,18 +478,18 @@ void EmuHLEIntercept(Xbe::LibraryVersion *pLibraryVersion, Xbe::Header *pXbeHead // } // else // { - // XTL::EmuD3DDeferredRenderState = 0; + // XTL::EmuD3DDeferredRenderState = nullptr; // CxbxKrnlCleanup("EmuD3DDeferredRenderState was not found!"); // } // // locate D3DDeferredTextureState // { - // pFunc = 0; + // pFunc = nullptr; // if(BuildVersion == 3925) // pFunc = EmuLocateFunction((OOVPA*)&IDirect3DDevice8_SetTextureState_TexCoordIndex_1_0_5849_LTCG, lower, upper); - // if(pFunc != 0) + // if(pFunc != nullptr) // { // if(BuildVersion == 3925) // 0x18F180 // XTL::EmuD3DDeferredTextureState = (DWORD*)(*(DWORD*)((uint32)pFunc + 0x11) - 0x70); // TODO: Verify @@ -494,7 +508,7 @@ void EmuHLEIntercept(Xbe::LibraryVersion *pLibraryVersion, Xbe::Header *pXbeHead // } // else // { - // XTL::EmuD3DDeferredTextureState = 0; + // XTL::EmuD3DDeferredTextureState = nullptr; // CxbxKrnlCleanup("EmuD3DDeferredTextureState was not found!"); // } // } @@ -745,7 +759,7 @@ static void EmuInstallWrappers(OOVPATable *OovpaTable, uint32 OovpaTableSize, Xb { OOVPA *Oovpa = OovpaTable[a].Oovpa; - void *pFunc = NULL; + void *pFunc = nullptr; if(bCacheInp && (vCacheInpIter != vCacheInp.end())) { @@ -759,13 +773,13 @@ static void EmuInstallWrappers(OOVPATable *OovpaTable, uint32 OovpaTableSize, Xb vCacheOut.push_back(pFunc); } - if(pFunc != 0) + if(pFunc != nullptr) { #ifdef _DEBUG_TRACE DbgPrintf("HLE: 0x%.08X -> %s\n", pFunc, OovpaTable[a].szFuncName); #endif - if(OovpaTable[a].lpRedirect == 0) + if(OovpaTable[a].lpRedirect == nullptr) { // Insert breakpoint *(uint8_t*)pFunc = 0xCC;