HLEDatabase code cleanup

This commit is contained in:
PatrickvL 2017-01-13 11:40:56 +01:00
parent 5965143104
commit b7131a8cfe
5 changed files with 50 additions and 260 deletions

View File

@ -109,7 +109,7 @@ const char *Lib_XONLINES = "XONLINES";
// For example, HLE_ENTRY(Lib_XAPILIB, XAPI, 3911) results in: // For example, HLE_ENTRY(Lib_XAPILIB, XAPI, 3911) results in:
// {Lib_XAPILIB, 3911, XAPI_1_0_3911, XAPI_1_0_3911_SIZE } // {Lib_XAPILIB, 3911, XAPI_1_0_3911, XAPI_1_0_3911_SIZE }
HLEData HLEDataBase[] = const HLEData HLEDataBase[] =
{ {
HLE_ENTRY(Lib_XAPILIB, XAPI, 3911), HLE_ENTRY(Lib_XAPILIB, XAPI, 3911),
HLE_ENTRY(Lib_XAPILIB, XAPI, 4034), HLE_ENTRY(Lib_XAPILIB, XAPI, 4034),
@ -167,228 +167,16 @@ HLEData HLEDataBase[] =
}; };
// ****************************************************************** // ******************************************************************
// * HLEDataBaseSize // * HLEDataBaseCount
// ****************************************************************** // ******************************************************************
extern uint32 HLEDataBaseSize = sizeof(HLEDataBase); extern const uint32 HLEDataBaseCount = sizeof(HLEDataBase) / sizeof(HLEData);
// ****************************************************************** // ******************************************************************
// * XRefDataBase // * XRefDataBase
// ****************************************************************** // ******************************************************************
extern uint32 XRefDataBase[] = extern uint32 XRefDataBase[XREF_COUNT] = { 0 }; // Reset and populated by EmuHLEIntercept
{
-1, // XREF_D3DDEVICE
-1, // XREF_DXSRSCULLMODE
-1, // XREF_D3DRS_MULTISAMPLEMODE
-1, // XREF_D3DRS_MULTISAMPLERENDERTARGETMODE
-1, // XREF_D3DRS_ROPZCMPALWAYSREAD
-1, // XREF_D3DRS_ROPZREAD
-1, // XREF_D3DRS_DONOTCULLUNCOMPRESSED
-1, // XREF_D3DRS_STENCILCULLENABLE
-1, // XREF_D3DCD_LAZYSETSTATEVB
-1, // XREF_D3D_BLOCKONTIME
-1, // XREF_D3D_SETFENCE
-1, // XREF_D3D_MakeRequestedSpace
-1, // XREF_D3D_KickOff
-1, // XREF_XNINIT
-1, // XREF_FCLOSEDEVICE
-1, // XREF_CLEARSTATEBLOCKFLAGS
-1, // XREF_RECORDSTATEBLOCK
-1, // XREF_SETDISTANCEFACTORA
-1, // XREF_SETDISTANCEFACTORB
-1, // XREF_SETROLLOFFFACTORA
-1, // XREF_SETROLLOFFFACTORB
-1, // XREF_SETDOPPLERFACTOR
-1, // XREF_SETBUFFERDATA
-1, // XREF_SETCURRENTPOSITION
-1, // XREF_SETCURRENTPOSITION2
-1, // XREF_GETCURRENTPOSITION
-1, // XREF_GETCURRENTPOSITION2
-1, // XREF_DSOUNDPLAY
-1, // XREF_DSOUNDPLAY2
-1, // XREF_DSOUNDSTOP
-1, // XREF_DSOUNDSTOP2
-1, // XREF_DSFLUSHEX2
-1, // XREF_DSSETBUFFERDATA
-1, // XREF_DSSETBUFFERDATA2
-1, // XREF_DSCREATESOUNDBUFFER
-1, // XREF_DSCREATESOUNDSTREAM
-1, // XREF_DSSTREAMPAUSE
-1, // XREF_DSSTREAMSETVOLUME
-1, // XREF_DSSETI3DL2LISTENER
-1, // XREF_DSSETMIXBINHEADROOMA
-1, // XREF_DSSETMIXBINHEADROOMB
-1, // XREF_DSSETMIXBINSA
-1, // XREF_DSSETMIXBINSB
-1, // XREF_DSSETMIXBINSC
-1, // XREF_DSSETMIXBINVOLUMESA
-1, // XREF_DSSETMIXBINVOLUMESB
-1, // XREF_DSSETMIXBINVOLUMESC
-1, // XREF_DSSETPOSITIONA
-1, // XREF_DSSETPOSITIONB
-1, // XREF_DSSETVELOCITYA
-1, // XREF_DSSETVELOCITYB
-1, // XREF_DSDOWORKA
-1, // XREF_DSDOWORKB
-1, // XREF_DSSETALLPARAMETERSA
-1, // XREF_DSSETALLPARAMETERSB
-1, // XREF_DSSETHEADROOMA
-1, // XREF_DSENABLEHEADPHONES
-1, // XREF_DSSYNCHPLAYBACKA
-1, // XREF_DSSYNCHPLAYBACKB
-1, // XREF_DSSETI3DL2SOURCE1A (Stream)
-1, // XREF_DSSETI3DL2SOURCE2A (Buffer)
-1, // XREF_DSBUFFERSETPITCHA (Buffer)
-1, // XREF_DSBUFFERSETPITCHB (Buffer)
-1, // XREF_DSBUFFERGETSTATUSA (Buffer)
-1, // XREF_DSBUFFERGETSTATUSB (Buffer)
-1, // XREF_DSBUFFERSETVOLUMEA (Buffer)
-1, // XREF_DSBUFFERSETVOLUMEB (Buffer)
-1, // XREF_DSBUFFERSETCURRENTPOSITIONA (Buffer)
-1, // XREF_DSBUFFERSETCURRENTPOSITIONB (Buffer)
-1, // XREF_DSBUFFERSETLOOPREGIONA (Buffer)
-1, // XREF_DSBUFFERSETPLAYREGIONA (Buffer)
-1, // XREF_DSBUFFERLOCKA (Buffer)
-1, // XREF_DSBUFFERSETHEADROOMA (Buffer)
-1, // XREF_DSBUFFERSETFREQUENCYA (Buffer)
-1, // XREF_DSBUFFERSETFREQUENCYB
-1, // XREF_DSSTREAMSETMAXDISTANCE1A (Stream)
-1, // XREF_DSSTREAMSETMAXDISTANCE1B
-1, // XREF_DSSTREAMSETMAXDISTANCE1C
-1, // XREF_DSSTREAMSETMINDISTANCE1A (Stream)
-1, // XREF_DSSTREAMSETMINDISTANCE1B
-1, // XREF_DSSTREAMSETMINDISTANCE1C
-1, // XREF_DSSTREAMSETCONEANGLES1A
-1, // XREF_DSSTREAMSETCONEANGLES1B
-1, // XREF_DSSTREAMSETCONEOUTSIDEVOLUME1A (Stream)
-1, // XREF_DSSTREAMSETCONEOUTSIDEVOLUME1B
-1, // XREF_DSSTREAMSETALLPARAMETERS1A (Stream)
-1, // XREF_DSSTREAMSETALLPARAMETERS1B
-1, // XREF_DSSTREAMSETALLPARAMETERS1C
-1, // XREF_DSSTREAMSETVELOCITY1A (Stream)
-1, // XREF_DSSTREAMSETVELOCITY1B
-1, // XREF_DSSTREAMSETVELOCITY1C
-1, // XREF_DSSTREAMSETCONEORIENTATION1A (Stream)
-1, // XREF_DSSTREAMSETCONEORIENTATION1B
-1, // XREF_DSSTREAMSETCONEORIENTATION1C
-1, // XREF_DSSTREAMSETPOSITION1A (Stream)
-1, // XREF_DSSTREAMSETPOSITION1B
-1, // XREF_DSSTREAMSETPOSITION1C
-1, // XREF_DSSTREAMSETFREQUENCY1A (Stream)
-1, // XREF_DSSTREAMSETFREQUENCY1B
-1, // XREF_DSSTREAMSETROLLOFFFACTOR1A (Stream)
-1, // XREF_DSSTREAMSETROLLOFFFACTOR1B
-1, // XREF_GET2DSURFACEDESCB
-1, // XREF_COMMONSETRENDERTARGET
-1, // XREF_COMMITDEFERREDSETTINGSA
-1, // XREF_COMMITDEFERREDSETTINGSB
// s+
-1, // XREF_DSVOICESETMAXDISTANCE
-1, // XREF_DSVOICESETMINDISTANCE
-1, // XREF_DSVOICESETROLLOFFCURVE
-1, // XREF_DSVOICESETROLLOFFFACTOR
-1, // XREF_DSVOICESETDISTANCEFACTOR
-1, // XREF_DSVOICESETCONEANGLES
-1, // XREF_DSVOICESETCONEORIENTATION
-1, // XREF_DSVOICESETCONEOUTSIDEVOLUME
-1, // XREF_DSVOICESETPOSITION
-1, // XREF_DSVOICESETVELOCITY
-1, // XREF_DSVOICESETDOPPLERFACTOR
-1, // XREF_DSVOICESETI3DL2SOURCE
-1, // XREF_DSBUFFERSETMODEA
-1, // XREF_DSBUFFERSETMODEB
-1, // XREF_DSBUFFERSETMAXDISTANCE
-1, // XREF_DSBUFFERSETMINDISTANCE
-1, // XREF_DSBUFFERSETROLLOFFCURVE
-1, // XREF_DSBUFFERSETROLLOFFFACTOR
-1, // XREF_DSBUFFERSETDISTANCEFACTOR
-1, // XREF_DSBUFFERSETCONEANGLES
-1, // XREF_DSBUFFERSETCONEORIENTATION
-1, // XREF_DSBUFFERSETCONEOUTSIDEVOLUME
-1, // XREF_DSBUFFERSETPOSITION
-1, // XREF_DSBUFFERSETVELOCITY
-1, // XREF_DSBUFFERSETDOPPLERFACTOR
-1, // XREF_DSBUFFERSETI3DL2SOURCE
-1, // XREF_DirectSound_CDirectSoundVoice_SetFormat
-1, // XREF_DirectSound_CDirectSoundBuffer_SetFormat
-1, // XREF_DirectSound_CFullHRTFSource_GetCenterVolume
-1, // XREF_DirectSound_CHRTFSource_SetFullHRTF5Channel
-1, // XREF_D3D_BlockOnResource
-1, // XREF_DirectSound_CMcpxVoiceClient_SetLFO
-1, // XREF_DirectSound_CDirectSoundVoice_SetLFO
-1, // XREF_DirectSound_CDirectSoundBuffer_SetLFO
-1, // XREF_DirectSound_CDirectSoundVoice_SetVolume
-1, // XREF_DirectSound_CDirectSoundBuffer_SetVolume
-1, // XREF_DirectSound_CDirectSoundBuffer_SetLoopRegion
-1, // XREF_DirectSound_CMcpxBuffer_Play
-1, // XREF_DirectSound_CDirectSoundBuffer_PlayEx
-1, // XREF_DirectSound_WaveFormat_CreateXboxAdpcmFormat
-1, // XREF_DirectSound_CDirectSoundVoice_SetConeAngles
-1, // XREF_DirectSound_CDirectSoundBuffer_SetConeAngles
-1, // XREF_DirectSound_CDirectSoundVoice_CommitDeferredSettings
-1, // XREF_DirectSound_CDirectSoundVoice_SetAllParameters
-1, // XREF_DirectSound_CDirectSoundBuffer_SetAllParameters
-1, // XREF_DirectSound_CDirectSound_EnableHeadphones
-1, // XREF_DirectSound_CDirectSoundVoice_SetHeadroom
-1, // XREF_DirectSound_CDirectSoundBuffer_SetHeadroom
-1, // XREF_DirectSound_CDirectSound_GetOutputLevels
-1, // XREF_DirectSound_CMcpxBuffer_Pause
-1, // XREF_DirectSound_CDirectSoundBuffer_Pause
-1, // XREF_DirectSound_CMcpxBuffer_GetStatus
-1, // XREF_DirectSound_CDirectSoundBuffer_GetStatus
-1, // XREF_DirectSound_CDirectSoundVoice_SetEG
-1, // XREF_DirectSound_CMcpxVoiceClient_SetEG
-1, // XREF_DirectSound_CMcpxVoiceClient_SetFilter
-1, // XREF_DirectSound_CDirectSoundVoice_SetFilter
-1, // XREF_DirectSound_CDirectSoundBuffer_SetFilter
-1, // XREF_DirectSound_CDirectSoundStream_SetFilter
-1, // XREF_DirectSound_CDirectSoundBuffer_StopEx
-1, // XREF_CMcpxBuffer_Stop2
-1, // XREF_CMcpxAPU_Set3dDopplerFactor
-1, // XREF_CSensaura3d_GetFullHRTFFilterPair
-1, // XREF_CDirectSound_GetCaps
-1, // XREF_CDirectSoundVoice_SetPitch
-1, // XREF_DirectSoundEnterCriticalSection
-1, // XREF_CDirectSoundBuffer_SetMinDistance
-1, // XREF_CDirectSoundBuffer_SetMaxDistance
-1, // XREF_CMcpxVoiceClient_Commit3dSettings
-1, // XREF_CMcpxVoiceClient_SetI3DL2Source
-1, // XREF_CDirectSoundVoice_SetI3DL2Source
-1, // XREF_CDirectSoundVoice_SetMixBinVolumes
-1, // XREF_CDirectSoundStream_SetMixBinVolumes
-1, // XREF_DirectSound_CDirectSoundStream_SetHeadroom
-1, // XREF_DirectSound_CDirectSoundVoice_SetOutputBuffer
-1, // XREF_DirectSound_CDirectSoundBuffer_SetOutputBuffer
-1, // XREF_DirectSound_CDirectSoundBuffer_SetNotificationPositions
-1, // XREF_DirectSound_CDirectSoundBuffer_SetEG
-1, // XREF_DirectSound_CDirectSound_GetEffectData
-1, // XREF_CDirectSoundBuffer_SetNotificationPositions
-1, // XREF_DirectSound_CMcpxBuffer_Play2
// XACT
-1, // XREF_XACT_CEngine_RegisterWaveBank
-1, // XREF_XACT_CEngine_RegisterStreamedWaveBank
-1, // XREF_XACT_CEngine_CreateSoundBank
-1, // XREF_XACT_CEngine_DownloadEffectsImage
-1, // XREF_XACT_CEngine_CreateSoundSource
-1, // XREF_XACT_CSoundBank_GetSoundCueIndexFromFriendlyName
-1, // XREF_XACT_CEngine_RegisterNotification
-1, // XREF_XACT_CEngine_GetNotification
-1, // XREF_XACT_CEngine_UnRegisterWaveBank
// XONLINE
-1, // XREF_XoUpdateLaunchNewImageInternal
-1, // XREF_CXo_XOnlineLogon
-1,
/* not necessary?
-1, //XREF_XAPIXCALCULATESIGNATUREBEGINEX
//*/
// +s
};
// ****************************************************************** // ******************************************************************
// * track XRef location // * track XRef location
// ****************************************************************** // ******************************************************************
extern uint32 UnResolvedXRefs = sizeof(XRefDataBase)/sizeof(uint32); extern uint32 UnResolvedXRefs = sizeof(XRefDataBase)/sizeof(uint32);
// ******************************************************************
// * Search Speed Optimization
// ******************************************************************
extern bool bXRefFirstPass = true;

