separate D3D8 build version away from general build version

Plus prepare DSOUND build version to be use.
This commit is contained in:
RadWolfie 2019-07-04 15:45:25 -05:00 committed by PatrickvL
parent 6bc8294c79
commit 63663301f2
5 changed files with 39 additions and 31 deletions

View File

@ -43,6 +43,10 @@ static_assert(false, "Please implement support for cross-platform's user profile
#endif
std::string g_exec_filepath;
// Individual library version
uint16_t g_LibVersion_D3D8 = 0;
uint16_t g_LibVersion_DSOUND = 0;
// NOTE: Update settings_version when add/edit/delete setting's structure.
const unsigned int settings_version = 4;

View File

@ -31,6 +31,10 @@
#include <string>
extern std::string g_exec_filepath;
// Individual library version
extern uint16_t g_LibVersion_D3D8;
extern uint16_t g_LibVersion_DSOUND;
#define szSettings_alloc_error "ERROR: Unable to allocate Settings class."

View File

@ -126,9 +126,6 @@ XTL::D3DCAPS g_D3DCaps = {}; // Direct3D Caps
// wireframe toggle
static int g_iWireframe = 0;
// build version
extern uint32_t g_BuildVersion;
typedef uint64_t resource_key_t;
extern void UpdateFPSCounter();
@ -3655,7 +3652,7 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_SetVertexShaderConstant)
// some shaders need to add 96 to use ranges 0 to 192. This fixes 3911 - 4361 games and XDK
// samples, but breaks Turok.
// See D3DDevice_GetVertexShaderConstant
if(g_BuildVersion <= 4361)
if(g_LibVersion_D3D8 <= 4361)
Register += 96;
HRESULT hRet;
@ -8194,7 +8191,7 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_GetVertexShaderConstant)
// some shaders need to add 96 to use ranges 0 to 192. This fixes 3911 - 4361 games and XDK
// samples, but breaks Turok.
// See D3DDevice_SetVertexShaderConstant
if (g_BuildVersion <= 4361)
if (g_LibVersion_D3D8 <= 4361)
Register += 96;
HRESULT hRet = g_pD3DDevice->GetVertexShaderConstantF
@ -9118,7 +9115,7 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_SetPixelShaderConstant_4)
// TODO: This hack is necessary for Vertex Shaders on XDKs prior to 4361, but if this
// causes problems with pixel shaders, feel free to comment out the hack below.
if(g_BuildVersion <= 4361)
if(g_LibVersion_D3D8 <= 4361)
Register += 96;
HRESULT hRet = g_pD3DDevice->SetPixelShaderConstantF

View File

