From b7131a8cfe841672531b61dda1e39a0ddb50fd53 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Fri, 13 Jan 2017 11:40:56 +0100 Subject: [PATCH] HLEDatabase code cleanup --- src/CxbxKrnl/HLEDataBase.cpp | 220 +--------------------------------- src/CxbxKrnl/HLEDataBase.h | 26 ++-- src/CxbxKrnl/HLEIntercept.cpp | 50 ++++---- src/CxbxKrnl/HLEIntercept.h | 6 +- src/CxbxKrnl/OOVPA.h | 8 +- 5 files changed, 50 insertions(+), 260 deletions(-) diff --git a/src/CxbxKrnl/HLEDataBase.cpp b/src/CxbxKrnl/HLEDataBase.cpp index 89d309121..8779aa127 100644 --- a/src/CxbxKrnl/HLEDataBase.cpp +++ b/src/CxbxKrnl/HLEDataBase.cpp @@ -109,7 +109,7 @@ const char *Lib_XONLINES = "XONLINES"; // For example, HLE_ENTRY(Lib_XAPILIB, XAPI, 3911) results in: // {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, 4034), @@ -167,228 +167,16 @@ HLEData HLEDataBase[] = }; // ****************************************************************** -// * HLEDataBaseSize +// * HLEDataBaseCount // ****************************************************************** -extern uint32 HLEDataBaseSize = sizeof(HLEDataBase); +extern const uint32 HLEDataBaseCount = sizeof(HLEDataBase) / sizeof(HLEData); // ****************************************************************** // * XRefDataBase // ****************************************************************** -extern uint32 XRefDataBase[] = -{ - -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 -}; +extern uint32 XRefDataBase[XREF_COUNT] = { 0 }; // Reset and populated by EmuHLEIntercept // ****************************************************************** // * track XRef location // ****************************************************************** extern uint32 UnResolvedXRefs = sizeof(XRefDataBase)/sizeof(uint32); - -// ****************************************************************** -// * Search Speed Optimization -// ****************************************************************** -extern bool bXRefFirstPass = true; diff --git a/src/CxbxKrnl/HLEDataBase.h b/src/CxbxKrnl/HLEDataBase.h index c60d45ed4..97f6cfcda 100644 --- a/src/CxbxKrnl/HLEDataBase.h +++ b/src/CxbxKrnl/HLEDataBase.h @@ -96,7 +96,7 @@ extern const char *Lib_XONLINES; // ****************************************************************** // * HLEDataBase // ****************************************************************** -extern struct HLEData +extern const struct HLEData { const char *Library; @@ -107,25 +107,15 @@ extern struct HLEData HLEDataBase[]; // ****************************************************************** -// * HLEDataBaseSize +// * HLEDataBaseCount // ****************************************************************** -extern uint32 HLEDataBaseSize; - -// ****************************************************************** -// * XRefDataBase -// ****************************************************************** -extern uint32 XRefDataBase[]; +extern const uint32 HLEDataBaseCount; // ****************************************************************** // * UnResolvedXRefs // ****************************************************************** extern uint32 UnResolvedXRefs; -// ****************************************************************** -// * bXRefFirstPass -// ****************************************************************** -extern bool bXRefFirstPass; - // ****************************************************************** // * XRefDataBaseOffset // ****************************************************************** @@ -343,6 +333,14 @@ enum XRefDataBaseOffset // +s // XREF_XLoadSectionByHandle, // 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*/ diff --git a/src/CxbxKrnl/HLEIntercept.cpp b/src/CxbxKrnl/HLEIntercept.cpp index 4ac9b6d7c..15d9bb701 100644 --- a/src/CxbxKrnl/HLEIntercept.cpp +++ b/src/CxbxKrnl/HLEIntercept.cpp @@ -63,10 +63,12 @@ static bool bCacheInp = false; static std::vector vCacheInp; static std::vector::const_iterator vCacheInpIter; -// Set these for experimental APU(sound) / GPU (graphics) LLE -bool bLLE_APU = false; -bool bLLE_GPU = false; -bool bLLE_JIT = false; + +bool bLLE_APU = false; // Set this to true for experimental APU (sound) LLE +bool bLLE_GPU = false; // Set this to true for experimental GPU (graphics) LLE +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) { @@ -164,13 +166,16 @@ void EmuHLEIntercept(Xbe::LibraryVersion *pLibraryVersion, Xbe::Header *pXbeHead DbgPrintf("HLE: Detected Microsoft XDK application...\n"); uint32 dwLibraryVersions = pXbeHeader->dwLibraryVersions; - uint32 dwHLEEntries = HLEDataBaseSize / sizeof(HLEData); - uint32 LastUnResolvedXRefs = UnResolvedXRefs+1; uint32 OrigUnResolvedXRefs = UnResolvedXRefs; 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++) { DbgPrintf("HLE: Starting pass #%d...\n", p+1); @@ -516,24 +521,23 @@ 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; - - for(uint32 d=0;dOovpaTable, FoundHLEData->OovpaTableSize, pXbeHeader); + } else { + DbgPrintf("Skipped\n"); + } + } bXRefFirstPass = false; } @@ -606,7 +610,7 @@ static void *EmuLocateFunction(OOVPA *Oovpa, uint32 lower, uint32 upper) // Skip out if this is an unnecessary search if(!bXRefFirstPass && Oovpa->XRefCount == XRefZero && Oovpa->XRefSaveIndex == XRefNoSaveIndex) - return 0; + return nullptr; // 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 diff --git a/src/CxbxKrnl/HLEIntercept.h b/src/CxbxKrnl/HLEIntercept.h index 6ea148e9f..fdbfb3c7c 100644 --- a/src/CxbxKrnl/HLEIntercept.h +++ b/src/CxbxKrnl/HLEIntercept.h @@ -34,9 +34,9 @@ #ifndef HLEINTERCEPT_H #define HLEINTERCEPT_H -extern bool bLLE_APU; -extern bool bLLE_GPU; -extern bool bLLE_JIT; +extern bool bLLE_APU; // Set this to true for experimental APU (sound) LLE +extern bool bLLE_GPU; // Set this to true for experimental GPU (graphics) LLE +extern bool bLLE_JIT; // Set this to true for experimental JIT void EmuHLEIntercept(Xbe::LibraryVersion *LibraryVersion, Xbe::Header *XbeHeader); diff --git a/src/CxbxKrnl/OOVPA.h b/src/CxbxKrnl/OOVPA.h index c53591029..9dd8f5ce8 100644 --- a/src/CxbxKrnl/OOVPA.h +++ b/src/CxbxKrnl/OOVPA.h @@ -56,8 +56,8 @@ template inline void *MFPtoFP( MFT pMemFunc) #pragma pack(1) enum OOVPAType : uint16 { - Small, - Large, + Small, // Meaning, use SOVP, in which Offset is an uint08 + 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 // avoid that.) - // Small (Offset,Value)-Pair(s) + // Small (byte-sized) {Offset, Value}-pair(s) struct SOVP { uint08 Offset; uint08 Value; }; - // Large (Offset,Value)-Pair(s) + // Large (word-sized) {Offset, Value}-pair(s) struct LOVP { uint16 Offset;