// 枚举系统显卡 ///////////////////////////////////////////////////////////////////////////////// void D3D11AdapterList::Enumerate(IDXGIFactory1Ptr const & gi_factory) { // 枚举系统中的适配器 UINT adapter_no = 0; IDXGIAdapter1* dxgi_adapter = nullptr; while (gi_factory->EnumAdapters1(adapter_no, &dxgi_adapter) != DXGI_ERROR_NOT_FOUND) { if (dxgi_adapter != nullptr) { DXGI_ADAPTER_DESC ad; dxgi_adapter->GetDesc(&ad); D3D11AdapterPtr adapter = MakeSharedPtr<D3D11Adapter>(adapter_no, MakeCOMPtr(dxgi_adapter)); adapter->Enumerate(); adapters_.push_back(adapter); } ++ adapter_no; } // 如果没有找到兼容的设备则抛出错误 if (adapters_.empty()) { THR(errc::function_not_supported); } }
bool DDuplGrabber::init() { m_state = Unavailable; m_dxgiDll = LoadLibrary(L"dxgi.dll"); m_d3d11Dll = LoadLibrary(L"d3d11.dll"); if (!m_dxgiDll || !m_d3d11Dll) return false; m_createDXGIFactory1Func = GetProcAddress(m_dxgiDll, "CreateDXGIFactory1"); m_D3D11CreateDeviceFunc = GetProcAddress(m_d3d11Dll, "D3D11CreateDevice"); if (!m_createDXGIFactory1Func || !m_D3D11CreateDeviceFunc) return false; IDXGIFactory1Ptr factory; HRESULT hr = ((CreateDXGIFactory1Func)m_createDXGIFactory1Func)(__uuidof(IDXGIFactory1), (void**)&factory); if (FAILED(hr)) { qCritical(Q_FUNC_INFO " Failed to CreateDXGIFactory1: 0x%X", hr); return false; } IDXGIAdapter1Ptr adapter; for (int i = 0; factory->EnumAdapters1(i, &adapter) != DXGI_ERROR_NOT_FOUND; i++) { m_adapters.push_back(adapter); } if (NULL == (m_threadEvent = CreateEventW(NULL, false, false, DDUPL_THREAD_EVENT_NAME))) { qCritical(Q_FUNC_INFO " unable to create threadEvent"); return false; } if (NULL == (m_threadReturnEvent = CreateEventW(NULL, false, false, DDUPL_THREADRETURN_EVENT_NAME))) { qCritical(Q_FUNC_INFO " unable to create threadReturnEvent"); return false; } if (NULL == (m_thread = CreateThread(NULL, 0, DDuplGrabberThreadProc, this, 0, NULL))) { qCritical(Q_FUNC_INFO " unable to create thread"); return false; } m_state = Ready; return true; }