diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index ad2f77973b..244852862b 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -203,8 +203,18 @@ bool D3D12GSRender::invalidateTexture(u32 addr) return handled; } +D3D12DLLManagement::D3D12DLLManagement() +{ + loadD3D12FunctionPointers(); +} + +D3D12DLLManagement::~D3D12DLLManagement() +{ + unloadD3D12FunctionPointers(); +} + D3D12GSRender::D3D12GSRender() - : GSRender(), m_PSO(nullptr) + : GSRender(), m_D3D12Lib(), m_PSO(nullptr) { gfxHandler = [this](u32 addr) { bool result = invalidateTexture(addr); @@ -212,7 +222,6 @@ D3D12GSRender::D3D12GSRender() LOG_WARNING(RSX, "Reporting Cell writing to %x", addr); return result; }; - loadD3D12FunctionPointers(); if (Ini.GSDebugOutputEnable.GetValue()) { Microsoft::WRL::ComPtr debugInterface; @@ -383,7 +392,6 @@ D3D12GSRender::~D3D12GSRender() for (auto &tmp : m_texturesCache) tmp.second->Release(); m_outputScalingPass.Release(); - unloadD3D12FunctionPointers(); } void D3D12GSRender::Close() diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h index ab2da2268e..b81df5eac2 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h @@ -227,12 +227,22 @@ struct GarbageCollectionThread void waitForCompletion(); }; +/** + * Structure used to load/unload D3D12 lib. + */ +struct D3D12DLLManagement +{ + D3D12DLLManagement(); + ~D3D12DLLManagement(); +}; + class D3D12GSRender : public GSRender { private: /** D3D12 structures. * Note: they should be declared in reverse order of destruction */ + D3D12DLLManagement m_D3D12Lib; ComPtr m_device; ComPtr m_commandQueueGraphic; ComPtr m_swapChain; @@ -240,7 +250,6 @@ private: ComPtr m_backbufferAsRendertarget[2]; // m_rootSignatures[N] is RS with N texture/sample ComPtr m_rootSignatures[17]; - /** * Mutex protecting m_texturesCache and m_Textoclean access * Memory protection fault catch can be generated by any thread and