IDirect3D8* WINAPI DECLSPEC_HOTPATCH Direct3DCreate8(UINT SDKVersion) { IDirect3D8Impl* object; TRACE("SDKVersion = %x\n", SDKVersion); wined3d_mutex_lock(); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D8Impl)); object->lpVtbl = &Direct3D8_Vtbl; object->ref = 1; object->WineD3D = WineDirect3DCreate(8, (IUnknown *)object); TRACE("Created Direct3D object @ %p, WineObj @ %p\n", object, object->WineD3D); wined3d_mutex_unlock(); if (!object->WineD3D) { HeapFree( GetProcessHeap(), 0, object ); object = NULL; } return (IDirect3D8*) object; }
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; }