3
3
#include " VideoDeviceInfoProvider.h"
4
4
#include < common/error/Exception.h>
5
5
#include < common/error/Win32Error.h>
6
+ #include < common/DynamicLinkLibrary.h>
6
7
#include < common/ComPtr.h>
7
8
#include < xlog/xlog.h>
8
9
#include < dxgi.h>
@@ -11,7 +12,7 @@ class VideoDeviceInfoProviderD3D11 : public VideoDeviceInfoProvider
11
12
{
12
13
public:
13
14
VideoDeviceInfoProviderD3D11 ();
14
- ~VideoDeviceInfoProviderD3D11 () override ;
15
+ ~VideoDeviceInfoProviderD3D11 () override = default ;
15
16
std::vector<std::string> get_adapters () override ;
16
17
std::set<Resolution> get_resolutions (unsigned adapter, unsigned format) override ;
17
18
std::set<unsigned > get_multisample_types (unsigned adapter, unsigned format, bool windowed) override ;
@@ -27,46 +28,34 @@ class VideoDeviceInfoProviderD3D11 : public VideoDeviceInfoProvider
27
28
}
28
29
29
30
private:
30
- IDXGIFactory* m_factory ;
31
- HMODULE m_dxgi_lib ;
32
- HMODULE m_d3d11_lib ;
31
+ DynamicLinkLibrary m_dxgi_lib ;
32
+ DynamicLinkLibrary m_d3d11_lib ;
33
+ ComPtr<IDXGIFactory> m_factory ;
33
34
decltype (D3D11CreateDevice)* m_D3D11CreateDevice;
34
35
};
35
36
36
- VideoDeviceInfoProviderD3D11::VideoDeviceInfoProviderD3D11 ()
37
+ VideoDeviceInfoProviderD3D11::VideoDeviceInfoProviderD3D11 () :
38
+ m_dxgi_lib{L" dxgi.dll" }, m_d3d11_lib{L" d3d11.dll" }
37
39
{
38
- m_dxgi_lib = LoadLibraryA (" dxgi.dll" );
39
40
if (!m_dxgi_lib)
40
41
THROW_WIN32_ERROR (" Failed to load dxgi.dll" );
41
42
42
- // Note: double cast is needed to fix cast-function-type GCC warning
43
- auto pCreateDXGIFactory = reinterpret_cast <decltype (CreateDXGIFactory)*>(reinterpret_cast <void (*)()>(
44
- GetProcAddress (m_dxgi_lib, " CreateDXGIFactory" )));
43
+ auto pCreateDXGIFactory = m_dxgi_lib.get_proc_address <decltype (CreateDXGIFactory)*>(" CreateDXGIFactory" );
45
44
if (!pCreateDXGIFactory)
46
45
THROW_WIN32_ERROR (" Failed to load get CreateDXGIFactory function address" );
47
46
48
47
HRESULT hr = pCreateDXGIFactory (IID_IDXGIFactory, reinterpret_cast <void **>(&m_factory));
49
48
if (FAILED (hr))
50
49
THROW_EXCEPTION (" CreateDXGIFactory failed" );
51
50
52
- m_d3d11_lib = LoadLibraryA (" d3d11.dll" );
53
51
if (!m_d3d11_lib)
54
52
THROW_WIN32_ERROR (" Failed to load d3d11.dll" );
55
53
56
- // Note: double cast is needed to fix cast-function-type GCC warning
57
- m_D3D11CreateDevice = reinterpret_cast <decltype (D3D11CreateDevice)*>(reinterpret_cast <void (*)()>(
58
- GetProcAddress (m_d3d11_lib, " D3D11CreateDevice" )));
54
+ m_D3D11CreateDevice = m_d3d11_lib.get_proc_address <decltype (D3D11CreateDevice)*>(" D3D11CreateDevice" );
59
55
if (!m_D3D11CreateDevice)
60
56
THROW_WIN32_ERROR (" Failed to load get D3D11CreateDevice function address" );
61
57
}
62
58
63
- VideoDeviceInfoProviderD3D11::~VideoDeviceInfoProviderD3D11 ()
64
- {
65
- m_factory->Release ();
66
- FreeLibrary (m_d3d11_lib);
67
- FreeLibrary (m_dxgi_lib);
68
- }
69
-
70
59
std::vector<std::string> VideoDeviceInfoProviderD3D11::get_adapters ()
71
60
{
72
61
std::vector<std::string> adapters;
@@ -138,14 +127,14 @@ std::set<unsigned> VideoDeviceInfoProviderD3D11::get_multisample_types(
138
127
unsigned adapter, unsigned format, [[maybe_unused]] bool windowed
139
128
) {
140
129
141
- ComPtr<IDXGIAdapter> dxgi_adapter = nullptr ;
130
+ ComPtr<IDXGIAdapter> dxgi_adapter;
142
131
HRESULT hr = m_factory->EnumAdapters (adapter, &dxgi_adapter);
143
132
if (FAILED (hr)) {
144
133
xlog::error (" EnumAdapters failed: %lx" , hr);
145
134
return {};
146
135
}
147
136
148
- ComPtr<ID3D11Device> d3d11_device = nullptr ;
137
+ ComPtr<ID3D11Device> d3d11_device;
149
138
hr = m_D3D11CreateDevice (dxgi_adapter, D3D_DRIVER_TYPE_HARDWARE, nullptr , 0 , nullptr , 0 , D3D11_SDK_VERSION, &d3d11_device, nullptr , nullptr );
150
139
if (FAILED (hr)) {
151
140
xlog::error (" D3D11CreateDevice failed: %lx" , hr);
0 commit comments