@ -34,9 +34,8 @@
DWORD *XTL::EmuD3DDeferredRenderState = nullptr;
DWORD *XTL::EmuD3DDeferredTextureState = nullptr;
extern uint32_t g_BuildVersion;
#include "core\hle\Intercept.hpp" // For g_SymbolAddresses
#include "common/Settings.hpp" // For g_LibVersion_D3D8
void VerifyAndFixEmuDeferredRenderStateOffset()
{
@ -61,7 +60,7 @@ void VerifyAndFixEmuDeferredRenderStateOffset()
// Calculate index of D3DRS_CULLMODE for this XDK. We start counting from the first deferred state (D3DRS_FOGENABLE)
DWORD CullModeIndex = 0;
for (int i = XTL::X_D3DRS_FOGENABLE; i < XTL::X_D3DRS_CULLMODE; i++) {
if (XTL::DxbxRenderStateInfo[i].V <= g_BuildVersion) {
if (XTL::DxbxRenderStateInfo[i].V <= g_LibVersion_D3D8) {
CullModeIndex++;
}
}
@ -81,7 +80,7 @@ void UpdateDeferredRenderStates()
// Loop through all deferred render states
for (unsigned int RenderState = XTL::X_D3DRS_FOGENABLE; RenderState <= XTL::X_D3DRS_PRESENTATIONINTERVAL; RenderState++) {
// If the current state is not present within our desired XDK, skip it
if (XTL::DxbxRenderStateInfo[RenderState].V >= g_BuildVersion) {
if (XTL::DxbxRenderStateInfo[RenderState].V >= g_LibVersion_D3D8) {
continue;
}
@ -174,7 +173,7 @@ DWORD GetDeferredTextureStateFromIndex(DWORD State)
{
// On early XDKs, we need to shuffle the values around a little
// TODO: Verify which XDK version this change occurred at
if (g_BuildVersion <= 3948) {
if (g_LibVersion_D3D8 <= 3948) {
// Values range 0-9 (D3DTSS_COLOROP to D3DTSS_TEXTURETRANSFORMFLAGS) become 12-21
if (State <= 9) {
return State + 12;
@ -228,7 +227,7 @@ DWORD TranslateXDKSpecificD3DTOP(DWORD Value)
// TODO: Determine when exactly these values changed
// So far, 4134 is the earliest version we've seen using these mappings
// But this may change
if (g_BuildVersion >= 4134) {
if (g_LibVersion_D3D8 >= 4134) {
// For these XDKs, the mapping has been confirmed to match our internal mapping
return Value;
}

View File

@ -76,9 +76,6 @@ static const char* section_symbols = "Symbols";
std::map<std::string, xbaddr> g_SymbolAddresses;
bool g_SymbolCacheUsed = false;
// D3D build version
uint32_t g_BuildVersion = 0;
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_USB = false; // Set this to true for experimental USB (input) LLE
@ -348,16 +345,29 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
uint32_t dwLibraryVersions = pXbeHeader->dwLibraryVersions;
const char* SectionName = nullptr;
Xbe::SectionHeader* pSectionHeaders = (Xbe::SectionHeader*)pXbeHeader->dwSectionHeadersAddr;
uint32_t XbLibFlag;
// Get the highest revision build and prefix library to scan.
for (uint32_t v = 0; v < dwLibraryVersions; v++) {
uint16_t BuildVersion = pLibraryVersion[v].wBuildVersion;
uint16_t QFEVersion = pLibraryVersion[v].wFlags.QFEVersion;
uint16_t BuildVersion, QFEVersion;
BuildVersion = pLibraryVersion[v].wBuildVersion;
QFEVersion = pLibraryVersion[v].wFlags.QFEVersion;
if (xdkVersion < BuildVersion) {
xdkVersion = BuildVersion;
}
XbLibScan |= XbSymbolLibrayToFlag(std::string(pLibraryVersion[v].szName, pLibraryVersion[v].szName + 8).c_str());
XbLibFlag = XbSymbolLibrayToFlag(std::string(pLibraryVersion[v].szName, pLibraryVersion[v].szName + 8).c_str());
XbLibScan |= XbLibFlag;
// Keep certain library versions for plugin usage.
if ((XbLibFlag & (XbSymbolLib_D3D8 | XbSymbolLib_D3D8LTCG)) > 0) {
if (g_LibVersion_D3D8 < BuildVersion) {
g_LibVersion_D3D8 = BuildVersion;
}
}
else if ((XbLibFlag & XbSymbolLib_DSOUND) > 0) {
g_LibVersion_DSOUND = BuildVersion;
}
}
// Since XDK 4039 title does not have library version for DSOUND, let's check section header if it exists or not.
@ -365,6 +375,11 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
SectionName = (const char*)pSectionHeaders[v].dwSectionNameAddr;
if (strncmp(SectionName, Lib_DSOUND, 8) == 0) {
XbLibScan |= XbSymbolLib_DSOUND;
// If DSOUND version is not set, we need to force set it.
if (g_LibVersion_DSOUND == 0) {
g_LibVersion_DSOUND = xdkVersion;
}
break;
}
}
@ -405,7 +420,7 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
symbolCacheData.LoadFile(filename.c_str());
g_BuildVersion = symbolCacheData.GetLongValue(section_libs, sect_libs_keys.BuildVersion, /*Default=*/0);
xdkVersion = symbolCacheData.GetLongValue(section_libs, sect_libs_keys.BuildVersion, /*Default=*/0);
// Verify the version of the cache file against the Symbol Database version hash
const uint32_t SymbolDatabaseVersionHash = symbolCacheData.GetLongValue(section_info, sect_info_keys.SymbolDatabaseVersionHash, /*Default=*/0);
@ -474,17 +489,6 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
std::printf("Symbol: Detected Microsoft XDK application...\n");
// TODO: Is this enough for alias? We need to verify it.
if ((XbLibScan & XbSymbolLib_D3D8) > 0 || (XbLibScan & XbSymbolLib_D3D8LTCG) > 0) {
g_BuildVersion = xdkVersion;
}
#if 0 // NOTE: This is a note for what we should do for above.
if (BuildVersion >= 5558 && BuildVersion <= 5659 && QFEVersion > 1) {
EmuLog(LOG_LEVEL::WARNING, "D3D8 version 1.0.%d.%d Title Detected: This game uses an alias version 1.0.5788", BuildVersion, QFEVersion);
BuildVersion = 5788;
}
#endif
#if 0 // NOTE: This code is currently disabled due to not optimized and require more work to do.
XbSymbolRegisterLibrary(XbLibScan);
@ -537,7 +541,7 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
symbolCacheData.SetLongValue(section_libs, LibraryName.c_str(), pLibraryVersion[i].wBuildVersion, nullptr, /*UseHex =*/false);
}
symbolCacheData.SetLongValue(section_libs, sect_libs_keys.BuildVersion, g_BuildVersion, nullptr, /*UseHex =*/false);
symbolCacheData.SetLongValue(section_libs, sect_libs_keys.BuildVersion, xdkVersion, nullptr, /*UseHex =*/false);
// Store detected symbol addresses
for(auto it = g_SymbolAddresses.begin(); it != g_SymbolAddresses.end(); ++it) {