static HRESULT STDMETHODCALLTYPE dxgi_factory_EnumAdapters1(IDXGIFactory1 *iface, UINT adapter_idx, IDXGIAdapter1 **adapter) { struct dxgi_factory *factory = impl_from_IDXGIFactory1(iface); struct dxgi_adapter *adapter_object; UINT adapter_count; HRESULT hr; TRACE("iface %p, adapter_idx %u, adapter %p.\n", iface, adapter_idx, adapter); if (!adapter) return DXGI_ERROR_INVALID_CALL; wined3d_mutex_lock(); adapter_count = wined3d_get_adapter_count(factory->wined3d); wined3d_mutex_unlock(); if (adapter_idx >= adapter_count) { *adapter = NULL; return DXGI_ERROR_NOT_FOUND; } if (FAILED(hr = dxgi_adapter_create(factory, adapter_idx, &adapter_object))) { *adapter = NULL; return hr; } *adapter = &adapter_object->IDXGIAdapter1_iface; TRACE("Returning adapter %p.\n", *adapter); return S_OK; }
static UINT WINAPI d3d8_GetAdapterCount(IDirect3D8 *iface) { struct d3d8 *d3d8 = impl_from_IDirect3D8(iface); HRESULT hr; TRACE("iface %p.\n", iface); wined3d_mutex_lock(); hr = wined3d_get_adapter_count(d3d8->wined3d); wined3d_mutex_unlock(); return hr; }
static UINT WINAPI IDirect3D8Impl_GetAdapterCount(LPDIRECT3D8 iface) { IDirect3D8Impl *This = impl_from_IDirect3D8(iface); HRESULT hr; TRACE("iface %p.\n", iface); wined3d_mutex_lock(); hr = wined3d_get_adapter_count(This->WineD3D); wined3d_mutex_unlock(); return hr; }
static UINT WINAPI d3d9_GetAdapterCount(IDirect3D9Ex *iface) { struct d3d9 *d3d9 = impl_from_IDirect3D9Ex(iface); UINT ret; TRACE("iface %p.\n", iface); wined3d_mutex_lock(); ret = wined3d_get_adapter_count(d3d9->wined3d); wined3d_mutex_unlock(); return ret; }
static UINT WINAPI IDirect3D9Impl_GetAdapterCount(IDirect3D9Ex *iface) { IDirect3D9Impl *This = impl_from_IDirect3D9Ex(iface); UINT ret; TRACE("iface %p.\n", iface); wined3d_mutex_lock(); ret = wined3d_get_adapter_count(This->WineD3D); wined3d_mutex_unlock(); return ret; }
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; }