diff --git a/Dllmain/BuildNo.rc b/Dllmain/BuildNo.rc index f5ccaa52..b3a86fdb 100644 --- a/Dllmain/BuildNo.rc +++ b/Dllmain/BuildNo.rc @@ -1 +1 @@ -#define BUILD_NUMBER 6490 +#define BUILD_NUMBER 6491 diff --git a/External/Hooking b/External/Hooking index c8cb86c0..b65461a2 160000 --- a/External/Hooking +++ b/External/Hooking @@ -1 +1 @@ -Subproject commit c8cb86c0c7427a8f8b29999dbf716ec40a34ff32 +Subproject commit b65461a22d60a63175e0007bac8a3f549ee45c26 diff --git a/Settings/AllSettings.ini b/Settings/AllSettings.ini index ac0e067a..a4e77e37 100644 --- a/Settings/AllSettings.ini +++ b/Settings/AllSettings.ini @@ -64,6 +64,8 @@ AntiAliasing = 0 CacheClipPlane = 0 EnableVSync = 0 EnableWindowMode = 0 +ForceMixedVertexProcessing = 0 +ForceSystemMemVertexCache = 0 ForceVsyncMode = 0 FullscreenWindowMode = 0 WindowModeBorder = 0 diff --git a/Settings/Settings.cpp b/Settings/Settings.cpp index 94c7348b..8fb9ee0f 100644 --- a/Settings/Settings.cpp +++ b/Settings/Settings.cpp @@ -586,7 +586,7 @@ void CONFIG::Init() DDrawCompat = (DDrawCompat || DDrawCompat20 || DDrawCompat21 || DDrawCompatExperimental); isDdrawWrapperEnabled = (EnableDdrawWrapper || ConvertToDirectDraw7 || ConvertToDirect3D7 || DdrawResolutionHack); EnableWindowMode = (FullscreenWindowMode) ? true : EnableWindowMode; - isD3d9WrapperEnabled = (AnisotropicFiltering || AntiAliasing || CacheClipPlane || EnableVSync || ForceVsyncMode || EnableWindowMode); + isD3d9WrapperEnabled = (AnisotropicFiltering || AntiAliasing || CacheClipPlane || EnableVSync || ForceMixedVertexProcessing || ForceSystemMemVertexCache || ForceVsyncMode || EnableWindowMode); // Set ddraw color bit mode DdrawOverrideBitMode = (DdrawOverrideBitMode) ? DdrawOverrideBitMode : (Force32bitColor) ? 32 : (Force16bitColor) ? 16 : 0; diff --git a/Settings/Settings.h b/Settings/Settings.h index 889056c4..ae7ac5e9 100644 --- a/Settings/Settings.h +++ b/Settings/Settings.h @@ -50,6 +50,8 @@ visit(EnableVSync) \ visit(EnableWindowMode) \ visit(ExcludeProcess) \ + visit(ForceMixedVertexProcessing) \ + visit(ForceSystemMemVertexCache) \ visit(FilterNonActiveInput) \ visit(FixSpeakerConfigType) \ visit(ForceExclusiveMode) \ @@ -205,6 +207,8 @@ struct CONFIG bool EnableDsoundWrapper; // Enables the dsound wrapper bool EnableWindowMode; // Enables WndMode for d3d9 wrapper bool EnableVSync; // Enables VSync for d3d9 wrapper + bool ForceMixedVertexProcessing; // Forces Mixed mode for vertex processing in d3d9 + bool ForceSystemMemVertexCache; // Forces System Memory caching for vertexes in d3d9 bool FullScreen; // Sets the main window to fullscreen bool FullscreenWindowMode; // Enables fullscreen windowed mode, requires EnableWindowMode bool ForceTermination; // Terminates application when main window closes diff --git a/Settings/Settings.ini b/Settings/Settings.ini index 985dabe6..87bda0f0 100644 --- a/Settings/Settings.ini +++ b/Settings/Settings.ini @@ -59,6 +59,8 @@ AnisotropicFiltering = 0 AntiAliasing = 0 EnableVSync = 0 EnableWindowMode = 0 +ForceMixedVertexProcessing = 0 +ForceSystemMemVertexCache = 0 ForceVsyncMode = 0 FullscreenWindowMode = 0 WindowModeBorder = 0 diff --git a/d3d9/IDirect3D9Ex.cpp b/d3d9/IDirect3D9Ex.cpp index 66594466..892aea1f 100644 --- a/d3d9/IDirect3D9Ex.cpp +++ b/d3d9/IDirect3D9Ex.cpp @@ -174,6 +174,8 @@ HRESULT m_IDirect3D9Ex::CreateDevice(UINT Adapter, D3DDEVTYPE DeviceType, HWND h return D3DERR_INVALIDCALL; } + BehaviorFlags = UpdateBehaviorFlags(BehaviorFlags); + // Create new d3d9 device HRESULT hr = D3DERR_INVALIDCALL; @@ -271,6 +273,8 @@ HRESULT m_IDirect3D9Ex::CreateDeviceEx(THIS_ UINT Adapter, D3DDEVTYPE DeviceType return D3DERR_INVALIDCALL; } + BehaviorFlags = UpdateBehaviorFlags(BehaviorFlags); + // Create new d3d9 device HRESULT hr = D3DERR_INVALIDCALL; @@ -345,6 +349,31 @@ HRESULT m_IDirect3D9Ex::GetAdapterLUID(THIS_ UINT Adapter, LUID * pLUID) return ProxyInterface->GetAdapterLUID(Adapter, pLUID); } +DWORD UpdateBehaviorFlags(DWORD BehaviorFlags) +{ + if (Config.ForceMixedVertexProcessing) + { + BehaviorFlags &= ~(D3DCREATE_PUREDEVICE | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_SOFTWARE_VERTEXPROCESSING); + BehaviorFlags |= D3DCREATE_MIXED_VERTEXPROCESSING; + } + else if (BehaviorFlags & D3DCREATE_SOFTWARE_VERTEXPROCESSING) + { + BehaviorFlags &= ~(D3DCREATE_PUREDEVICE | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MIXED_VERTEXPROCESSING); + BehaviorFlags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING; + } + else if (BehaviorFlags & D3DCREATE_MIXED_VERTEXPROCESSING) + { + BehaviorFlags &= ~(D3DCREATE_PUREDEVICE | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_SOFTWARE_VERTEXPROCESSING); + BehaviorFlags |= D3DCREATE_MIXED_VERTEXPROCESSING; + } + else if (BehaviorFlags & D3DCREATE_HARDWARE_VERTEXPROCESSING) + { + BehaviorFlags &= ~(D3DCREATE_MIXED_VERTEXPROCESSING | D3DCREATE_SOFTWARE_VERTEXPROCESSING); + BehaviorFlags |= D3DCREATE_HARDWARE_VERTEXPROCESSING; + } + return BehaviorFlags; +} + // Set Presentation Parameters void UpdatePresentParameter(D3DPRESENT_PARAMETERS* pPresentationParameters, HWND hFocusWindow, bool SetWindow) { diff --git a/d3d9/IDirect3DDevice9Ex.cpp b/d3d9/IDirect3DDevice9Ex.cpp index 43be2933..e77b2267 100644 --- a/d3d9/IDirect3DDevice9Ex.cpp +++ b/d3d9/IDirect3DDevice9Ex.cpp @@ -17,6 +17,7 @@ #include "d3d9.h" #include "d3dx9.h" #include "Utils\Utils.h" +#include HRESULT m_IDirect3DDevice9Ex::QueryInterface(REFIID riid, void** ppvObj) { @@ -294,6 +295,12 @@ HRESULT m_IDirect3DDevice9Ex::CreateVertexBuffer(THIS_ UINT Length, DWORD Usage, { Logging::LogDebug() << __FUNCTION__ << " (" << this << ")"; + if (Config.ForceSystemMemVertexCache) + { + Pool = D3DPOOL_SYSTEMMEM; + Usage = D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY; + } + HRESULT hr = ProxyInterface->CreateVertexBuffer(Length, Usage, FVF, Pool, ppVertexBuffer, pSharedHandle); if (SUCCEEDED(hr) && ppVertexBuffer) @@ -1720,6 +1727,24 @@ HRESULT m_IDirect3DDevice9Ex::GetSwapChain(THIS_ UINT iSwapChain, IDirect3DSwapC { Logging::LogDebug() << __FUNCTION__ << " (" << this << ")"; + // Add 16 bytes for Steam Overlay Fix + __nop(); + __nop(); + __nop(); + __nop(); + __nop(); + __nop(); + __nop(); + __nop(); + __nop(); + __nop(); + __nop(); + __nop(); + __nop(); + __nop(); + __nop(); + __nop(); + HRESULT hr = ProxyInterface->GetSwapChain(iSwapChain, ppSwapChain); if (SUCCEEDED(hr) && ppSwapChain) diff --git a/d3d9/d3d9.h b/d3d9/d3d9.h index 1b57a7a7..ad64b610 100644 --- a/d3d9/d3d9.h +++ b/d3d9/d3d9.h @@ -34,6 +34,7 @@ typedef void(WINAPI *D3DPERF_SetRegionProc)(D3DCOLOR, LPCWSTR); typedef IDirect3D9 *(WINAPI *Direct3DCreate9Proc)(UINT); typedef HRESULT(WINAPI *Direct3DCreate9ExProc)(UINT, IDirect3D9Ex **); +DWORD UpdateBehaviorFlags(DWORD BehaviorFlags); void UpdatePresentParameter(D3DPRESENT_PARAMETERS* pPresentationParameters, HWND hFocusWindow, bool SetWindow); void UpdatePresentParameterForMultisample(D3DPRESENT_PARAMETERS* pPresentationParameters, D3DMULTISAMPLE_TYPE MultiSampleType, DWORD MultiSampleQuality);