initialize commits of scan locate D3DDeferredRenderState D3DDeferredTextureState

This commit is contained in:
jarupxx 2017-09-23 09:37:52 +09:00 committed by Luke Usher
parent a72cfb8191
commit 064a3173d9
11 changed files with 179 additions and 13 deletions

View File

@ -36,7 +36,7 @@
#include "OOVPA.h"
extern LOOVPA<1+10> D3DDevice_SetTextureState_TexCoordIndex_4361;
extern LOOVPA<1+10> D3DDevice_SetTextureState_TexCoordIndex_4242;
extern OOVPATable D3D8_4361[];
extern uint32 D3D8_4361_SIZE;

View File

@ -595,7 +595,7 @@ OOVPA_END;
// ******************************************************************
// * D3DDevice_SetTextureState_TexCoordIndex
// ******************************************************************
OOVPA_XREF(D3DDevice_SetTextureState_TexCoordIndex, 4361, 1+10,
OOVPA_XREF(D3DDevice_SetTextureState_TexCoordIndex, 4242, 1+10,
XRefNoSaveIndex,
XRefOne)
@ -1242,7 +1242,7 @@ OOVPATable D3D8_4361[] = {
REGISTER_OOVPA(D3DDevice_EnableOverlay, 4134, PATCH),
REGISTER_OOVPA(D3DDevice_UpdateOverlay, 4361, PATCH),
REGISTER_OOVPA(D3DDevice_BlockUntilVerticalBlank, 4361, PATCH),
REGISTER_OOVPA(D3DDevice_SetTextureState_TexCoordIndex, 4361, PATCH),
REGISTER_OOVPA(D3DDevice_SetTextureState_TexCoordIndex, 4242, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_VertexBlend, 4134, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_CullMode, 4034, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_TextureFactor, 4134, PATCH),

View File

@ -645,7 +645,7 @@ OOVPATable D3D8_4432[] {
REGISTER_OOVPA(D3DDevice_SetRenderState_BackFillMode, 4134, PATCH),
REGISTER_OOVPA(D3DDevice_SetTextureState_BorderColor, 4361, PATCH),
REGISTER_OOVPA(D3DDevice_SetTextureState_ColorKeyColor, 4134, PATCH),
REGISTER_OOVPA(D3DDevice_SetTextureState_TexCoordIndex, 4361, PATCH),
REGISTER_OOVPA(D3DDevice_SetTextureState_TexCoordIndex, 4242, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_VertexBlend, 4134, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_CullMode, 4034, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_FrontFace, 4134, PATCH),

View File

@ -36,7 +36,9 @@
#include "OOVPA.h"
#if 0 // No longer used, replaced by generic 4034 version
extern LOOVPA<2+13> D3DDevice_SetRenderState_CullMode_5233;
#endif
extern OOVPATable D3D8_5233[];
extern uint32 D3D8_5233_SIZE;

View File

@ -123,7 +123,7 @@ OOVPA_NO_XREF(D3DDevice_CreateTexture2, 5233, 12)
{ 0xB2, 0xC2 },
{ 0xB3, 0x1C },
OOVPA_END;
#if 0 // No longer used, replaced by generic 4034 version
// ******************************************************************
// * D3DDevice_SetRenderState_CullMode
// ******************************************************************
@ -156,6 +156,7 @@ OOVPA_XREF(D3DDevice_SetRenderState_CullMode, 5233, 2+13,
{ 0x55, 0x04 },
{ 0x56, 0x04 },
OOVPA_END;
#endif
// ******************************************************************
// * D3DDevice_SetTexture
@ -662,7 +663,7 @@ OOVPATable D3D8_5233[] = {
REGISTER_OOVPA(D3DDevice_SetTextureState_BorderColor, 4361, PATCH),
REGISTER_OOVPA(D3DDevice_SetTextureState_ColorKeyColor, 4134, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_VertexBlend, 4134, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_CullMode, 5233, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_CullMode, 4034, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_NormalizeNormals, 4134, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_TextureFactor, 5028, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_ZBias, 3925, PATCH),

View File

@ -1127,7 +1127,7 @@ OOVPATable D3D8_5344[] = {
REGISTER_OOVPA(D3DDevice_SetTextureState_BorderColor, 4361, PATCH),
REGISTER_OOVPA(D3DDevice_SetTextureState_ColorKeyColor, 4134, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_VertexBlend, 4134, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_CullMode, 5233, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_CullMode, 4034, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_NormalizeNormals, 4134, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_TextureFactor, 5028, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_ZBias, 3925, PATCH),

View File

@ -1722,7 +1722,7 @@ OOVPATable D3D8_5558[] = {
REGISTER_OOVPA(D3DDevice_SetTextureState_TexCoordIndex, 4627, PATCH),
REGISTER_OOVPA(D3DDevice_SetTextureState_BumpEnv, 4039, PATCH),
REGISTER_OOVPA(D3DDevice_SetTextureState_BorderColor, 4361, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_CullMode, 5233, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_CullMode, 4034, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_NormalizeNormals, 4134, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_ZBias, 3925, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_EdgeAntiAlias, 4134, PATCH),

View File

@ -1070,7 +1070,7 @@ OOVPATable D3D8_5788[] = {
REGISTER_OOVPA(D3DDevice_SetTextureState_TexCoordIndex, 4627, PATCH),
REGISTER_OOVPA(D3DDevice_SetTextureState_BumpEnv, 4039, PATCH),
REGISTER_OOVPA(D3DDevice_SetTextureState_BorderColor, 4361, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_CullMode, 5233, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_CullMode, 4034, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_TextureFactor, 5788, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_NormalizeNormals, 4134, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_ZBias, 3925, PATCH),

View File

@ -192,7 +192,7 @@ OOVPATable D3D8_5849[] = {
REGISTER_OOVPA(D3DDevice_SetTextureState_TexCoordIndex, 4627, PATCH),
REGISTER_OOVPA(D3DDevice_SetTextureState_BumpEnv, 4039, PATCH),
REGISTER_OOVPA(D3DDevice_SetTextureState_BorderColor, 4361, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_CullMode, 5233, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_CullMode, 4034, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_TextureFactor, 5788, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_NormalizeNormals, 4134, PATCH),
REGISTER_OOVPA(D3DDevice_SetRenderState_ZBias, 3925, PATCH),

View File

@ -224,7 +224,7 @@ OOVPATable D3D8_OOVPAV2[] = {
REGISTER_OOVPAS(D3DDevice_SetTextureState_BorderColor, PATCH, 3925, 4034, 4361),
REGISTER_OOVPAS(D3DDevice_SetTextureState_BumpEnv, PATCH, 3925, 4039),
REGISTER_OOVPAS(D3DDevice_SetTextureState_ColorKeyColor, PATCH, 3925, 4034, 4134),
REGISTER_OOVPAS(D3DDevice_SetTextureState_TexCoordIndex, PATCH, 3925, 4034, 4361, 4627),
REGISTER_OOVPAS(D3DDevice_SetTextureState_TexCoordIndex, PATCH, 3925, 4034, 4242, 4627),
REGISTER_OOVPAS(D3DDevice_SetTile, PATCH, 3925, 4039, 4134, 4627, 5028, 5558, 5788),
REGISTER_OOVPAS(D3DDevice_SetTransform, PATCH, 3925, 4034, 4134, 5344, 5558), // Was 4134 (from 5344's comment)
REGISTER_OOVPAS(D3DDevice_SetVertexData2f, PATCH, 3925, 4039), // Was 4627 (from 5344's comment)

View File

@ -339,10 +339,11 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
// Skip scanning for D3D8 symbols when LLE GPU is selected
if (bLLE_GPU)
continue;
#if ENABLE_LEGACY_D3D8_DB
// Some 3911 titles have different D3D8 builds
if (BuildVersion <= 3948)
BuildVersion = 3925;
#endif
}
if (strcmp(LibraryName.c_str(), Lib_DSOUND) == 0)
{
@ -410,6 +411,167 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
xbaddr lower = pXbeHeader->dwBaseAddr;
xbaddr upper = pXbeHeader->dwBaseAddr + pXbeHeader->dwSizeofImage;
}
#ifndef ENABLE_LEGACY_D3D8_DB
else if (strcmp(LibraryName.c_str(), Lib_D3D8) == 0)
{
xbaddr lower = pXbeHeader->dwBaseAddr;
xbaddr upper = pXbeHeader->dwBaseAddr + pXbeHeader->dwSizeofImage;
xbaddr pFunc = (xbaddr)nullptr;
if(OrigBuildVersion >= 3925 && OrigBuildVersion < 4034)
pFunc = EmuLocateFunction((OOVPA*)&D3DDevice_SetRenderState_CullMode_3925, lower, upper);
else
pFunc = EmuLocateFunction((OOVPA*)&D3DDevice_SetRenderState_CullMode_4034, lower, upper);
// locate D3DDeferredRenderState
if(pFunc != (xbaddr)nullptr)
{
// offset for stencil cull enable render state in the deferred render state buffer
xbaddr DerivedAddr_D3DRS_CULLMODE = NULL;
int Decrement = 0; // TODO : Rename into something understandable
int Increment = 0; // TODO : Rename into something understandable
int patchOffset = 0; // TODO : Rename into something understandable
// Read address of D3DRS_CULLMODE from D3DDevice_SetRenderState_CullMode
// TODO : Simplify this when XREF_D3DRS_CULLMODE derivation is deemed stable
{
if (OrigBuildVersion >= 3925 && OrigBuildVersion < 4034)
{
DerivedAddr_D3DRS_CULLMODE = *(xbaddr*)(pFunc + 0x25);
Decrement = 0x1FC; // TODO: Clean up (?)
Increment = 82 * 4;
patchOffset = 140 * 4; // Verified 3925 and 3948
//Decrement = 0x19F; // TODO: Clean up (?)
//Increment = 72 * 4;
//patchOffset = 142*4; // TODO: Verify
}
else if (OrigBuildVersion >= 4034 && OrigBuildVersion <= 4361)
{
DerivedAddr_D3DRS_CULLMODE = *(xbaddr*)(pFunc + 0x2B);
Decrement = 0x200;
Increment = 82 * 4;
patchOffset = 142 * 4;
}
else if (OrigBuildVersion >= 4432 && OrigBuildVersion < 4627)
{
DerivedAddr_D3DRS_CULLMODE = *(xbaddr*)(pFunc + 0x2B);
Decrement = 0x204;
Increment = 83 * 4;
patchOffset = 143 * 4;
}
else if (OrigBuildVersion >= 4627 && OrigBuildVersion <= 5933)
{
DerivedAddr_D3DRS_CULLMODE = *(xbaddr*)(pFunc + 0x2B);
Decrement = 0x24C;
Increment = 92 * 4;
patchOffset = 162 * 4;
}
// Temporary verification - is XREF_D3DDEVICE derived correctly?
xbaddr DerivedAddr_D3DDevice = *(xbaddr*)((xbaddr)pFunc + 0x03);
if (XRefDataBase[XREF_D3DDEVICE] != DerivedAddr_D3DDevice)
{
if (XRefDataBase[XREF_D3DDEVICE] != XREF_ADDR_DERIVE)
CxbxPopupMessage("Second derived XREF_D3DDEVICE differs from first!");
XRefDataBase[XREF_D3DDEVICE] = DerivedAddr_D3DDevice;
}
g_SymbolAddresses["D3DDEVICE"] = DerivedAddr_D3DDevice;
// Temporary verification - is XREF_D3DRS_CULLMODE derived correctly?
if (XRefDataBase[XREF_D3DRS_CULLMODE] != DerivedAddr_D3DRS_CULLMODE)
{
if (XRefDataBase[XREF_D3DRS_CULLMODE] != XREF_ADDR_DERIVE)
CxbxPopupMessage("Second derived XREF_D3DRS_CULLMODE differs from first!");
XRefDataBase[XREF_D3DRS_CULLMODE] = DerivedAddr_D3DRS_CULLMODE;
}
}
// Derive address of EmuD3DDeferredRenderState from D3DRS_CULLMODE
XTL::EmuD3DDeferredRenderState = (DWORD*)(DerivedAddr_D3DRS_CULLMODE - Decrement + Increment);
patchOffset -= Increment;
// Derive address of a few other deferred render state slots (to help xref-based function location)
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] = XTL::X_D3DRS_UNK;
}
g_SymbolAddresses["D3DDeferredRenderState"] = (DWORD)XTL::EmuD3DDeferredRenderState;
printf("HLE: 0x%.08X -> EmuD3DDeferredRenderState\n", XTL::EmuD3DDeferredRenderState);
//DbgPrintf("HLE: 0x%.08X -> XREF_D3DRS_ROPZCMPALWAYSREAD\n", XRefDataBase[XREF_D3DRS_ROPZCMPALWAYSREAD] );
}
else
{
XTL::EmuD3DDeferredRenderState = nullptr;
CxbxKrnlCleanup("EmuD3DDeferredRenderState was not found!");
}
// locate D3DDeferredTextureState
{
pFunc = (xbaddr)nullptr;
if(OrigBuildVersion >= 3925 && OrigBuildVersion < 4034)
pFunc = EmuLocateFunction((OOVPA*)&D3DDevice_SetTextureState_TexCoordIndex_3925, lower, upper);
else if(OrigBuildVersion >= 4034 && OrigBuildVersion < 4242)
pFunc = EmuLocateFunction((OOVPA*)&D3DDevice_SetTextureState_TexCoordIndex_4034, lower, upper);
else if(OrigBuildVersion >= 4242 && OrigBuildVersion < 4627)
pFunc = EmuLocateFunction((OOVPA*)&D3DDevice_SetTextureState_TexCoordIndex_4242, lower, upper);
else if(OrigBuildVersion >= 4627)
pFunc = EmuLocateFunction((OOVPA*)&D3DDevice_SetTextureState_TexCoordIndex_4627, lower, upper);
if (pFunc != (xbaddr)nullptr)
{
xbaddr DerivedAddr_D3DTSS_TEXCOORDINDEX = NULL;
int Decrement = 0x70; // TODO : Rename into something understandable
// TODO : Remove this when XREF_D3DTSS_TEXCOORDINDEX derivation is deemed stable
{
if (OrigBuildVersion >= 3925 && OrigBuildVersion < 4034) // 0x18F180
DerivedAddr_D3DTSS_TEXCOORDINDEX = *(xbaddr*)(pFunc + 0x11);
else if (OrigBuildVersion >= 4034 && OrigBuildVersion < 4242)
DerivedAddr_D3DTSS_TEXCOORDINDEX = *(xbaddr*)(pFunc + 0x18);
else
DerivedAddr_D3DTSS_TEXCOORDINDEX = *(xbaddr*)(pFunc + 0x19);
// Temporary verification - is XREF_D3DTSS_TEXCOORDINDEX derived correctly?
if (XRefDataBase[XREF_D3DTSS_TEXCOORDINDEX] != DerivedAddr_D3DTSS_TEXCOORDINDEX)
{
if (XRefDataBase[XREF_D3DTSS_TEXCOORDINDEX] != XREF_ADDR_DERIVE)
CxbxPopupMessage("Second derived XREF_D3DTSS_TEXCOORDINDEX differs from first!");
XRefDataBase[XREF_D3DTSS_TEXCOORDINDEX] = DerivedAddr_D3DTSS_TEXCOORDINDEX;
}
}
XTL::EmuD3DDeferredTextureState = (DWORD*)(DerivedAddr_D3DTSS_TEXCOORDINDEX - Decrement);
for(int s=0;s<4;s++)
{
for(int v=0;v<32;v++)
XTL::EmuD3DDeferredTextureState[v+s*32] = X_D3DTSS_UNK;
}
g_SymbolAddresses["D3DDeferredTextureState"] = (DWORD)XTL::EmuD3DDeferredTextureState;
printf("HLE: 0x%.08X -> EmuD3DDeferredTextureState\n", XTL::EmuD3DDeferredTextureState);
}
else
{
XTL::EmuD3DDeferredTextureState = nullptr;
CxbxKrnlCleanup("EmuD3DDeferredTextureState was not found!");
}
}
#else
else if (strcmp(LibraryName.c_str(), Lib_D3D8) == 0 &&
(BuildVersion == 3925 || BuildVersion == 4034 || BuildVersion == 4134 || BuildVersion == 4361
|| BuildVersion == 4432 || BuildVersion == 4627 || BuildVersion == 5028 || BuildVersion == 5233
@ -544,7 +706,7 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
else if(BuildVersion == 4034 || BuildVersion == 4134)
pFunc = EmuLocateFunction((OOVPA*)&D3DDevice_SetTextureState_TexCoordIndex_4034, lower, upper);
else if(BuildVersion == 4361 || BuildVersion == 4432)
pFunc = EmuLocateFunction((OOVPA*)&D3DDevice_SetTextureState_TexCoordIndex_4361, lower, upper);
pFunc = EmuLocateFunction((OOVPA*)&D3DDevice_SetTextureState_TexCoordIndex_4242, lower, upper);
else if(BuildVersion == 4627 || BuildVersion == 5028 || BuildVersion == 5233 || BuildVersion == 5344
|| BuildVersion == 5558 || BuildVersion == 5788 || BuildVersion == 5849)
pFunc = EmuLocateFunction((OOVPA*)&D3DDevice_SetTextureState_TexCoordIndex_4627, lower, upper);
@ -591,6 +753,7 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
CxbxKrnlCleanup("EmuD3DDeferredTextureState was not found!");
}
}
#endif
}
}