From 3d7b1abe80d475e9eec6d936bd5bc070208ab622 Mon Sep 17 00:00:00 2001 From: Krystian Chmielewski Date: Tue, 18 May 2021 15:19:50 +0000 Subject: [PATCH] Dynamic loading dxcore instead of linking Signed-off-by: Krystian Chmielewski Signed-off-by: Mateusz Jablonski --- CMakeLists.txt | 2 +- shared/source/os_interface/windows/wddm/adapter_info.cpp | 7 +++++++ shared/source/os_interface/windows/wddm/adapter_info.h | 8 +++++++- shared/source/os_interface/windows/wddm/wddm_calls.cpp | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index af9819ff81..28ad4902ca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -695,7 +695,7 @@ if(MSVC) set(LINKER_FLAGS "${LINKER_FLAGS} /OPT:NOICF") # Support for WUD - set(CMAKE_CXX_STANDARD_LIBRARIES "onecore.lib dxcore.lib") + set(CMAKE_CXX_STANDARD_LIBRARIES "onecore.lib") foreach(IT kernel32.lib;user32.lib;gdi32.lib;advapi32.lib;ole32.lib;) set(LINKER_FLAGS "${LINKER_FLAGS} /NODEFAULTLIB:${IT}") endforeach() diff --git a/shared/source/os_interface/windows/wddm/adapter_info.cpp b/shared/source/os_interface/windows/wddm/adapter_info.cpp index f50022aada..4438ed8f24 100644 --- a/shared/source/os_interface/windows/wddm/adapter_info.cpp +++ b/shared/source/os_interface/windows/wddm/adapter_info.cpp @@ -10,6 +10,7 @@ #include "shared/source/debug_settings/debug_settings_manager.h" #include "shared/source/helpers/debug_helpers.h" #include "shared/source/os_interface/windows/gdi_interface.h" +#include "shared/source/os_interface/windows/os_library_win.h" #include "shared/source/utilities/stackvec.h" #include @@ -222,4 +223,10 @@ bool DxgiAdapterFactory::createSnapshotOfAvailableAdapters() { return true; } +void WddmAdapterFactory::loadDxCore(DxCoreAdapterFactory::CreateAdapterFactoryFcn &outDxCoreCreateAdapterFactoryF) { + dxCoreLibrary.reset(OsLibrary::load("dxcore.dll")); + if (dxCoreLibrary && dxCoreLibrary->isLoaded()) { + outDxCoreCreateAdapterFactoryF = reinterpret_cast(dxCoreLibrary->getProcAddress("DXCoreCreateAdapterFactory")); + } +} } // namespace NEO diff --git a/shared/source/os_interface/windows/wddm/adapter_info.h b/shared/source/os_interface/windows/wddm/adapter_info.h index c37930ea63..8404e7e7cf 100644 --- a/shared/source/os_interface/windows/wddm/adapter_info.h +++ b/shared/source/os_interface/windows/wddm/adapter_info.h @@ -22,6 +22,7 @@ typedef unsigned int D3DKMT_HANDLE; namespace NEO { class Gdi; +class OsLibrary; std::wstring queryAdapterDriverStorePath(const Gdi &gdi, D3DKMT_HANDLE adapter); @@ -115,6 +116,9 @@ class WddmAdapterFactory : public AdapterFactory { public: WddmAdapterFactory(AdapterFactory::CreateAdapterFactoryFcn dxCoreCreateAdapterFactoryF, AdapterFactory::CreateAdapterFactoryFcn dxgiCreateAdapterFactoryF) { + if (nullptr == dxCoreCreateAdapterFactoryF) { + loadDxCore(dxCoreCreateAdapterFactoryF); + } underlyingFactory = std::make_unique(dxCoreCreateAdapterFactoryF); if (false == underlyingFactory->isSupported()) { underlyingFactory = std::make_unique(dxgiCreateAdapterFactoryF); @@ -141,6 +145,8 @@ class WddmAdapterFactory : public AdapterFactory { protected: std::unique_ptr underlyingFactory; -}; + std::unique_ptr dxCoreLibrary; + void loadDxCore(DxCoreAdapterFactory::CreateAdapterFactoryFcn &outDxCoreCreateAdapterFactoryF); +}; } // namespace NEO diff --git a/shared/source/os_interface/windows/wddm/wddm_calls.cpp b/shared/source/os_interface/windows/wddm/wddm_calls.cpp index 0c7227032a..646700e2f2 100644 --- a/shared/source/os_interface/windows/wddm/wddm_calls.cpp +++ b/shared/source/os_interface/windows/wddm/wddm_calls.cpp @@ -16,7 +16,7 @@ Wddm::CreateDXGIFactoryFcn getCreateDxgiFactory() { } Wddm::DXCoreCreateAdapterFactoryFcn getDXCoreCreateAdapterFactory() { - return DXCoreCreateAdapterFactory; + return nullptr; } Wddm::GetSystemInfoFcn getGetSystemInfo() {