d3d_helper.cpp 1.2 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. {
  33. if(adapter)
  34. adapters.push_back(adapter);
  35. ++i;
  36. }
  37. dxgi_factory->Release();
  38. } while (0);
  39. if (free_lib && hdxgi) free_system_library(hdxgi);
  40. return adapters;
  41. }
  42. }