From 9fbd676b275a530061d420f433d91ac63f5a42a0 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Tue, 21 Oct 2008 15:06:58 +0200 Subject: [PATCH] dxgi: Implement CreateDXGIFactory(). --- dlls/dxgi/Makefile.in | 5 +- dlls/dxgi/dxgi.spec | 2 +- dlls/dxgi/dxgi_main.c | 25 ++++++++ dlls/dxgi/dxgi_private.h | 8 +++ dlls/dxgi/factory.c | 162 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 199 insertions(+), 3 deletions(-) create mode 100644 dlls/dxgi/factory.c diff --git a/dlls/dxgi/Makefile.in b/dlls/dxgi/Makefile.in index fde4b405036..77b2b97d6e6 100644 --- a/dlls/dxgi/Makefile.in +++ b/dlls/dxgi/Makefile.in @@ -4,10 +4,11 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = dxgi.dll IMPORTLIB = dxgi -IMPORTS = kernel32 +IMPORTS = dxguid uuid kernel32 C_SRCS = \ - dxgi_main.c + dxgi_main.c \ + factory.c RC_SRCS = version.rc diff --git a/dlls/dxgi/dxgi.spec b/dlls/dxgi/dxgi.spec index df2b403d047..1c5069d5ddc 100644 --- a/dlls/dxgi/dxgi.spec +++ b/dlls/dxgi/dxgi.spec @@ -1 +1 @@ -@ stub CreateDXGIFactory +@ stdcall CreateDXGIFactory(ptr ptr) diff --git a/dlls/dxgi/dxgi_main.c b/dlls/dxgi/dxgi_main.c index e99ddc79d3b..44b4eeec36a 100644 --- a/dlls/dxgi/dxgi_main.c +++ b/dlls/dxgi/dxgi_main.c @@ -37,3 +37,28 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) return TRUE; } + +HRESULT WINAPI CreateDXGIFactory(REFIID riid, void **factory) +{ + struct dxgi_factory *object; + HRESULT hr; + + FIXME("riid %s, factory %p partial stub!\n", debugstr_guid(riid), factory); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate DXGI factory object memory\n"); + return E_OUTOFMEMORY; + } + + object->vtbl = &dxgi_factory_vtbl; + object->refcount = 1; + + TRACE("Created IDXGIFactory %p\n", object); + + hr = IDXGIFactory_QueryInterface((IDXGIFactory *)object, riid, factory); + IDXGIFactory_Release((IDXGIFactory *)object); + + return hr; +} diff --git a/dlls/dxgi/dxgi_private.h b/dlls/dxgi/dxgi_private.h index a03659e771e..0ca3b41bcf6 100644 --- a/dlls/dxgi/dxgi_private.h +++ b/dlls/dxgi/dxgi_private.h @@ -28,4 +28,12 @@ #include "dxgi.h" +/* IDXGIFactory */ +extern const struct IDXGIFactoryVtbl dxgi_factory_vtbl; +struct dxgi_factory +{ + const struct IDXGIFactoryVtbl *vtbl; + LONG refcount; +}; + #endif /* __WINE_DXGI_PRIVATE_H */ diff --git a/dlls/dxgi/factory.c b/dlls/dxgi/factory.c new file mode 100644 index 00000000000..d9593e3b63b --- /dev/null +++ b/dlls/dxgi/factory.c @@ -0,0 +1,162 @@ +/* + * Copyright 2008 Henri Verbeet for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + */ + +#include "config.h" +#include "wine/port.h" + +#include "dxgi_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(dxgi); + +/* IUnknown methods */ + +HRESULT STDMETHODCALLTYPE dxgi_factory_QueryInterface(IDXGIFactory* iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_IUnknown) + || IsEqualGUID(riid, &IID_IDXGIObject) + || IsEqualGUID(riid, &IID_IDXGIFactory)) + { + IUnknown_AddRef(iface); + *object = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid)); + + *object = NULL; + return E_NOINTERFACE; +} + +ULONG STDMETHODCALLTYPE dxgi_factory_AddRef(IDXGIFactory* iface) +{ + struct dxgi_factory *This = (struct dxgi_factory *)iface; + ULONG refcount = InterlockedIncrement(&This->refcount); + + TRACE("%p increasing refcount to %u\n", This, refcount); + + return refcount; +} + +ULONG STDMETHODCALLTYPE dxgi_factory_Release(IDXGIFactory* iface) +{ + struct dxgi_factory *This = (struct dxgi_factory *)iface; + ULONG refcount = InterlockedDecrement(&This->refcount); + + TRACE("%p decreasing refcount to %u\n", This, refcount); + + if (!refcount) + { + HeapFree(GetProcessHeap(), 0, This); + } + + return refcount; +} + +/* IDXGIObject methods */ + +HRESULT STDMETHODCALLTYPE dxgi_factory_SetPrivateData(IDXGIFactory* iface, + REFGUID guid, UINT data_size, const void *data) +{ + FIXME("iface %p, guid %s, data_size %u, data %p stub!\n", iface, debugstr_guid(guid), data_size, data); + + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE dxgi_factory_SetPrivateDataInterface(IDXGIFactory* iface, + REFGUID guid, const IUnknown *object) +{ + FIXME("iface %p, guid %s, object %p stub!\n", iface, debugstr_guid(guid), object); + + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE dxgi_factory_GetPrivateData(IDXGIFactory* iface, + REFGUID guid, UINT *data_size, void *data) +{ + FIXME("iface %p, guid %s, data_size %p, data %p stub!\n", iface, debugstr_guid(guid), data_size, data); + + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE dxgi_factory_GetParent(IDXGIFactory* iface, REFIID riid, void **parent) +{ + FIXME("iface %p, riid %s, parent %p stub!\n", iface, debugstr_guid(riid), parent); + + return E_NOTIMPL; +} + +/* IDXGIFactory methods */ + +HRESULT STDMETHODCALLTYPE dxgi_factory_EnumAdapters(IDXGIFactory* iface, UINT adapter_idx, IDXGIAdapter **adapter) +{ + FIXME("iface %p, adapter_idx %u, adapter %p stub!\n", iface, adapter_idx, adapter); + + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE dxgi_factory_MakeWindowAssociation(IDXGIFactory* iface, HWND window, UINT flags) +{ + FIXME("iface %p, window %p, flags %#x stub!\n\n", iface, window, flags); + + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE dxgi_factory_GetWindowAssociation(IDXGIFactory* iface, HWND *window) +{ + FIXME("iface %p, window %p stub!\n", iface, window); + + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE dxgi_factory_CreateSwapChain(IDXGIFactory* iface, + IUnknown *device, DXGI_SWAP_CHAIN_DESC *desc, IDXGISwapChain **swapchain) +{ + FIXME("iface %p, device %p, desc %p, swapchain %p stub!\n", iface, device, desc, swapchain); + + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE dxgi_factory_CreateSoftwareAdapter(IDXGIFactory* iface, + HMODULE swrast, IDXGIAdapter **adapter) +{ + FIXME("iface %p, swrast %p, adapter %p stub!\n", iface, swrast, adapter); + + return E_NOTIMPL; +} + +const struct IDXGIFactoryVtbl dxgi_factory_vtbl = +{ + /* IUnknown methods */ + dxgi_factory_QueryInterface, + dxgi_factory_AddRef, + dxgi_factory_Release, + /* IDXGIObject methods */ + dxgi_factory_SetPrivateData, + dxgi_factory_SetPrivateDataInterface, + dxgi_factory_GetPrivateData, + dxgi_factory_GetParent, + /* IDXGIFactory methods */ + dxgi_factory_EnumAdapters, + dxgi_factory_MakeWindowAssociation, + dxgi_factory_GetWindowAssociation, + dxgi_factory_CreateSwapChain, + dxgi_factory_CreateSoftwareAdapter, +}; -- 2.11.4.GIT