Merge remote-tracking branch 'origin/oovpa_refactor' into hle-caching
This commit is contained in:
commit
62ec14bafe
|
@ -234,7 +234,6 @@ $(SOLUTIONDIR)Export.bat</Command>
|
|||
<ClInclude Include="..\..\src\CxbxKrnl\HLEDataBase\D3D8.1.0.5558.h" />
|
||||
<ClInclude Include="..\..\src\CxbxKrnl\HLEDataBase\D3D8.1.0.5788.h" />
|
||||
<ClInclude Include="..\..\src\CxbxKrnl\HLEDataBase\D3D8.1.0.5849.h" />
|
||||
<ClInclude Include="..\..\src\CxbxKrnl\HLEDataBase\D3D8LTCG.1.0.5849.h" />
|
||||
<ClInclude Include="..\..\src\CxbxKrnl\HLEDataBase\DSound.1.0.3936.h" />
|
||||
<ClInclude Include="..\..\src\CxbxKrnl\HLEDataBase\DSound.1.0.4134.h" />
|
||||
<ClInclude Include="..\..\src\CxbxKrnl\HLEDataBase\DSound.1.0.4361.h" />
|
||||
|
@ -323,7 +322,6 @@ $(SOLUTIONDIR)Export.bat</Command>
|
|||
<None Include="..\..\src\CxbxKrnl\HLEDataBase\D3D8.1.0.5558.inl" />
|
||||
<None Include="..\..\src\CxbxKrnl\HLEDataBase\D3D8.1.0.5788.inl" />
|
||||
<None Include="..\..\src\CxbxKrnl\HLEDataBase\D3D8.1.0.5849.inl" />
|
||||
<None Include="..\..\src\CxbxKrnl\HLEDataBase\D3D8LTCG.1.0.5849.inl" />
|
||||
<None Include="..\..\src\CxbxKrnl\HLEDataBase\DSound.1.0.3936.inl" />
|
||||
<None Include="..\..\src\CxbxKrnl\HLEDataBase\DSound.1.0.4134.inl" />
|
||||
<None Include="..\..\src\CxbxKrnl\HLEDataBase\DSound.1.0.4361.inl" />
|
||||
|
|
|
@ -276,9 +276,6 @@
|
|||
<ClInclude Include="..\..\src\CxbxKrnl\HLEDataBase\D3D8.1.0.5849.h">
|
||||
<Filter>HLEDatabase</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\src\CxbxKrnl\HLEDataBase\D3D8LTCG.1.0.5849.h">
|
||||
<Filter>HLEDatabase</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\src\CxbxKrnl\HLEDataBase\DSound.1.0.3936.h">
|
||||
<Filter>HLEDatabase</Filter>
|
||||
</ClInclude>
|
||||
|
@ -593,9 +590,6 @@
|
|||
<None Include="..\..\src\CxbxKrnl\HLEDataBase\D3D8.1.0.5849.inl">
|
||||
<Filter>HLEDatabase</Filter>
|
||||
</None>
|
||||
<None Include="..\..\src\CxbxKrnl\HLEDataBase\D3D8LTCG.1.0.5849.inl">
|
||||
<Filter>HLEDatabase</Filter>
|
||||
</None>
|
||||
<None Include="..\..\src\CxbxKrnl\HLEDataBase\DSound.1.0.3936.inl">
|
||||
<Filter>HLEDatabase</Filter>
|
||||
</None>
|
||||
|
|
|
@ -82,7 +82,6 @@ const char *Lib_XONLINES = "XONLINES";
|
|||
#include "HLEDataBase/D3D8.1.0.5558.inl"
|
||||
#include "HLEDataBase/D3D8.1.0.5788.inl"
|
||||
#include "HLEDataBase/D3D8.1.0.5849.inl"
|
||||
#include "HLEDataBase/D3D8LTCG.1.0.5849.inl"
|
||||
#include "HLEDataBase/DSound.1.0.3936.inl"
|
||||
#include "HLEDataBase/DSound.1.0.4134.inl"
|
||||
#include "HLEDataBase/DSound.1.0.4361.inl"
|
||||
|
@ -155,8 +154,6 @@ const HLEData HLEDataBase[] =
|
|||
HLE_ENTRY(Lib_D3D8, D3D8, 5788),
|
||||
HLE_ENTRY(Lib_D3D8, D3D8, 5849),
|
||||
|
||||
HLE_ENTRY(Lib_D3D8LTCG, D3D8LTCG, 5849),
|
||||
|
||||
HLE_ENTRY(Lib_DSOUND, DSound, 3936),
|
||||
HLE_ENTRY(Lib_DSOUND, DSound, 4134),
|
||||
HLE_ENTRY(Lib_DSOUND, DSound, 4361),
|
||||
|
|
|
@ -58,7 +58,6 @@
|
|||
#include "HLEDataBase/D3D8.1.0.5558.h"
|
||||
#include "HLEDataBase/D3D8.1.0.5788.h"
|
||||
#include "HLEDataBase/D3D8.1.0.5849.h"
|
||||
#include "HLEDataBase/D3D8LTCG.1.0.5849.h"
|
||||
#include "HLEDataBase/DSound.1.0.3936.h"
|
||||
#include "HLEDataBase/DSound.1.0.4134.h"
|
||||
#include "HLEDataBase/DSound.1.0.4361.h"
|
||||
|
|
|
@ -1,45 +0,0 @@
|
|||
// ******************************************************************
|
||||
// *
|
||||
// * .,-::::: .,:: .::::::::. .,:: .:
|
||||
// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;;
|
||||
// * [[[ '[[,,[[' [[[__[[\. '[[,,[['
|
||||
// * $$$ Y$$$P $$""""Y$$ Y$$$P
|
||||
// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo,
|
||||
// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm,
|
||||
// *
|
||||
// * Cxbx->Win32->CxbxKrnl->D3D8LTCG.1.0.5849.h
|
||||
// *
|
||||
// * This file is part of the Cxbx project.
|
||||
// *
|
||||
// * Cxbx and Cxbe are free software; you can redistribute them
|
||||
// * and/or modify them under the terms of the GNU General Public
|
||||
// * License as published by the Free Software Foundation; either
|
||||
// * version 2 of the license, or (at your option) any later version.
|
||||
// *
|
||||
// * This program is distributed in the hope that it will be useful,
|
||||
// * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// * GNU General Public License for more details.
|
||||
// *
|
||||
// * You should have recieved a copy of the GNU General Public License
|
||||
// * along with this program; see the file COPYING.
|
||||
// * If not, write to the Free Software Foundation, Inc.,
|
||||
// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA.
|
||||
// *
|
||||
// * (c) 2002-2003 Aaron Robinson <caustik@caustik.com>
|
||||
// *
|
||||
// * All rights reserved
|
||||
// *
|
||||
// ******************************************************************
|
||||
#ifndef D3D8LTCG_5849_H
|
||||
#define D3D8LTCG_5849_H
|
||||
|
||||
#include "OOVPA.h"
|
||||
|
||||
extern LOOVPA<2+13> D3DDevice_SetRenderState_CullMode_LTCG_5849;
|
||||
extern LOOVPA<1+10> D3DDevice_SetTextureState_TexCoordIndex_LTCG_5849;
|
||||
|
||||
extern OOVPATable D3D8LTCG_5849[];
|
||||
extern uint32 D3D8LTCG_5849_SIZE;
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
|
@ -46,23 +46,12 @@
|
|||
|
||||
static xbaddr EmuLocateFunction(OOVPA *Oovpa, xbaddr lower, xbaddr upper);
|
||||
static void EmuInstallPatches(OOVPATable *OovpaTable, uint32 OovpaTableSize, Xbe::Header *pXbeHeader);
|
||||
static void EmuXRefFailure();
|
||||
|
||||
#include <shlobj.h>
|
||||
#include <vector>
|
||||
|
||||
uint32 fcount = 0;
|
||||
void * funcExclude[2048] = { nullptr };
|
||||
|
||||
uint32 g_BuildVersion;
|
||||
|
||||
static std::vector<xbaddr> vCacheOut;
|
||||
|
||||
static bool bCacheInp = false;
|
||||
static std::vector<xbaddr> vCacheInp;
|
||||
static std::vector<xbaddr>::const_iterator vCacheInpIter;
|
||||
|
||||
|
||||
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
|
||||
|
@ -75,93 +64,15 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
|
|||
Xbe::Certificate *pCertificate = (Xbe::Certificate*)pXbeHeader->dwCertificateAddr;
|
||||
Xbe::LibraryVersion *pLibraryVersion = (Xbe::LibraryVersion*)pXbeHeader->dwLibraryVersionsAddr;
|
||||
|
||||
char szCacheFileName[MAX_PATH];
|
||||
|
||||
printf("\n");
|
||||
printf("*******************************************************************************\n");
|
||||
printf("* Cxbx-Reloaded High Level Emulation database last modified %s\n", szHLELastCompileTime);
|
||||
printf("*******************************************************************************\n");
|
||||
printf("\n");
|
||||
|
||||
//
|
||||
// initialize HLE cache file
|
||||
//
|
||||
|
||||
{
|
||||
SHGetSpecialFolderPath(NULL, szCacheFileName, CSIDL_APPDATA, TRUE);
|
||||
|
||||
strcat(szCacheFileName, "\\Cxbx-Reloaded\\");
|
||||
|
||||
CreateDirectory(szCacheFileName, NULL);
|
||||
|
||||
char *spot = strrchr(szCacheFileName, '\\');
|
||||
|
||||
//
|
||||
// create HLECache directory
|
||||
//
|
||||
|
||||
strcpy(spot, "\\HLECache");
|
||||
|
||||
CreateDirectory(szCacheFileName, NULL);
|
||||
|
||||
//
|
||||
// open title's cache file
|
||||
//
|
||||
sprintf(spot+9, "\\%08x.dat", pCertificate->dwTitleId);
|
||||
|
||||
FILE *pCacheFile = fopen(szCacheFileName, "rb");
|
||||
|
||||
if(pCacheFile != NULL)
|
||||
{
|
||||
bool bVerified = false;
|
||||
|
||||
//
|
||||
// verify last compiled timestamp
|
||||
//
|
||||
|
||||
char szCacheLastCompileTime[64];
|
||||
|
||||
memset(szCacheLastCompileTime, 0, 64);
|
||||
|
||||
if(fread(szCacheLastCompileTime, 64, 1, pCacheFile) == 1)
|
||||
{
|
||||
if(strcmp(szCacheLastCompileTime, szHLELastCompileTime) == 0)
|
||||
{
|
||||
bVerified = true;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// load function addresses
|
||||
//
|
||||
|
||||
if(bVerified)
|
||||
{
|
||||
while(true)
|
||||
{
|
||||
xbaddr cur;
|
||||
|
||||
if(fread(&cur, 4, 1, pCacheFile) != 1)
|
||||
break;
|
||||
|
||||
vCacheInp.push_back(cur);
|
||||
}
|
||||
|
||||
bCacheInp = true;
|
||||
|
||||
vCacheInpIter = vCacheInp.begin();
|
||||
|
||||
printf("HLE: Loaded HLE Cache for 0x%.08X\n", pCertificate->dwTitleId);
|
||||
}
|
||||
|
||||
fclose(pCacheFile);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// initialize Microsoft XDK emulation
|
||||
//
|
||||
|
||||
if(pLibraryVersion != 0)
|
||||
{
|
||||
printf("HLE: Detected Microsoft XDK application...\n");
|
||||
|
@ -196,6 +107,7 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
|
|||
uint16 OrigBuildVersion = BuildVersion;
|
||||
|
||||
// Aliases - for testing purposes only
|
||||
// TODO: Remove these and come up with a better way to handle XDKs we don't hve databases for
|
||||
if(BuildVersion == 4039) { BuildVersion = 4034; }
|
||||
if(BuildVersion == 4238) { BuildVersion = 4361; } // I don't think this XDK was released.
|
||||
if(BuildVersion == 4242) { BuildVersion = 4361; }
|
||||
|
@ -208,47 +120,27 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
|
|||
if(BuildVersion == 5659) { BuildVersion = 5558; }
|
||||
if(BuildVersion == 5120) { BuildVersion = 5233; }
|
||||
if(BuildVersion == 5933) { BuildVersion = 5849; } // These XDK versions are pretty much the same
|
||||
/*
|
||||
if(BuildVersion == 3944) { BuildVersion = 3925; }
|
||||
if(BuildVersion == 4039) { BuildVersion = 4034; }
|
||||
if(BuildVersion == 4242) { BuildVersion = 4432; }
|
||||
if(BuildVersion == 4531) { BuildVersion = 4432; }
|
||||
if(BuildVersion == 4721) { BuildVersion = 4432; }
|
||||
if(BuildVersion == 4831) { BuildVersion = 4432; }
|
||||
if(BuildVersion == 4928) { BuildVersion = 4432; }
|
||||
if(BuildVersion == 5028) { BuildVersion = 4432; }
|
||||
if(BuildVersion == 5120) { BuildVersion = 4432; }
|
||||
if(BuildVersion == 5344) { BuildVersion = 4432; }
|
||||
if(BuildVersion == 5455) { BuildVersion = 4432; }
|
||||
if(BuildVersion == 5933) { BuildVersion = 4432; }
|
||||
*/
|
||||
|
||||
char szLibraryName[9] = {0};
|
||||
char szOrigLibraryName[9] = {0};
|
||||
|
||||
for(uint32 c=0;c<8;c++)
|
||||
{
|
||||
szLibraryName[c] = pLibraryVersion[v].szName[c];
|
||||
szOrigLibraryName[c] = pLibraryVersion[v].szName[c];
|
||||
}
|
||||
|
||||
std::string LibraryName = std::string(pLibraryVersion[v].szName, pLibraryVersion[v].szName + 8);
|
||||
|
||||
// TODO: HACK: D3DX8 is packed into D3D8 database
|
||||
if (strcmp(szLibraryName, Lib_D3DX8) == 0)
|
||||
if (LibraryName == Lib_D3DX8)
|
||||
{
|
||||
strcpy(szLibraryName, Lib_D3D8);
|
||||
LibraryName = Lib_D3D8;
|
||||
}
|
||||
|
||||
if(strcmp(szLibraryName, Lib_D3D8LTCG) == 0)
|
||||
if (LibraryName == Lib_D3D8LTCG)
|
||||
{
|
||||
// Skip scanning for D3D8LTCG symbols when LLE GPU is selected
|
||||
if (bLLE_GPU)
|
||||
continue;
|
||||
// If LLE GPU is not enabled, show a warning that the title is not supported
|
||||
if (!bLLE_GPU) {
|
||||
CxbxKrnlCleanup("LTCG Title Detected: This game is not supported by HLE");
|
||||
}
|
||||
|
||||
// Test (do not release uncommented!)
|
||||
/*strcpy(szLibraryName, Lib_D3D8);*/
|
||||
// Skip LTCG libraries as we cannot reliably detect them
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp(szLibraryName, Lib_D3D8) == 0)
|
||||
if (LibraryName == Lib_D3D8)
|
||||
{
|
||||
// Skip scanning for D3D8 symbols when LLE GPU is selected
|
||||
if (bLLE_GPU)
|
||||
|
@ -257,7 +149,6 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
|
|||
// Prevent scanning D3D8 again (since D3D8X is packed into it above)
|
||||
if (bFoundD3D)
|
||||
{
|
||||
//DbgPrintf("Redundant\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -266,13 +157,8 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
|
|||
// 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)
|
||||
else if(LibraryName == Lib_DSOUND)
|
||||
{
|
||||
// Skip scanning for DSOUND symbols when LLE APU is selected
|
||||
if (bLLE_APU)
|
||||
|
@ -289,7 +175,7 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
|
|||
BuildVersion == 4531 )
|
||||
BuildVersion = 4627;
|
||||
}
|
||||
else if(strcmp(szLibraryName, Lib_XAPILIB) == 0)
|
||||
else if(LibraryName == Lib_XAPILIB)
|
||||
{
|
||||
// Change a few XAPILIB versions to similar counterparts
|
||||
if(BuildVersion == 3944)
|
||||
|
@ -299,14 +185,12 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
|
|||
if(OrigBuildVersion == 4531)
|
||||
BuildVersion = 4627;
|
||||
}
|
||||
else if (strcmp(szLibraryName, Lib_XGRAPHC) == 0)
|
||||
else if (LibraryName == Lib_XGRAPHC)
|
||||
{
|
||||
// Skip scanning for XGRAPHC (XG) symbols when LLE GPU is selected
|
||||
if (bLLE_GPU)
|
||||
continue;
|
||||
|
||||
// if(BuildVersion == 4432)
|
||||
// BuildVersion = 4361;
|
||||
if (BuildVersion == 3944)
|
||||
BuildVersion = 3911;
|
||||
if (OrigBuildVersion == 4531)
|
||||
|
@ -315,7 +199,7 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
|
|||
|
||||
if(bXRefFirstPass)
|
||||
{
|
||||
if(strcmp(Lib_XAPILIB, szLibraryName) == 0 &&
|
||||
if (LibraryName == Lib_XAPILIB &&
|
||||
(BuildVersion == 3911 || BuildVersion == 4034 || BuildVersion == 4134 || BuildVersion == 4361
|
||||
|| BuildVersion == 4432 || BuildVersion == 4627 || BuildVersion == 5028 || BuildVersion == 5233
|
||||
|| BuildVersion == 5344 || BuildVersion == 5558 || BuildVersion == 5788 || BuildVersion == 5849))
|
||||
|
@ -323,7 +207,7 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
|
|||
xbaddr lower = pXbeHeader->dwBaseAddr;
|
||||
xbaddr upper = pXbeHeader->dwBaseAddr + pXbeHeader->dwSizeofImage;
|
||||
}
|
||||
else if(strcmp(Lib_D3D8, szLibraryName) == 0 /*&& strcmp(Lib_D3D8LTCG, szOrigLibraryName)*/ &&
|
||||
else if(LibraryName == Lib_D3D8 &&
|
||||
(BuildVersion == 3925 || BuildVersion == 4134 || BuildVersion == 4361 || BuildVersion == 4432
|
||||
|| BuildVersion == 4627 || BuildVersion == 5028 || BuildVersion == 5233 || BuildVersion == 5344
|
||||
|| BuildVersion == 5558 || BuildVersion == 5788 || BuildVersion == 5849))
|
||||
|
@ -499,91 +383,13 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
|
|||
}
|
||||
}
|
||||
}
|
||||
//else if(strcmp(Lib_D3D8LTCG, szLibraryName) == 0 &&
|
||||
// (BuildVersion == 5849)) // 5849 only so far...
|
||||
// {
|
||||
// // Save D3D8 build version
|
||||
// g_BuildVersion = BuildVersion;
|
||||
|
||||
// xbaddr lower = pXbeHeader->dwBaseAddr;
|
||||
// xbaddr upper = pXbeHeader->dwBaseAddr + pXbeHeader->dwSizeofImage;
|
||||
// xbaddr pFunc = (xbaddr)nullptr;
|
||||
|
||||
// if(BuildVersion == 5849)
|
||||
// pFunc = EmuLocateFunction((OOVPA*)&D3DDevice_SetRenderState_CullMode_LTCG_5849, lower, upper);
|
||||
|
||||
// // locate D3DDeferredRenderState
|
||||
// if(pFunc != nullptr)
|
||||
// {
|
||||
// // offset for stencil cull enable render state in the deferred render state buffer
|
||||
// int patchOffset = 0;
|
||||
|
||||
// if(BuildVersion == 5849)
|
||||
// {
|
||||
// // WARNING: Not thoroughly tested (just seemed very correct right away)
|
||||
// XTL::EmuD3DDeferredRenderState = (DWORD*)(*(DWORD*)(pFunc + 0x2B) - 0x24C + 92*4);
|
||||
// patchOffset = 162*4 - 92*4;
|
||||
// }
|
||||
|
||||
// XRefDataBase[XREF_D3DDEVICE] = *(DWORD*)((DWORD)pFunc + 0x03);
|
||||
// XRefDataBase[XREF_D3DRS_MULTISAMPLEMODE] = (xbaddr)XTL::EmuD3DDeferredRenderState + patchOffset - 8*4;
|
||||
// XRefDataBase[XREF_D3DRS_MULTISAMPLERENDERTARGETMODE] = (xbaddr)XTL::EmuD3DDeferredRenderState + patchOffset - 7*4;
|
||||
// XRefDataBase[XREF_D3DRS_STENCILCULLENABLE] = (xbaddr)XTL::EmuD3DDeferredRenderState + patchOffset + 0*4;
|
||||
// XRefDataBase[XREF_D3DRS_ROPZCMPALWAYSREAD] = (xbaddr)XTL::EmuD3DDeferredRenderState + patchOffset + 1*4;
|
||||
// XRefDataBase[XREF_D3DRS_ROPZREAD] = (xbaddr)XTL::EmuD3DDeferredRenderState + patchOffset + 2*4;
|
||||
// XRefDataBase[XREF_D3DRS_DONOTCULLUNCOMPRESSED] = (xbaddr)XTL::EmuD3DDeferredRenderState + patchOffset + 3*4;
|
||||
|
||||
// for(int v=0;v<44;v++)
|
||||
// {
|
||||
// XTL::EmuD3DDeferredRenderState[v] = X_D3DRS_UNK;
|
||||
// }
|
||||
|
||||
// DbgPrintf("HLE: 0x%.08X -> EmuD3DDeferredRenderState\n", XTL::EmuD3DDeferredRenderState);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// XTL::EmuD3DDeferredRenderState = nullptr;
|
||||
// CxbxKrnlCleanup("EmuD3DDeferredRenderState was not found!");
|
||||
// }
|
||||
|
||||
// // locate D3DDeferredTextureState
|
||||
// {
|
||||
// pFunc = (xbaddr)nullptr;
|
||||
|
||||
// if(BuildVersion == 3925)
|
||||
// pFunc = EmuLocateFunction((OOVPA*)&D3DDevice_SetTextureState_TexCoordIndex_LTCG_5849, lower, upper);
|
||||
|
||||
// if(pFunc != (xbaddr)nullptr)
|
||||
// {
|
||||
// if(BuildVersion == 3925) // 0x18F180
|
||||
// XTL::EmuD3DDeferredTextureState = (DWORD*)(*(DWORD*)(pFunc + 0x11) - 0x70); // TODO: Verify
|
||||
// else if(BuildVersion == 4134)
|
||||
// XTL::EmuD3DDeferredTextureState = (DWORD*)(*(DWORD*)(pFunc + 0x18) - 0x70); // TODO: Verify
|
||||
// else
|
||||
// XTL::EmuD3DDeferredTextureState = (DWORD*)(*(DWORD*)(pFunc + 0x19) - 0x70);
|
||||
|
||||
// for(int s=0;s<4;s++)
|
||||
// {
|
||||
// for(int v=0;v<32;v++)
|
||||
// XTL::EmuD3DDeferredTextureState[v+s*32] = X_D3DTSS_UNK;
|
||||
// }
|
||||
|
||||
// DbgPrintf("HLE: 0x%.08X -> EmuD3DDeferredTextureState\n", XTL::EmuD3DDeferredTextureState);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// XTL::EmuD3DDeferredTextureState = nullptr;
|
||||
// CxbxKrnlCleanup("EmuD3DDeferredTextureState was not found!");
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
printf("HLE: * Searching HLE database for %s version 1.0.%d... ", szLibraryName, BuildVersion);
|
||||
printf("HLE: * Searching HLE database for %s version 1.0.%d... ", LibraryName.c_str(), BuildVersion);
|
||||
|
||||
const HLEData *FoundHLEData = nullptr;
|
||||
for(uint32 d = 0; d < HLEDataBaseCount; d++) {
|
||||
if (BuildVersion == HLEDataBase[d].BuildVersion && strcmp(szLibraryName, HLEDataBase[d].Library) == 0) {
|
||||
if (BuildVersion == HLEDataBase[d].BuildVersion && strcmp(LibraryName.c_str(), HLEDataBase[d].Library) == 0) {
|
||||
FoundHLEData = &HLEDataBase[d];
|
||||
break;
|
||||
}
|
||||
|
@ -604,49 +410,6 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
|
|||
printf("HLE: Resolved %d cross reference(s)\n", OrigUnResolvedXRefs - UnResolvedXRefs);
|
||||
}
|
||||
|
||||
vCacheInp.clear();
|
||||
|
||||
//
|
||||
// update cache file
|
||||
//
|
||||
/* Turn of the nasty HLE cacheing (When you are adding oovaps anyway), it's in dire need of a better file identify system
|
||||
if(vCacheOut.size() > 0)
|
||||
{
|
||||
FILE *pCacheFile = fopen(szCacheFileName, "wb");
|
||||
|
||||
if(pCacheFile != NULL)
|
||||
{
|
||||
DbgPrintf("HLE: Saving HLE Cache for 0x%.08X...\n", pCertificate->dwTitleId);
|
||||
|
||||
//
|
||||
// write last compiled timestamp
|
||||
//
|
||||
|
||||
char szCacheLastCompileTime[64];
|
||||
|
||||
memset(szCacheLastCompileTime, 0, 64);
|
||||
|
||||
strcpy(szCacheLastCompileTime, szHLELastCompileTime);
|
||||
|
||||
fwrite(szCacheLastCompileTime, 64, 1, pCacheFile);
|
||||
|
||||
//
|
||||
// write function addresses
|
||||
//
|
||||
|
||||
std::vector<void*>::const_iterator cur;
|
||||
|
||||
for(cur = vCacheOut.begin();cur != vCacheOut.end(); ++cur)
|
||||
{
|
||||
fwrite(&(*cur), 4, 1, pCacheFile);
|
||||
}
|
||||
}
|
||||
|
||||
fclose(pCacheFile);
|
||||
}
|
||||
*/
|
||||
vCacheOut.clear();
|
||||
|
||||
printf("\n");
|
||||
|
||||
return;
|
||||
|
@ -859,47 +622,21 @@ static void EmuInstallPatches(OOVPATable *OovpaTable, uint32 OovpaTableSize, Xbe
|
|||
OOVPA *Oovpa = OovpaTable[a].Oovpa;
|
||||
xbaddr pFunc = (xbaddr)nullptr;
|
||||
|
||||
if(bCacheInp && (vCacheInpIter != vCacheInp.end()))
|
||||
{
|
||||
pFunc = *vCacheInpIter;
|
||||
++vCacheInpIter;
|
||||
}
|
||||
else
|
||||
{
|
||||
pFunc = EmuLocateFunction(Oovpa, lower, upper);
|
||||
if (pFunc != (xbaddr)nullptr)
|
||||
vCacheOut.push_back(pFunc);
|
||||
}
|
||||
|
||||
pFunc = EmuLocateFunction(Oovpa, lower, upper);
|
||||
|
||||
if(pFunc != (xbaddr)nullptr)
|
||||
{
|
||||
printf("HLE: 0x%.08X -> %s\n", pFunc, OovpaTable[a].szFuncName);
|
||||
|
||||
if(OovpaTable[a].emuPatch == nullptr)
|
||||
{
|
||||
// Only place an XRef trapping patch when the OOVPA registration wasn't disabled
|
||||
if ((OovpaTable[a].Flags & Flag_DontScan) == 0)
|
||||
{
|
||||
// Write breakpoint opcode
|
||||
*(uint8_t*)pFunc = OPCODE_INT3_CC;
|
||||
EmuInstallPatch(pFunc + 1, EmuXRefFailure);
|
||||
}
|
||||
}
|
||||
else
|
||||
if ((OovpaTable[a].Flags & Flag_DontScan) == 0 && (OovpaTable[a].emuPatch != nullptr))
|
||||
{
|
||||
EmuInstallPatch(pFunc, OovpaTable[a].emuPatch);
|
||||
funcExclude[fcount++] = (void *)pFunc;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// alert for the situation where an Xref function body is hit
|
||||
static void EmuXRefFailure()
|
||||
{
|
||||
CxbxKrnlCleanup("XRef-only function body reached. Fatal Error.");
|
||||
}
|
||||
|
||||
#ifdef _DEBUG_TRACE
|
||||
|
||||
struct HLEVerifyContext {
|
||||
|
|
Loading…
Reference in New Issue