diff --git a/r5dev/materialsystem/cmaterialsystem.h b/r5dev/materialsystem/cmaterialsystem.h index 185b75e1..29acbefd 100644 --- a/r5dev/materialsystem/cmaterialsystem.h +++ b/r5dev/materialsystem/cmaterialsystem.h @@ -1,6 +1,7 @@ #ifndef MATERIALSYSTEM_H #define MATERIALSYSTEM_H #include "cmaterialglue.h" +#include "public/imaterialsystem.h" #define STREAM_DB_EXT "stbsp" @@ -14,11 +15,47 @@ public: #endif // !MATERIALSYSTEM_NODX }; +#ifndef MATERIALSYSTEM_NODX +class CMaterialDeviceMgr +{ +public: + inline const MaterialAdapterInfo_t& GetAdapterInfo(int nIndex) const + { + Assert(nIndex >= 0 && nIndex < SDK_ARRAYSIZE(m_AdapterInfo)); + return m_AdapterInfo[nIndex]; + } + inline const MaterialAdapterInfo_t& GetAdapterInfo() const + { + // Retrieve info of the selected adapter. + return GetAdapterInfo(m_SelectedAdapter); + } + +private: + enum + { + MAX_ADAPTER_COUNT = 4 + }; + + IDXGIAdapter* m_Adapters[MAX_ADAPTER_COUNT]; + void* m_pUnknown1[MAX_ADAPTER_COUNT]; + MaterialAdapterInfo_t m_AdapterInfo[MAX_ADAPTER_COUNT]; + size_t m_AdapterMemorySize[MAX_ADAPTER_COUNT]; + int m_NumDisplayAdaptersProcessed; + int m_SelectedAdapter; + int m_NumDisplayAdapters; +}; + +inline CMaterialDeviceMgr* g_pMaterialAdapterMgr = nullptr; +#endif // !MATERIALSYSTEM_NODX + /* ==== MATERIALSYSTEM ================================================================================================================================================== */ inline CMemory p_CMaterialSystem__Init; inline InitReturnVal_t(*CMaterialSystem__Init)(CMaterialSystem* thisptr); -inline void* g_pMaterialSystem = nullptr; +inline CMemory p_CMaterialSystem__Disconnect; +inline void(*CMaterialSystem__Disconnect)(void); + +inline CMaterialSystem* g_pMaterialSystem = nullptr; inline void* g_pMaterialVFTable = nullptr; #ifndef MATERIALSYSTEM_NODX inline CMemory p_CMaterialSystem__FindMaterialEx; @@ -54,6 +91,7 @@ class VMaterialSystem : public IDetour { LogConAdr("CMaterial::`vftable'", reinterpret_cast(g_pMaterialVFTable)); LogFunAdr("CMaterialSystem::Init", p_CMaterialSystem__Init.GetPtr()); + LogFunAdr("CMaterialSystem::Disconnect", p_CMaterialSystem__Disconnect.GetPtr()); #ifndef MATERIALSYSTEM_NODX LogFunAdr("CMaterialSystem::FindMaterialEx", p_CMaterialSystem__FindMaterialEx.GetPtr()); LogFunAdr("CMaterialSystem::GetScreenSize", p_CMaterialSystem_GetScreenSize.GetPtr()); @@ -64,6 +102,7 @@ class VMaterialSystem : public IDetour LogVarAdr("g_nUnfreeStreamingTextureMemory", reinterpret_cast(g_nUnfreeStreamingTextureMemory)); LogVarAdr("g_nUnusableStreamingTextureMemory", reinterpret_cast(g_nUnusableStreamingTextureMemory)); LogVarAdr("s_pRenderContext", s_pRenderContext.GetPtr()); + LogVarAdr("g_MaterialAdapterMgr", reinterpret_cast(g_pMaterialAdapterMgr)); #endif // !MATERIALSYSTEM_NODX LogVarAdr("g_pMaterialSystem", reinterpret_cast(g_pMaterialSystem)); } @@ -71,6 +110,9 @@ class VMaterialSystem : public IDetour { p_CMaterialSystem__Init = g_GameDll.FindPatternSIMD("48 89 5C 24 ?? 55 56 57 41 54 41 55 41 56 41 57 48 83 EC 70 48 83 3D ?? ?? ?? ?? ??"); CMaterialSystem__Init = p_CMaterialSystem__Init.RCast(); /*48 89 5C 24 ?? 55 56 57 41 54 41 55 41 56 41 57 48 83 EC 70 48 83 3D ?? ?? ?? ?? ??*/ + + p_CMaterialSystem__Disconnect = g_GameDll.FindPatternSIMD("48 83 EC 28 8B 0D ?? ?? ?? ?? 48 89 6C 24 ??"); + CMaterialSystem__Disconnect = p_CMaterialSystem__Disconnect.RCast(); #ifndef MATERIALSYSTEM_NODX p_CMaterialSystem__FindMaterialEx = g_GameDll.FindPatternSIMD("44 89 4C 24 ?? 44 88 44 24 ?? 48 89 4C 24 ??"); CMaterialSystem__FindMaterialEx = p_CMaterialSystem__FindMaterialEx.RCast(); /*44 89 4C 24 ?? 44 88 44 24 ?? 48 89 4C 24 ??*/ @@ -99,8 +141,9 @@ class VMaterialSystem : public IDetour g_nUnusableStreamingTextureMemory = p_DrawStreamOverlay.Offset(0x50).FindPatternSelf("48 8B 05", CMemory::Direction::DOWN).ResolveRelativeAddressSelf(0x3, 0x7).RCast(); s_pRenderContext = p_DispatchDrawCall.FindPattern("48 8B ?? ?? ?? ?? 01").ResolveRelativeAddressSelf(0x3, 0x7); + g_pMaterialAdapterMgr = p_CMaterialSystem__Disconnect.FindPattern("48 8D").ResolveRelativeAddressSelf(0x3, 0x7).RCast(); #endif // !MATERIALSYSTEM_NODX - g_pMaterialSystem = g_GameDll.FindPatternSIMD("48 8B 0D ?? ?? ?? ?? 48 85 C9 74 11 48 8B 01 48 8D 15 ?? ?? ?? ??").ResolveRelativeAddressSelf(0x3, 0x7).RCast(); + g_pMaterialSystem = g_GameDll.FindPatternSIMD("48 8B 0D ?? ?? ?? ?? 48 85 C9 74 11 48 8B 01 48 8D 15 ?? ?? ?? ??").ResolveRelativeAddressSelf(0x3, 0x7).RCast(); } virtual void GetCon(void) const { diff --git a/r5dev/public/imaterialsystem.h b/r5dev/public/imaterialsystem.h index ce26761c..3fa72fc7 100644 --- a/r5dev/public/imaterialsystem.h +++ b/r5dev/public/imaterialsystem.h @@ -1,6 +1,30 @@ #ifndef IMATERIALSYSTEM_H #define IMATERIALSYSTEM_H +#define NVIDIA_VENDOR_ID 0x10DE + +//----------------------------------------------------------------------------- +// Material adapter info.. +//----------------------------------------------------------------------------- +struct MaterialAdapterInfo_t +{ + enum + { + MATERIAL_ADAPTER_NAME_LENGTH = 512 + }; + + char m_pDriverName[MATERIAL_ADAPTER_NAME_LENGTH]; + unsigned int m_VendorID; + unsigned int m_DeviceID; + unsigned int m_SubSysID; + unsigned int m_Revision; + int m_nDXSupportLevel; // This is the *preferred* dx support level + int m_nMinDXSupportLevel; + int m_nMaxDXSupportLevel; + unsigned int m_nDriverVersionHigh; + unsigned int m_nDriverVersionLow; +}; + //----------------------------------------------------------------------------- // Video mode info.. //-----------------------------------------------------------------------------