Fixed a race condition on RPC worker thread creation, and a typo.
[wine] / dlls / ddraw / direct3d / main.c
1 /*
2  * Copyright 2000 Marcus Meissner
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 #include "config.h"
20
21 #include <assert.h>
22 #ifdef HAVE_UNISTD_H
23 # include <unistd.h>
24 #endif
25 #include <fcntl.h>
26 #include <string.h>
27 #include <stdio.h>
28
29 #include "winerror.h"
30 #include "ddraw.h"
31 #include "d3d.h"
32 #include "wine/debug.h"
33
34 #include "d3d_private.h"
35
36 WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
37
38 HRESULT WINAPI
39 Main_IDirect3DImpl_7_3T_2T_1T_QueryInterface(LPDIRECT3D7 iface,
40                                              REFIID riid,
41                                              LPVOID* obp)
42 {
43     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface);
44
45     TRACE("(%p/%p)->(%s,%p)\n", This, iface, debugstr_guid(riid), obp);
46
47     /* By default, set the object pointer to NULL */
48     *obp = NULL;
49       
50     if (( IsEqualGUID( &IID_IDirectDraw,  riid ) ) ||
51         ( IsEqualGUID (&IID_IDirectDraw2, riid ) ) ||
52         ( IsEqualGUID (&IID_IDirectDraw4, riid ) ) ||
53         ( IsEqualGUID( &IID_IDirectDraw7, riid ) )
54     ) {
55         HRESULT ret;
56         TRACE("  Creating IDirectDrawX interface by calling DirectDraw function.\n");
57         ret = IDirectDraw_QueryInterface(ICOM_INTERFACE(This->ddraw,IDirectDraw), riid, obp);
58         if (ret == S_OK) {
59             IDirectDraw_Release(ICOM_INTERFACE(This->ddraw,IDirectDraw));
60             IDirect3D_AddRef(ICOM_INTERFACE(This,IDirect3D));
61         }
62         return ret;
63     }
64     if ( IsEqualGUID( &IID_IUnknown,  riid ) ) {
65         IDirect3D_AddRef(ICOM_INTERFACE(This,IDirect3D));
66         *obp = iface;
67         TRACE("  Creating IUnknown interface at %p.\n", *obp);
68         return S_OK;
69     }
70     if ( IsEqualGUID( &IID_IDirect3D, riid ) ) {
71         IDirect3D_AddRef(ICOM_INTERFACE(This,IDirect3D));
72         *obp = ICOM_INTERFACE(This, IDirect3D);
73         TRACE("  Creating IDirect3D interface %p\n", *obp);
74         return S_OK;
75     }
76     if ( IsEqualGUID( &IID_IDirect3D2, riid ) ) {
77         IDirect3D_AddRef(ICOM_INTERFACE(This,IDirect3D));
78         *obp = ICOM_INTERFACE(This, IDirect3D2);
79         TRACE("  Creating IDirect3D2 interface %p\n", *obp);
80         return S_OK;
81     }
82     if ( IsEqualGUID( &IID_IDirect3D3, riid ) ) {
83         IDirect3D_AddRef(ICOM_INTERFACE(This,IDirect3D));
84         *obp = ICOM_INTERFACE(This, IDirect3D3);
85         TRACE("  Creating IDirect3D3 interface %p\n", *obp);
86         return S_OK;
87     }
88     if ( IsEqualGUID( &IID_IDirect3D7, riid ) ) {
89         /* This is not 100 % true as we should not be able to QueryInterface a '7' version from another one.
90            But well, to factorize the code, why check for application bugs :-) ?
91          */
92         IDirect3D_AddRef(ICOM_INTERFACE(This,IDirect3D));
93         *obp = ICOM_INTERFACE(This, IDirect3D7);
94         TRACE("  Creating IDirect3D7 interface %p\n", *obp);
95         return S_OK;
96     }
97     FIXME("(%p): interface for IID %s NOT found!\n", This, debugstr_guid(riid));
98     return OLE_E_ENUM_NOMORE;
99 }
100
101 ULONG WINAPI
102 Main_IDirect3DImpl_7_3T_2T_1T_AddRef(LPDIRECT3D7 iface)
103 {
104     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface);
105     TRACE("(%p/%p)->() incrementing from %lu.\n", This, iface, This->ref);
106
107     return ++(This->ref);
108 }
109
110 ULONG WINAPI
111 Main_IDirect3DImpl_7_3T_2T_1T_Release(LPDIRECT3D7 iface)
112 {
113     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface);
114     TRACE("(%p/%p)->() decrementing from %lu.\n", This, iface, This->ref);
115     if (--(This->ref) == 0) {
116         IDirectDraw_Release(ICOM_INTERFACE(This->ddraw, IDirectDraw));
117         HeapFree(GetProcessHeap(), 0, This);
118         return 0;
119     }
120     return This->ref;
121 }
122
123 HRESULT WINAPI
124 Main_IDirect3DImpl_1_Initialize(LPDIRECT3D iface,
125                                 REFIID riid)
126 {
127     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D, iface);
128     TRACE("(%p/%p)->(%s) no-op...\n", This, iface, debugstr_guid(riid));
129     return D3D_OK;
130 }
131
132 HRESULT WINAPI
133 Main_IDirect3DImpl_3_2T_1T_EnumDevices(LPDIRECT3D3 iface,
134                                        LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback,
135                                        LPVOID lpUserArg)
136 {
137     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface);
138     FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpEnumDevicesCallback, lpUserArg);
139     return D3D_OK;
140 }
141
142 HRESULT WINAPI
143 Main_IDirect3DImpl_3_2T_1T_CreateLight(LPDIRECT3D3 iface,
144                                        LPDIRECT3DLIGHT* lplpDirect3DLight,
145                                        IUnknown* pUnkOuter)
146 {
147     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface);
148     FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lplpDirect3DLight, pUnkOuter);
149     return D3D_OK;
150 }
151
152 HRESULT WINAPI
153 Main_IDirect3DImpl_3_2T_1T_CreateMaterial(LPDIRECT3D3 iface,
154                                           LPDIRECT3DMATERIAL3* lplpDirect3DMaterial3,
155                                           IUnknown* pUnkOuter)
156 {
157     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface);
158     FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lplpDirect3DMaterial3, pUnkOuter);
159     return D3D_OK;
160 }
161
162 HRESULT WINAPI
163 Main_IDirect3DImpl_3_2T_1T_CreateViewport(LPDIRECT3D3 iface,
164                                           LPDIRECT3DVIEWPORT3* lplpD3DViewport3,
165                                           IUnknown* pUnkOuter)
166 {
167     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface);
168     FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lplpD3DViewport3, pUnkOuter);
169     return D3D_OK;
170 }
171
172 HRESULT WINAPI
173 Main_IDirect3DImpl_3_2T_1T_FindDevice(LPDIRECT3D3 iface,
174                                       LPD3DFINDDEVICESEARCH lpD3DDFS,
175                                       LPD3DFINDDEVICERESULT lpD3DFDR)
176 {
177     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface);
178     FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpD3DDFS, lpD3DFDR);
179     return D3D_OK;
180 }
181
182 HRESULT WINAPI
183 Main_IDirect3DImpl_2_CreateDevice(LPDIRECT3D2 iface,
184                                   REFCLSID rclsid,
185                                   LPDIRECTDRAWSURFACE lpDDS,
186                                   LPDIRECT3DDEVICE2* lplpD3DDevice2)
187 {
188     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D2, iface);
189     FIXME("(%p/%p)->(%s,%p,%p): stub!\n", This, iface, debugstr_guid(rclsid), lpDDS, lplpD3DDevice2);
190     return D3D_OK;
191 }
192
193 HRESULT WINAPI
194 Main_IDirect3DImpl_3_CreateDevice(LPDIRECT3D3 iface,
195                                   REFCLSID rclsid,
196                                   LPDIRECTDRAWSURFACE4 lpDDS,
197                                   LPDIRECT3DDEVICE3* lplpD3DDevice3,
198                                   LPUNKNOWN lpUnk)
199 {
200     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface);
201     FIXME("(%p/%p)->(%s,%p,%p,%p): stub!\n", This, iface, debugstr_guid(rclsid), lpDDS, lplpD3DDevice3, lpUnk);
202     return D3D_OK;
203 }
204
205 HRESULT WINAPI
206 Main_IDirect3DImpl_7_3T_EnumZBufferFormats(LPDIRECT3D7 iface,
207                                            REFCLSID riidDevice,
208                                            LPD3DENUMPIXELFORMATSCALLBACK lpEnumCallback,
209                                            LPVOID lpContext)
210 {
211     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface);
212     FIXME("(%p/%p)->(%s,%p,%p): stub!\n", This, iface, debugstr_guid(riidDevice), lpEnumCallback, lpContext);
213     return D3D_OK;
214 }
215
216 HRESULT WINAPI
217 Main_IDirect3DImpl_7_3T_EvictManagedTextures(LPDIRECT3D7 iface)
218 {
219     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface);
220     FIXME("(%p/%p)->(): stub!\n", This, iface);
221     return D3D_OK;
222 }
223
224 HRESULT WINAPI
225 Main_IDirect3DImpl_7_EnumDevices(LPDIRECT3D7 iface,
226                                  LPD3DENUMDEVICESCALLBACK7 lpEnumDevicesCallback,
227                                  LPVOID lpUserArg)
228 {
229     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface);
230     FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpEnumDevicesCallback, lpUserArg);
231     return D3D_OK;
232 }
233
234 HRESULT WINAPI
235 Main_IDirect3DImpl_7_CreateDevice(LPDIRECT3D7 iface,
236                                   REFCLSID rclsid,
237                                   LPDIRECTDRAWSURFACE7 lpDDS,
238                                   LPDIRECT3DDEVICE7* lplpD3DDevice)
239 {
240     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface);
241     FIXME("(%p/%p)->(%s,%p,%p): stub!\n", This, iface, debugstr_guid(rclsid), lpDDS, lplpD3DDevice);
242     return D3D_OK;
243 }
244
245 HRESULT WINAPI
246 Main_IDirect3DImpl_7_3T_CreateVertexBuffer(LPDIRECT3D7 iface,
247                                            LPD3DVERTEXBUFFERDESC lpD3DVertBufDesc,
248                                            LPDIRECT3DVERTEXBUFFER7* lplpD3DVertBuf,
249                                            DWORD dwFlags)
250 {
251     ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface);
252     FIXME("(%p/%p)->(%p,%p,%08lx): stub!\n", This, iface, lpD3DVertBufDesc, lplpD3DVertBuf, dwFlags);
253     return D3D_OK;
254 }
255
256 HRESULT WINAPI
257 Thunk_IDirect3DImpl_3_QueryInterface(LPDIRECT3D3 iface,
258                                      REFIID riid,
259                                      LPVOID* obp)
260 {
261     TRACE("(%p)->(%s,%p) thunking to IDirect3D7 interface.\n", iface, debugstr_guid(riid), obp);
262     return IDirect3D7_QueryInterface(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D3, IDirect3D7, iface),
263                                      riid,
264                                      obp);
265 }
266
267 HRESULT WINAPI
268 Thunk_IDirect3DImpl_2_QueryInterface(LPDIRECT3D2 iface,
269                                      REFIID riid,
270                                      LPVOID* obp)
271 {
272     TRACE("(%p)->(%s,%p) thunking to IDirect3D7 interface.\n", iface, debugstr_guid(riid), obp);
273     return IDirect3D7_QueryInterface(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D7, iface),
274                                      riid,
275                                      obp);
276 }
277
278 HRESULT WINAPI
279 Thunk_IDirect3DImpl_1_QueryInterface(LPDIRECT3D iface,
280                                      REFIID riid,
281                                      LPVOID* obp)
282 {
283     TRACE("(%p)->(%s,%p) thunking to IDirect3D7 interface.\n", iface, debugstr_guid(riid), obp);
284     return IDirect3D7_QueryInterface(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D7, iface),
285                                      riid,
286                                      obp);
287 }
288
289 ULONG WINAPI
290 Thunk_IDirect3DImpl_3_AddRef(LPDIRECT3D3 iface)
291 {
292     TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface);
293     return IDirect3D7_AddRef(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D3, IDirect3D7, iface));
294 }
295
296 ULONG WINAPI
297 Thunk_IDirect3DImpl_2_AddRef(LPDIRECT3D2 iface)
298 {
299     TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface);
300     return IDirect3D7_AddRef(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D7, iface));
301 }
302
303 ULONG WINAPI
304 Thunk_IDirect3DImpl_1_AddRef(LPDIRECT3D iface)
305 {
306     TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface);
307     return IDirect3D7_AddRef(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D7, iface));
308 }
309
310 ULONG WINAPI
311 Thunk_IDirect3DImpl_3_Release(LPDIRECT3D3 iface)
312 {
313     TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface);
314     return IDirect3D7_Release(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D3, IDirect3D7, iface));
315 }
316
317 ULONG WINAPI
318 Thunk_IDirect3DImpl_2_Release(LPDIRECT3D2 iface)
319 {
320     TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface);
321     return IDirect3D7_Release(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D7, iface));
322 }
323
324 ULONG WINAPI
325 Thunk_IDirect3DImpl_1_Release(LPDIRECT3D iface)
326 {
327     TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface);
328     return IDirect3D7_Release(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D7, iface));
329 }
330
331 HRESULT WINAPI
332 Thunk_IDirect3DImpl_3_EnumZBufferFormats(LPDIRECT3D3 iface,
333                                          REFCLSID riidDevice,
334                                          LPD3DENUMPIXELFORMATSCALLBACK lpEnumCallback,
335                                          LPVOID lpContext)
336 {
337     TRACE("(%p)->(%s,%p,%p) thunking to IDirect3D7 interface.\n", iface, debugstr_guid(riidDevice), lpEnumCallback, lpContext);
338     return IDirect3D7_EnumZBufferFormats(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D3, IDirect3D7, iface),
339                                          riidDevice,
340                                          lpEnumCallback,
341                                          lpContext);
342 }
343
344 HRESULT WINAPI
345 Thunk_IDirect3DImpl_3_EvictManagedTextures(LPDIRECT3D3 iface)
346 {
347     TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface);
348     return IDirect3D7_EvictManagedTextures(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D3, IDirect3D7, iface));
349 }
350
351 HRESULT WINAPI
352 Thunk_IDirect3DImpl_2_EnumDevices(LPDIRECT3D2 iface,
353                                   LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback,
354                                   LPVOID lpUserArg)
355 {
356     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lpEnumDevicesCallback, lpUserArg);
357     return IDirect3D3_EnumDevices(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D3, iface),
358                                   lpEnumDevicesCallback,
359                                   lpUserArg);
360 }
361
362 HRESULT WINAPI
363 Thunk_IDirect3DImpl_1_EnumDevices(LPDIRECT3D iface,
364                                   LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback,
365                                   LPVOID lpUserArg)
366 {
367     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lpEnumDevicesCallback, lpUserArg);
368     return IDirect3D3_EnumDevices(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D3, iface),
369                                   lpEnumDevicesCallback,
370                                   lpUserArg);
371 }
372
373 HRESULT WINAPI
374 Thunk_IDirect3DImpl_2_CreateLight(LPDIRECT3D2 iface,
375                                   LPDIRECT3DLIGHT* lplpDirect3DLight,
376                                   IUnknown* pUnkOuter)
377 {
378     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lplpDirect3DLight, pUnkOuter);
379     return IDirect3D3_CreateLight(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D3, iface),
380                                   lplpDirect3DLight,
381                                   pUnkOuter);
382 }
383
384 HRESULT WINAPI
385 Thunk_IDirect3DImpl_1_CreateLight(LPDIRECT3D iface,
386                                   LPDIRECT3DLIGHT* lplpDirect3DLight,
387                                   IUnknown* pUnkOuter)
388 {
389     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lplpDirect3DLight, pUnkOuter);
390     return IDirect3D3_CreateLight(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D3, iface),
391                                   lplpDirect3DLight,
392                                   pUnkOuter);
393 }
394
395 HRESULT WINAPI
396 Thunk_IDirect3DImpl_1_CreateMaterial(LPDIRECT3D iface,
397                                      LPDIRECT3DMATERIAL* lplpDirect3DMaterial,
398                                      IUnknown* pUnkOuter)
399 {
400     HRESULT ret;
401     LPDIRECT3DMATERIAL3 ret_val;
402
403     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lplpDirect3DMaterial, pUnkOuter);
404     ret = IDirect3D3_CreateMaterial(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D3, iface),
405                                     &ret_val,
406                                     pUnkOuter);
407
408     *lplpDirect3DMaterial = COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial3, IDirect3DMaterial, ret_val);
409
410     TRACE(" returning interface %p.\n", *lplpDirect3DMaterial);
411     
412     return ret;
413 }
414
415 HRESULT WINAPI
416 Thunk_IDirect3DImpl_1_CreateViewport(LPDIRECT3D iface,
417                                      LPDIRECT3DVIEWPORT* lplpD3DViewport,
418                                      IUnknown* pUnkOuter)
419 {
420     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lplpD3DViewport, pUnkOuter);
421     return IDirect3D3_CreateViewport(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D3, iface),
422                                     (LPDIRECT3DVIEWPORT3 *) lplpD3DViewport /* No need to cast here */,
423                                     pUnkOuter);
424 }
425
426 HRESULT WINAPI
427 Thunk_IDirect3DImpl_2_CreateMaterial(LPDIRECT3D2 iface,
428                                      LPDIRECT3DMATERIAL2* lplpDirect3DMaterial2,
429                                      IUnknown* pUnkOuter)
430 {
431     HRESULT ret;
432     LPDIRECT3DMATERIAL3 ret_val;
433
434     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lplpDirect3DMaterial2, pUnkOuter);
435     ret = IDirect3D3_CreateMaterial(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D3, iface),
436                                     &ret_val,
437                                     pUnkOuter);
438
439     *lplpDirect3DMaterial2 = COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial3, IDirect3DMaterial2, ret_val);
440
441     TRACE(" returning interface %p.\n", *lplpDirect3DMaterial2);
442     
443     return ret;
444 }
445
446 HRESULT WINAPI
447 Thunk_IDirect3DImpl_2_CreateViewport(LPDIRECT3D2 iface,
448                                      LPDIRECT3DVIEWPORT* lplpD3DViewport2,
449                                      IUnknown* pUnkOuter)
450 {
451     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lplpD3DViewport2, pUnkOuter);
452     return IDirect3D3_CreateViewport(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D3, iface),
453                                      (LPDIRECT3DVIEWPORT3 *) lplpD3DViewport2 /* No need to cast here */,
454                                      pUnkOuter);
455 }
456
457
458 HRESULT WINAPI
459 Thunk_IDirect3DImpl_3_CreateVertexBuffer(LPDIRECT3D3 iface,
460                                          LPD3DVERTEXBUFFERDESC lpD3DVertBufDesc,
461                                          LPDIRECT3DVERTEXBUFFER* lplpD3DVertBuf,
462                                          DWORD dwFlags,
463                                          LPUNKNOWN lpUnk)
464 {
465     HRESULT ret;
466     LPDIRECT3DVERTEXBUFFER7 ret_val;
467
468     TRACE("(%p)->(%p,%p,%08lx,%p) thunking to IDirect3D7 interface.\n", iface, lpD3DVertBufDesc, lplpD3DVertBuf, dwFlags, lpUnk);
469     
470     /* dwFlags is not used in the D3D7 interface, use the vertex buffer description instead */
471     if (dwFlags & D3DDP_DONOTCLIP) lpD3DVertBufDesc->dwCaps |= D3DVBCAPS_DONOTCLIP;
472
473     ret = IDirect3D7_CreateVertexBuffer(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D3, IDirect3D7, iface),
474                                         lpD3DVertBufDesc,
475                                         &ret_val,
476                                         dwFlags);
477
478     *lplpD3DVertBuf = COM_INTERFACE_CAST(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7, IDirect3DVertexBuffer, ret_val);
479
480     TRACE(" returning interface %p.\n", *lplpD3DVertBuf);
481     
482     return ret;
483 }
484
485 HRESULT WINAPI
486 Thunk_IDirect3DImpl_1_FindDevice(LPDIRECT3D iface,
487                                  LPD3DFINDDEVICESEARCH lpD3DDFS,
488                                  LPD3DFINDDEVICERESULT lplpD3DDevice)
489 {
490     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lpD3DDFS, lplpD3DDevice);
491     return IDirect3D3_FindDevice(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D3, iface),
492                                  lpD3DDFS,
493                                  lplpD3DDevice);
494 }
495
496 HRESULT WINAPI
497 Thunk_IDirect3DImpl_2_FindDevice(LPDIRECT3D2 iface,
498                                  LPD3DFINDDEVICESEARCH lpD3DDFS,
499                                  LPD3DFINDDEVICERESULT lpD3DFDR)
500 {
501     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lpD3DDFS, lpD3DFDR);
502     return IDirect3D3_FindDevice(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D3, iface),
503                                  lpD3DDFS,
504                                  lpD3DFDR);
505 }