Пример #1
0
	// 枚举系统显卡
	/////////////////////////////////////////////////////////////////////////////////
	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);
		}
	}
Пример #2
0
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;
}