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 ULONG STDMETHODCALLTYPE dxgi_factory_Release(IDXGIFactory1 *iface) { struct dxgi_factory *factory = impl_from_IDXGIFactory1(iface); ULONG refcount = InterlockedDecrement(&factory->refcount); TRACE("%p decreasing refcount to %u.\n", iface, refcount); if (!refcount) { UINT i; if (factory->device_window) DestroyWindow(factory->device_window); for (i = 0; i < factory->adapter_count; ++i) { IDXGIAdapter1_Release(factory->adapters[i]); } HeapFree(GetProcessHeap(), 0, factory->adapters); EnterCriticalSection(&dxgi_cs); wined3d_decref(factory->wined3d); LeaveCriticalSection(&dxgi_cs); wined3d_private_store_cleanup(&factory->private_store); HeapFree(GetProcessHeap(), 0, factory); } return refcount; }
static HRESULT STDMETHODCALLTYPE dxgi_factory_SetPrivateData(IDXGIFactory1 *iface, REFGUID guid, UINT data_size, const void *data) { struct dxgi_factory *factory = impl_from_IDXGIFactory1(iface); TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data); return dxgi_set_private_data(&factory->private_store, guid, data_size, data); }
static ULONG STDMETHODCALLTYPE dxgi_factory_AddRef(IDXGIFactory1 *iface) { struct dxgi_factory *factory = impl_from_IDXGIFactory1(iface); ULONG refcount = InterlockedIncrement(&factory->refcount); TRACE("%p increasing refcount to %u.\n", iface, refcount); return refcount; }
static HRESULT STDMETHODCALLTYPE dxgi_factory_SetPrivateDataInterface(IDXGIFactory1 *iface, REFGUID guid, const IUnknown *object) { struct dxgi_factory *factory = impl_from_IDXGIFactory1(iface); TRACE("iface %p, guid %s, object %p.\n", iface, debugstr_guid(guid), object); return dxgi_set_private_data_interface(&factory->private_store, guid, object); }
static HRESULT STDMETHODCALLTYPE dxgi_factory_GetWindowAssociation(IDXGIFactory1 *iface, HWND *window) { struct dxgi_factory *factory = impl_from_IDXGIFactory1(iface); FIXME("iface %p, window %p stub!\n", iface, window); if (!window) return DXGI_ERROR_INVALID_CALL; *window = factory->assoc_window; return S_OK; }
static HRESULT STDMETHODCALLTYPE dxgi_factory_MakeWindowAssociation(IDXGIFactory1 *iface, HWND window, UINT flags) { struct dxgi_factory *factory = impl_from_IDXGIFactory1(iface); FIXME("iface %p, window %p, flags %#x stub!\n", iface, window, flags); if (!window && flags) return DXGI_ERROR_INVALID_CALL; factory->assoc_window = window; return S_OK; }
static HRESULT STDMETHODCALLTYPE dxgi_factory_QueryInterface(IDXGIFactory1 *iface, REFIID iid, void **out) { struct dxgi_factory *factory = impl_from_IDXGIFactory1(iface); TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out); if ((factory->extended && IsEqualGUID(iid, &IID_IDXGIFactory1)) || IsEqualGUID(iid, &IID_IDXGIFactory) || IsEqualGUID(iid, &IID_IDXGIObject) || IsEqualGUID(iid, &IID_IUnknown)) { IUnknown_AddRef(iface); *out = iface; return S_OK; } WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); *out = NULL; return E_NOINTERFACE; }
static ULONG STDMETHODCALLTYPE dxgi_factory_Release(IDXGIFactory1 *iface) { struct dxgi_factory *factory = impl_from_IDXGIFactory1(iface); ULONG refcount = InterlockedDecrement(&factory->refcount); TRACE("%p decreasing refcount to %u.\n", iface, refcount); if (!refcount) { if (factory->device_window) DestroyWindow(factory->device_window); wined3d_mutex_lock(); wined3d_decref(factory->wined3d); wined3d_mutex_unlock(); wined3d_private_store_cleanup(&factory->private_store); HeapFree(GetProcessHeap(), 0, factory); } return refcount; }
static HRESULT STDMETHODCALLTYPE dxgi_factory_EnumAdapters1(IDXGIFactory1 *iface, UINT adapter_idx, IDXGIAdapter1 **adapter) { struct dxgi_factory *factory = impl_from_IDXGIFactory1(iface); TRACE("iface %p, adapter_idx %u, adapter %p.\n", iface, adapter_idx, adapter); if (!adapter) return DXGI_ERROR_INVALID_CALL; if (adapter_idx >= factory->adapter_count) { *adapter = NULL; return DXGI_ERROR_NOT_FOUND; } *adapter = (IDXGIAdapter1 *)factory->adapters[adapter_idx]; IDXGIAdapter1_AddRef(*adapter); TRACE("Returning adapter %p.\n", *adapter); return S_OK; }