Merge pull request #71 from PatrickvL/master

Switches for LLE APU and GPU
This commit is contained in:
Luke Usher 2016-12-29 12:33:06 +00:00 committed by GitHub
commit c940f69f3c
3 changed files with 152 additions and 121 deletions

View File

@ -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

View File

@ -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;

View File

@ -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;