atl80: Added AtlComModuleRegisterServer implementation (based on AtlModuleRegisterSer...
[wine] / dlls / d3d10core / d3d10core_main.c
1 /*
2  * Copyright 2008 Henri Verbeet for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  *
18  */
19
20 #include "config.h"
21 #include "wine/port.h"
22
23 #define D3D10CORE_INIT_GUID
24 #include "d3d10core_private.h"
25
26 WINE_DEFAULT_DEBUG_CHANNEL(d3d10core);
27
28 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
29 {
30     TRACE("fdwReason %u\n", fdwReason);
31
32     switch(fdwReason)
33     {
34         case DLL_PROCESS_ATTACH:
35             DisableThreadLibraryCalls(hInstDLL);
36             break;
37     }
38
39     return TRUE;
40 }
41
42 static HRESULT WINAPI layer_init(enum dxgi_device_layer_id id, DWORD *count, DWORD *values)
43 {
44     TRACE("id %#x, count %p, values %p\n", id, count, values);
45
46     if (id != DXGI_DEVICE_LAYER_D3D10_DEVICE)
47     {
48         WARN("Unknown layer id %#x\n", id);
49         return E_NOTIMPL;
50     }
51
52     return S_OK;
53 }
54
55 static UINT WINAPI layer_get_size(enum dxgi_device_layer_id id, struct layer_get_size_args *args, DWORD unknown0)
56 {
57     TRACE("id %#x, args %p, unknown0 %#x\n", id, args, unknown0);
58
59     if (id != DXGI_DEVICE_LAYER_D3D10_DEVICE)
60     {
61         WARN("Unknown layer id %#x\n", id);
62         return 0;
63     }
64
65     return sizeof(struct d3d10_device);
66 }
67
68 static HRESULT WINAPI layer_create(enum dxgi_device_layer_id id, void **layer_base, DWORD unknown0,
69         void *device_object, REFIID riid, void **device_layer)
70 {
71     struct d3d10_device *object;
72     HRESULT hr;
73
74     TRACE("id %#x, layer_base %p, unknown0 %#x, device_object %p, riid %s, device_layer %p\n",
75             id, layer_base, unknown0, device_object, debugstr_guid(riid), device_layer);
76
77     if (id != DXGI_DEVICE_LAYER_D3D10_DEVICE)
78     {
79         WARN("Unknown layer id %#x\n", id);
80         *device_layer = NULL;
81         return E_NOTIMPL;
82     }
83
84     object = *layer_base;
85     if (FAILED(hr = d3d10_device_init(object, device_object)))
86     {
87         WARN("Failed to initialize device, hr %#x.\n", hr);
88         *device_layer = NULL;
89         return hr;
90     }
91     *device_layer = &object->IUnknown_inner;
92
93     TRACE("Created d3d10 device at %p\n", object);
94
95     return S_OK;
96 }
97
98 HRESULT WINAPI D3D10CoreRegisterLayers(void)
99 {
100     const struct dxgi_device_layer layers[] =
101     {
102         {DXGI_DEVICE_LAYER_D3D10_DEVICE, layer_init, layer_get_size, layer_create},
103     };
104
105     DXGID3D10RegisterLayers(layers, sizeof(layers)/sizeof(*layers));
106
107     return S_OK;
108 }
109
110 HRESULT WINAPI D3D10CoreCreateDevice(IDXGIFactory *factory, IDXGIAdapter *adapter,
111         UINT flags, void *unknown0, ID3D10Device **device)
112 {
113     IUnknown *dxgi_device;
114     HMODULE d3d10core;
115     HRESULT hr;
116
117     TRACE("factory %p, adapter %p, flags %#x, unknown0 %p, device %p.\n",
118             factory, adapter, flags, unknown0, device);
119
120     d3d10core = GetModuleHandleA("d3d10core.dll");
121     hr = DXGID3D10CreateDevice(d3d10core, factory, adapter, flags, unknown0, (void **)&dxgi_device);
122     if (FAILED(hr))
123     {
124         WARN("Failed to create device, returning %#x\n", hr);
125         return hr;
126     }
127
128     hr = IUnknown_QueryInterface(dxgi_device, &IID_ID3D10Device, (void **)device);
129     IUnknown_Release(dxgi_device);
130
131     return hr;
132 }