diff --git a/dlls/Makefile.in b/dlls/Makefile.in index 56e0506cd7c..a5fcd6fce7c 100644 --- a/dlls/Makefile.in +++ b/dlls/Makefile.in @@ -199,6 +199,7 @@ IMPORT_LIBS = \ cryptui/libcryptui.$(IMPLIBEXT) \ ctl3d32/libctl3d32.$(IMPLIBEXT) \ d3d10/libd3d10.$(IMPLIBEXT) \ + d3d10core/libd3d10core.$(IMPLIBEXT) \ d3d8/libd3d8.$(IMPLIBEXT) \ d3d9/libd3d9.$(IMPLIBEXT) \ d3dim/libd3dim.$(IMPLIBEXT) \ @@ -341,6 +342,7 @@ CROSS_IMPLIBS = \ cryptui/libcryptui.a \ ctl3d32/libctl3d32.a \ d3d10/libd3d10.a \ + d3d10core/libd3d10core.a \ d3d8/libd3d8.a \ d3d9/libd3d9.a \ d3dim/libd3dim.a \ @@ -527,6 +529,9 @@ ctl3d32/libctl3d32.def ctl3d32/libctl3d32.a: ctl3d32/ctl3d32.spec $(WINEBUILD) d3d10/libd3d10.def d3d10/libd3d10.a: d3d10/d3d10.spec $(WINEBUILD) @cd d3d10 && $(MAKE) `basename $@` +d3d10core/libd3d10core.def d3d10core/libd3d10core.a: d3d10core/d3d10core.spec $(WINEBUILD) + @cd d3d10core && $(MAKE) `basename $@` + d3d8/libd3d8.def d3d8/libd3d8.a: d3d8/d3d8.spec $(WINEBUILD) @cd d3d8 && $(MAKE) `basename $@` diff --git a/dlls/d3d10/Makefile.in b/dlls/d3d10/Makefile.in index 48d6f1eeee6..3aef27da366 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 053abd00bd4..188d354b52e 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 c3057afda7e..46a45768241 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 a55b59126f9..c45ff3cb9c2 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 = \