View File

@ -96,7 +96,7 @@ extern const char *Lib_XONLINES;
// ****************************************************************** // ******************************************************************
// * HLEDataBase // * HLEDataBase
// ****************************************************************** // ******************************************************************
extern struct HLEData extern const struct HLEData
{ {
const char *Library; const char *Library;
@ -107,25 +107,15 @@ extern struct HLEData
HLEDataBase[]; HLEDataBase[];
// ****************************************************************** // ******************************************************************
// * HLEDataBaseSize // * HLEDataBaseCount
// ****************************************************************** // ******************************************************************
extern uint32 HLEDataBaseSize; extern const uint32 HLEDataBaseCount;
// ******************************************************************
// * XRefDataBase
// ******************************************************************
extern uint32 XRefDataBase[];
// ****************************************************************** // ******************************************************************
// * UnResolvedXRefs // * UnResolvedXRefs
// ****************************************************************** // ******************************************************************
extern uint32 UnResolvedXRefs; extern uint32 UnResolvedXRefs;
// ******************************************************************
// * bXRefFirstPass
// ******************************************************************
extern bool bXRefFirstPass;
// ****************************************************************** // ******************************************************************
// * XRefDataBaseOffset // * XRefDataBaseOffset
// ****************************************************************** // ******************************************************************
@ -343,6 +333,14 @@ enum XRefDataBaseOffset
// +s // +s
// XREF_XLoadSectionByHandle, // XREF_XLoadSectionByHandle,
// XREF_XFreeSectionByHandle, // XREF_XFreeSectionByHandle,
XREF_COUNT // XREF_COUONT must always be last.
// Also, if XREF_COUNT > sizeof(byte), enlarge struct OOVPA.XRefSaveIndex (and Value somehow)
}; };
#endif // ******************************************************************
// * XRefDataBase
// ******************************************************************
extern uint32 XRefDataBase[XREF_COUNT];
#endif /*HLEDATABASE_H*/

