d3d_helper.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include "d3d_helper.h"
  2. #include "system_lib.h"
  3. #include "error_define.h"
  4. #include "log_helper.h"
  5. namespace am {
  6. typedef HRESULT(WINAPI *DXGI_FUNC_CREATEFACTORY)(REFIID, IDXGIFactory1 **);
  7. std::list<IDXGIAdapter *> d3d_helper::get_adapters(int *error, bool free_lib)
  8. {
  9. std::list<IDXGIAdapter *> adapters;
  10. *error = AE_NO;
  11. HMODULE hdxgi = load_system_library("dxgi.dll");
  12. if (!hdxgi) {
  13. *error = AE_D3D_LOAD_FAILED;
  14. return adapters;
  15. }
  16. do {
  17. DXGI_FUNC_CREATEFACTORY create_factory = nullptr;
  18. create_factory = (DXGI_FUNC_CREATEFACTORY) GetProcAddress(hdxgi, "CreateDXGIFactory1");
  19. if (create_factory == nullptr) {
  20. *error = AE_DXGI_GET_PROC_FAILED;
  21. break;
  22. }
  23. IDXGIFactory1 *dxgi_factory = nullptr;
  24. HRESULT hr = create_factory(__uuidof(IDXGIFactory1), &dxgi_factory);
  25. if (FAILED(hr)) {
  26. *error = AE_DXGI_GET_FACTORY_FAILED;
  27. break;
  28. }
  29. unsigned int i = 0;
  30. IDXGIAdapter *adapter = nullptr;
  31. while (dxgi_factory->EnumAdapters(i, &adapter) != DXGI_ERROR_NOT_FOUND) {
  32. if (adapter)
  33. adapters.push_back(adapter);
  34. ++i;
  35. }
  36. dxgi_factory->Release();
  37. } while (0);
  38. if (free_lib && hdxgi)
  39. free_system_library(hdxgi);
  40. return adapters;
  41. }
  42. } // namespace am