| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- #include "d3d_helper.h"
- #include "system_lib.h"
- #include "error_define.h"
- #include "log_helper.h"
- namespace am {
- typedef HRESULT(WINAPI *DXGI_FUNC_CREATEFACTORY)(REFIID, IDXGIFactory1 **);
- std::list<IDXGIAdapter *> d3d_helper::get_adapters(int *error, bool free_lib)
- {
- std::list<IDXGIAdapter *> adapters;
- *error = AE_NO;
- HMODULE hdxgi = load_system_library("dxgi.dll");
- if (!hdxgi) {
- *error = AE_D3D_LOAD_FAILED;
- return adapters;
- }
- do {
- DXGI_FUNC_CREATEFACTORY create_factory = nullptr;
- create_factory = (DXGI_FUNC_CREATEFACTORY) GetProcAddress(hdxgi, "CreateDXGIFactory1");
- if (create_factory == nullptr) {
- *error = AE_DXGI_GET_PROC_FAILED;
- break;
- }
- IDXGIFactory1 *dxgi_factory = nullptr;
- HRESULT hr = create_factory(__uuidof(IDXGIFactory1), &dxgi_factory);
- if (FAILED(hr)) {
- *error = AE_DXGI_GET_FACTORY_FAILED;
- break;
- }
- unsigned int i = 0;
- IDXGIAdapter *adapter = nullptr;
- while (dxgi_factory->EnumAdapters(i, &adapter) != DXGI_ERROR_NOT_FOUND) {
- if (adapter)
- adapters.push_back(adapter);
- ++i;
- }
- dxgi_factory->Release();
- } while (0);
- if (free_lib && hdxgi)
- free_system_library(hdxgi);
- return adapters;
- }
- } // namespace am
|