@@ -34,16 +34,30 @@ typedef struct _D3DKMT_ENUMADAPTERS_L
34
34
D3DKMT_ADAPTERINFO_L Adapters[16 ];
35
35
} D3DKMT_ENUMADAPTERS_L;
36
36
37
+ typedef struct _D3DKMT_CLOSEADAPTER_L
38
+ {
39
+ UINT hAdapter; // in: adapter handle
40
+ } D3DKMT_CLOSEADAPTER_L;
41
+
37
42
// Function pointers
38
43
typedef UINT (*PFN_D3DKMTQueryAdapterInfo_L)(D3DKMT_QUERYADAPTERINFO_L*);
39
44
typedef UINT (*PFN_D3DKMTEnumAdapters_L)(D3DKMT_ENUMADAPTERS_L*);
45
+ typedef UINT (*PFN_D3DKMTCloseAdapter)(D3DKMT_CLOSEADAPTER_L*);
40
46
41
47
inline static std::vector<std::filesystem::path> GetDriverStore ()
42
48
{
43
49
std::vector<std::filesystem::path> result;
44
50
45
51
// Load D3DKMT functions dynamically
46
- HMODULE hGdi32 = LoadLibrary (L" Gdi32.dll" );
52
+ bool libraryLoaded = false ;
53
+ HMODULE hGdi32 = GetModuleHandle (L" Gdi32.dll" );
54
+
55
+ if (hGdi32 == nullptr )
56
+ {
57
+ hGdi32 = LoadLibrary (L" Gdi32.dll" );
58
+ libraryLoaded = hGdi32 != nullptr ;
59
+ }
60
+
47
61
if (hGdi32 == nullptr )
48
62
{
49
63
LOG_ERROR (" Failed to load Gdi32.dll" );
@@ -54,8 +68,9 @@ inline static std::vector<std::filesystem::path> GetDriverStore()
54
68
{
55
69
auto o_D3DKMTEnumAdapters = (PFN_D3DKMTEnumAdapters_L)GetProcAddress (hGdi32, " D3DKMTEnumAdapters" );
56
70
auto o_D3DKMTQueryAdapterInfo = (PFN_D3DKMTQueryAdapterInfo_L)GetProcAddress (hGdi32, " D3DKMTQueryAdapterInfo" );
71
+ auto o_D3DKMTCloseAdapter = (PFN_D3DKMTCloseAdapter)GetProcAddress (hGdi32, " D3DKMTCloseAdapter" );
57
72
58
- if (o_D3DKMTEnumAdapters == nullptr || o_D3DKMTQueryAdapterInfo == nullptr )
73
+ if (o_D3DKMTEnumAdapters == nullptr || o_D3DKMTQueryAdapterInfo == nullptr || o_D3DKMTCloseAdapter == nullptr )
59
74
{
60
75
LOG_ERROR (" Failed to resolve D3DKMT functions" );
61
76
break ;
@@ -91,6 +106,13 @@ inline static std::vector<std::filesystem::path> GetDriverStore()
91
106
LOG_ERROR (" Failed to query adapter info {:X}" , hr);
92
107
else
93
108
result.push_back (std::filesystem::path (umdFileInfo.UmdFileName ).parent_path ());
109
+
110
+
111
+ D3DKMT_CLOSEADAPTER_L closeAdapter = {};
112
+ closeAdapter.hAdapter = adapter.hAdapter ;
113
+ auto closeResult = o_D3DKMTCloseAdapter (&closeAdapter);
114
+ if (closeResult != 0 )
115
+ LOG_ERROR (" D3DKMTCloseAdapter error: {:X}" , closeResult);
94
116
}
95
117
}
96
118
else
@@ -101,7 +123,9 @@ inline static std::vector<std::filesystem::path> GetDriverStore()
101
123
102
124
} while (false );
103
125
104
- FreeLibrary (hGdi32);
126
+ if (libraryLoaded)
127
+ FreeLibrary (hGdi32);
128
+
105
129
return result;
106
130
}
107
131
@@ -122,7 +146,7 @@ struct AmdExtFfxApi : public IAmdExtFfxApi
122
146
123
147
HRESULT STDMETHODCALLTYPE UpdateFfxApiProvider (void * pData, uint32_t dataSizeInBytes) override
124
148
{
125
- LOG_INFO (" UpdateFfxApiProvider called" );
149
+ LOG_INFO (" UpdateFfxApiProvider called" );
126
150
127
151
if (pfnUpdateFfxApiProvider == nullptr )
128
152
{
0 commit comments