Some clean-ups after the DrawPrimitive rewrite.
[wine] / dlls / ddraw / d3ddevice / main.c
1 /* Direct3D Device
2  * Copyright (c) 1998 Lionel ULMER
3  *
4  * This file contains all the common stuff for D3D devices.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #include "config.h"
22
23 #include <string.h>
24
25 #include "windef.h"
26 #include "winerror.h"
27 #include "objbase.h"
28 #include "ddraw.h"
29 #include "d3d.h"
30 #include "wine/debug.h"
31
32 #include "d3d_private.h"
33 #include "main.h"
34
35 WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
36
37 HRESULT WINAPI
38 Main_IDirect3DDeviceImpl_7_3T_2T_1T_QueryInterface(LPDIRECT3DDEVICE7 iface,
39                                                    REFIID riid,
40                                                    LPVOID* obp)
41 {
42     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
43     TRACE("(%p/%p)->(%s,%p)\n", This, iface, debugstr_guid(riid), obp);
44
45     *obp = NULL;
46
47     if ( IsEqualGUID( &IID_IUnknown,  riid ) ) {
48         IDirect3DDevice7_AddRef(ICOM_INTERFACE(This, IDirect3DDevice7));
49         *obp = iface;
50         TRACE("  Creating IUnknown interface at %p.\n", *obp);
51         return S_OK;
52     }
53     if ( IsEqualGUID( &IID_IDirect3DDevice, riid ) ) {
54         IDirect3DDevice7_AddRef(ICOM_INTERFACE(This, IDirect3DDevice7));
55         *obp = ICOM_INTERFACE(This, IDirect3DDevice);
56         TRACE("  Creating IDirect3DDevice interface %p\n", *obp);
57         return S_OK;
58     }
59     if ( IsEqualGUID( &IID_IDirect3DDevice2, riid ) ) {
60         IDirect3DDevice7_AddRef(ICOM_INTERFACE(This, IDirect3DDevice7));
61         *obp = ICOM_INTERFACE(This, IDirect3DDevice2);
62         TRACE("  Creating IDirect3DDevice2 interface %p\n", *obp);
63         return S_OK;
64     }
65     if ( IsEqualGUID( &IID_IDirect3DDevice3, riid ) ) {
66         IDirect3DDevice7_AddRef(ICOM_INTERFACE(This, IDirect3DDevice7));
67         *obp = ICOM_INTERFACE(This, IDirect3DDevice3);
68         TRACE("  Creating IDirect3DDevice3 interface %p\n", *obp);
69         return S_OK;
70     }
71     if ( IsEqualGUID( &IID_IDirect3DDevice7, riid ) ) {
72         IDirect3DDevice7_AddRef(ICOM_INTERFACE(This, IDirect3DDevice7));
73         *obp = ICOM_INTERFACE(This, IDirect3DDevice7);
74         TRACE("  Creating IDirect3DDevice7 interface %p\n", *obp);
75         return S_OK;
76     }
77     FIXME("(%p): interface for IID %s NOT found!\n", This, debugstr_guid(riid));
78     return OLE_E_ENUM_NOMORE;
79 }
80
81 ULONG WINAPI
82 Main_IDirect3DDeviceImpl_7_3T_2T_1T_AddRef(LPDIRECT3DDEVICE7 iface)
83 {
84     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
85     TRACE("(%p/%p)->() incrementing from %lu.\n", This, iface, This->ref);
86     return ++(This->ref);
87 }
88
89 ULONG WINAPI
90 Main_IDirect3DDeviceImpl_7_3T_2T_1T_Release(LPDIRECT3DDEVICE7 iface)
91 {
92     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
93     TRACE("(%p/%p)->() decrementing from %lu.\n", This, iface, This->ref);
94     if (!--(This->ref)) {
95         int i;
96         /* Release texture associated with the device */
97         for (i = 0; i < MAX_TEXTURES; i++) {
98             if (This->current_texture[i] != NULL)
99                 IDirect3DTexture2_Release(ICOM_INTERFACE(This->current_texture[i], IDirect3DTexture2));
100         }
101                   
102         HeapFree(GetProcessHeap(), 0, This);
103         return 0;
104     }
105     return This->ref;
106 }
107
108 HRESULT WINAPI
109 Main_IDirect3DDeviceImpl_7_GetCaps(LPDIRECT3DDEVICE7 iface,
110                                    LPD3DDEVICEDESC7 lpD3DHELDevDesc)
111 {
112     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
113     FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpD3DHELDevDesc);
114     return DD_OK;
115 }
116
117 HRESULT WINAPI
118 Main_IDirect3DDeviceImpl_7_3T_EnumTextureFormats(LPDIRECT3DDEVICE7 iface,
119                                                  LPD3DENUMPIXELFORMATSCALLBACK lpD3DEnumPixelProc,
120                                                  LPVOID lpArg)
121 {
122     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
123     FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpD3DEnumPixelProc, lpArg);
124     return DD_OK;
125 }
126
127 HRESULT WINAPI
128 Main_IDirect3DDeviceImpl_7_3T_2T_1T_BeginScene(LPDIRECT3DDEVICE7 iface)
129 {
130     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
131     TRACE("(%p/%p)->()\n", This, iface);
132     /* Nothing to do */
133     return DD_OK;
134 }
135
136 HRESULT WINAPI
137 Main_IDirect3DDeviceImpl_7_3T_2T_1T_EndScene(LPDIRECT3DDEVICE7 iface)
138 {
139     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
140     TRACE("(%p/%p)->()\n", This, iface);
141     /* Nothing to do */
142     return DD_OK;
143 }
144
145 HRESULT WINAPI
146 Main_IDirect3DDeviceImpl_7_3T_2T_1T_GetDirect3D(LPDIRECT3DDEVICE7 iface,
147                                                 LPDIRECT3D7* lplpDirect3D3)
148 {
149     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
150     TRACE("(%p/%p)->(%p)\n", This, iface, lplpDirect3D3);
151
152     *lplpDirect3D3 = ICOM_INTERFACE(This->d3d, IDirect3D7);
153     IDirect3D7_AddRef(ICOM_INTERFACE(This->d3d, IDirect3D7));
154     
155     TRACE(" returning interface %p\n", *lplpDirect3D3);
156     return DD_OK;
157 }
158
159 HRESULT WINAPI
160 Main_IDirect3DDeviceImpl_7_3T_2T_SetRenderTarget(LPDIRECT3DDEVICE7 iface,
161                                                  LPDIRECTDRAWSURFACE7 lpNewRenderTarget,
162                                                  DWORD dwFlags)
163 {
164     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
165     FIXME("(%p/%p)->(%p,%08lx): stub!\n", This, iface, lpNewRenderTarget, dwFlags);
166     return DD_OK;
167 }
168
169 HRESULT WINAPI
170 Main_IDirect3DDeviceImpl_7_3T_2T_GetRenderTarget(LPDIRECT3DDEVICE7 iface,
171                                                  LPDIRECTDRAWSURFACE7* lplpRenderTarget)
172 {
173     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
174     TRACE("(%p/%p)->(%p)\n", This, iface, lplpRenderTarget);
175
176     *lplpRenderTarget = ICOM_INTERFACE(This->surface, IDirectDrawSurface7);
177     IDirectDrawSurface7_AddRef(ICOM_INTERFACE(This->surface, IDirectDrawSurface7));
178     
179     TRACE(" returning surface at %p.\n", *lplpRenderTarget);
180     
181     return DD_OK;
182 }
183
184 HRESULT WINAPI
185 Main_IDirect3DDeviceImpl_7_Clear(LPDIRECT3DDEVICE7 iface,
186                                  DWORD dwCount,
187                                  LPD3DRECT lpRects,
188                                  DWORD dwFlags,
189                                  D3DCOLOR dwColor,
190                                  D3DVALUE dvZ,
191                                  DWORD dwStencil)
192 {
193     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
194     TRACE("(%p/%p)->(%08lx,%p,%08lx,%08lx,%f,%08lx)\n", This, iface, dwCount, lpRects, dwFlags, (DWORD) dwColor, dvZ, dwStencil);
195     return This->clear(This, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil);
196 }
197
198 HRESULT WINAPI
199 Main_IDirect3DDeviceImpl_7_3T_2T_SetTransform(LPDIRECT3DDEVICE7 iface,
200                                               D3DTRANSFORMSTATETYPE dtstTransformStateType,
201                                               LPD3DMATRIX lpD3DMatrix)
202 {
203     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
204     FIXME("(%p/%p)->(%08x,%p): stub!\n", This, iface, dtstTransformStateType, lpD3DMatrix);
205     return DD_OK;
206 }
207
208 HRESULT WINAPI
209 Main_IDirect3DDeviceImpl_7_3T_2T_GetTransform(LPDIRECT3DDEVICE7 iface,
210                                               D3DTRANSFORMSTATETYPE dtstTransformStateType,
211                                               LPD3DMATRIX lpD3DMatrix)
212 {
213     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
214     FIXME("(%p/%p)->(%08x,%p): stub!\n", This, iface, dtstTransformStateType, lpD3DMatrix);
215     return DD_OK;
216 }
217
218 HRESULT WINAPI
219 Main_IDirect3DDeviceImpl_7_SetViewport(LPDIRECT3DDEVICE7 iface,
220                                        LPD3DVIEWPORT7 lpData)
221 {
222     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
223     TRACE("(%p/%p)->(%p)\n", This, iface, lpData);
224
225     if (TRACE_ON(ddraw)) {
226         TRACE(" viewport is : \n");
227         TRACE("    - dwX = %ld   dwY = %ld\n",
228               lpData->dwX, lpData->dwY);
229         TRACE("    - dwWidth = %ld   dwHeight = %ld\n",
230               lpData->dwWidth, lpData->dwHeight);
231         TRACE("    - dvMinZ = %f   dvMaxZ = %f\n",
232               lpData->dvMinZ, lpData->dvMaxZ);
233     }
234     This->active_viewport = *lpData;
235
236     return DD_OK;
237 }
238
239 HRESULT WINAPI
240 Main_IDirect3DDeviceImpl_7_3T_2T_MultiplyTransform(LPDIRECT3DDEVICE7 iface,
241                                                    D3DTRANSFORMSTATETYPE dtstTransformStateType,
242                                                    LPD3DMATRIX lpD3DMatrix)
243 {
244     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
245     FIXME("(%p/%p)->(%08x,%p): stub!\n", This, iface, dtstTransformStateType, lpD3DMatrix);
246     return DD_OK;
247 }
248
249 HRESULT WINAPI
250 Main_IDirect3DDeviceImpl_7_GetViewport(LPDIRECT3DDEVICE7 iface,
251                                        LPD3DVIEWPORT7 lpData)
252 {
253     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
254     TRACE("(%p/%p)->(%p)\n", This, iface, lpData);
255
256     *lpData = This->active_viewport;
257
258     if (TRACE_ON(ddraw)) {
259         TRACE(" returning viewport : \n");
260         TRACE("    - dwX = %ld   dwY = %ld\n",
261               lpData->dwX, lpData->dwY);
262         TRACE("    - dwWidth = %ld   dwHeight = %ld\n",
263               lpData->dwWidth, lpData->dwHeight);
264         TRACE("    - dvMinZ = %f   dvMaxZ = %f\n",
265               lpData->dvMinZ, lpData->dvMaxZ);
266     }
267
268     return DD_OK;
269 }
270
271 HRESULT WINAPI
272 Main_IDirect3DDeviceImpl_7_SetMaterial(LPDIRECT3DDEVICE7 iface,
273                                        LPD3DMATERIAL7 lpMat)
274 {
275     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
276     FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpMat);
277     return DD_OK;
278 }
279
280 HRESULT WINAPI
281 Main_IDirect3DDeviceImpl_7_GetMaterial(LPDIRECT3DDEVICE7 iface,
282                                        LPD3DMATERIAL7 lpMat)
283 {
284     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
285     FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpMat);
286     return DD_OK;
287 }
288
289 HRESULT WINAPI
290 Main_IDirect3DDeviceImpl_7_SetLight(LPDIRECT3DDEVICE7 iface,
291                                     DWORD dwLightIndex,
292                                     LPD3DLIGHT7 lpLight)
293 {
294     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
295     FIXME("(%p/%p)->(%08lx,%p): stub!\n", This, iface, dwLightIndex, lpLight);
296     return DD_OK;
297 }
298
299 HRESULT WINAPI
300 Main_IDirect3DDeviceImpl_7_GetLight(LPDIRECT3DDEVICE7 iface,
301                                     DWORD dwLightIndex,
302                                     LPD3DLIGHT7 lpLight)
303 {
304     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
305     FIXME("(%p/%p)->(%08lx,%p): stub!\n", This, iface, dwLightIndex, lpLight);
306     return DD_OK;
307 }
308
309 HRESULT WINAPI
310 Main_IDirect3DDeviceImpl_7_3T_2T_SetRenderState(LPDIRECT3DDEVICE7 iface,
311                                                 D3DRENDERSTATETYPE dwRenderStateType,
312                                                 DWORD dwRenderState)
313 {
314     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
315     FIXME("(%p/%p)->(%08x,%08lx): stub!\n", This, iface, dwRenderStateType, dwRenderState);
316     return DD_OK;
317 }
318
319 HRESULT WINAPI
320 Main_IDirect3DDeviceImpl_7_3T_2T_GetRenderState(LPDIRECT3DDEVICE7 iface,
321                                                 D3DRENDERSTATETYPE dwRenderStateType,
322                                                 LPDWORD lpdwRenderState)
323 {
324     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
325     FIXME("(%p/%p)->(%08x,%p): stub!\n", This, iface, dwRenderStateType, lpdwRenderState);
326     return DD_OK;
327 }
328
329 HRESULT WINAPI
330 Main_IDirect3DDeviceImpl_7_BeginStateBlock(LPDIRECT3DDEVICE7 iface)
331 {
332     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
333     FIXME("(%p/%p)->(): stub!\n", This, iface);
334     return DD_OK;
335 }
336
337 HRESULT WINAPI
338 Main_IDirect3DDeviceImpl_7_EndStateBlock(LPDIRECT3DDEVICE7 iface,
339                                          LPDWORD lpdwBlockHandle)
340 {
341     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
342     FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpdwBlockHandle);
343     return DD_OK;
344 }
345
346 HRESULT WINAPI
347 Main_IDirect3DDeviceImpl_7_PreLoad(LPDIRECT3DDEVICE7 iface,
348                                    LPDIRECTDRAWSURFACE7 lpddsTexture)
349 {
350     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
351     FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpddsTexture);
352     return DD_OK;
353 }
354
355 HRESULT WINAPI
356 Main_IDirect3DDeviceImpl_7_3T_DrawPrimitive(LPDIRECT3DDEVICE7 iface,
357                                             D3DPRIMITIVETYPE d3dptPrimitiveType,
358                                             DWORD d3dvtVertexType,
359                                             LPVOID lpvVertices,
360                                             DWORD dwVertexCount,
361                                             DWORD dwFlags)
362 {
363     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
364     FIXME("(%p/%p)->(%08x,%08lx,%p,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwVertexCount, dwFlags);
365     return DD_OK;
366 }
367
368 HRESULT WINAPI
369 Main_IDirect3DDeviceImpl_7_3T_DrawIndexedPrimitive(LPDIRECT3DDEVICE7 iface,
370                                                    D3DPRIMITIVETYPE d3dptPrimitiveType,
371                                                    DWORD d3dvtVertexType,
372                                                    LPVOID lpvVertices,
373                                                    DWORD dwVertexCount,
374                                                    LPWORD dwIndices,
375                                                    DWORD dwIndexCount,
376                                                    DWORD dwFlags)
377 {
378     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
379     FIXME("(%p/%p)->(%08x,%08lx,%p,%08lx,%p,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwVertexCount, dwIndices, dwIndexCount, dwFlags);
380     return DD_OK;
381 }
382
383 HRESULT WINAPI
384 Main_IDirect3DDeviceImpl_7_3T_2T_SetClipStatus(LPDIRECT3DDEVICE7 iface,
385                                                LPD3DCLIPSTATUS lpD3DClipStatus)
386 {
387     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
388     FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpD3DClipStatus);
389     return DD_OK;
390 }
391
392 HRESULT WINAPI
393 Main_IDirect3DDeviceImpl_7_3T_2T_GetClipStatus(LPDIRECT3DDEVICE7 iface,
394                                                LPD3DCLIPSTATUS lpD3DClipStatus)
395 {
396     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
397     FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpD3DClipStatus);
398     return DD_OK;
399 }
400
401 HRESULT WINAPI
402 Main_IDirect3DDeviceImpl_7_3T_DrawPrimitiveStrided(LPDIRECT3DDEVICE7 iface,
403                                                    D3DPRIMITIVETYPE d3dptPrimitiveType,
404                                                    DWORD dwVertexType,
405                                                    LPD3DDRAWPRIMITIVESTRIDEDDATA lpD3DDrawPrimStrideData,
406                                                    DWORD dwVertexCount,
407                                                    DWORD dwFlags)
408 {
409     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
410     FIXME("(%p/%p)->(%08x,%08lx,%p,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, dwVertexType, lpD3DDrawPrimStrideData, dwVertexCount, dwFlags);
411     return DD_OK;
412 }
413
414 HRESULT WINAPI
415 Main_IDirect3DDeviceImpl_7_3T_DrawIndexedPrimitiveStrided(LPDIRECT3DDEVICE7 iface,
416                                                           D3DPRIMITIVETYPE d3dptPrimitiveType,
417                                                           DWORD dwVertexType,
418                                                           LPD3DDRAWPRIMITIVESTRIDEDDATA lpD3DDrawPrimStrideData,
419                                                           DWORD dwVertexCount,
420                                                           LPWORD lpIndex,
421                                                           DWORD dwIndexCount,
422                                                           DWORD dwFlags)
423 {
424     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
425     FIXME("(%p/%p)->(%08x,%08lx,%p,%08lx,%p,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, dwVertexType, lpD3DDrawPrimStrideData, dwVertexCount, lpIndex, dwIndexCount, dwFlags);
426     return DD_OK;
427 }
428
429 HRESULT WINAPI
430 Main_IDirect3DDeviceImpl_7_DrawPrimitiveVB(LPDIRECT3DDEVICE7 iface,
431                                            D3DPRIMITIVETYPE d3dptPrimitiveType,
432                                            LPDIRECT3DVERTEXBUFFER7 lpD3DVertexBuf,
433                                            DWORD dwStartVertex,
434                                            DWORD dwNumVertices,
435                                            DWORD dwFlags)
436 {
437     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
438     FIXME("(%p/%p)->(%08x,%p,%08lx,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, lpD3DVertexBuf, dwStartVertex, dwNumVertices, dwFlags);
439     return DD_OK;
440 }
441
442 HRESULT WINAPI
443 Main_IDirect3DDeviceImpl_7_DrawIndexedPrimitiveVB(LPDIRECT3DDEVICE7 iface,
444                                                   D3DPRIMITIVETYPE d3dptPrimitiveType,
445                                                   LPDIRECT3DVERTEXBUFFER7 lpD3DVertexBuf,
446                                                   DWORD dwStartVertex,
447                                                   DWORD dwNumVertices,
448                                                   LPWORD lpwIndices,
449                                                   DWORD dwIndexCount,
450                                                   DWORD dwFlags)
451 {
452     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
453     FIXME("(%p/%p)->(%08x,%p,%08lx,%08lx,%p,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, lpD3DVertexBuf, dwStartVertex, dwNumVertices, lpwIndices, dwIndexCount, dwFlags);
454     return DD_OK;
455 }
456
457 HRESULT WINAPI
458 Main_IDirect3DDeviceImpl_7_3T_ComputeSphereVisibility(LPDIRECT3DDEVICE7 iface,
459                                                       LPD3DVECTOR lpCenters,
460                                                       LPD3DVALUE lpRadii,
461                                                       DWORD dwNumSpheres,
462                                                       DWORD dwFlags,
463                                                       LPDWORD lpdwReturnValues)
464 {
465     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
466     FIXME("(%p/%p)->(%p,%p,%08lx,%08lx,%p): stub!\n", This, iface, lpCenters, lpRadii, dwNumSpheres, dwFlags, lpdwReturnValues);
467     return DD_OK;
468 }
469
470 HRESULT WINAPI
471 Main_IDirect3DDeviceImpl_7_GetTexture(LPDIRECT3DDEVICE7 iface,
472                                       DWORD dwStage,
473                                       LPDIRECTDRAWSURFACE7* lpTexture)
474 {
475     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
476     FIXME("(%p/%p)->(%08lx,%p): stub!\n", This, iface, dwStage, lpTexture);
477     return DD_OK;
478 }
479
480 HRESULT WINAPI
481 Main_IDirect3DDeviceImpl_7_3T_SetTexture(LPDIRECT3DDEVICE7 iface,
482                                          DWORD dwStage,
483                                          LPDIRECTDRAWSURFACE7 lpTexture)
484 {
485     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
486     FIXME("(%p/%p)->(%08lx,%p): stub!\n", This, iface, dwStage, lpTexture);
487     return DD_OK;
488 }
489
490 HRESULT WINAPI
491 Main_IDirect3DDeviceImpl_7_3T_GetTextureStageState(LPDIRECT3DDEVICE7 iface,
492                                                    DWORD dwStage,
493                                                    D3DTEXTURESTAGESTATETYPE d3dTexStageStateType,
494                                                    LPDWORD lpdwState)
495 {
496     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
497     FIXME("(%p/%p)->(%08lx,%08x,%p): stub!\n", This, iface, dwStage, d3dTexStageStateType, lpdwState);
498     return DD_OK;
499 }
500
501 HRESULT WINAPI
502 Main_IDirect3DDeviceImpl_7_3T_SetTextureStageState(LPDIRECT3DDEVICE7 iface,
503                                                    DWORD dwStage,
504                                                    D3DTEXTURESTAGESTATETYPE d3dTexStageStateType,
505                                                    DWORD dwState)
506 {
507     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
508     FIXME("(%p/%p)->(%08lx,%08x,%08lx): stub!\n", This, iface, dwStage, d3dTexStageStateType, dwState);
509     return DD_OK;
510 }
511
512 HRESULT WINAPI
513 Main_IDirect3DDeviceImpl_7_3T_ValidateDevice(LPDIRECT3DDEVICE7 iface,
514                                              LPDWORD lpdwPasses)
515 {
516     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
517     FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpdwPasses);
518     return DD_OK;
519 }
520
521 HRESULT WINAPI
522 Main_IDirect3DDeviceImpl_7_ApplyStateBlock(LPDIRECT3DDEVICE7 iface,
523                                            DWORD dwBlockHandle)
524 {
525     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
526     FIXME("(%p/%p)->(%08lx): stub!\n", This, iface, dwBlockHandle);
527     return DD_OK;
528 }
529
530 HRESULT WINAPI
531 Main_IDirect3DDeviceImpl_7_CaptureStateBlock(LPDIRECT3DDEVICE7 iface,
532                                              DWORD dwBlockHandle)
533 {
534     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
535     FIXME("(%p/%p)->(%08lx): stub!\n", This, iface, dwBlockHandle);
536     return DD_OK;
537 }
538
539 HRESULT WINAPI
540 Main_IDirect3DDeviceImpl_7_DeleteStateBlock(LPDIRECT3DDEVICE7 iface,
541                                             DWORD dwBlockHandle)
542 {
543     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
544     FIXME("(%p/%p)->(%08lx): stub!\n", This, iface, dwBlockHandle);
545     return DD_OK;
546 }
547
548 HRESULT WINAPI
549 Main_IDirect3DDeviceImpl_7_CreateStateBlock(LPDIRECT3DDEVICE7 iface,
550                                             D3DSTATEBLOCKTYPE d3dsbType,
551                                             LPDWORD lpdwBlockHandle)
552 {
553     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
554     FIXME("(%p/%p)->(%08x,%p): stub!\n", This, iface, d3dsbType, lpdwBlockHandle);
555     return DD_OK;
556 }
557
558 HRESULT WINAPI
559 Main_IDirect3DDeviceImpl_7_Load(LPDIRECT3DDEVICE7 iface,
560                                 LPDIRECTDRAWSURFACE7 lpDestTex,
561                                 LPPOINT lpDestPoint,
562                                 LPDIRECTDRAWSURFACE7 lpSrcTex,
563                                 LPRECT lprcSrcRect,
564                                 DWORD dwFlags)
565 {
566     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
567     FIXME("(%p/%p)->(%p,%p,%p,%p,%08lx): stub!\n", This, iface, lpDestTex, lpDestPoint, lpSrcTex, lprcSrcRect, dwFlags);
568     return DD_OK;
569 }
570
571 HRESULT WINAPI
572 Main_IDirect3DDeviceImpl_7_LightEnable(LPDIRECT3DDEVICE7 iface,
573                                        DWORD dwLightIndex,
574                                        BOOL bEnable)
575 {
576     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
577     FIXME("(%p/%p)->(%08lx,%d): stub!\n", This, iface, dwLightIndex, bEnable);
578     return DD_OK;
579 }
580
581 HRESULT WINAPI
582 Main_IDirect3DDeviceImpl_7_GetLightEnable(LPDIRECT3DDEVICE7 iface,
583                                           DWORD dwLightIndex,
584                                           BOOL* pbEnable)
585 {
586     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
587     FIXME("(%p/%p)->(%08lx,%p): stub!\n", This, iface, dwLightIndex, pbEnable);
588     return DD_OK;
589 }
590
591 HRESULT WINAPI
592 Main_IDirect3DDeviceImpl_7_SetClipPlane(LPDIRECT3DDEVICE7 iface,
593                                         DWORD dwIndex,
594                                         D3DVALUE* pPlaneEquation)
595 {
596     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
597     FIXME("(%p/%p)->(%08lx,%p): stub!\n", This, iface, dwIndex, pPlaneEquation);
598     return DD_OK;
599 }
600
601 HRESULT WINAPI
602 Main_IDirect3DDeviceImpl_7_GetClipPlane(LPDIRECT3DDEVICE7 iface,
603                                         DWORD dwIndex,
604                                         D3DVALUE* pPlaneEquation)
605 {
606     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
607     FIXME("(%p/%p)->(%08lx,%p): stub!\n", This, iface, dwIndex, pPlaneEquation);
608     return DD_OK;
609 }
610
611 HRESULT WINAPI
612 Main_IDirect3DDeviceImpl_7_GetInfo(LPDIRECT3DDEVICE7 iface,
613                                    DWORD dwDevInfoID,
614                                    LPVOID pDevInfoStruct,
615                                    DWORD dwSize)
616 {
617     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
618     FIXME("(%p/%p)->(%08lx,%p,%08lx): stub!\n", This, iface, dwDevInfoID, pDevInfoStruct, dwSize);
619     return DD_OK;
620 }
621
622 HRESULT WINAPI
623 Main_IDirect3DDeviceImpl_3_2T_1T_GetCaps(LPDIRECT3DDEVICE3 iface,
624                                          LPD3DDEVICEDESC lpD3DHWDevDesc,
625                                          LPD3DDEVICEDESC lpD3DHELDevDesc)
626 {
627     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
628     FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpD3DHWDevDesc, lpD3DHELDevDesc);
629     return DD_OK;
630 }
631
632 HRESULT WINAPI
633 Main_IDirect3DDeviceImpl_3_2T_1T_GetStats(LPDIRECT3DDEVICE3 iface,
634                                           LPD3DSTATS lpD3DStats)
635 {
636     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
637     FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpD3DStats);
638     return DD_OK;
639 }
640
641 HRESULT WINAPI
642 Main_IDirect3DDeviceImpl_3_2T_1T_AddViewport(LPDIRECT3DDEVICE3 iface,
643                                              LPDIRECT3DVIEWPORT3 lpDirect3DViewport3)
644 {
645     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
646     IDirect3DViewportImpl *lpDirect3DViewportImpl = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, lpDirect3DViewport3);
647     
648     TRACE("(%p/%p)->(%p)\n", This, iface, lpDirect3DViewport3);
649
650     lpDirect3DViewportImpl->next = This->viewport_list;
651     This->viewport_list = lpDirect3DViewportImpl;
652     
653     return DD_OK;
654 }
655
656 HRESULT WINAPI
657 Main_IDirect3DDeviceImpl_3_2T_1T_DeleteViewport(LPDIRECT3DDEVICE3 iface,
658                                                 LPDIRECT3DVIEWPORT3 lpDirect3DViewport3)
659 {
660     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
661     IDirect3DViewportImpl *lpDirect3DViewportImpl = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, lpDirect3DViewport3);
662     IDirect3DViewportImpl *cur_viewport, *prev_viewport = NULL;
663   
664     TRACE("(%p/%p)->(%p)\n", This, iface, lpDirect3DViewport3);
665
666     cur_viewport = This->viewport_list;
667     while (cur_viewport != NULL) {
668         if (cur_viewport == lpDirect3DViewportImpl) {
669             if (prev_viewport == NULL) This->viewport_list = cur_viewport->next;
670             else prev_viewport->next = cur_viewport->next;
671             /* TODO : add desactivate of the viewport and all associated lights... */
672             return DD_OK;
673         }
674         prev_viewport = cur_viewport;
675         cur_viewport = cur_viewport->next;
676     }
677     
678     return DDERR_INVALIDPARAMS;
679 }
680
681 HRESULT WINAPI
682 Main_IDirect3DDeviceImpl_3_2T_1T_NextViewport(LPDIRECT3DDEVICE3 iface,
683                                               LPDIRECT3DVIEWPORT3 lpDirect3DViewport3,
684                                               LPDIRECT3DVIEWPORT3* lplpDirect3DViewport3,
685                                               DWORD dwFlags)
686 {
687     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
688     IDirect3DViewportImpl *res = NULL;
689
690     TRACE("(%p/%p)->(%p,%p,%08lx)\n", This, iface, lpDirect3DViewport3, lplpDirect3DViewport3, dwFlags);
691     
692     switch (dwFlags) {
693         case D3DNEXT_NEXT: {
694             IDirect3DViewportImpl *lpDirect3DViewportImpl = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, lpDirect3DViewport3);
695             res = lpDirect3DViewportImpl->next;
696         } break;
697         case D3DNEXT_HEAD: {
698             res = This->viewport_list;
699         } break;
700         case D3DNEXT_TAIL: {
701             IDirect3DViewportImpl *cur_viewport = This->viewport_list;
702             if (cur_viewport != NULL) {
703                 while (cur_viewport->next != NULL) cur_viewport = cur_viewport->next;
704             }
705             res = cur_viewport;
706         } break;
707         default:
708             *lplpDirect3DViewport3 = NULL;
709             return DDERR_INVALIDPARAMS;
710     }
711     *lplpDirect3DViewport3 = ICOM_INTERFACE(res, IDirect3DViewport3);
712     return DD_OK;
713 }
714
715 HRESULT WINAPI
716 Main_IDirect3DDeviceImpl_3_2T_SetCurrentViewport(LPDIRECT3DDEVICE3 iface,
717                                                  LPDIRECT3DVIEWPORT3 lpDirect3DViewport3)
718 {
719     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
720     TRACE("(%p/%p)->(%p)\n", This, iface, lpDirect3DViewport3);
721
722     /* Should check if the viewport was added or not */
723
724     /* Set this viewport as the current viewport */
725     This->current_viewport = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, lpDirect3DViewport3);
726
727     /* Activate this viewport */
728     This->current_viewport->active_device = This;
729     This->current_viewport->activate(This->current_viewport);    
730     
731     /* And copy the values in the structure used by the device */
732     if (This->current_viewport->use_vp2) {
733         This->active_viewport.dwX = This->current_viewport->viewports.vp2.dwX;
734         This->active_viewport.dwY = This->current_viewport->viewports.vp2.dwY;
735         This->active_viewport.dwHeight = This->current_viewport->viewports.vp2.dwHeight;
736         This->active_viewport.dwWidth = This->current_viewport->viewports.vp2.dwWidth;
737         This->active_viewport.dvMinZ = This->current_viewport->viewports.vp2.dvMinZ;
738         This->active_viewport.dvMaxZ = This->current_viewport->viewports.vp2.dvMaxZ;
739     } else {
740         This->active_viewport.dwX = This->current_viewport->viewports.vp1.dwX;
741         This->active_viewport.dwY = This->current_viewport->viewports.vp1.dwY;
742         This->active_viewport.dwHeight = This->current_viewport->viewports.vp1.dwHeight;
743         This->active_viewport.dwWidth = This->current_viewport->viewports.vp1.dwWidth;
744         This->active_viewport.dvMinZ = This->current_viewport->viewports.vp1.dvMinZ;
745         This->active_viewport.dvMaxZ = This->current_viewport->viewports.vp1.dvMaxZ;
746     }
747
748     return DD_OK;
749 }
750
751 HRESULT WINAPI
752 Main_IDirect3DDeviceImpl_3_2T_GetCurrentViewport(LPDIRECT3DDEVICE3 iface,
753                                                  LPDIRECT3DVIEWPORT3* lplpDirect3DViewport3)
754 {
755     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
756     TRACE("(%p/%p)->(%p)\n", This, iface, lplpDirect3DViewport3);
757
758     *lplpDirect3DViewport3 = ICOM_INTERFACE(This->current_viewport, IDirect3DViewport3);
759     TRACE(" returning interface %p\n", *lplpDirect3DViewport3);
760     
761     return DD_OK;
762 }
763
764 HRESULT WINAPI
765 Main_IDirect3DDeviceImpl_3_Begin(LPDIRECT3DDEVICE3 iface,
766                                  D3DPRIMITIVETYPE d3dptPrimitiveType,
767                                  DWORD dwVertexTypeDesc,
768                                  DWORD dwFlags)
769 {
770     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
771     FIXME("(%p/%p)->(%08x,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, dwVertexTypeDesc, dwFlags);
772     return DD_OK;
773 }
774
775 HRESULT WINAPI
776 Main_IDirect3DDeviceImpl_3_BeginIndexed(LPDIRECT3DDEVICE3 iface,
777                                         D3DPRIMITIVETYPE d3dptPrimitiveType,
778                                         DWORD d3dvtVertexType,
779                                         LPVOID lpvVertices,
780                                         DWORD dwNumVertices,
781                                         DWORD dwFlags)
782 {
783     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
784     FIXME("(%p/%p)->(%08x,%08lx,%p,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwNumVertices, dwFlags);
785     return DD_OK;
786 }
787
788 HRESULT WINAPI
789 Main_IDirect3DDeviceImpl_3_2T_Vertex(LPDIRECT3DDEVICE3 iface,
790                                      LPVOID lpVertexType)
791 {
792     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
793     FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpVertexType);
794     return DD_OK;
795 }
796
797 HRESULT WINAPI
798 Main_IDirect3DDeviceImpl_3_2T_Index(LPDIRECT3DDEVICE3 iface,
799                                     WORD wVertexIndex)
800 {
801     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
802     FIXME("(%p/%p)->(%04x): stub!\n", This, iface, wVertexIndex);
803     return DD_OK;
804 }
805
806 HRESULT WINAPI
807 Main_IDirect3DDeviceImpl_3_2T_End(LPDIRECT3DDEVICE3 iface,
808                                   DWORD dwFlags)
809 {
810     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
811     FIXME("(%p/%p)->(%08lx): stub!\n", This, iface, dwFlags);
812     return DD_OK;
813 }
814
815 HRESULT WINAPI
816 Main_IDirect3DDeviceImpl_3_2T_GetLightState(LPDIRECT3DDEVICE3 iface,
817                                             D3DLIGHTSTATETYPE dwLightStateType,
818                                             LPDWORD lpdwLightState)
819 {
820     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
821     FIXME("(%p/%p)->(%08x,%p): stub!\n", This, iface, dwLightStateType, lpdwLightState);
822     return DD_OK;
823 }
824
825 HRESULT WINAPI
826 Main_IDirect3DDeviceImpl_3_2T_SetLightState(LPDIRECT3DDEVICE3 iface,
827                                             D3DLIGHTSTATETYPE dwLightStateType,
828                                             DWORD dwLightState)
829 {
830     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
831     FIXME("(%p/%p)->(%08x,%08lx): stub!\n", This, iface, dwLightStateType, dwLightState);
832     return DD_OK;
833 }
834
835 HRESULT WINAPI
836 Main_IDirect3DDeviceImpl_3_DrawPrimitiveVB(LPDIRECT3DDEVICE3 iface,
837                                            D3DPRIMITIVETYPE d3dptPrimitiveType,
838                                            LPDIRECT3DVERTEXBUFFER lpD3DVertexBuf,
839                                            DWORD dwStartVertex,
840                                            DWORD dwNumVertices,
841                                            DWORD dwFlags)
842 {
843     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
844     FIXME("(%p/%p)->(%08x,%p,%08lx,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, lpD3DVertexBuf, dwStartVertex, dwNumVertices, dwFlags);
845     return DD_OK;
846 }
847
848 HRESULT WINAPI
849 Main_IDirect3DDeviceImpl_3_DrawIndexedPrimitiveVB(LPDIRECT3DDEVICE3 iface,
850                                                   D3DPRIMITIVETYPE d3dptPrimitiveType,
851                                                   LPDIRECT3DVERTEXBUFFER lpD3DVertexBuf,
852                                                   LPWORD lpwIndices,
853                                                   DWORD dwIndexCount,
854                                                   DWORD dwFlags)
855 {
856     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
857     FIXME("(%p/%p)->(%08x,%p,%p,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, lpD3DVertexBuf, lpwIndices, dwIndexCount, dwFlags);
858     return DD_OK;
859 }
860
861 HRESULT WINAPI
862 Main_IDirect3DDeviceImpl_3_GetTexture(LPDIRECT3DDEVICE3 iface,
863                                       DWORD dwStage,
864                                       LPDIRECT3DTEXTURE2* lplpTexture2)
865 {
866     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
867     FIXME("(%p/%p)->(%08lx,%p): stub!\n", This, iface, dwStage, lplpTexture2);
868     return DD_OK;
869 }
870
871 HRESULT WINAPI
872 Main_IDirect3DDeviceImpl_2_SwapTextureHandles(LPDIRECT3DDEVICE2 iface,
873                                               LPDIRECT3DTEXTURE2 lpD3DTex1,
874                                               LPDIRECT3DTEXTURE2 lpD3DTex2)
875 {
876     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
877     FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpD3DTex1, lpD3DTex2);
878     return DD_OK;
879 }
880
881 HRESULT WINAPI
882 Main_IDirect3DDeviceImpl_2_NextViewport(LPDIRECT3DDEVICE2 iface,
883                                         LPDIRECT3DVIEWPORT2 lpDirect3DViewport2,
884                                         LPDIRECT3DVIEWPORT2* lplpDirect3DViewport2,
885                                         DWORD dwFlags)
886 {
887     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
888     FIXME("(%p/%p)->(%p,%p,%08lx): stub!\n", This, iface, lpDirect3DViewport2, lplpDirect3DViewport2, dwFlags);
889     return DD_OK;
890 }
891
892 HRESULT WINAPI
893 Main_IDirect3DDeviceImpl_2_1T_EnumTextureFormats(LPDIRECT3DDEVICE2 iface,
894                                                  LPD3DENUMTEXTUREFORMATSCALLBACK lpD3DEnumTextureProc,
895                                                  LPVOID lpArg)
896 {
897     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
898     FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpD3DEnumTextureProc, lpArg);
899     return DD_OK;
900 }
901
902 HRESULT WINAPI
903 Main_IDirect3DDeviceImpl_2_Begin(LPDIRECT3DDEVICE2 iface,
904                                  D3DPRIMITIVETYPE d3dpt,
905                                  D3DVERTEXTYPE dwVertexTypeDesc,
906                                  DWORD dwFlags)
907 {
908     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
909     FIXME("(%p/%p)->(%08x,%08x,%08lx): stub!\n", This, iface, d3dpt, dwVertexTypeDesc, dwFlags);
910     return DD_OK;
911 }
912
913 HRESULT WINAPI
914 Main_IDirect3DDeviceImpl_2_BeginIndexed(LPDIRECT3DDEVICE2 iface,
915                                         D3DPRIMITIVETYPE d3dptPrimitiveType,
916                                         D3DVERTEXTYPE d3dvtVertexType,
917                                         LPVOID lpvVertices,
918                                         DWORD dwNumVertices,
919                                         DWORD dwFlags)
920 {
921     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
922     FIXME("(%p/%p)->(%08x,%08x,%p,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwNumVertices, dwFlags);
923     return DD_OK;
924 }
925
926 HRESULT WINAPI
927 Main_IDirect3DDeviceImpl_2_DrawPrimitive(LPDIRECT3DDEVICE2 iface,
928                                          D3DPRIMITIVETYPE d3dptPrimitiveType,
929                                          D3DVERTEXTYPE d3dvtVertexType,
930                                          LPVOID lpvVertices,
931                                          DWORD dwVertexCount,
932                                          DWORD dwFlags)
933 {
934     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
935     FIXME("(%p/%p)->(%08x,%08x,%p,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwVertexCount, dwFlags);
936     return DD_OK;
937 }
938
939 HRESULT WINAPI
940 Main_IDirect3DDeviceImpl_2_DrawIndexedPrimitive(LPDIRECT3DDEVICE2 iface,
941                                                 D3DPRIMITIVETYPE d3dptPrimitiveType,
942                                                 D3DVERTEXTYPE d3dvtVertexType,
943                                                 LPVOID lpvVertices,
944                                                 DWORD dwVertexCount,
945                                                 LPWORD dwIndices,
946                                                 DWORD dwIndexCount,
947                                                 DWORD dwFlags)
948 {
949     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
950     FIXME("(%p/%p)->(%08x,%08x,%p,%08lx,%p,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwVertexCount, dwIndices, dwIndexCount, dwFlags);
951     return DD_OK;
952 }
953
954 HRESULT WINAPI
955 Main_IDirect3DDeviceImpl_1_Initialize(LPDIRECT3DDEVICE iface,
956                                       LPDIRECT3D lpDirect3D,
957                                       LPGUID lpGUID,
958                                       LPD3DDEVICEDESC lpD3DDVDesc)
959 {
960     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
961     FIXME("(%p/%p)->(%p,%p,%p): stub!\n", This, iface, lpDirect3D, lpGUID, lpD3DDVDesc);
962     return DD_OK;
963 }
964
965 HRESULT WINAPI
966 Main_IDirect3DDeviceImpl_1_SwapTextureHandles(LPDIRECT3DDEVICE iface,
967                                               LPDIRECT3DTEXTURE lpD3Dtex1,
968                                               LPDIRECT3DTEXTURE lpD3DTex2)
969 {
970     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
971     FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpD3Dtex1, lpD3DTex2);
972     return DD_OK;
973 }
974
975 HRESULT WINAPI
976 Main_IDirect3DDeviceImpl_1_CreateExecuteBuffer(LPDIRECT3DDEVICE iface,
977                                                LPD3DEXECUTEBUFFERDESC lpDesc,
978                                                LPDIRECT3DEXECUTEBUFFER* lplpDirect3DExecuteBuffer,
979                                                IUnknown* pUnkOuter)
980 {
981     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
982     FIXME("(%p/%p)->(%p,%p,%p): stub!\n", This, iface, lpDesc, lplpDirect3DExecuteBuffer, pUnkOuter);
983     return DD_OK;
984 }
985
986 HRESULT WINAPI
987 Main_IDirect3DDeviceImpl_1_Execute(LPDIRECT3DDEVICE iface,
988                                    LPDIRECT3DEXECUTEBUFFER lpDirect3DExecuteBuffer,
989                                    LPDIRECT3DVIEWPORT lpDirect3DViewport,
990                                    DWORD dwFlags)
991 {
992     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
993     IDirect3DExecuteBufferImpl *lpDirect3DExecuteBufferImpl = ICOM_OBJECT(IDirect3DExecuteBufferImpl, IDirect3DExecuteBuffer, lpDirect3DExecuteBuffer);
994     IDirect3DViewportImpl *lpDirect3DViewportImpl = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, lpDirect3DViewport);
995     
996     TRACE("(%p/%p)->(%p,%p,%08lx)\n", This, iface, lpDirect3DExecuteBuffer, lpDirect3DViewport, dwFlags);
997
998     /* Put this as the default context */
999
1000     /* Execute... */
1001     lpDirect3DExecuteBufferImpl->execute(lpDirect3DExecuteBufferImpl, This, lpDirect3DViewportImpl);
1002
1003     return DD_OK;
1004 }
1005
1006 HRESULT WINAPI
1007 Main_IDirect3DDeviceImpl_1_NextViewport(LPDIRECT3DDEVICE iface,
1008                                         LPDIRECT3DVIEWPORT lpDirect3DViewport,
1009                                         LPDIRECT3DVIEWPORT* lplpDirect3DViewport,
1010                                         DWORD dwFlags)
1011 {
1012     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
1013     FIXME("(%p/%p)->(%p,%p,%08lx): stub!\n", This, iface, lpDirect3DViewport, lplpDirect3DViewport, dwFlags);
1014     return DD_OK;
1015 }
1016
1017 HRESULT WINAPI
1018 Main_IDirect3DDeviceImpl_1_Pick(LPDIRECT3DDEVICE iface,
1019                                 LPDIRECT3DEXECUTEBUFFER lpDirect3DExecuteBuffer,
1020                                 LPDIRECT3DVIEWPORT lpDirect3DViewport,
1021                                 DWORD dwFlags,
1022                                 LPD3DRECT lpRect)
1023 {
1024     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
1025     FIXME("(%p/%p)->(%p,%p,%08lx,%p): stub!\n", This, iface, lpDirect3DExecuteBuffer, lpDirect3DViewport, dwFlags, lpRect);
1026     return DD_OK;
1027 }
1028
1029 HRESULT WINAPI
1030 Main_IDirect3DDeviceImpl_1_GetPickRecords(LPDIRECT3DDEVICE iface,
1031                                           LPDWORD lpCount,
1032                                           LPD3DPICKRECORD lpD3DPickRec)
1033 {
1034     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
1035     FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpCount, lpD3DPickRec);
1036     return DD_OK;
1037 }
1038
1039 HRESULT WINAPI
1040 Main_IDirect3DDeviceImpl_1_CreateMatrix(LPDIRECT3DDEVICE iface,
1041                                         LPD3DMATRIXHANDLE lpD3DMatHandle)
1042 {
1043     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
1044     TRACE("(%p/%p)->(%p)\n", This, iface, lpD3DMatHandle);
1045
1046     *lpD3DMatHandle = (D3DMATRIXHANDLE) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(D3DMATRIX));
1047     TRACE(" returning matrix handle %p\n", (void *) *lpD3DMatHandle);
1048     
1049     return DD_OK;
1050 }
1051
1052 HRESULT WINAPI
1053 Main_IDirect3DDeviceImpl_1_SetMatrix(LPDIRECT3DDEVICE iface,
1054                                      D3DMATRIXHANDLE D3DMatHandle,
1055                                      LPD3DMATRIX lpD3DMatrix)
1056 {
1057     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
1058     TRACE("(%p/%p)->(%08lx,%p)\n", This, iface, (DWORD) D3DMatHandle, lpD3DMatrix);
1059
1060     dump_mat(lpD3DMatrix);
1061     *((D3DMATRIX *) D3DMatHandle) = *lpD3DMatrix;   
1062     
1063     return DD_OK;
1064 }
1065
1066 HRESULT WINAPI
1067 Main_IDirect3DDeviceImpl_1_GetMatrix(LPDIRECT3DDEVICE iface,
1068                                      D3DMATRIXHANDLE D3DMatHandle,
1069                                      LPD3DMATRIX lpD3DMatrix)
1070 {
1071     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
1072     TRACE("(%p/%p)->(%08lx,%p)\n", This, iface, (DWORD) D3DMatHandle, lpD3DMatrix);
1073
1074     *lpD3DMatrix = *((D3DMATRIX *) D3DMatHandle);
1075     
1076     return DD_OK;
1077 }
1078
1079 HRESULT WINAPI
1080 Main_IDirect3DDeviceImpl_1_DeleteMatrix(LPDIRECT3DDEVICE iface,
1081                                         D3DMATRIXHANDLE D3DMatHandle)
1082 {
1083     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
1084     TRACE("(%p/%p)->(%08lx)\n", This, iface, (DWORD) D3DMatHandle);
1085
1086     HeapFree(GetProcessHeap(), 0, (void *) D3DMatHandle);
1087     
1088     return DD_OK;
1089 }
1090
1091 HRESULT WINAPI
1092 Thunk_IDirect3DDeviceImpl_3_QueryInterface(LPDIRECT3DDEVICE3 iface,
1093                                            REFIID riid,
1094                                            LPVOID* obp)
1095 {
1096     TRACE("(%p)->(%s,%p) thunking to IDirect3DDevice7 interface.\n", iface, debugstr_guid(riid), obp);
1097     return IDirect3DDevice7_QueryInterface(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1098                                            riid,
1099                                            obp);
1100 }
1101
1102 HRESULT WINAPI
1103 Thunk_IDirect3DDeviceImpl_2_QueryInterface(LPDIRECT3DDEVICE2 iface,
1104                                            REFIID riid,
1105                                            LPVOID* obp)
1106 {
1107     TRACE("(%p)->(%s,%p) thunking to IDirect3DDevice7 interface.\n", iface, debugstr_guid(riid), obp);
1108     return IDirect3DDevice7_QueryInterface(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1109                                            riid,
1110                                            obp);
1111 }
1112
1113 HRESULT WINAPI
1114 Thunk_IDirect3DDeviceImpl_1_QueryInterface(LPDIRECT3DDEVICE iface,
1115                                            REFIID riid,
1116                                            LPVOID* obp)
1117 {
1118     TRACE("(%p)->(%s,%p) thunking to IDirect3DDevice7 interface.\n", iface, debugstr_guid(riid), obp);
1119     return IDirect3DDevice7_QueryInterface(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice7, iface),
1120                                            riid,
1121                                            obp);
1122 }
1123
1124 ULONG WINAPI
1125 Thunk_IDirect3DDeviceImpl_3_AddRef(LPDIRECT3DDEVICE3 iface)
1126 {
1127     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1128     return IDirect3DDevice7_AddRef(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface));
1129 }
1130
1131 ULONG WINAPI
1132 Thunk_IDirect3DDeviceImpl_2_AddRef(LPDIRECT3DDEVICE2 iface)
1133 {
1134     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1135     return IDirect3DDevice7_AddRef(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface));
1136 }
1137
1138 ULONG WINAPI
1139 Thunk_IDirect3DDeviceImpl_1_AddRef(LPDIRECT3DDEVICE iface)
1140 {
1141     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1142     return IDirect3DDevice7_AddRef(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice7, iface));
1143 }
1144
1145 ULONG WINAPI
1146 Thunk_IDirect3DDeviceImpl_3_Release(LPDIRECT3DDEVICE3 iface)
1147 {
1148     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1149     return IDirect3DDevice7_Release(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface));
1150 }
1151
1152 ULONG WINAPI
1153 Thunk_IDirect3DDeviceImpl_2_Release(LPDIRECT3DDEVICE2 iface)
1154 {
1155     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1156     return IDirect3DDevice7_Release(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface));
1157 }
1158
1159 ULONG WINAPI
1160 Thunk_IDirect3DDeviceImpl_1_Release(LPDIRECT3DDEVICE iface)
1161 {
1162     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1163     return IDirect3DDevice7_Release(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice7, iface));
1164 }
1165
1166 HRESULT WINAPI
1167 Thunk_IDirect3DDeviceImpl_2_AddViewport(LPDIRECT3DDEVICE2 iface,
1168                                         LPDIRECT3DVIEWPORT2 lpDirect3DViewport2)
1169 {
1170     TRACE("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", iface, lpDirect3DViewport2);
1171     return IDirect3DDevice3_AddViewport(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1172                                         (LPDIRECT3DVIEWPORT3) lpDirect3DViewport2 /* No need to cast here as all interfaces are equivalent */);
1173 }
1174
1175 HRESULT WINAPI
1176 Thunk_IDirect3DDeviceImpl_1_AddViewport(LPDIRECT3DDEVICE iface,
1177                                         LPDIRECT3DVIEWPORT lpDirect3DViewport)
1178 {
1179     TRACE("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", iface, lpDirect3DViewport);
1180     return IDirect3DDevice3_AddViewport(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice3, iface),
1181                                         (LPDIRECT3DVIEWPORT3) lpDirect3DViewport /* No need to cast here as all interfaces are equivalent */);
1182 }
1183
1184 HRESULT WINAPI
1185 Thunk_IDirect3DDeviceImpl_2_DeleteViewport(LPDIRECT3DDEVICE2 iface,
1186                                            LPDIRECT3DVIEWPORT2 lpDirect3DViewport2)
1187 {
1188     TRACE("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", iface, lpDirect3DViewport2);
1189     return IDirect3DDevice3_DeleteViewport(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1190                                            (LPDIRECT3DVIEWPORT3) lpDirect3DViewport2 /* No need to cast here as all interfaces are equivalent */);
1191 }
1192
1193 HRESULT WINAPI
1194 Thunk_IDirect3DDeviceImpl_1_DeleteViewport(LPDIRECT3DDEVICE iface,
1195                                            LPDIRECT3DVIEWPORT lpDirect3DViewport)
1196 {
1197     TRACE("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", iface, lpDirect3DViewport);
1198     return IDirect3DDevice3_DeleteViewport(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice3, iface),
1199                                            (LPDIRECT3DVIEWPORT3) lpDirect3DViewport /* No need to cast here as all interfaces are equivalent */);
1200 }
1201
1202 HRESULT WINAPI
1203 Thunk_IDirect3DDeviceImpl_2_NextViewport(LPDIRECT3DDEVICE3 iface,
1204                                          LPDIRECT3DVIEWPORT2 lpDirect3DViewport2,
1205                                          LPDIRECT3DVIEWPORT2* lplpDirect3DViewport2,
1206                                          DWORD dwFlags)
1207 {
1208     TRACE("(%p)->(%p,%p,%08lx) thunking to IDirect3DDevice3 interface.\n", iface, lpDirect3DViewport2, lplpDirect3DViewport2, dwFlags);
1209     return IDirect3DDevice3_NextViewport(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1210                                          (LPDIRECT3DVIEWPORT3) lpDirect3DViewport2 /* No need to cast here as all interfaces are equivalent */,
1211                                          (LPDIRECT3DVIEWPORT3*) lplpDirect3DViewport2,
1212                                          dwFlags);
1213 }
1214
1215 HRESULT WINAPI
1216 Thunk_IDirect3DDeviceImpl_1_NextViewport(LPDIRECT3DDEVICE3 iface,
1217                                          LPDIRECT3DVIEWPORT lpDirect3DViewport,
1218                                          LPDIRECT3DVIEWPORT* lplpDirect3DViewport,
1219                                          DWORD dwFlags)
1220 {
1221     TRACE("(%p)->(%p,%p,%08lx) thunking to IDirect3DDevice3 interface.\n", iface, lpDirect3DViewport, lplpDirect3DViewport, dwFlags);
1222     return IDirect3DDevice3_NextViewport(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice3, iface),
1223                                          (LPDIRECT3DVIEWPORT3) lpDirect3DViewport /* No need to cast here as all interfaces are equivalent */,
1224                                          (LPDIRECT3DVIEWPORT3*) lplpDirect3DViewport,
1225                                          dwFlags);
1226 }
1227
1228 HRESULT WINAPI
1229 Thunk_IDirect3DDeviceImpl_3_GetDirect3D(LPDIRECT3DDEVICE3 iface,
1230                                         LPDIRECT3D3* lplpDirect3D3)
1231 {
1232     HRESULT ret;
1233     LPDIRECT3D7 ret_ptr;
1234   
1235     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lplpDirect3D3);
1236     ret = IDirect3DDevice7_GetDirect3D(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1237                                        &ret_ptr);
1238     *lplpDirect3D3 = COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D7, IDirect3D3, ret_ptr);
1239     TRACE(" returning interface %p\n", *lplpDirect3D3);
1240     return ret;
1241 }
1242
1243 HRESULT WINAPI
1244 Thunk_IDirect3DDeviceImpl_2_GetDirect3D(LPDIRECT3DDEVICE2 iface,
1245                                         LPDIRECT3D2* lplpDirect3D2)
1246 {
1247     HRESULT ret;
1248     LPDIRECT3D7 ret_ptr;
1249   
1250     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lplpDirect3D2);
1251     ret = IDirect3DDevice7_GetDirect3D(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1252                                        &ret_ptr);
1253     *lplpDirect3D2 = COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D7, IDirect3D2, ret_ptr);
1254     TRACE(" returning interface %p\n", *lplpDirect3D2);
1255     return ret;
1256 }
1257
1258 HRESULT WINAPI
1259 Thunk_IDirect3DDeviceImpl_1_GetDirect3D(LPDIRECT3DDEVICE iface,
1260                                         LPDIRECT3D* lplpDirect3D)
1261 {
1262     HRESULT ret;
1263     LPDIRECT3D7 ret_ptr;
1264   
1265     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lplpDirect3D);
1266     ret = IDirect3DDevice7_GetDirect3D(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice7, iface),
1267                                        &ret_ptr);
1268     *lplpDirect3D = COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D7, IDirect3D, ret_ptr);
1269     TRACE(" returning interface %p\n", *lplpDirect3D);
1270     return ret;
1271 }
1272
1273 HRESULT WINAPI
1274 Thunk_IDirect3DDeviceImpl_2_SetCurrentViewport(LPDIRECT3DDEVICE2 iface,
1275                                                LPDIRECT3DVIEWPORT2 lpDirect3DViewport2)
1276 {
1277     TRACE("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", iface, lpDirect3DViewport2);
1278     return IDirect3DDevice3_SetCurrentViewport(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1279                                                (LPDIRECT3DVIEWPORT3) lpDirect3DViewport2 /* No need to cast here as all interfaces are equivalent */);
1280 }
1281
1282 HRESULT WINAPI
1283 Thunk_IDirect3DDeviceImpl_2_GetCurrentViewport(LPDIRECT3DDEVICE2 iface,
1284                                                LPDIRECT3DVIEWPORT2* lplpDirect3DViewport2)
1285 {
1286     TRACE("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", iface, lplpDirect3DViewport2);
1287     return IDirect3DDevice3_GetCurrentViewport(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1288                                                (LPDIRECT3DVIEWPORT3*) lplpDirect3DViewport2 /* No need to cast here as all interfaces are equivalent */);
1289 }
1290
1291 HRESULT WINAPI
1292 Thunk_IDirect3DDeviceImpl_3_EnumTextureFormats(LPDIRECT3DDEVICE3 iface,
1293                                                LPD3DENUMPIXELFORMATSCALLBACK lpD3DEnumPixelProc,
1294                                                LPVOID lpArg)
1295 {
1296     TRACE("(%p)->(%p,%p) thunking to IDirect3DDevice7 interface.\n", iface, lpD3DEnumPixelProc, lpArg);
1297     return IDirect3DDevice7_EnumTextureFormats(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1298                                                lpD3DEnumPixelProc,
1299                                                lpArg);
1300 }
1301
1302 HRESULT WINAPI
1303 Thunk_IDirect3DDeviceImpl_3_BeginScene(LPDIRECT3DDEVICE3 iface)
1304 {
1305     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1306     return IDirect3DDevice7_BeginScene(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface));
1307 }
1308
1309 HRESULT WINAPI
1310 Thunk_IDirect3DDeviceImpl_2_BeginScene(LPDIRECT3DDEVICE2 iface)
1311 {
1312     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1313     return IDirect3DDevice7_BeginScene(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface));
1314 }
1315
1316 HRESULT WINAPI
1317 Thunk_IDirect3DDeviceImpl_1_BeginScene(LPDIRECT3DDEVICE iface)
1318 {
1319     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1320     return IDirect3DDevice7_BeginScene(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice7, iface));
1321 }
1322
1323 HRESULT WINAPI
1324 Thunk_IDirect3DDeviceImpl_3_EndScene(LPDIRECT3DDEVICE3 iface)
1325 {
1326     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1327     return IDirect3DDevice7_EndScene(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface));
1328 }
1329
1330 HRESULT WINAPI
1331 Thunk_IDirect3DDeviceImpl_2_EndScene(LPDIRECT3DDEVICE2 iface)
1332 {
1333     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1334     return IDirect3DDevice7_EndScene(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface));
1335 }
1336
1337 HRESULT WINAPI
1338 Thunk_IDirect3DDeviceImpl_1_EndScene(LPDIRECT3DDEVICE iface)
1339 {
1340     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1341     return IDirect3DDevice7_EndScene(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice7, iface));
1342 }
1343
1344 HRESULT WINAPI
1345 Thunk_IDirect3DDeviceImpl_3_SetTransform(LPDIRECT3DDEVICE3 iface,
1346                                          D3DTRANSFORMSTATETYPE dtstTransformStateType,
1347                                          LPD3DMATRIX lpD3DMatrix)
1348 {
1349     TRACE("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", iface, dtstTransformStateType, lpD3DMatrix);
1350     return IDirect3DDevice7_SetTransform(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1351                                          dtstTransformStateType,
1352                                          lpD3DMatrix);
1353 }
1354
1355 HRESULT WINAPI
1356 Thunk_IDirect3DDeviceImpl_2_SetTransform(LPDIRECT3DDEVICE2 iface,
1357                                          D3DTRANSFORMSTATETYPE dtstTransformStateType,
1358                                          LPD3DMATRIX lpD3DMatrix)
1359 {
1360     TRACE("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", iface, dtstTransformStateType, lpD3DMatrix);
1361     return IDirect3DDevice7_SetTransform(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1362                                          dtstTransformStateType,
1363                                          lpD3DMatrix);
1364 }
1365
1366 HRESULT WINAPI
1367 Thunk_IDirect3DDeviceImpl_3_GetTransform(LPDIRECT3DDEVICE3 iface,
1368                                          D3DTRANSFORMSTATETYPE dtstTransformStateType,
1369                                          LPD3DMATRIX lpD3DMatrix)
1370 {
1371     TRACE("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", iface, dtstTransformStateType, lpD3DMatrix);
1372     return IDirect3DDevice7_GetTransform(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1373                                          dtstTransformStateType,
1374                                          lpD3DMatrix);
1375 }
1376
1377 HRESULT WINAPI
1378 Thunk_IDirect3DDeviceImpl_2_GetTransform(LPDIRECT3DDEVICE2 iface,
1379                                          D3DTRANSFORMSTATETYPE dtstTransformStateType,
1380                                          LPD3DMATRIX lpD3DMatrix)
1381 {
1382     TRACE("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", iface, dtstTransformStateType, lpD3DMatrix);
1383     return IDirect3DDevice7_GetTransform(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1384                                          dtstTransformStateType,
1385                                          lpD3DMatrix);
1386 }
1387
1388 HRESULT WINAPI
1389 Thunk_IDirect3DDeviceImpl_3_MultiplyTransform(LPDIRECT3DDEVICE3 iface,
1390                                               D3DTRANSFORMSTATETYPE dtstTransformStateType,
1391                                               LPD3DMATRIX lpD3DMatrix)
1392 {
1393     TRACE("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", iface, dtstTransformStateType, lpD3DMatrix);
1394     return IDirect3DDevice7_MultiplyTransform(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1395                                               dtstTransformStateType,
1396                                               lpD3DMatrix);
1397 }
1398
1399 HRESULT WINAPI
1400 Thunk_IDirect3DDeviceImpl_2_MultiplyTransform(LPDIRECT3DDEVICE2 iface,
1401                                               D3DTRANSFORMSTATETYPE dtstTransformStateType,
1402                                               LPD3DMATRIX lpD3DMatrix)
1403 {
1404     TRACE("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", iface, dtstTransformStateType, lpD3DMatrix);
1405     return IDirect3DDevice7_MultiplyTransform(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1406                                               dtstTransformStateType,
1407                                               lpD3DMatrix);
1408 }
1409
1410 HRESULT WINAPI
1411 Thunk_IDirect3DDeviceImpl_3_SetRenderState(LPDIRECT3DDEVICE3 iface,
1412                                            D3DRENDERSTATETYPE dwRenderStateType,
1413                                            DWORD dwRenderState)
1414 {
1415     TRACE("(%p)->(%08x,%08lx) thunking to IDirect3DDevice7 interface.\n", iface, dwRenderStateType, dwRenderState);
1416     return IDirect3DDevice7_SetRenderState(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1417                                            dwRenderStateType,
1418                                            dwRenderState);
1419 }
1420
1421 HRESULT WINAPI
1422 Thunk_IDirect3DDeviceImpl_2_SetRenderState(LPDIRECT3DDEVICE2 iface,
1423                                            D3DRENDERSTATETYPE dwRenderStateType,
1424                                            DWORD dwRenderState)
1425 {
1426     TRACE("(%p)->(%08x,%08lx) thunking to IDirect3DDevice7 interface.\n", iface, dwRenderStateType, dwRenderState);
1427     return IDirect3DDevice7_SetRenderState(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1428                                            dwRenderStateType,
1429                                            dwRenderState);
1430 }
1431
1432 HRESULT WINAPI
1433 Thunk_IDirect3DDeviceImpl_3_GetRenderState(LPDIRECT3DDEVICE3 iface,
1434                                            D3DRENDERSTATETYPE dwRenderStateType,
1435                                            LPDWORD lpdwRenderState)
1436 {
1437     TRACE("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", iface, dwRenderStateType, lpdwRenderState);
1438     return IDirect3DDevice7_GetRenderState(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1439                                            dwRenderStateType,
1440                                            lpdwRenderState);
1441 }
1442
1443 HRESULT WINAPI
1444 Thunk_IDirect3DDeviceImpl_2_GetRenderState(LPDIRECT3DDEVICE2 iface,
1445                                            D3DRENDERSTATETYPE dwRenderStateType,
1446                                            LPDWORD lpdwRenderState)
1447 {
1448     TRACE("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", iface, dwRenderStateType, lpdwRenderState);
1449     return IDirect3DDevice7_GetRenderState(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1450                                            dwRenderStateType,
1451                                            lpdwRenderState);
1452 }
1453
1454 HRESULT WINAPI
1455 Thunk_IDirect3DDeviceImpl_3_DrawPrimitive(LPDIRECT3DDEVICE3 iface,
1456                                           D3DPRIMITIVETYPE d3dptPrimitiveType,
1457                                           DWORD d3dvtVertexType,
1458                                           LPVOID lpvVertices,
1459                                           DWORD dwVertexCount,
1460                                           DWORD dwFlags)
1461 {
1462     TRACE("(%p)->(%08x,%08lx,%p,%08lx,%08lx) thunking to IDirect3DDevice7 interface.\n", iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwVertexCount, dwFlags);
1463     return IDirect3DDevice7_DrawPrimitive(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1464                                           d3dptPrimitiveType,
1465                                           d3dvtVertexType,
1466                                           lpvVertices,
1467                                           dwVertexCount,
1468                                           dwFlags);
1469 }
1470
1471 HRESULT WINAPI
1472 Thunk_IDirect3DDeviceImpl_3_DrawIndexedPrimitive(LPDIRECT3DDEVICE3 iface,
1473                                                  D3DPRIMITIVETYPE d3dptPrimitiveType,
1474                                                  DWORD d3dvtVertexType,
1475                                                  LPVOID lpvVertices,
1476                                                  DWORD dwVertexCount,
1477                                                  LPWORD dwIndices,
1478                                                  DWORD dwIndexCount,
1479                                                  DWORD dwFlags)
1480 {
1481     TRACE("(%p)->(%08x,%08lx,%p,%08lx,%p,%08lx,%08lx) thunking to IDirect3DDevice7 interface.\n", iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwVertexCount, dwIndices, dwIndexCount, dwFlags);
1482     return IDirect3DDevice7_DrawIndexedPrimitive(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1483                                                  d3dptPrimitiveType,
1484                                                  d3dvtVertexType,
1485                                                  lpvVertices,
1486                                                  dwVertexCount,
1487                                                  dwIndices,
1488                                                  dwIndexCount,
1489                                                  dwFlags);
1490 }
1491
1492 HRESULT WINAPI
1493 Thunk_IDirect3DDeviceImpl_3_SetClipStatus(LPDIRECT3DDEVICE3 iface,
1494                                           LPD3DCLIPSTATUS lpD3DClipStatus)
1495 {
1496     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lpD3DClipStatus);
1497     return IDirect3DDevice7_SetClipStatus(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1498                                           lpD3DClipStatus);
1499 }
1500
1501 HRESULT WINAPI
1502 Thunk_IDirect3DDeviceImpl_2_SetClipStatus(LPDIRECT3DDEVICE2 iface,
1503                                           LPD3DCLIPSTATUS lpD3DClipStatus)
1504 {
1505     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lpD3DClipStatus);
1506     return IDirect3DDevice7_SetClipStatus(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1507                                           lpD3DClipStatus);
1508 }
1509
1510 HRESULT WINAPI
1511 Thunk_IDirect3DDeviceImpl_3_GetClipStatus(LPDIRECT3DDEVICE3 iface,
1512                                           LPD3DCLIPSTATUS lpD3DClipStatus)
1513 {
1514     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lpD3DClipStatus);
1515     return IDirect3DDevice7_GetClipStatus(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1516                                           lpD3DClipStatus);
1517 }
1518
1519 HRESULT WINAPI
1520 Thunk_IDirect3DDeviceImpl_2_GetClipStatus(LPDIRECT3DDEVICE2 iface,
1521                                           LPD3DCLIPSTATUS lpD3DClipStatus)
1522 {
1523     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lpD3DClipStatus);
1524     return IDirect3DDevice7_GetClipStatus(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1525                                           lpD3DClipStatus);
1526 }
1527
1528 HRESULT WINAPI
1529 Thunk_IDirect3DDeviceImpl_3_DrawPrimitiveStrided(LPDIRECT3DDEVICE3 iface,
1530                                                  D3DPRIMITIVETYPE d3dptPrimitiveType,
1531                                                  DWORD dwVertexType,
1532                                                  LPD3DDRAWPRIMITIVESTRIDEDDATA lpD3DDrawPrimStrideData,
1533                                                  DWORD dwVertexCount,
1534                                                  DWORD dwFlags)
1535 {
1536     TRACE("(%p)->(%08x,%08lx,%p,%08lx,%08lx) thunking to IDirect3DDevice7 interface.\n", iface, d3dptPrimitiveType, dwVertexType, lpD3DDrawPrimStrideData, dwVertexCount, dwFlags);
1537     return IDirect3DDevice7_DrawPrimitiveStrided(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1538                                                  d3dptPrimitiveType,
1539                                                  dwVertexType,
1540                                                  lpD3DDrawPrimStrideData,
1541                                                  dwVertexCount,
1542                                                  dwFlags);
1543 }
1544
1545 HRESULT WINAPI
1546 Thunk_IDirect3DDeviceImpl_3_DrawIndexedPrimitiveStrided(LPDIRECT3DDEVICE3 iface,
1547                                                         D3DPRIMITIVETYPE d3dptPrimitiveType,
1548                                                         DWORD dwVertexType,
1549                                                         LPD3DDRAWPRIMITIVESTRIDEDDATA lpD3DDrawPrimStrideData,
1550                                                         DWORD dwVertexCount,
1551                                                         LPWORD lpIndex,
1552                                                         DWORD dwIndexCount,
1553                                                         DWORD dwFlags)
1554 {
1555     TRACE("(%p)->(%08x,%08lx,%p,%08lx,%p,%08lx,%08lx) thunking to IDirect3DDevice7 interface.\n", iface, d3dptPrimitiveType, dwVertexType, lpD3DDrawPrimStrideData, dwVertexCount, lpIndex, dwIndexCount, dwFlags);
1556     return IDirect3DDevice7_DrawIndexedPrimitiveStrided(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1557                                                         d3dptPrimitiveType,
1558                                                         dwVertexType,
1559                                                         lpD3DDrawPrimStrideData,
1560                                                         dwVertexCount,
1561                                                         lpIndex,
1562                                                         dwIndexCount,
1563                                                         dwFlags);
1564 }
1565
1566 HRESULT WINAPI
1567 Thunk_IDirect3DDeviceImpl_3_ComputeSphereVisibility(LPDIRECT3DDEVICE3 iface,
1568                                                     LPD3DVECTOR lpCenters,
1569                                                     LPD3DVALUE lpRadii,
1570                                                     DWORD dwNumSpheres,
1571                                                     DWORD dwFlags,
1572                                                     LPDWORD lpdwReturnValues)
1573 {
1574     TRACE("(%p)->(%p,%p,%08lx,%08lx,%p) thunking to IDirect3DDevice7 interface.\n", iface, lpCenters, lpRadii, dwNumSpheres, dwFlags, lpdwReturnValues);
1575     return IDirect3DDevice7_ComputeSphereVisibility(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1576                                                     lpCenters,
1577                                                     lpRadii,
1578                                                     dwNumSpheres,
1579                                                     dwFlags,
1580                                                     lpdwReturnValues);
1581 }
1582
1583 HRESULT WINAPI
1584 Thunk_IDirect3DDeviceImpl_3_GetTextureStageState(LPDIRECT3DDEVICE3 iface,
1585                                                  DWORD dwStage,
1586                                                  D3DTEXTURESTAGESTATETYPE d3dTexStageStateType,
1587                                                  LPDWORD lpdwState)
1588 {
1589     TRACE("(%p)->(%08lx,%08x,%p) thunking to IDirect3DDevice7 interface.\n", iface, dwStage, d3dTexStageStateType, lpdwState);
1590     return IDirect3DDevice7_GetTextureStageState(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1591                                                  dwStage,
1592                                                  d3dTexStageStateType,
1593                                                  lpdwState);
1594 }
1595
1596 HRESULT WINAPI
1597 Thunk_IDirect3DDeviceImpl_3_SetTextureStageState(LPDIRECT3DDEVICE3 iface,
1598                                                  DWORD dwStage,
1599                                                  D3DTEXTURESTAGESTATETYPE d3dTexStageStateType,
1600                                                  DWORD dwState)
1601 {
1602     TRACE("(%p)->(%08lx,%08x,%08lx) thunking to IDirect3DDevice7 interface.\n", iface, dwStage, d3dTexStageStateType, dwState);
1603     return IDirect3DDevice7_SetTextureStageState(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1604                                                  dwStage,
1605                                                  d3dTexStageStateType,
1606                                                  dwState);
1607 }
1608
1609 HRESULT WINAPI
1610 Thunk_IDirect3DDeviceImpl_3_ValidateDevice(LPDIRECT3DDEVICE3 iface,
1611                                            LPDWORD lpdwPasses)
1612 {
1613     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lpdwPasses);
1614     return IDirect3DDevice7_ValidateDevice(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1615                                            lpdwPasses);
1616 }
1617
1618 HRESULT WINAPI
1619 Thunk_IDirect3DDeviceImpl_2_GetCaps(LPDIRECT3DDEVICE2 iface,
1620                                     LPD3DDEVICEDESC lpD3DHWDevDesc,
1621                                     LPD3DDEVICEDESC lpD3DHELDevDesc)
1622 {
1623     TRACE("(%p)->(%p,%p) thunking to IDirect3DDevice3 interface.\n", iface, lpD3DHWDevDesc, lpD3DHELDevDesc);
1624     return IDirect3DDevice3_GetCaps(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1625                                     lpD3DHWDevDesc,
1626                                     lpD3DHELDevDesc);
1627 }
1628
1629 HRESULT WINAPI
1630 Thunk_IDirect3DDeviceImpl_1_GetCaps(LPDIRECT3DDEVICE iface,
1631                                     LPD3DDEVICEDESC lpD3DHWDevDesc,
1632                                     LPD3DDEVICEDESC lpD3DHELDevDesc)
1633 {
1634     TRACE("(%p)->(%p,%p) thunking to IDirect3DDevice3 interface.\n", iface, lpD3DHWDevDesc, lpD3DHELDevDesc);
1635     return IDirect3DDevice3_GetCaps(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice3, iface),
1636                                     lpD3DHWDevDesc,
1637                                     lpD3DHELDevDesc);
1638 }
1639
1640 HRESULT WINAPI
1641 Thunk_IDirect3DDeviceImpl_2_GetStats(LPDIRECT3DDEVICE2 iface,
1642                                      LPD3DSTATS lpD3DStats)
1643 {
1644     TRACE("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", iface, lpD3DStats);
1645     return IDirect3DDevice3_GetStats(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1646                                      lpD3DStats);
1647 }
1648
1649 HRESULT WINAPI
1650 Thunk_IDirect3DDeviceImpl_1_GetStats(LPDIRECT3DDEVICE iface,
1651                                      LPD3DSTATS lpD3DStats)
1652 {
1653     TRACE("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", iface, lpD3DStats);
1654     return IDirect3DDevice3_GetStats(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice3, iface),
1655                                      lpD3DStats);
1656 }
1657
1658 HRESULT WINAPI
1659 Thunk_IDirect3DDeviceImpl_3_SetRenderTarget(LPDIRECT3DDEVICE3 iface,
1660                                             LPDIRECTDRAWSURFACE4 lpNewRenderTarget,
1661                                             DWORD dwFlags)
1662 {
1663     TRACE("(%p)->(%p,%08lx) thunking to IDirect3DDevice7 interface.\n", iface, lpNewRenderTarget, dwFlags);
1664     return IDirect3DDevice7_SetRenderTarget(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1665                                             (LPDIRECTDRAWSURFACE7) lpNewRenderTarget /* No cast needed as DSurf4 == DSurf7 */,
1666                                             dwFlags);
1667 }
1668
1669 HRESULT WINAPI
1670 Thunk_IDirect3DDeviceImpl_3_GetRenderTarget(LPDIRECT3DDEVICE3 iface,
1671                                             LPDIRECTDRAWSURFACE4* lplpRenderTarget)
1672 {
1673     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lplpRenderTarget);
1674     return IDirect3DDevice7_GetRenderTarget(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1675                                             (LPDIRECTDRAWSURFACE7*) lplpRenderTarget /* No cast needed as DSurf4 == DSurf7 */);
1676 }
1677
1678 HRESULT WINAPI
1679 Thunk_IDirect3DDeviceImpl_2_SetRenderTarget(LPDIRECT3DDEVICE2 iface,
1680                                             LPDIRECTDRAWSURFACE lpNewRenderTarget,
1681                                             DWORD dwFlags)
1682 {
1683     TRACE("(%p)->(%p,%08lx) thunking to IDirect3DDevice7 interface.\n", iface, lpNewRenderTarget, dwFlags);
1684     return IDirect3DDevice7_SetRenderTarget(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1685                                             COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface3, IDirectDrawSurface7, lpNewRenderTarget),
1686                                             dwFlags);
1687 }
1688
1689 HRESULT WINAPI
1690 Thunk_IDirect3DDeviceImpl_2_GetRenderTarget(LPDIRECT3DDEVICE2 iface,
1691                                             LPDIRECTDRAWSURFACE* lplpRenderTarget)
1692 {
1693     HRESULT ret;
1694     LPDIRECTDRAWSURFACE7 ret_val;
1695   
1696     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lplpRenderTarget);
1697     ret = IDirect3DDevice7_GetRenderTarget(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1698                                            &ret_val);
1699     *lplpRenderTarget = (LPDIRECTDRAWSURFACE) COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7, IDirectDrawSurface3, ret_val);
1700     TRACE(" returning interface %p\n", *lplpRenderTarget);
1701     return ret;
1702 }
1703
1704 HRESULT WINAPI
1705 Thunk_IDirect3DDeviceImpl_2_Vertex(LPDIRECT3DDEVICE2 iface,
1706                                    LPVOID lpVertexType)
1707 {
1708     TRACE("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", iface, lpVertexType);
1709     return IDirect3DDevice3_Vertex(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1710                                    lpVertexType);
1711 }
1712
1713 HRESULT WINAPI
1714 Thunk_IDirect3DDeviceImpl_2_Index(LPDIRECT3DDEVICE2 iface,
1715                                   WORD wVertexIndex)
1716 {
1717     TRACE("(%p)->(%04x) thunking to IDirect3DDevice3 interface.\n", iface, wVertexIndex);
1718     return IDirect3DDevice3_Index(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1719                                   wVertexIndex);
1720 }
1721
1722 HRESULT WINAPI
1723 Thunk_IDirect3DDeviceImpl_2_End(LPDIRECT3DDEVICE2 iface,
1724                                 DWORD dwFlags)
1725 {
1726     TRACE("(%p)->(%08lx) thunking to IDirect3DDevice3 interface.\n", iface, dwFlags);
1727     return IDirect3DDevice3_End(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1728                                 dwFlags);
1729 }
1730
1731 HRESULT WINAPI
1732 Thunk_IDirect3DDeviceImpl_2_GetLightState(LPDIRECT3DDEVICE2 iface,
1733                                           D3DLIGHTSTATETYPE dwLightStateType,
1734                                           LPDWORD lpdwLightState)
1735 {
1736     TRACE("(%p)->(%08x,%p) thunking to IDirect3DDevice3 interface.\n", iface, dwLightStateType, lpdwLightState);
1737     return IDirect3DDevice3_GetLightState(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1738                                           dwLightStateType,
1739                                           lpdwLightState);
1740 }
1741
1742 HRESULT WINAPI
1743 Thunk_IDirect3DDeviceImpl_2_SetLightState(LPDIRECT3DDEVICE2 iface,
1744                                           D3DLIGHTSTATETYPE dwLightStateType,
1745                                           DWORD dwLightState)
1746 {
1747     TRACE("(%p)->(%08x,%08lx) thunking to IDirect3DDevice3 interface.\n", iface, dwLightStateType, dwLightState);
1748     return IDirect3DDevice3_SetLightState(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1749                                           dwLightStateType,
1750                                           dwLightState);
1751 }
1752
1753 HRESULT WINAPI
1754 Thunk_IDirect3DDeviceImpl_1_EnumTextureFormats(LPDIRECT3DDEVICE iface,
1755                                                LPD3DENUMTEXTUREFORMATSCALLBACK lpD3DEnumTextureProc,
1756                                                LPVOID lpArg)
1757 {
1758     TRACE("(%p)->(%p,%p) thunking to IDirect3DDevice2 interface.\n", iface, lpD3DEnumTextureProc, lpArg);
1759     return IDirect3DDevice2_EnumTextureFormats(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice2, iface),
1760                                                lpD3DEnumTextureProc,
1761                                                lpArg);
1762 }
1763
1764 HRESULT WINAPI
1765 Thunk_IDirect3DDeviceImpl_3_SetTexture(LPDIRECT3DDEVICE3 iface,
1766                                        DWORD dwStage,
1767                                        LPDIRECT3DTEXTURE2 lpTexture2)
1768 {
1769     TRACE("(%p)->(%ld,%p) thunking to IDirect3DDevice7 interface.\n", iface, dwStage, lpTexture2);
1770     return IDirect3DDevice7_SetTexture(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1771                                        dwStage,
1772                                        COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture2, IDirectDrawSurface7, lpTexture2));
1773 }