View File

@ -63,10 +63,12 @@ static bool bCacheInp = false;
static std::vector<void *> vCacheInp; static std::vector<void *> vCacheInp;
static std::vector<void*>::const_iterator vCacheInpIter; static std::vector<void*>::const_iterator vCacheInpIter;
// Set these for experimental APU(sound) / GPU (graphics) LLE
bool bLLE_APU = false; bool bLLE_APU = false; // Set this to true for experimental APU (sound) LLE
bool bLLE_GPU = false; bool bLLE_GPU = false; // Set this to true for experimental GPU (graphics) LLE
bool bLLE_JIT = false; bool bLLE_JIT = false; // Set this to true for experimental JIT
bool bXRefFirstPass; // For search speed optimization, set in EmuHLEIntercept, read in EmuLocateFunction
void EmuHLEIntercept(Xbe::LibraryVersion *pLibraryVersion, Xbe::Header *pXbeHeader) void EmuHLEIntercept(Xbe::LibraryVersion *pLibraryVersion, Xbe::Header *pXbeHeader)
{ {
@ -164,13 +166,16 @@ void EmuHLEIntercept(Xbe::LibraryVersion *pLibraryVersion, Xbe::Header *pXbeHead
DbgPrintf("HLE: Detected Microsoft XDK application...\n"); DbgPrintf("HLE: Detected Microsoft XDK application...\n");
uint32 dwLibraryVersions = pXbeHeader->dwLibraryVersions; uint32 dwLibraryVersions = pXbeHeader->dwLibraryVersions;
uint32 dwHLEEntries = HLEDataBaseSize / sizeof(HLEData);
uint32 LastUnResolvedXRefs = UnResolvedXRefs+1; uint32 LastUnResolvedXRefs = UnResolvedXRefs+1;
uint32 OrigUnResolvedXRefs = UnResolvedXRefs; uint32 OrigUnResolvedXRefs = UnResolvedXRefs;
bool bFoundD3D = false; bool bFoundD3D = false;
bXRefFirstPass = true; // Set to false for search speed optimization
memset((void*)XRefDataBase, -1, sizeof(XRefDataBase));
for(int p=0;UnResolvedXRefs < LastUnResolvedXRefs;p++) for(int p=0;UnResolvedXRefs < LastUnResolvedXRefs;p++)
{ {
DbgPrintf("HLE: Starting pass #%d...\n", p+1); DbgPrintf("HLE: Starting pass #%d...\n", p+1);
@ -516,23 +521,22 @@ void EmuHLEIntercept(Xbe::LibraryVersion *pLibraryVersion, Xbe::Header *pXbeHead
// } // }
} }
DbgPrintf("HLE: * Searching HLE database for %s 1.0.%d...", szLibraryName, BuildVersion); DbgPrintf("HLE: * Searching HLE database for %s version 1.0.%d...", szLibraryName, BuildVersion);
bool found=false; const HLEData *FoundHLEData = nullptr;
for(uint32 d = 0; d < HLEDataBaseCount; d++) {
for(uint32 d=0;d<dwHLEEntries;d++) if (BuildVersion == HLEDataBase[d].BuildVersion && strcmp(szLibraryName, HLEDataBase[d].Library) == 0) {
{ FoundHLEData = &HLEDataBase[d];
if(BuildVersion != HLEDataBase[d].BuildVersion || strcmp(szLibraryName, HLEDataBase[d].Library) != 0) break;
continue; }
found = true;
DbgPrintf("Found\n");
EmuInstallWrappers(HLEDataBase[d].OovpaTable, HLEDataBase[d].OovpaTableSize, pXbeHeader);
} }
if(!found) { DbgPrintf("Skipped\n"); } if (FoundHLEData) {
DbgPrintf("Found\n");
EmuInstallWrappers(FoundHLEData->OovpaTable, FoundHLEData->OovpaTableSize, pXbeHeader);
} else {
DbgPrintf("Skipped\n");
}
} }
bXRefFirstPass = false; bXRefFirstPass = false;
@ -606,7 +610,7 @@ static void *EmuLocateFunction(OOVPA *Oovpa, uint32 lower, uint32 upper)
// Skip out if this is an unnecessary search // Skip out if this is an unnecessary search
if(!bXRefFirstPass && Oovpa->XRefCount == XRefZero && Oovpa->XRefSaveIndex == XRefNoSaveIndex) if(!bXRefFirstPass && Oovpa->XRefCount == XRefZero && Oovpa->XRefSaveIndex == XRefNoSaveIndex)
return 0; return nullptr;
// large // large
if(Oovpa->Type == Large) if(Oovpa->Type == Large)
@ -746,7 +750,7 @@ static void *EmuLocateFunction(OOVPA *Oovpa, uint32 lower, uint32 upper)
} }
} }
return 0; return nullptr;
} }
// install function interception wrappers // install function interception wrappers

