| 83 | } |
| 84 | |
| 85 | std::shared_ptr<instance> d3d11::create(const device& target) |
| 86 | { |
| 87 | std::shared_ptr<d3d11_instance> inst; |
| 88 | ATL::CComPtr<ID3D11Device> device; |
| 89 | IDXGIAdapter1* adapter = nullptr; |
| 90 | |
| 91 | // Find the correct "Adapter" (device). |
| 92 | IDXGIAdapter1* dxgi_adapter = nullptr; |
| 93 | for (UINT idx = 0; !FAILED(_dxgifactory->EnumAdapters1(idx, &dxgi_adapter)); idx++) { |
| 94 | DXGI_ADAPTER_DESC1 desc = DXGI_ADAPTER_DESC1(); |
| 95 | dxgi_adapter->GetDesc1(&desc); |
| 96 | |
| 97 | if ((desc.AdapterLuid.LowPart == target.id.second) && (desc.AdapterLuid.HighPart == target.id.first)) { |
| 98 | adapter = dxgi_adapter; |
| 99 | break; |
| 100 | } |
| 101 | } |
| 102 | |
| 103 | // Create a D3D11 Device |
| 104 | UINT device_flags = D3D11_CREATE_DEVICE_VIDEO_SUPPORT; |
| 105 | std::vector<D3D_FEATURE_LEVEL> feature_levels = {D3D_FEATURE_LEVEL_12_1, D3D_FEATURE_LEVEL_12_0, D3D_FEATURE_LEVEL_11_1}; |
| 106 | |
| 107 | if (FAILED(_D3D11CreateDevice(adapter, D3D_DRIVER_TYPE_HARDWARE, NULL, device_flags, feature_levels.data(), static_cast<UINT>(feature_levels.size()), D3D11_SDK_VERSION, &device, NULL, NULL))) { |
| 108 | throw std::runtime_error("Failed to create D3D11 device for target."); |
| 109 | } |
| 110 | |
| 111 | return std::make_shared<d3d11_instance>(device); |
| 112 | } |
| 113 | |
| 114 | std::shared_ptr<instance> d3d11::create_from_obs() |
| 115 | { |