static HRESULT dxgi_factory_init(struct dxgi_factory *factory, BOOL extended) { HRESULT hr; UINT i; factory->IDXGIFactory1_iface.lpVtbl = &dxgi_factory_vtbl; factory->refcount = 1; wined3d_private_store_init(&factory->private_store); EnterCriticalSection(&dxgi_cs); factory->wined3d = wined3d_create(0); if (!factory->wined3d) { LeaveCriticalSection(&dxgi_cs); wined3d_private_store_cleanup(&factory->private_store); return DXGI_ERROR_UNSUPPORTED; } factory->adapter_count = wined3d_get_adapter_count(factory->wined3d); LeaveCriticalSection(&dxgi_cs); factory->adapters = HeapAlloc(GetProcessHeap(), 0, factory->adapter_count * sizeof(*factory->adapters)); if (!factory->adapters) { ERR("Failed to allocate DXGI adapter array memory.\n"); hr = E_OUTOFMEMORY; goto fail; } for (i = 0; i < factory->adapter_count; ++i) { struct dxgi_adapter *adapter = HeapAlloc(GetProcessHeap(), 0, sizeof(*adapter)); if (!adapter) { UINT j; ERR("Failed to allocate DXGI adapter memory.\n"); for (j = 0; j < i; ++j) { IDXGIAdapter1_Release(factory->adapters[j]); } hr = E_OUTOFMEMORY; goto fail; } if (FAILED(hr = dxgi_adapter_init(adapter, factory, i))) { UINT j; ERR("Failed to initialize adapter, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, adapter); for (j = 0; j < i; ++j) { IDXGIAdapter1_Release(factory->adapters[j]); } goto fail; } factory->adapters[i] = &adapter->IDXGIAdapter1_iface; } factory->extended = extended; return S_OK; fail: HeapFree(GetProcessHeap(), 0, factory->adapters); EnterCriticalSection(&dxgi_cs); wined3d_decref(factory->wined3d); LeaveCriticalSection(&dxgi_cs); wined3d_private_store_cleanup(&factory->private_store); return hr; }
HRESULT dxgi_factory_init(struct dxgi_factory *factory) { HRESULT hr; UINT i; factory->vtbl = &dxgi_factory_vtbl; factory->refcount = 1; EnterCriticalSection(&dxgi_cs); factory->wined3d = WineDirect3DCreate(10, (IUnknown *)factory); if (!factory->wined3d) { LeaveCriticalSection(&dxgi_cs); return DXGI_ERROR_UNSUPPORTED; } factory->adapter_count = IWineD3D_GetAdapterCount(factory->wined3d); LeaveCriticalSection(&dxgi_cs); factory->adapters = HeapAlloc(GetProcessHeap(), 0, factory->adapter_count * sizeof(*factory->adapters)); if (!factory->adapters) { ERR("Failed to allocate DXGI adapter array memory.\n"); hr = E_OUTOFMEMORY; goto fail; } for (i = 0; i < factory->adapter_count; ++i) { struct dxgi_adapter *adapter = HeapAlloc(GetProcessHeap(), 0, sizeof(*adapter)); if (!adapter) { UINT j; ERR("Failed to allocate DXGI adapter memory.\n"); for (j = 0; j < i; ++j) { IDXGIAdapter_Release(factory->adapters[j]); } hr = E_OUTOFMEMORY; goto fail; } hr = dxgi_adapter_init(adapter, (IWineDXGIFactory *)factory, i); if (FAILED(hr)) { UINT j; ERR("Failed to initialize adapter, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, adapter); for (j = 0; j < i; ++j) { IDXGIAdapter_Release(factory->adapters[j]); } goto fail; } factory->adapters[i] = (IDXGIAdapter *)adapter; } return S_OK; fail: HeapFree(GetProcessHeap(), 0, factory->adapters); EnterCriticalSection(&dxgi_cs); IWineD3D_Release(factory->wined3d); LeaveCriticalSection(&dxgi_cs); return hr; }