Merge remote-tracking branch 'origin/oovpa_refactor' into hle-caching

This commit is contained in:
Luke Usher 2017-04-19 06:23:56 +01:00
commit 62ec14bafe
7 changed files with 23 additions and 1348 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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