Merged msacm and msacm32 dlls.
[wine] / dlls / ddraw / direct3d / main.c
1 #include "config.h"
2
3 #include <assert.h>
4 #include <unistd.h>
5 #include <fcntl.h>
6 #include <string.h>
7 #include <stdio.h>
8
9 #include "winerror.h"
10 #include "ddraw.h"
11 #include "d3d.h"
12 #include "message.h"
13 #include "options.h"
14 #include "monitor.h"
15 #include "debugtools.h"
16
17 #include "d3d_private.h"
18
19 DEFAULT_DEBUG_CHANNEL(ddraw);
20
21 static ICOM_VTABLE(IDirect3D) d3dvt;
22 static ICOM_VTABLE(IDirect3D2) d3d2vt;
23
24 /*******************************************************************************
25  *                              IDirect3D
26  */
27 HRESULT WINAPI IDirect3DImpl_QueryInterface(
28     LPDIRECT3D iface,REFIID refiid,LPVOID *obj
29 ) {
30     ICOM_THIS(IDirect3DImpl,iface);
31     /* FIXME: Not sure if this is correct */
32
33     TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj);
34     if (( IsEqualGUID( &IID_IDirectDraw,  refiid ) ) ||
35         ( IsEqualGUID (&IID_IDirectDraw2, refiid ) ) ||
36         ( IsEqualGUID( &IID_IDirectDraw4, refiid ) )
37     ) {
38         *obj = This->ddraw;
39         IDirect3D_AddRef(iface);
40         TRACE("  Creating IDirectDrawX interface (%p)\n", *obj);
41         return S_OK;
42     }
43     if (( IsEqualGUID( &IID_IDirect3D, refiid ) ) ||
44         ( IsEqualGUID( &IID_IUnknown,  refiid ) ) ) {
45         *obj = This;
46         IDirect3D_AddRef(iface);
47         TRACE("  Creating IDirect3D interface (%p)\n", *obj);
48         return S_OK;
49     }
50     if ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) {
51         IDirect3D2Impl*  d3d;
52
53         d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
54         d3d->ref = 1;
55         d3d->ddraw = This->ddraw;
56         IDirect3D_AddRef(iface);
57         ICOM_VTBL(d3d) = &d3d2vt;
58         *obj = d3d;
59         TRACE("  Creating IDirect3D2 interface (%p)\n", *obj);
60         return S_OK;
61     }
62     FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid));
63     return OLE_E_ENUM_NOMORE;
64 }
65
66 ULONG WINAPI IDirect3DImpl_AddRef(LPDIRECT3D iface) {
67     ICOM_THIS(IDirect3DImpl,iface);
68     TRACE("(%p)->() incrementing from %lu.\n", This, This->ref );
69
70     return ++(This->ref);
71 }
72
73 ULONG WINAPI IDirect3DImpl_Release(LPDIRECT3D iface)
74 {
75     ICOM_THIS(IDirect3DImpl,iface);
76     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
77
78     if (!--(This->ref)) {
79         IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
80         HeapFree(GetProcessHeap(),0,This);
81         return S_OK;
82     }
83     return This->ref;
84 }
85
86 HRESULT WINAPI IDirect3DImpl_Initialize(LPDIRECT3D iface,REFIID refiid) {
87     ICOM_THIS(IDirect3DImpl,iface);
88     /* FIXME: Not sure if this is correct */
89     FIXME("(%p)->(%s):stub.\n",This,debugstr_guid(refiid));
90     return DDERR_ALREADYINITIALIZED;
91 }
92
93 HRESULT WINAPI IDirect3DImpl_EnumDevices(
94     LPDIRECT3D iface, LPD3DENUMDEVICESCALLBACK cb, LPVOID context
95 ) {
96     ICOM_THIS(IDirect3DImpl,iface);
97     FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
98     return DD_OK;
99 }
100
101 HRESULT WINAPI IDirect3DImpl_CreateLight(
102     LPDIRECT3D iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
103 ) {
104     ICOM_THIS(IDirect3DImpl,iface);
105     FIXME("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
106     return E_FAIL;
107 }
108
109 HRESULT WINAPI IDirect3DImpl_CreateMaterial(
110     LPDIRECT3D iface, LPDIRECT3DMATERIAL *lpmaterial, IUnknown *lpunk
111 ) {
112     ICOM_THIS(IDirect3DImpl,iface);
113     FIXME("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
114     return E_FAIL;
115 }
116
117 HRESULT WINAPI IDirect3DImpl_CreateViewport(
118     LPDIRECT3D iface, LPDIRECT3DVIEWPORT *lpviewport, IUnknown *lpunk
119 ) {
120     ICOM_THIS(IDirect3DImpl,iface);
121     FIXME("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
122
123     return E_FAIL;
124 }
125
126 HRESULT WINAPI IDirect3DImpl_FindDevice(
127     LPDIRECT3D iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
128     LPD3DFINDDEVICERESULT lpfinddevrst)
129 {
130     ICOM_THIS(IDirect3DImpl,iface);
131     FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
132     return DD_OK;
133 }
134
135 /* This is for checking the correctness of the prototypes/functions.
136  * Do not remove.
137  */
138 static ICOM_VTABLE(IDirect3D) WINE_UNUSED d3dvt = {
139     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
140     IDirect3DImpl_QueryInterface,
141     IDirect3DImpl_AddRef,
142     IDirect3DImpl_Release,
143     IDirect3DImpl_Initialize,
144     IDirect3DImpl_EnumDevices,
145     IDirect3DImpl_CreateLight,
146     IDirect3DImpl_CreateMaterial,
147     IDirect3DImpl_CreateViewport,
148     IDirect3DImpl_FindDevice
149 };
150
151 /*******************************************************************************
152  *                              IDirect3D2
153  */
154 HRESULT WINAPI IDirect3D2Impl_QueryInterface(
155     LPDIRECT3D2 iface,REFIID refiid,LPVOID *obj) {  
156     ICOM_THIS(IDirect3D2Impl,iface);
157
158     /* FIXME: Not sure if this is correct */
159
160     TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj);
161     if ( ( IsEqualGUID( &IID_IDirectDraw,  refiid ) ) ||
162          ( IsEqualGUID( &IID_IDirectDraw2, refiid ) ) ||
163          ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) ) {
164         *obj = This->ddraw;
165         IDirect3D2_AddRef(iface);
166
167         TRACE("  Creating IDirectDrawX interface (%p)\n", *obj);
168         
169         return S_OK;
170     }
171     if ( ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) ||
172          ( IsEqualGUID( &IID_IUnknown,   refiid ) ) ) {
173         *obj = This;
174         IDirect3D2_AddRef(iface);
175
176         TRACE("  Creating IDirect3D2 interface (%p)\n", *obj);
177
178         return S_OK;
179     }
180     if ( IsEqualGUID( &IID_IDirect3D, refiid ) ) {
181         IDirect3DImpl*  d3d;
182
183         d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
184         d3d->ref = 1;
185         d3d->ddraw = This->ddraw;
186         IDirect3D2_AddRef(iface);
187         ICOM_VTBL(d3d) = &d3dvt;
188         *obj = d3d;
189         TRACE("  Creating IDirect3D interface (%p)\n", *obj);
190         return S_OK;
191     }
192     FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid));
193     return OLE_E_ENUM_NOMORE;
194 }
195
196 ULONG WINAPI IDirect3D2Impl_AddRef(LPDIRECT3D2 iface) {
197     ICOM_THIS(IDirect3D2Impl,iface);
198     TRACE("(%p)->() incrementing from %lu.\n", This, This->ref );
199
200     return ++(This->ref);
201 }
202
203 ULONG WINAPI IDirect3D2Impl_Release(LPDIRECT3D2 iface) {
204     ICOM_THIS(IDirect3D2Impl,iface);
205     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
206
207     if (!--(This->ref)) {
208         IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
209         HeapFree(GetProcessHeap(),0,This);
210         return S_OK;
211     }
212     return This->ref;
213 }
214
215 HRESULT WINAPI IDirect3D2Impl_EnumDevices(
216     LPDIRECT3D2 iface,LPD3DENUMDEVICESCALLBACK cb, LPVOID context
217 ) {
218     ICOM_THIS(IDirect3D2Impl,iface);
219     FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
220     return DD_OK;
221 }
222
223 HRESULT WINAPI IDirect3D2Impl_CreateLight(
224     LPDIRECT3D2 iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
225 ) {
226     ICOM_THIS(IDirect3D2Impl,iface);
227     FIXME("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
228     return E_FAIL;
229 }
230
231 HRESULT WINAPI IDirect3D2Impl_CreateMaterial(
232     LPDIRECT3D2 iface, LPDIRECT3DMATERIAL2 *lpmaterial, IUnknown *lpunk
233 ) {
234     ICOM_THIS(IDirect3D2Impl,iface);
235     FIXME("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
236     return E_FAIL;
237 }
238
239 HRESULT WINAPI IDirect3D2Impl_CreateViewport(
240     LPDIRECT3D2 iface, LPDIRECT3DVIEWPORT2 *lpviewport, IUnknown *lpunk
241 ) {
242     ICOM_THIS(IDirect3D2Impl,iface);
243     FIXME("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
244     return E_FAIL;
245 }
246
247 HRESULT WINAPI IDirect3D2Impl_FindDevice(
248     LPDIRECT3D2 iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
249     LPD3DFINDDEVICERESULT lpfinddevrst)
250 {
251     ICOM_THIS(IDirect3D2Impl,iface);
252     FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
253     return DD_OK;
254 }
255
256 HRESULT WINAPI IDirect3D2Impl_CreateDevice(
257     LPDIRECT3D2 iface, REFCLSID rguid, LPDIRECTDRAWSURFACE surface,
258     LPDIRECT3DDEVICE2 *device)
259 {
260     ICOM_THIS(IDirect3D2Impl,iface);
261     FIXME("(%p)->(%s,%p,%p): stub\n",This,debugstr_guid(rguid),surface,device);
262     return DDERR_INVALIDPARAMS;
263 }
264
265 /* This is for checking the correctness of the prototypes/functions.
266  * Do not remove.
267  */
268 static ICOM_VTABLE(IDirect3D2) WINE_UNUSED d3d2vt = 
269 {
270     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
271     IDirect3D2Impl_QueryInterface,
272     IDirect3D2Impl_AddRef,
273     IDirect3D2Impl_Release,
274     IDirect3D2Impl_EnumDevices,
275     IDirect3D2Impl_CreateLight,
276     IDirect3D2Impl_CreateMaterial,
277     IDirect3D2Impl_CreateViewport,
278     IDirect3D2Impl_FindDevice,
279     IDirect3D2Impl_CreateDevice
280 };