d3d10: Implement D3D10CreateDevice() on top of D3D10CoreCreateDevice().

Henri Verbeet hverbeet at codeweavers.com
Fri Nov 14 06:57:06 CST 2008


---
 dlls/d3d10/Makefile.in     |    2 +-
 dlls/d3d10/d3d10_main.c    |   93 +++++++++++++++++++++++++++++++++++++++++++-
 dlls/d3d10/d3d10_private.h |    4 ++
 dlls/d3d10core/Makefile.in |    1 +
 4 files changed, 97 insertions(+), 3 deletions(-)

diff --git a/dlls/d3d10/Makefile.in b/dlls/d3d10/Makefile.in
index 48d6f1e..3aef27d 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 dxgi kernel32
+IMPORTS   = dxguid uuid d3d10core dxgi kernel32
 
 C_SRCS = \
 	d3d10_main.c \
diff --git a/dlls/d3d10/d3d10_main.c b/dlls/d3d10/d3d10_main.c
index 053abd0..188d354 100644
--- a/dlls/d3d10/d3d10_main.c
+++ b/dlls/d3d10/d3d10_main.c
@@ -42,10 +42,99 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
 HRESULT WINAPI D3D10CreateDevice(IDXGIAdapter *adapter, D3D10_DRIVER_TYPE driver_type,
         HMODULE swrast, UINT flags, UINT sdk_version, ID3D10Device **device)
 {
-    FIXME("adapter %p, driver_type %s, swrast %p, flags %#x, sdk_version %d, device %p stub!\n",
+    IDXGIFactory *factory;
+    HRESULT hr;
+
+    TRACE("adapter %p, driver_type %s, swrast %p, flags %#x, sdk_version %d, device %p\n",
             adapter, debug_d3d10_driver_type(driver_type), swrast, flags, sdk_version, device);
 
-    return E_NOTIMPL;
+    if (adapter)
+    {
+        IDXGIAdapter_AddRef(adapter);
+        hr = IDXGIAdapter_GetParent(adapter, &IID_IDXGIFactory, (void **)&factory);
+        if (FAILED(hr))
+        {
+            WARN("Failed to get dxgi factory, returning %#x\n", hr);
+            return hr;
+        }
+    }
+    else
+    {
+        hr = CreateDXGIFactory(&IID_IDXGIFactory, (void **)&factory);
+        if (FAILED(hr))
+        {
+            WARN("Failed to create dxgi factory, returning %#x\n", hr);
+            return hr;
+        }
+
+        switch(driver_type)
+        {
+            case D3D10_DRIVER_TYPE_HARDWARE:
+            {
+                hr = IDXGIFactory_EnumAdapters(factory, 0, &adapter);
+                if (FAILED(hr))
+                {
+                    WARN("No adapters found, returning %#x\n", hr);
+                    IDXGIFactory_Release(factory);
+                    return hr;
+                }
+                break;
+            }
+
+            case D3D10_DRIVER_TYPE_NULL:
+                FIXME("NULL device not implemented, falling back to refrast\n");
+            case D3D10_DRIVER_TYPE_REFERENCE:
+            {
+                HMODULE refrast = LoadLibraryA("d3d10ref.dll");
+                if (!refrast)
+                {
+                    WARN("Failed to load refrast, returning E_FAIL\n");
+                    IDXGIFactory_Release(factory);
+                    return E_FAIL;
+                }
+                hr = IDXGIFactory_CreateSoftwareAdapter(factory, refrast, &adapter);
+                FreeLibrary(refrast);
+                if (FAILED(hr))
+                {
+                    WARN("Failed to create a software adapter, returning %#x\n", hr);
+                    IDXGIFactory_Release(factory);
+                    return hr;
+                }
+                break;
+            }
+
+            case D3D10_DRIVER_TYPE_SOFTWARE:
+            {
+                if (!swrast)
+                {
+                    WARN("Software device requested, but NULL swrast passed, returning E_FAIL\n");
+                    IDXGIFactory_Release(factory);
+                    return E_FAIL;
+                }
+                hr = IDXGIFactory_CreateSoftwareAdapter(factory, swrast, &adapter);
+                if (FAILED(hr))
+                {
+                    WARN("Failed to create a software adapter, returning %#x\n", hr);
+                    IDXGIFactory_Release(factory);
+                    return hr;
+                }
+                break;
+            }
+        }
+    }
+
+    hr = D3D10CoreCreateDevice(factory, adapter, flags, 0, device);
+    IDXGIAdapter_Release(adapter);
+    IDXGIFactory_Release(factory);
+    if (FAILED(hr))
+    {
+        WARN("Failed to create a device, returning %#x\n", hr);
+        return hr;
+    }
+
+    TRACE("Created ID3D10Device %p\n", *device);
+
+    return hr;
 }
 
 HRESULT WINAPI D3D10CreateDeviceAndSwapChain(IDXGIAdapter *adapter, D3D10_DRIVER_TYPE driver_type,
diff --git a/dlls/d3d10/d3d10_private.h b/dlls/d3d10/d3d10_private.h
index c3057af..46a4576 100644
--- a/dlls/d3d10/d3d10_private.h
+++ b/dlls/d3d10/d3d10_private.h
@@ -31,4 +31,8 @@
 /* TRACE helper functions */
 const char *debug_d3d10_driver_type(D3D10_DRIVER_TYPE driver_type);
 
+/* D3D10Core */
+HRESULT WINAPI D3D10CoreCreateDevice(IDXGIFactory *factory, IDXGIAdapter *adapter,
+        UINT flags, DWORD unknown0, ID3D10Device **device);
+
 #endif /* __WINE_D3D10_PRIVATE_H */
diff --git a/dlls/d3d10core/Makefile.in b/dlls/d3d10core/Makefile.in
index a55b591..c45ff3c 100644
--- a/dlls/d3d10core/Makefile.in
+++ b/dlls/d3d10core/Makefile.in
@@ -3,6 +3,7 @@ TOPOBJDIR = ../..
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = d3d10core.dll
+IMPORTLIB = d3d10core
 IMPORTS   = dxguid uuid dxgi kernel32
 
 C_SRCS = \
-- 
1.5.6.4



--------------090603050004010007060000--



More information about the wine-patches mailing list