From 5d6b7e4c4594862b9bbdafe5074c237c03d1d601 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Thu, 23 Oct 2008 16:37:09 +0200 Subject: [PATCH] d3d10: Implement D3D10CreateDeviceAndSwapChain(). --- dlls/d3d10/Makefile.in | 2 +- dlls/d3d10/d3d10.spec | 2 +- dlls/d3d10/d3d10_main.c | 49 +++++++++++++++++++++++++++++++++++++++++ include/d3d10misc.h | 4 ++++ 4 files changed, 55 insertions(+), 2 deletions(-) diff --git a/dlls/d3d10/Makefile.in b/dlls/d3d10/Makefile.in index 296c236479a..eeaa542626f 100644 --- a/dlls/d3d10/Makefile.in +++ b/dlls/d3d10/Makefile.in @@ -4,7 +4,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = d3d10.dll IMPORTLIB = d3d10 -IMPORTS = dxguid uuid kernel32 +IMPORTS = dxguid uuid dxgi kernel32 C_SRCS = \ d3d10_main.c \ diff --git a/dlls/d3d10/d3d10.spec b/dlls/d3d10/d3d10.spec index 0b59175ed7c..2613e38966d 100644 --- a/dlls/d3d10/d3d10.spec +++ b/dlls/d3d10/d3d10.spec @@ -2,7 +2,7 @@ @ stub D3D10CompileShader @ stub D3D10CreateBlob @ stdcall D3D10CreateDevice(ptr long ptr long long ptr) -@ stub D3D10CreateDeviceAndSwapChain +@ stdcall D3D10CreateDeviceAndSwapChain(ptr long ptr long long ptr ptr ptr) @ stub D3D10CreateEffectFromMemory @ stub D3D10CreateEffectPoolFromMemory @ stub D3D10CreateStateBlock diff --git a/dlls/d3d10/d3d10_main.c b/dlls/d3d10/d3d10_main.c index 6ed17564a27..f34a8ea86a7 100644 --- a/dlls/d3d10/d3d10_main.c +++ b/dlls/d3d10/d3d10_main.c @@ -64,3 +64,52 @@ HRESULT WINAPI D3D10CreateDevice(IDXGIAdapter *adapter, D3D10_DRIVER_TYPE driver return S_OK; } + +HRESULT WINAPI D3D10CreateDeviceAndSwapChain(IDXGIAdapter *adapter, D3D10_DRIVER_TYPE driver_type, + HMODULE swrast, UINT flags, UINT sdk_version, DXGI_SWAP_CHAIN_DESC *swapchain_desc, + IDXGISwapChain **swapchain, ID3D10Device **device) +{ + IDXGIFactory *factory; + HRESULT hr; + + TRACE("adapter %p, driver_type %s, swrast %p, flags %#x, sdk_version %d,\n" + "\tswapchain_desc %p, swapchain %p, device %p\n", + adapter, debug_d3d10_driver_type(driver_type), swrast, flags, sdk_version, + swapchain_desc, swapchain, device); + + hr = D3D10CreateDevice(adapter, driver_type, swrast, flags, sdk_version, device); + if (FAILED(hr)) + { + WARN("Failed to create a device, returning %#x\n", hr); + return hr; + } + + TRACE("Created ID3D10Device %p\n", *device); + + hr = CreateDXGIFactory(&IID_IDXGIFactory, (void **)&factory); + if (FAILED(hr)) + { + ID3D10Device_Release(*device); + *device = NULL; + + WARN("Failed to create a DXGI factory, returning %#x\n", hr); + return hr; + } + + TRACE("Created IDXGIFactory %p\n", factory); + + hr = IDXGIFactory_CreateSwapChain(factory, (IUnknown *)*device, swapchain_desc, swapchain); + IDXGIFactory_Release(factory); + if (FAILED(hr)) + { + ID3D10Device_Release(*device); + *device = NULL; + + WARN("Failed to create a swapchain, returning %#x\n", hr); + return hr; + } + + TRACE("Created IDXGISwapChain %p\n", *swapchain); + + return S_OK; +} diff --git a/include/d3d10misc.h b/include/d3d10misc.h index 00cf1539f4d..58a6d26d434 100644 --- a/include/d3d10misc.h +++ b/include/d3d10misc.h @@ -35,6 +35,10 @@ typedef enum D3D10_DRIVER_TYPE { HRESULT WINAPI D3D10CreateDevice(IDXGIAdapter *adapter, D3D10_DRIVER_TYPE driver_type, HMODULE swrast, UINT flags, UINT sdk_version, ID3D10Device **device); +HRESULT WINAPI D3D10CreateDeviceAndSwapChain(IDXGIAdapter *adapter, D3D10_DRIVER_TYPE driver_type, + HMODULE swrast, UINT flags, UINT sdk_version, DXGI_SWAP_CHAIN_DESC *swapchain_desc, + IDXGISwapChain **swapchain, ID3D10Device **device); + #ifdef __cplusplus } #endif