View File

@ -34,9 +34,9 @@
#ifndef HLEINTERCEPT_H #ifndef HLEINTERCEPT_H
#define HLEINTERCEPT_H #define HLEINTERCEPT_H
extern bool bLLE_APU; extern bool bLLE_APU; // Set this to true for experimental APU (sound) LLE
extern bool bLLE_GPU; extern bool bLLE_GPU; // Set this to true for experimental GPU (graphics) LLE
extern bool bLLE_JIT; extern bool bLLE_JIT; // Set this to true for experimental JIT
void EmuHLEIntercept(Xbe::LibraryVersion *LibraryVersion, Xbe::Header *XbeHeader); void EmuHLEIntercept(Xbe::LibraryVersion *LibraryVersion, Xbe::Header *XbeHeader);

View File

@ -56,8 +56,8 @@ template <class BaseClass, typename MFT> inline void *MFPtoFP( MFT pMemFunc)
#pragma pack(1) #pragma pack(1)
enum OOVPAType : uint16 { enum OOVPAType : uint16 {
Small, Small, // Meaning, use SOVP, in which Offset is an uint08
Large, Large, // Meaning, use LOVP, in which Offset is an uint16
}; };
// ****************************************************************** // ******************************************************************
@ -97,14 +97,14 @@ struct OOVPA
// that for each template instance, the type is redefined. Let's // that for each template instance, the type is redefined. Let's
// avoid that.) // avoid that.)
// Small (Offset,Value)-Pair(s) // Small (byte-sized) {Offset, Value}-pair(s)
struct SOVP struct SOVP
{ {
uint08 Offset; uint08 Offset;
uint08 Value; uint08 Value;
}; };
// Large (Offset,Value)-Pair(s) // Large (word-sized) {Offset, Value}-pair(s)
struct LOVP struct LOVP
{ {
uint16 Offset; uint16 Offset;