Skip to content

Commit 524c70c

Browse files
misyltoadlenny-lunarg
authored andcommitted
loader: Dynamically load DXGI
Avoids recursively having DXGI and the loader call eachother back and forth when DXVK is in use. Fixes KhronosGroup#253
1 parent 7c72f54 commit 524c70c

File tree

4 files changed

+36
-5
lines changed

4 files changed

+36
-5
lines changed

loader/CMakeLists.txt

+3-3
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ else(UNIX AND NOT APPLE) # i.e.: Linux
175175
endif()
176176

177177
if(WIN32)
178-
add_library(loader-norm OBJECT ${NORMAL_LOADER_SRCS} dirent_on_windows.c)
178+
add_library(loader-norm OBJECT ${NORMAL_LOADER_SRCS} dirent_on_windows.c dxgi_loader.c)
179179
target_compile_options(loader-norm PUBLIC "$<$<CONFIG:DEBUG>:${LOCAL_C_FLAGS_DBG}>")
180180
target_compile_options(loader-norm PUBLIC ${MSVC_LOADER_COMPILE_OPTIONS})
181181
target_include_directories(loader-norm PRIVATE "$<TARGET_PROPERTY:Vulkan::Headers,INTERFACE_INCLUDE_DIRECTORIES>")
@@ -214,10 +214,10 @@ if(WIN32)
214214
endif()
215215

216216
if(ENABLE_WIN10_ONECORE)
217-
target_link_libraries(vulkan OneCoreUAP.lib LIBCMT.LIB LIBCMTD.LIB LIBVCRUNTIME.LIB LIBUCRT.LIB Dxgi)
217+
target_link_libraries(vulkan OneCoreUAP.lib LIBCMT.LIB LIBCMTD.LIB LIBVCRUNTIME.LIB LIBUCRT.LIB)
218218
set_target_properties(vulkan PROPERTIES LINK_FLAGS "/NODEFAULTLIB")
219219
else()
220-
target_link_libraries(vulkan Cfgmgr32 Dxgi)
220+
target_link_libraries(vulkan Cfgmgr32)
221221
endif()
222222

223223
add_dependencies(vulkan loader_asm_gen_files)

loader/dxgi_loader.c

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#include "dxgi_loader.h"
2+
3+
#include <strsafe.h>
4+
5+
static HMODULE load_dxgi_module() {
6+
TCHAR systemPath[MAX_PATH] = "";
7+
GetSystemDirectory(systemPath, MAX_PATH);
8+
StringCchCat(systemPath, MAX_PATH, TEXT("\\dxgi.dll"));
9+
10+
return LoadLibrary(systemPath);
11+
}
12+
13+
typedef HRESULT (APIENTRY *PFN_CreateDXGIFactory1)(REFIID riid, void **ppFactory);
14+
15+
HRESULT dyn_CreateDXGIFactory1(REFIID riid, void **ppFactory) {
16+
PFN_CreateDXGIFactory1 fpCreateDXGIFactory1 =
17+
(PFN_CreateDXGIFactory1)GetProcAddress(load_dxgi_module(), "CreateDXGIFactory1");
18+
19+
if (fpCreateDXGIFactory1 != NULL)
20+
return fpCreateDXGIFactory1(riid, ppFactory);
21+
22+
return DXGI_ERROR_NOT_FOUND;
23+
}

loader/dxgi_loader.h

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#ifndef DXGI_LOADER_H
2+
#define DXGI_LOADER_H
3+
4+
#include <dxgi1_2.h>
5+
6+
HRESULT dyn_CreateDXGIFactory1(REFIID riid, void **ppFactory);
7+
8+
#endif

loader/loader.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
#include <devpkey.h>
7272
#include <winternl.h>
7373
#include <d3dkmthk.h>
74-
#include <dxgi1_2.h>
74+
#include "dxgi_loader.h"
7575

7676
typedef _Check_return_ NTSTATUS (APIENTRY *PFN_D3DKMTEnumAdapters2)(const D3DKMT_ENUMADAPTERS2*);
7777
typedef _Check_return_ NTSTATUS (APIENTRY *PFN_D3DKMTQueryAdapterInfo)(const D3DKMT_QUERYADAPTERINFO*);
@@ -873,7 +873,7 @@ VkResult loaderGetRegistryFiles(const struct loader_instance *inst, char *locati
873873
}
874874

875875
if (is_driver) {
876-
HRESULT hres = CreateDXGIFactory1(&IID_IDXGIFactory1, &dxgi_factory);
876+
HRESULT hres = dyn_CreateDXGIFactory1(&IID_IDXGIFactory1, &dxgi_factory);
877877
if (hres != S_OK) {
878878
loader_log(
879879
inst, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0,

0 commit comments

Comments
 (0)