From 4ead72747b72e3218172cde47388f26bfb7141c7 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sun, 13 Jul 2025 16:06:40 +1000 Subject: [PATCH] D3DCommon: Load dxgi.lib dynamically --- src/util/CMakeLists.txt | 2 +- src/util/d3d_common.cpp | 22 +++++++++++++++++++++- src/util/util.props | 2 +- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt index 7b0dced0a..5e3c48a9a 100644 --- a/src/util/CMakeLists.txt +++ b/src/util/CMakeLists.txt @@ -241,7 +241,7 @@ if(WIN32) xinput_source.h ) target_link_libraries(util PRIVATE d3d12ma) - target_link_libraries(util PRIVATE d3d12.lib dxgi.lib winmm.lib Dwmapi.lib winhttp.lib) + target_link_libraries(util PRIVATE d3d12.lib winmm.lib Dwmapi.lib winhttp.lib) if(CMAKE_BUILD_TYPE MATCHES "Debug|Devel") target_link_libraries(util PRIVATE WinPixEventRuntime::WinPixEventRuntime) diff --git a/src/util/d3d_common.cpp b/src/util/d3d_common.cpp index 353d7d84b..0fe8e93fd 100644 --- a/src/util/d3d_common.cpp +++ b/src/util/d3d_common.cpp @@ -35,6 +35,8 @@ struct FeatureLevelTableEntry struct Libs { std::mutex load_mutex; + DynamicLibrary dxgi_library; + decltype(&CreateDXGIFactory2) CreateDXGIFactory2; DynamicLibrary d3d11_library; PFN_D3D11_CREATE_DEVICE D3D11CreateDevice; DynamicLibrary d3dcompiler_library; @@ -127,12 +129,30 @@ D3D_FEATURE_LEVEL D3DCommon::GetDeviceMaxFeatureLevel(IDXGIAdapter1* adapter) Microsoft::WRL::ComPtr D3DCommon::CreateFactory(bool debug, Error* error) { + if (!s_libs.dxgi_library.IsOpen()) + { + // another thread may have opened it + const std::unique_lock lock(s_libs.load_mutex); + if (!s_libs.d3d11_library.IsOpen()) + { + if (!s_libs.dxgi_library.Open("dxgi.dll", error)) + return {}; + + if (!s_libs.dxgi_library.GetSymbol("CreateDXGIFactory2", &s_libs.CreateDXGIFactory2)) + { + Error::SetStringView(error, "Failed to load CreateDXGIFactory2 from dxgi.dll"); + s_libs.dxgi_library.Close(); + return {}; + } + } + } + UINT flags = 0; if (debug) flags |= DXGI_CREATE_FACTORY_DEBUG; Microsoft::WRL::ComPtr factory; - const HRESULT hr = CreateDXGIFactory2(flags, IID_PPV_ARGS(factory.GetAddressOf())); + const HRESULT hr = s_libs.CreateDXGIFactory2(flags, IID_PPV_ARGS(factory.GetAddressOf())); if (FAILED(hr)) Error::SetHResult(error, "Failed to create DXGI factory: ", hr); diff --git a/src/util/util.props b/src/util/util.props index 85fb12d9d..6aebff885 100644 --- a/src/util/util.props +++ b/src/util/util.props @@ -13,7 +13,7 @@ - %(AdditionalDependencies);d3d12.lib;dxgi.lib;Dwmapi.lib;winhttp.lib + %(AdditionalDependencies);d3d12.lib;Dwmapi.lib;winhttp.lib