static ULONG STDMETHODCALLTYPE dxgi_factory_Release(IWineDXGIFactory *iface) { struct dxgi_factory *This = impl_from_IWineDXGIFactory(iface); ULONG refcount = InterlockedDecrement(&This->refcount); TRACE("%p decreasing refcount to %u\n", This, refcount); if (!refcount) { UINT i; for (i = 0; i < This->adapter_count; ++i) { IWineDXGIAdapter_Release(This->adapters[i]); } HeapFree(GetProcessHeap(), 0, This->adapters); EnterCriticalSection(&dxgi_cs); wined3d_decref(This->wined3d); LeaveCriticalSection(&dxgi_cs); HeapFree(GetProcessHeap(), 0, This); } return refcount; }
static HRESULT STDMETHODCALLTYPE dxgi_factory_QueryInterface(IWineDXGIFactory *iface, REFIID iid, void **out) { struct dxgi_factory *factory = impl_from_IWineDXGIFactory(iface); TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out); if (IsEqualGUID(iid, &IID_IWineDXGIFactory) || IsEqualGUID(iid, &IID_IDXGIFactory5) || IsEqualGUID(iid, &IID_IDXGIFactory4) || IsEqualGUID(iid, &IID_IDXGIFactory3) || IsEqualGUID(iid, &IID_IDXGIFactory2) || (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 HRESULT STDMETHODCALLTYPE dxgi_factory_EnumAdapters1(IWineDXGIFactory *iface, UINT adapter_idx, IDXGIAdapter1 **adapter) { struct dxgi_factory *factory = impl_from_IWineDXGIFactory(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 = (IDXGIAdapter1 *)&adapter_object->IWineDXGIAdapter_iface; TRACE("Returning adapter %p.\n", *adapter); return S_OK; }
static ULONG STDMETHODCALLTYPE dxgi_factory_AddRef(IWineDXGIFactory *iface) { struct dxgi_factory *This = impl_from_IWineDXGIFactory(iface); ULONG refcount = InterlockedIncrement(&This->refcount); TRACE("%p increasing refcount to %u\n", This, refcount); return refcount; }
static HRESULT STDMETHODCALLTYPE dxgi_factory_SetPrivateData(IWineDXGIFactory *iface, REFGUID guid, UINT data_size, const void *data) { struct dxgi_factory *factory = impl_from_IWineDXGIFactory(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 HRESULT STDMETHODCALLTYPE dxgi_factory_SetPrivateDataInterface(IWineDXGIFactory *iface, REFGUID guid, const IUnknown *object) { struct dxgi_factory *factory = impl_from_IWineDXGIFactory(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 struct wined3d * STDMETHODCALLTYPE dxgi_factory_get_wined3d(IWineDXGIFactory *iface) { struct dxgi_factory *This = impl_from_IWineDXGIFactory(iface); TRACE("iface %p\n", iface); EnterCriticalSection(&dxgi_cs); wined3d_incref(This->wined3d); LeaveCriticalSection(&dxgi_cs); return This->wined3d; }
static ULONG STDMETHODCALLTYPE dxgi_factory_Release(IWineDXGIFactory *iface) { struct dxgi_factory *factory = impl_from_IWineDXGIFactory(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); heap_free(factory); } return refcount; }
static HRESULT STDMETHODCALLTYPE dxgi_factory_EnumAdapters1(IWineDXGIFactory *iface, UINT adapter_idx, IDXGIAdapter1 **adapter) { struct dxgi_factory *factory = impl_from_IWineDXGIFactory(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; }
static HRESULT STDMETHODCALLTYPE dxgi_factory_CreateSwapChain(IWineDXGIFactory *iface, IUnknown *device, DXGI_SWAP_CHAIN_DESC *desc, IDXGISwapChain **swapchain) { struct dxgi_factory *factory = impl_from_IWineDXGIFactory(iface); DXGI_SWAP_CHAIN_FULLSCREEN_DESC fullscreen_desc; DXGI_SWAP_CHAIN_DESC1 swapchain_desc; TRACE("iface %p, device %p, desc %p, swapchain %p.\n", iface, device, desc, swapchain); if (!desc) { WARN("Invalid pointer.\n"); return DXGI_ERROR_INVALID_CALL; } swapchain_desc.Width = desc->BufferDesc.Width; swapchain_desc.Height = desc->BufferDesc.Height; swapchain_desc.Format = desc->BufferDesc.Format; swapchain_desc.Stereo = FALSE; swapchain_desc.SampleDesc = desc->SampleDesc; swapchain_desc.BufferUsage = desc->BufferUsage; swapchain_desc.BufferCount = desc->BufferCount; swapchain_desc.Scaling = DXGI_SCALING_STRETCH; swapchain_desc.SwapEffect = desc->SwapEffect; swapchain_desc.AlphaMode = DXGI_ALPHA_MODE_IGNORE; swapchain_desc.Flags = desc->Flags; fullscreen_desc.RefreshRate = desc->BufferDesc.RefreshRate; fullscreen_desc.ScanlineOrdering = desc->BufferDesc.ScanlineOrdering; fullscreen_desc.Scaling = desc->BufferDesc.Scaling; fullscreen_desc.Windowed = desc->Windowed; return IWineDXGIFactory_CreateSwapChainForHwnd(&factory->IWineDXGIFactory_iface, device, desc->OutputWindow, &swapchain_desc, &fullscreen_desc, NULL, (IDXGISwapChain1 **)swapchain); }