ok() does not support '%S'. Store the Ansi version, convert to Unicode
[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 DWORD InitRenderStateTab[] = {
38     D3DRENDERSTATE_TEXTUREHANDLE,           (DWORD)NULL,
39     D3DRENDERSTATE_ANTIALIAS,               D3DANTIALIAS_NONE,
40     /* FIXME: D3DRENDERSTATE_TEXTUREADDRESS */
41     D3DRENDERSTATE_TEXTUREPERSPECTIVE,      TRUE,
42     /* FIXME: D3DRENDERSTATE_WRAPU */
43     /* FIXME: D3DRENDERSTATE_WRAPV */
44     D3DRENDERSTATE_ZENABLE,                 D3DZB_TRUE, /* This needs to be set differently according to the Z buffer status */
45     D3DRENDERSTATE_FILLMODE,                D3DFILL_SOLID,
46     D3DRENDERSTATE_SHADEMODE,               D3DSHADE_GOURAUD,
47     D3DRENDERSTATE_LINEPATTERN,             0,
48     D3DRENDERSTATE_MONOENABLE,              FALSE,
49     D3DRENDERSTATE_ROP2,                    R2_COPYPEN,
50     D3DRENDERSTATE_PLANEMASK,               0xFFFFFFFF,
51     D3DRENDERSTATE_ZWRITEENABLE,            TRUE,
52     D3DRENDERSTATE_ALPHATESTENABLE,         FALSE,
53     D3DRENDERSTATE_LASTPIXEL,               TRUE,
54     D3DRENDERSTATE_TEXTUREMAG,              D3DFILTER_NEAREST,
55     D3DRENDERSTATE_TEXTUREMIN,              D3DFILTER_NEAREST,
56     D3DRENDERSTATE_SRCBLEND,                D3DBLEND_ONE,
57     D3DRENDERSTATE_DESTBLEND,               D3DBLEND_ZERO,
58     D3DRENDERSTATE_TEXTUREMAPBLEND,         D3DTBLEND_MODULATE,
59     D3DRENDERSTATE_CULLMODE,                D3DCULL_CCW,
60     D3DRENDERSTATE_ZFUNC,                   D3DCMP_LESSEQUAL,
61     D3DRENDERSTATE_ALPHAREF,                0,
62     D3DRENDERSTATE_ALPHAFUNC,               D3DCMP_ALWAYS,
63     D3DRENDERSTATE_DITHERENABLE,            FALSE,
64     D3DRENDERSTATE_ALPHABLENDENABLE,        FALSE,
65     D3DRENDERSTATE_FOGENABLE,               FALSE,
66     D3DRENDERSTATE_SPECULARENABLE,          FALSE,
67     D3DRENDERSTATE_ZVISIBLE,                FALSE,
68     D3DRENDERSTATE_SUBPIXEL,                FALSE,
69     D3DRENDERSTATE_SUBPIXELX,               FALSE,
70     D3DRENDERSTATE_STIPPLEDALPHA,           FALSE,
71     D3DRENDERSTATE_FOGCOLOR,                D3DRGBA(0,0,0,0),
72     D3DRENDERSTATE_FOGTABLEMODE,            D3DFOG_NONE,
73     /* FIXME: D3DRENDERSTATE_FOGTABLESTART (same as D3DRENDERSTATE_FOGSTART) */
74     /* FIXME: D3DRENDERSTATE_FOGTABLEEND (same as D3DRENDERSTATE_FOGEND) */
75     D3DRENDERSTATE_FOGTABLEDENSITY,         0x3F80000, /* 1.0f (same as D3DRENDERSTATE_FOGDENSITY) */
76     /* FIXME: D3DRENDERSTATE_STIPPLEENABLE */
77     D3DRENDERSTATE_EDGEANTIALIAS,           FALSE,
78     D3DRENDERSTATE_COLORKEYENABLE,          FALSE,
79     /* FIXME: D3DRENDERSTATE_BORDERCOLOR */
80     D3DRENDERSTATE_TEXTUREADDRESSU,         D3DTADDRESS_WRAP,
81     D3DRENDERSTATE_TEXTUREADDRESSV,         D3DTADDRESS_WRAP,
82     D3DRENDERSTATE_MIPMAPLODBIAS,           0x00000000, /* 0.0f */
83     D3DRENDERSTATE_ZBIAS,                   0,
84     D3DRENDERSTATE_RANGEFOGENABLE,          FALSE,    
85     /* FIXME: D3DRENDERSTATE_ANISOTROPY */
86     /* FIXME: D3DRENDERSTATE_FLUSHBATCH */
87     /* FIXME: D3DRENDERSTATE_TRANSLUCENTSORTINDEPENDENT */
88     D3DRENDERSTATE_STENCILENABLE,           FALSE,
89     D3DRENDERSTATE_STENCILFAIL,             D3DSTENCILOP_KEEP,
90     D3DRENDERSTATE_STENCILZFAIL,            D3DSTENCILOP_KEEP,
91     D3DRENDERSTATE_STENCILPASS,             D3DSTENCILOP_KEEP,
92     D3DRENDERSTATE_STENCILFUNC,             D3DCMP_ALWAYS,
93     D3DRENDERSTATE_STENCILREF,              0,
94     D3DRENDERSTATE_STENCILMASK,             0xFFFFFFFF,
95     D3DRENDERSTATE_STENCILWRITEMASK,        0xFFFFFFFF,
96     /* FIXME: D3DRENDERSTATE_TEXTUREFACTOR */
97     /* FIXME: D3DRENDERSTATE_STIPPLEPATTERN00..31 */
98     D3DRENDERSTATE_WRAP0,                   0,
99     D3DRENDERSTATE_WRAP1,                   0,
100     D3DRENDERSTATE_WRAP2,                   0,
101     D3DRENDERSTATE_WRAP3,                   0,
102     D3DRENDERSTATE_WRAP4,                   0,
103     D3DRENDERSTATE_WRAP5,                   0,
104     D3DRENDERSTATE_WRAP6,                   0,
105     D3DRENDERSTATE_WRAP7,                   0,
106     D3DRENDERSTATE_CLIPPING,                FALSE,
107     D3DRENDERSTATE_LIGHTING,                TRUE,
108     D3DRENDERSTATE_EXTENTS,                 FALSE,
109     D3DRENDERSTATE_AMBIENT,                 D3DRGBA(0,0,0,0),
110     D3DRENDERSTATE_FOGVERTEXMODE,           D3DFOG_NONE,
111     D3DRENDERSTATE_COLORVERTEX,             TRUE,
112     D3DRENDERSTATE_LOCALVIEWER,             TRUE,
113     D3DRENDERSTATE_NORMALIZENORMALS,        FALSE,
114     /* FIXME: D3DRENDER_STATE_COLORKEYBLENDENABLE */
115     D3DRENDERSTATE_DIFFUSEMATERIALSOURCE,   D3DMCS_COLOR1,
116     D3DRENDERSTATE_SPECULARMATERIALSOURCE,  D3DMCS_COLOR2,
117     D3DRENDERSTATE_AMBIENTMATERIALSOURCE,   D3DMCS_COLOR2,
118     D3DRENDERSTATE_EMISSIVEMATERIALSOURCE,  D3DMCS_MATERIAL,
119     D3DRENDERSTATE_VERTEXBLEND,             D3DVBLEND_DISABLE,
120     D3DRENDERSTATE_CLIPPLANEENABLE,         0
121 };
122
123 DWORD InitLightStateTab[] = {
124     D3DLIGHTSTATE_MATERIAL,           (DWORD)NULL,
125     D3DLIGHTSTATE_AMBIENT,            D3DRGBA(0,0,0,0),
126     D3DLIGHTSTATE_COLORMODEL,         D3DCOLOR_RGB,
127     D3DLIGHTSTATE_FOGMODE,            D3DFOG_NONE,
128     D3DLIGHTSTATE_FOGSTART,           0x3F80000, /* 1.0f */
129     D3DLIGHTSTATE_FOGEND,             0x42C8000, /* 100.0f */
130     D3DLIGHTSTATE_FOGDENSITY,         0x3F80000  /* 1.0f */
131     /* FIXME: D3DLIGHTSTATE_COLORVERTEX */
132 };
133
134 DWORD InitTextureStageStateTab[] = {
135     D3DTSS_COLOROP,          D3DTOP_DISABLE,
136     D3DTSS_COLORARG1,        D3DTA_TEXTURE,
137     D3DTSS_COLORARG2,        D3DTA_CURRENT,
138     D3DTSS_ALPHAOP,          D3DTOP_DISABLE,
139     D3DTSS_ALPHAARG1,        D3DTA_TEXTURE,
140     D3DTSS_ALPHAARG2,        D3DTA_CURRENT,
141     /* FIXME: D3DTSS_BUMPENVMAT00,01,10,11 */
142     /* D3DTSS_TEXCOORDINDEX is set manually */
143     D3DTSS_ADDRESS,          D3DTADDRESS_WRAP,
144     D3DTSS_ADDRESSU,         D3DTADDRESS_WRAP,
145     D3DTSS_ADDRESSV,         D3DTADDRESS_WRAP,
146     /* FIXME: D3DTSS_BORDERCOLOR */
147     D3DTSS_MAGFILTER,        D3DTFG_POINT,
148     D3DTSS_MINFILTER,        D3DTFN_POINT,
149     D3DTSS_MIPFILTER,        D3DTFP_NONE,
150     D3DTSS_MIPMAPLODBIAS,    0x00000000, /* 0.0f */
151     D3DTSS_MAXMIPLEVEL,      0
152     /* FIXME: D3DTSS_MAXANISOTROPY */
153     /* FIXME: D3DTSS_BUMPENVLSCALE */
154     /* FIXME: D3DTSS_NUMPENVLOFFSET */
155     /* FIXME: D3DTSS_TEXTURETRANSFORMFLAGS */
156 };
157
158         
159 void InitDefaultStateBlock(STATEBLOCK* lpStateBlock, int version)
160 {
161     int i,j;  
162     TRACE("(%p,%d)\n", lpStateBlock, version);    
163     memset(lpStateBlock, 0, sizeof(STATEBLOCK));
164     
165     /* Initialize render states */
166     for(i = 0; i < sizeof(InitRenderStateTab) / sizeof(InitRenderStateTab[0]); i += 2)
167     {
168         lpStateBlock->render_state[InitRenderStateTab[i] - 1] = InitRenderStateTab[i + 1];
169         lpStateBlock->set_flags.render_state[InitRenderStateTab[i] - 1] = TRUE;
170     }
171
172     /* Initialize texture stages states */
173     for(i = 0; i < MAX_TEXTURES; i++)
174     {
175        for(j = 0; j < sizeof(InitTextureStageStateTab) / sizeof(InitTextureStageStateTab[0]); j += 2)
176        {
177            lpStateBlock->texture_stage_state[i][InitTextureStageStateTab[j] - 1] = InitTextureStageStateTab[j + 1];
178            lpStateBlock->set_flags.texture_stage_state[i][InitTextureStageStateTab[j] - 1] = TRUE;
179        }
180        /* Map texture coords 0 to stage 0, 1 to stage 1, etc... */
181        lpStateBlock->texture_stage_state[i][D3DTSS_TEXCOORDINDEX - 1] = i;
182        lpStateBlock->set_flags.texture_stage_state[i][D3DTSS_TEXCOORDINDEX - 1] = TRUE;
183     }
184     
185     /* The first texture is particular, update it consequently */
186     lpStateBlock->texture_stage_state[0][D3DTSS_COLOROP - 1] = D3DTOP_MODULATE;
187     lpStateBlock->texture_stage_state[0][D3DTSS_ALPHAOP - 1] = D3DTOP_SELECTARG1;
188     
189     /* Updates for particular versions */
190     if ((version == 1) || (version==2))
191        lpStateBlock->render_state[D3DRENDERSTATE_SPECULARENABLE - 1] = TRUE;
192 }
193
194 HRESULT WINAPI
195 Main_IDirect3DDeviceImpl_7_3T_2T_1T_QueryInterface(LPDIRECT3DDEVICE7 iface,
196                                                    REFIID riid,
197                                                    LPVOID* obp)
198 {
199     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
200     TRACE("(%p/%p)->(%s,%p)\n", This, iface, debugstr_guid(riid), obp);
201
202     *obp = NULL;
203
204     if ( IsEqualGUID( &IID_IUnknown,  riid ) ) {
205         IDirect3DDevice7_AddRef(ICOM_INTERFACE(This, IDirect3DDevice7));
206         *obp = iface;
207         TRACE("  Creating IUnknown interface at %p.\n", *obp);
208         return S_OK;
209     }
210     if ( IsEqualGUID( &IID_IDirect3DDevice, riid ) ) {
211         IDirect3DDevice7_AddRef(ICOM_INTERFACE(This, IDirect3DDevice7));
212         *obp = ICOM_INTERFACE(This, IDirect3DDevice);
213         TRACE("  Creating IDirect3DDevice interface %p\n", *obp);
214         return S_OK;
215     }
216     if ( IsEqualGUID( &IID_IDirect3DDevice2, riid ) ) {
217         IDirect3DDevice7_AddRef(ICOM_INTERFACE(This, IDirect3DDevice7));
218         *obp = ICOM_INTERFACE(This, IDirect3DDevice2);
219         TRACE("  Creating IDirect3DDevice2 interface %p\n", *obp);
220         return S_OK;
221     }
222     if ( IsEqualGUID( &IID_IDirect3DDevice3, riid ) ) {
223         IDirect3DDevice7_AddRef(ICOM_INTERFACE(This, IDirect3DDevice7));
224         *obp = ICOM_INTERFACE(This, IDirect3DDevice3);
225         TRACE("  Creating IDirect3DDevice3 interface %p\n", *obp);
226         return S_OK;
227     }
228     if ( IsEqualGUID( &IID_IDirect3DDevice7, riid ) ) {
229         IDirect3DDevice7_AddRef(ICOM_INTERFACE(This, IDirect3DDevice7));
230         *obp = ICOM_INTERFACE(This, IDirect3DDevice7);
231         TRACE("  Creating IDirect3DDevice7 interface %p\n", *obp);
232         return S_OK;
233     }
234     FIXME("(%p): interface for IID %s NOT found!\n", This, debugstr_guid(riid));
235     return OLE_E_ENUM_NOMORE;
236 }
237
238 ULONG WINAPI
239 Main_IDirect3DDeviceImpl_7_3T_2T_1T_AddRef(LPDIRECT3DDEVICE7 iface)
240 {
241     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
242     TRACE("(%p/%p)->() incrementing from %lu.\n", This, iface, This->ref);
243     return ++(This->ref);
244 }
245
246 ULONG WINAPI
247 Main_IDirect3DDeviceImpl_7_3T_2T_1T_Release(LPDIRECT3DDEVICE7 iface)
248 {
249     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
250     TRACE("(%p/%p)->() decrementing from %lu.\n", This, iface, This->ref);
251     if (!--(This->ref)) {
252         int i;
253         /* Release texture associated with the device */
254         for (i = 0; i < MAX_TEXTURES; i++) {
255             if (This->current_texture[i] != NULL)
256                 IDirect3DTexture2_Release(ICOM_INTERFACE(This->current_texture[i], IDirect3DTexture2));
257         }
258                   
259         HeapFree(GetProcessHeap(), 0, This);
260         return 0;
261     }
262     return This->ref;
263 }
264
265 HRESULT WINAPI
266 Main_IDirect3DDeviceImpl_7_GetCaps(LPDIRECT3DDEVICE7 iface,
267                                    LPD3DDEVICEDESC7 lpD3DHELDevDesc)
268 {
269     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
270     FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpD3DHELDevDesc);
271     return DD_OK;
272 }
273
274 HRESULT WINAPI
275 Main_IDirect3DDeviceImpl_7_3T_EnumTextureFormats(LPDIRECT3DDEVICE7 iface,
276                                                  LPD3DENUMPIXELFORMATSCALLBACK lpD3DEnumPixelProc,
277                                                  LPVOID lpArg)
278 {
279     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
280     FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpD3DEnumPixelProc, lpArg);
281     return DD_OK;
282 }
283
284 HRESULT WINAPI
285 Main_IDirect3DDeviceImpl_7_3T_2T_1T_BeginScene(LPDIRECT3DDEVICE7 iface)
286 {
287     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
288     TRACE("(%p/%p)->()\n", This, iface);
289     /* Nothing to do */
290     return DD_OK;
291 }
292
293 HRESULT WINAPI
294 Main_IDirect3DDeviceImpl_7_3T_2T_1T_EndScene(LPDIRECT3DDEVICE7 iface)
295 {
296     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
297     TRACE("(%p/%p)->()\n", This, iface);
298     /* Nothing to do */
299     return DD_OK;
300 }
301
302 HRESULT WINAPI
303 Main_IDirect3DDeviceImpl_7_3T_2T_1T_GetDirect3D(LPDIRECT3DDEVICE7 iface,
304                                                 LPDIRECT3D7* lplpDirect3D3)
305 {
306     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
307     TRACE("(%p/%p)->(%p)\n", This, iface, lplpDirect3D3);
308
309     *lplpDirect3D3 = ICOM_INTERFACE(This->d3d, IDirect3D7);
310     IDirect3D7_AddRef(ICOM_INTERFACE(This->d3d, IDirect3D7));
311     
312     TRACE(" returning interface %p\n", *lplpDirect3D3);
313     return DD_OK;
314 }
315
316 HRESULT WINAPI
317 Main_IDirect3DDeviceImpl_7_3T_2T_SetRenderTarget(LPDIRECT3DDEVICE7 iface,
318                                                  LPDIRECTDRAWSURFACE7 lpNewRenderTarget,
319                                                  DWORD dwFlags)
320 {
321     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
322     IDirectDrawSurfaceImpl *target_impl = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, lpNewRenderTarget);
323
324     TRACE("(%p/%p)->(%p,%08lx)\n", This, iface, lpNewRenderTarget, dwFlags);
325     if (target_impl != This->surface) {
326         WARN(" Change of rendering target not handled yet !\n");
327     }
328     return DD_OK;
329 }
330
331 HRESULT WINAPI
332 Main_IDirect3DDeviceImpl_7_3T_2T_GetRenderTarget(LPDIRECT3DDEVICE7 iface,
333                                                  LPDIRECTDRAWSURFACE7* lplpRenderTarget)
334 {
335     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
336     TRACE("(%p/%p)->(%p)\n", This, iface, lplpRenderTarget);
337
338     *lplpRenderTarget = ICOM_INTERFACE(This->surface, IDirectDrawSurface7);
339     IDirectDrawSurface7_AddRef(ICOM_INTERFACE(This->surface, IDirectDrawSurface7));
340     
341     TRACE(" returning surface at %p.\n", *lplpRenderTarget);
342     
343     return DD_OK;
344 }
345
346 HRESULT WINAPI
347 Main_IDirect3DDeviceImpl_7_Clear(LPDIRECT3DDEVICE7 iface,
348                                  DWORD dwCount,
349                                  LPD3DRECT lpRects,
350                                  DWORD dwFlags,
351                                  D3DCOLOR dwColor,
352                                  D3DVALUE dvZ,
353                                  DWORD dwStencil)
354 {
355     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
356     TRACE("(%p/%p)->(%08lx,%p,%08lx,%08lx,%f,%08lx)\n", This, iface, dwCount, lpRects, dwFlags, (DWORD) dwColor, dvZ, dwStencil);
357     return This->clear(This, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil);
358 }
359
360 HRESULT WINAPI
361 Main_IDirect3DDeviceImpl_7_3T_2T_SetTransform(LPDIRECT3DDEVICE7 iface,
362                                               D3DTRANSFORMSTATETYPE dtstTransformStateType,
363                                               LPD3DMATRIX lpD3DMatrix)
364 {
365     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
366     DWORD matrix_changed = 0x00000000;
367
368     TRACE("(%p/%p)->(%08x,%p)\n", This, iface, dtstTransformStateType, lpD3DMatrix);
369
370     switch (dtstTransformStateType) {
371         case D3DTRANSFORMSTATE_WORLD: {
372             if (TRACE_ON(ddraw)) {
373                 TRACE(" D3DTRANSFORMSTATE_WORLD :\n"); dump_D3DMATRIX(lpD3DMatrix);
374             }
375             memcpy(This->world_mat, lpD3DMatrix, 16 * sizeof(float));
376             matrix_changed = WORLDMAT_CHANGED;
377         } break;
378
379         case D3DTRANSFORMSTATE_VIEW: {
380             if (TRACE_ON(ddraw)) {
381                 TRACE(" D3DTRANSFORMSTATE_VIEW :\n");  dump_D3DMATRIX(lpD3DMatrix);
382             }
383             memcpy(This->view_mat, lpD3DMatrix, 16 * sizeof(float));
384             matrix_changed = VIEWMAT_CHANGED;
385         } break;
386
387         case D3DTRANSFORMSTATE_PROJECTION: {
388             if (TRACE_ON(ddraw)) {
389                 TRACE(" D3DTRANSFORMSTATE_PROJECTION :\n");  dump_D3DMATRIX(lpD3DMatrix);
390             }
391             memcpy(This->proj_mat, lpD3DMatrix, 16 * sizeof(float));
392             matrix_changed = PROJMAT_CHANGED;
393         } break;
394
395         default:
396             ERR("Unknown transform type %08x !!!\n", dtstTransformStateType);
397             break;
398     }
399
400     if (matrix_changed != 0x00000000) This->matrices_updated(This, matrix_changed);
401
402     return DD_OK;
403 }
404
405 HRESULT WINAPI
406 Main_IDirect3DDeviceImpl_7_3T_2T_GetTransform(LPDIRECT3DDEVICE7 iface,
407                                               D3DTRANSFORMSTATETYPE dtstTransformStateType,
408                                               LPD3DMATRIX lpD3DMatrix)
409 {
410     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
411     TRACE("(%p/%p)->(%08x,%p)\n", This, iface, dtstTransformStateType, lpD3DMatrix);
412
413     switch (dtstTransformStateType) {
414         case D3DTRANSFORMSTATE_WORLD: {
415             if (TRACE_ON(ddraw)) {
416                 TRACE(" returning D3DTRANSFORMSTATE_WORLD :\n");
417                 dump_D3DMATRIX(lpD3DMatrix);
418             }
419             memcpy(lpD3DMatrix, This->world_mat, 16 * sizeof(D3DVALUE));
420         } break;
421
422         case D3DTRANSFORMSTATE_VIEW: {
423             if (TRACE_ON(ddraw)) {
424                 TRACE(" returning D3DTRANSFORMSTATE_VIEW :\n");
425                 dump_D3DMATRIX(lpD3DMatrix);
426             }
427             memcpy(lpD3DMatrix, This->world_mat, 16 * sizeof(D3DVALUE));
428         } break;
429
430         case D3DTRANSFORMSTATE_PROJECTION: {
431             if (TRACE_ON(ddraw)) {
432                 TRACE(" returning D3DTRANSFORMSTATE_PROJECTION :\n");
433                 dump_D3DMATRIX(lpD3DMatrix);
434             }
435             memcpy(lpD3DMatrix, This->world_mat, 16 * sizeof(D3DVALUE));
436         } break;
437
438         default:
439             ERR("Unknown transform type %08x !!!\n", dtstTransformStateType);
440             return DDERR_INVALIDPARAMS;
441     }
442
443     return DD_OK;
444 }
445
446 HRESULT WINAPI
447 Main_IDirect3DDeviceImpl_7_SetViewport(LPDIRECT3DDEVICE7 iface,
448                                        LPD3DVIEWPORT7 lpData)
449 {
450     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
451     TRACE("(%p/%p)->(%p)\n", This, iface, lpData);
452
453     if (TRACE_ON(ddraw)) {
454         TRACE(" viewport is : \n");
455         TRACE("    - dwX = %ld   dwY = %ld\n",
456               lpData->dwX, lpData->dwY);
457         TRACE("    - dwWidth = %ld   dwHeight = %ld\n",
458               lpData->dwWidth, lpData->dwHeight);
459         TRACE("    - dvMinZ = %f   dvMaxZ = %f\n",
460               lpData->dvMinZ, lpData->dvMaxZ);
461     }
462     This->active_viewport = *lpData;
463
464     return DD_OK;
465 }
466
467 HRESULT WINAPI
468 Main_IDirect3DDeviceImpl_7_3T_2T_MultiplyTransform(LPDIRECT3DDEVICE7 iface,
469                                                    D3DTRANSFORMSTATETYPE dtstTransformStateType,
470                                                    LPD3DMATRIX lpD3DMatrix)
471 {
472     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
473     FIXME("(%p/%p)->(%08x,%p): stub!\n", This, iface, dtstTransformStateType, lpD3DMatrix);
474     return DD_OK;
475 }
476
477 HRESULT WINAPI
478 Main_IDirect3DDeviceImpl_7_GetViewport(LPDIRECT3DDEVICE7 iface,
479                                        LPD3DVIEWPORT7 lpData)
480 {
481     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
482     TRACE("(%p/%p)->(%p)\n", This, iface, lpData);
483
484     *lpData = This->active_viewport;
485
486     if (TRACE_ON(ddraw)) {
487         TRACE(" returning viewport : \n");
488         TRACE("    - dwX = %ld   dwY = %ld\n",
489               lpData->dwX, lpData->dwY);
490         TRACE("    - dwWidth = %ld   dwHeight = %ld\n",
491               lpData->dwWidth, lpData->dwHeight);
492         TRACE("    - dvMinZ = %f   dvMaxZ = %f\n",
493               lpData->dvMinZ, lpData->dvMaxZ);
494     }
495
496     return DD_OK;
497 }
498
499 HRESULT WINAPI
500 Main_IDirect3DDeviceImpl_7_SetMaterial(LPDIRECT3DDEVICE7 iface,
501                                        LPD3DMATERIAL7 lpMat)
502 {
503     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
504     FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpMat);
505     return DD_OK;
506 }
507
508 HRESULT WINAPI
509 Main_IDirect3DDeviceImpl_7_GetMaterial(LPDIRECT3DDEVICE7 iface,
510                                        LPD3DMATERIAL7 lpMat)
511 {
512     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
513     TRACE("(%p/%p)->(%p)\n", This, iface, lpMat);
514     
515     *lpMat = This->current_material;
516
517     if (TRACE_ON(ddraw)) {
518         TRACE(" returning material : \n");
519         dump_D3DMATERIAL7(lpMat);
520     }
521
522     return DD_OK;
523 }
524
525 HRESULT WINAPI
526 Main_IDirect3DDeviceImpl_7_SetLight(LPDIRECT3DDEVICE7 iface,
527                                     DWORD dwLightIndex,
528                                     LPD3DLIGHT7 lpLight)
529 {
530     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
531     FIXME("(%p/%p)->(%08lx,%p): stub!\n", This, iface, dwLightIndex, lpLight);
532     return DD_OK;
533 }
534
535 HRESULT WINAPI
536 Main_IDirect3DDeviceImpl_7_GetLight(LPDIRECT3DDEVICE7 iface,
537                                     DWORD dwLightIndex,
538                                     LPD3DLIGHT7 lpLight)
539 {
540     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
541     TRACE("(%p/%p)->(%08lx,%p)\n", This, iface, dwLightIndex, lpLight);
542
543     if (dwLightIndex > MAX_LIGHTS) return DDERR_INVALIDPARAMS;
544     *lpLight = This->light_parameters[dwLightIndex];
545
546     if (TRACE_ON(ddraw)) {
547         TRACE(" returning light : \n");
548         dump_D3DLIGHT7(lpLight);
549     }
550
551     return DD_OK;
552 }
553
554 HRESULT WINAPI
555 Main_IDirect3DDeviceImpl_7_3T_2T_SetRenderState(LPDIRECT3DDEVICE7 iface,
556                                                 D3DRENDERSTATETYPE dwRenderStateType,
557                                                 DWORD dwRenderState)
558 {
559     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
560     FIXME("(%p/%p)->(%08x,%08lx): stub!\n", This, iface, dwRenderStateType, dwRenderState);
561     return DD_OK;
562 }
563
564 HRESULT WINAPI
565 Main_IDirect3DDeviceImpl_7_3T_2T_GetRenderState(LPDIRECT3DDEVICE7 iface,
566                                                 D3DRENDERSTATETYPE dwRenderStateType,
567                                                 LPDWORD lpdwRenderState)
568 {
569     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
570     FIXME("(%p/%p)->(%08x,%p): stub!\n", This, iface, dwRenderStateType, lpdwRenderState);
571     return DD_OK;
572 }
573
574 HRESULT WINAPI
575 Main_IDirect3DDeviceImpl_7_BeginStateBlock(LPDIRECT3DDEVICE7 iface)
576 {
577     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
578     FIXME("(%p/%p)->(): stub!\n", This, iface);
579     return DD_OK;
580 }
581
582 HRESULT WINAPI
583 Main_IDirect3DDeviceImpl_7_EndStateBlock(LPDIRECT3DDEVICE7 iface,
584                                          LPDWORD lpdwBlockHandle)
585 {
586     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
587     FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpdwBlockHandle);
588     return DD_OK;
589 }
590
591 HRESULT WINAPI
592 Main_IDirect3DDeviceImpl_7_PreLoad(LPDIRECT3DDEVICE7 iface,
593                                    LPDIRECTDRAWSURFACE7 lpddsTexture)
594 {
595     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
596     FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpddsTexture);
597     return DD_OK;
598 }
599
600 HRESULT WINAPI
601 Main_IDirect3DDeviceImpl_7_3T_DrawPrimitive(LPDIRECT3DDEVICE7 iface,
602                                             D3DPRIMITIVETYPE d3dptPrimitiveType,
603                                             DWORD d3dvtVertexType,
604                                             LPVOID lpvVertices,
605                                             DWORD dwVertexCount,
606                                             DWORD dwFlags)
607 {
608     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
609     FIXME("(%p/%p)->(%08x,%08lx,%p,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwVertexCount, dwFlags);
610     return DD_OK;
611 }
612
613 HRESULT WINAPI
614 Main_IDirect3DDeviceImpl_7_3T_DrawIndexedPrimitive(LPDIRECT3DDEVICE7 iface,
615                                                    D3DPRIMITIVETYPE d3dptPrimitiveType,
616                                                    DWORD d3dvtVertexType,
617                                                    LPVOID lpvVertices,
618                                                    DWORD dwVertexCount,
619                                                    LPWORD dwIndices,
620                                                    DWORD dwIndexCount,
621                                                    DWORD dwFlags)
622 {
623     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
624     FIXME("(%p/%p)->(%08x,%08lx,%p,%08lx,%p,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwVertexCount, dwIndices, dwIndexCount, dwFlags);
625     return DD_OK;
626 }
627
628 HRESULT WINAPI
629 Main_IDirect3DDeviceImpl_7_3T_2T_SetClipStatus(LPDIRECT3DDEVICE7 iface,
630                                                LPD3DCLIPSTATUS lpD3DClipStatus)
631 {
632     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
633     FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpD3DClipStatus);
634     return DD_OK;
635 }
636
637 HRESULT WINAPI
638 Main_IDirect3DDeviceImpl_7_3T_2T_GetClipStatus(LPDIRECT3DDEVICE7 iface,
639                                                LPD3DCLIPSTATUS lpD3DClipStatus)
640 {
641     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
642     FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpD3DClipStatus);
643     return DD_OK;
644 }
645
646 HRESULT WINAPI
647 Main_IDirect3DDeviceImpl_7_3T_DrawPrimitiveStrided(LPDIRECT3DDEVICE7 iface,
648                                                    D3DPRIMITIVETYPE d3dptPrimitiveType,
649                                                    DWORD dwVertexType,
650                                                    LPD3DDRAWPRIMITIVESTRIDEDDATA lpD3DDrawPrimStrideData,
651                                                    DWORD dwVertexCount,
652                                                    DWORD dwFlags)
653 {
654     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
655     FIXME("(%p/%p)->(%08x,%08lx,%p,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, dwVertexType, lpD3DDrawPrimStrideData, dwVertexCount, dwFlags);
656     return DD_OK;
657 }
658
659 HRESULT WINAPI
660 Main_IDirect3DDeviceImpl_7_3T_DrawIndexedPrimitiveStrided(LPDIRECT3DDEVICE7 iface,
661                                                           D3DPRIMITIVETYPE d3dptPrimitiveType,
662                                                           DWORD dwVertexType,
663                                                           LPD3DDRAWPRIMITIVESTRIDEDDATA lpD3DDrawPrimStrideData,
664                                                           DWORD dwVertexCount,
665                                                           LPWORD lpIndex,
666                                                           DWORD dwIndexCount,
667                                                           DWORD dwFlags)
668 {
669     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
670     FIXME("(%p/%p)->(%08x,%08lx,%p,%08lx,%p,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, dwVertexType, lpD3DDrawPrimStrideData, dwVertexCount, lpIndex, dwIndexCount, dwFlags);
671     return DD_OK;
672 }
673
674 HRESULT WINAPI
675 Main_IDirect3DDeviceImpl_7_3T_DrawPrimitiveVB(LPDIRECT3DDEVICE7 iface,
676                                               D3DPRIMITIVETYPE d3dptPrimitiveType,
677                                               LPDIRECT3DVERTEXBUFFER7 lpD3DVertexBuf,
678                                               DWORD dwStartVertex,
679                                               DWORD dwNumVertices,
680                                               DWORD dwFlags)
681 {
682     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
683     FIXME("(%p/%p)->(%08x,%p,%08lx,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, lpD3DVertexBuf, dwStartVertex, dwNumVertices, dwFlags);
684     return DD_OK;
685 }
686
687 HRESULT WINAPI
688 Main_IDirect3DDeviceImpl_7_3T_DrawIndexedPrimitiveVB(LPDIRECT3DDEVICE7 iface,
689                                                      D3DPRIMITIVETYPE d3dptPrimitiveType,
690                                                      LPDIRECT3DVERTEXBUFFER7 lpD3DVertexBuf,
691                                                      DWORD dwStartVertex,
692                                                      DWORD dwNumVertices,
693                                                      LPWORD lpwIndices,
694                                                      DWORD dwIndexCount,
695                                                      DWORD dwFlags)
696 {
697     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
698     FIXME("(%p/%p)->(%08x,%p,%08lx,%08lx,%p,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, lpD3DVertexBuf, dwStartVertex, dwNumVertices, lpwIndices, dwIndexCount, dwFlags);
699     return DD_OK;
700 }
701
702 HRESULT WINAPI
703 Main_IDirect3DDeviceImpl_7_3T_ComputeSphereVisibility(LPDIRECT3DDEVICE7 iface,
704                                                       LPD3DVECTOR lpCenters,
705                                                       LPD3DVALUE lpRadii,
706                                                       DWORD dwNumSpheres,
707                                                       DWORD dwFlags,
708                                                       LPDWORD lpdwReturnValues)
709 {
710     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
711     FIXME("(%p/%p)->(%p,%p,%08lx,%08lx,%p): stub!\n", This, iface, lpCenters, lpRadii, dwNumSpheres, dwFlags, lpdwReturnValues);
712     return DD_OK;
713 }
714
715 HRESULT WINAPI
716 Main_IDirect3DDeviceImpl_7_3T_GetTexture(LPDIRECT3DDEVICE7 iface,
717                                          DWORD dwStage,
718                                          LPDIRECTDRAWSURFACE7* lpTexture)
719 {
720     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
721     TRACE("(%p/%p)->(%08lx,%p)\n", This, iface, dwStage, lpTexture);
722
723     if (This->current_texture[dwStage] != NULL) {
724         *lpTexture = ICOM_INTERFACE(This->current_texture[dwStage], IDirectDrawSurface7);
725     } else {
726         *lpTexture = NULL;
727     }
728
729     TRACE(" returning interface at %p (for implementation at %p).\n", *lpTexture, This->current_texture[dwStage]);
730
731     /* Note: should this method increase the reference count for this ?? */
732
733     return DD_OK;
734 }
735
736 HRESULT WINAPI
737 Main_IDirect3DDeviceImpl_7_3T_SetTexture(LPDIRECT3DDEVICE7 iface,
738                                          DWORD dwStage,
739                                          LPDIRECTDRAWSURFACE7 lpTexture)
740 {
741     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
742     FIXME("(%p/%p)->(%08lx,%p): stub!\n", This, iface, dwStage, lpTexture);
743     return DD_OK;
744 }
745
746 HRESULT WINAPI
747 Main_IDirect3DDeviceImpl_7_3T_GetTextureStageState(LPDIRECT3DDEVICE7 iface,
748                                                    DWORD dwStage,
749                                                    D3DTEXTURESTAGESTATETYPE d3dTexStageStateType,
750                                                    LPDWORD lpdwState)
751 {
752     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
753     TRACE("(%p/%p)->(%08lx,%08x,%p)\n", This, iface, dwStage, d3dTexStageStateType, lpdwState);
754     if (lpdwState && (dwStage < 8) && d3dTexStageStateType && (d3dTexStageStateType < HIGHEST_TEXTURE_STAGE_STATE) ) {
755         *lpdwState = This->state_block.texture_stage_state[dwStage][d3dTexStageStateType-1];
756         return DD_OK;
757     }
758     return DDERR_INVALIDPARAMS;
759 }
760
761 HRESULT WINAPI
762 Main_IDirect3DDeviceImpl_7_3T_SetTextureStageState(LPDIRECT3DDEVICE7 iface,
763                                                    DWORD dwStage,
764                                                    D3DTEXTURESTAGESTATETYPE d3dTexStageStateType,
765                                                    DWORD dwState)
766 {
767     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
768     FIXME("(%p/%p)->(%08lx,%08x,%08lx): stub!\n", This, iface, dwStage, d3dTexStageStateType, dwState);
769     return DD_OK;
770 }
771
772 HRESULT WINAPI
773 Main_IDirect3DDeviceImpl_7_3T_ValidateDevice(LPDIRECT3DDEVICE7 iface,
774                                              LPDWORD lpdwPasses)
775 {
776     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
777     FIXME("(%p/%p)->(%p): semi-stub!\n", This, iface, lpdwPasses);
778
779     /* For the moment, we have a VERY good hardware which does everything in one pass :-) */
780     *lpdwPasses = 1;
781
782     return DD_OK;
783 }
784
785 HRESULT WINAPI
786 Main_IDirect3DDeviceImpl_7_ApplyStateBlock(LPDIRECT3DDEVICE7 iface,
787                                            DWORD dwBlockHandle)
788 {
789     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
790     FIXME("(%p/%p)->(%08lx): stub!\n", This, iface, dwBlockHandle);
791     return DD_OK;
792 }
793
794 HRESULT WINAPI
795 Main_IDirect3DDeviceImpl_7_CaptureStateBlock(LPDIRECT3DDEVICE7 iface,
796                                              DWORD dwBlockHandle)
797 {
798     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
799     FIXME("(%p/%p)->(%08lx): stub!\n", This, iface, dwBlockHandle);
800     return DD_OK;
801 }
802
803 HRESULT WINAPI
804 Main_IDirect3DDeviceImpl_7_DeleteStateBlock(LPDIRECT3DDEVICE7 iface,
805                                             DWORD dwBlockHandle)
806 {
807     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
808     FIXME("(%p/%p)->(%08lx): stub!\n", This, iface, dwBlockHandle);
809     return DD_OK;
810 }
811
812 HRESULT WINAPI
813 Main_IDirect3DDeviceImpl_7_CreateStateBlock(LPDIRECT3DDEVICE7 iface,
814                                             D3DSTATEBLOCKTYPE d3dsbType,
815                                             LPDWORD lpdwBlockHandle)
816 {
817     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
818     FIXME("(%p/%p)->(%08x,%p): stub!\n", This, iface, d3dsbType, lpdwBlockHandle);
819     return DD_OK;
820 }
821
822 HRESULT WINAPI
823 Main_IDirect3DDeviceImpl_7_Load(LPDIRECT3DDEVICE7 iface,
824                                 LPDIRECTDRAWSURFACE7 lpDestTex,
825                                 LPPOINT lpDestPoint,
826                                 LPDIRECTDRAWSURFACE7 lpSrcTex,
827                                 LPRECT lprcSrcRect,
828                                 DWORD dwFlags)
829 {
830     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
831     FIXME("(%p/%p)->(%p,%p,%p,%p,%08lx): stub!\n", This, iface, lpDestTex, lpDestPoint, lpSrcTex, lprcSrcRect, dwFlags);
832     return DD_OK;
833 }
834
835 HRESULT WINAPI
836 Main_IDirect3DDeviceImpl_7_LightEnable(LPDIRECT3DDEVICE7 iface,
837                                        DWORD dwLightIndex,
838                                        BOOL bEnable)
839 {
840     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
841     FIXME("(%p/%p)->(%08lx,%d): stub!\n", This, iface, dwLightIndex, bEnable);
842     return DD_OK;
843 }
844
845 HRESULT WINAPI
846 Main_IDirect3DDeviceImpl_7_GetLightEnable(LPDIRECT3DDEVICE7 iface,
847                                           DWORD dwLightIndex,
848                                           BOOL* pbEnable)
849 {
850     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
851     TRACE("(%p/%p)->(%08lx,%p)\n", This, iface, dwLightIndex, pbEnable);
852
853     if (dwLightIndex > MAX_LIGHTS) *pbEnable = 0;
854     else *pbEnable = ((0x00000001 << dwLightIndex) & This->active_lights) != 0;
855     
856     TRACE(" returning %d.\n", *pbEnable);
857
858     return DD_OK;
859 }
860
861 HRESULT WINAPI
862 Main_IDirect3DDeviceImpl_7_SetClipPlane(LPDIRECT3DDEVICE7 iface,
863                                         DWORD dwIndex,
864                                         D3DVALUE* pPlaneEquation)
865 {
866     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
867     FIXME("(%p/%p)->(%08lx,%p): stub!\n", This, iface, dwIndex, pPlaneEquation);
868     return DD_OK;
869 }
870
871 HRESULT  WINAPI  
872 Main_IDirect3DDeviceImpl_7_GetClipPlane(LPDIRECT3DDEVICE7 iface, DWORD dwIndex, D3DVALUE* pPlaneEquation)
873 {
874     ICOM_THIS(IDirect3DDeviceImpl,iface);
875
876     TRACE("(%p)->(%ld,%p)\n", This, dwIndex, pPlaneEquation);
877
878     if (dwIndex>=This->max_clipping_planes) {
879         return DDERR_INVALIDPARAMS;
880     }
881
882     memcpy( pPlaneEquation, This->clipping_planes[dwIndex].plane, sizeof(D3DVALUE[4]));
883
884     return D3D_OK;
885 }
886
887 HRESULT WINAPI
888 Main_IDirect3DDeviceImpl_7_GetInfo(LPDIRECT3DDEVICE7 iface,
889                                    DWORD dwDevInfoID,
890                                    LPVOID pDevInfoStruct,
891                                    DWORD dwSize)
892 {
893     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
894     TRACE("(%p/%p)->(%08lx,%p,%08lx)\n", This, iface, dwDevInfoID, pDevInfoStruct, dwSize);
895
896     if (TRACE_ON(ddraw)) {
897         TRACE(" info requested : ");
898         switch (dwDevInfoID) {
899             case D3DDEVINFOID_TEXTUREMANAGER: DPRINTF("D3DDEVINFOID_TEXTUREMANAGER\n"); break;
900             case D3DDEVINFOID_D3DTEXTUREMANAGER: DPRINTF("D3DDEVINFOID_D3DTEXTUREMANAGER\n"); break;
901             case D3DDEVINFOID_TEXTURING: DPRINTF("D3DDEVINFOID_TEXTURING\n"); break;
902             default: ERR(" invalid flag !!!\n"); return DDERR_INVALIDPARAMS;
903         }
904     }
905
906     return S_FALSE; /* According to MSDN, this is valid for a non-debug driver */
907 }
908
909 HRESULT WINAPI
910 Main_IDirect3DDeviceImpl_3_2T_1T_GetCaps(LPDIRECT3DDEVICE3 iface,
911                                          LPD3DDEVICEDESC lpD3DHWDevDesc,
912                                          LPD3DDEVICEDESC lpD3DHELDevDesc)
913 {
914     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
915     FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpD3DHWDevDesc, lpD3DHELDevDesc);
916     return DD_OK;
917 }
918
919 HRESULT WINAPI
920 Main_IDirect3DDeviceImpl_3_2T_1T_GetStats(LPDIRECT3DDEVICE3 iface,
921                                           LPD3DSTATS lpD3DStats)
922 {
923     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
924     FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpD3DStats);
925     return DD_OK;
926 }
927
928 HRESULT WINAPI
929 Main_IDirect3DDeviceImpl_3_2T_1T_AddViewport(LPDIRECT3DDEVICE3 iface,
930                                              LPDIRECT3DVIEWPORT3 lpDirect3DViewport3)
931 {
932     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
933     IDirect3DViewportImpl *lpDirect3DViewportImpl = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, lpDirect3DViewport3);
934     
935     TRACE("(%p/%p)->(%p)\n", This, iface, lpDirect3DViewport3);
936
937     lpDirect3DViewportImpl->next = This->viewport_list;
938     This->viewport_list = lpDirect3DViewportImpl;
939     
940     return DD_OK;
941 }
942
943 HRESULT WINAPI
944 Main_IDirect3DDeviceImpl_3_2T_1T_DeleteViewport(LPDIRECT3DDEVICE3 iface,
945                                                 LPDIRECT3DVIEWPORT3 lpDirect3DViewport3)
946 {
947     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
948     IDirect3DViewportImpl *lpDirect3DViewportImpl = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, lpDirect3DViewport3);
949     IDirect3DViewportImpl *cur_viewport, *prev_viewport = NULL;
950   
951     TRACE("(%p/%p)->(%p)\n", This, iface, lpDirect3DViewport3);
952
953     cur_viewport = This->viewport_list;
954     while (cur_viewport != NULL) {
955         if (cur_viewport == lpDirect3DViewportImpl) {
956             if (prev_viewport == NULL) This->viewport_list = cur_viewport->next;
957             else prev_viewport->next = cur_viewport->next;
958             /* TODO : add desactivate of the viewport and all associated lights... */
959             return DD_OK;
960         }
961         prev_viewport = cur_viewport;
962         cur_viewport = cur_viewport->next;
963     }
964     
965     return DDERR_INVALIDPARAMS;
966 }
967
968 HRESULT WINAPI
969 Main_IDirect3DDeviceImpl_3_2T_1T_NextViewport(LPDIRECT3DDEVICE3 iface,
970                                               LPDIRECT3DVIEWPORT3 lpDirect3DViewport3,
971                                               LPDIRECT3DVIEWPORT3* lplpDirect3DViewport3,
972                                               DWORD dwFlags)
973 {
974     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
975     IDirect3DViewportImpl *res = NULL;
976
977     TRACE("(%p/%p)->(%p,%p,%08lx)\n", This, iface, lpDirect3DViewport3, lplpDirect3DViewport3, dwFlags);
978     
979     switch (dwFlags) {
980         case D3DNEXT_NEXT: {
981             IDirect3DViewportImpl *lpDirect3DViewportImpl = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, lpDirect3DViewport3);
982             res = lpDirect3DViewportImpl->next;
983         } break;
984         case D3DNEXT_HEAD: {
985             res = This->viewport_list;
986         } break;
987         case D3DNEXT_TAIL: {
988             IDirect3DViewportImpl *cur_viewport = This->viewport_list;
989             if (cur_viewport != NULL) {
990                 while (cur_viewport->next != NULL) cur_viewport = cur_viewport->next;
991             }
992             res = cur_viewport;
993         } break;
994         default:
995             *lplpDirect3DViewport3 = NULL;
996             return DDERR_INVALIDPARAMS;
997     }
998     *lplpDirect3DViewport3 = ICOM_INTERFACE(res, IDirect3DViewport3);
999     return DD_OK;
1000 }
1001
1002 HRESULT WINAPI
1003 Main_IDirect3DDeviceImpl_3_2T_SetCurrentViewport(LPDIRECT3DDEVICE3 iface,
1004                                                  LPDIRECT3DVIEWPORT3 lpDirect3DViewport3)
1005 {
1006     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
1007     TRACE("(%p/%p)->(%p)\n", This, iface, lpDirect3DViewport3);
1008
1009     /* Should check if the viewport was added or not */
1010
1011     /* Set this viewport as the current viewport */
1012     This->current_viewport = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, lpDirect3DViewport3);
1013
1014     /* Activate this viewport */
1015     This->current_viewport->active_device = This;
1016     This->current_viewport->activate(This->current_viewport);    
1017     
1018     /* And copy the values in the structure used by the device */
1019     if (This->current_viewport->use_vp2) {
1020         This->active_viewport.dwX = This->current_viewport->viewports.vp2.dwX;
1021         This->active_viewport.dwY = This->current_viewport->viewports.vp2.dwY;
1022         This->active_viewport.dwHeight = This->current_viewport->viewports.vp2.dwHeight;
1023         This->active_viewport.dwWidth = This->current_viewport->viewports.vp2.dwWidth;
1024         This->active_viewport.dvMinZ = This->current_viewport->viewports.vp2.dvMinZ;
1025         This->active_viewport.dvMaxZ = This->current_viewport->viewports.vp2.dvMaxZ;
1026     } else {
1027         This->active_viewport.dwX = This->current_viewport->viewports.vp1.dwX;
1028         This->active_viewport.dwY = This->current_viewport->viewports.vp1.dwY;
1029         This->active_viewport.dwHeight = This->current_viewport->viewports.vp1.dwHeight;
1030         This->active_viewport.dwWidth = This->current_viewport->viewports.vp1.dwWidth;
1031         This->active_viewport.dvMinZ = This->current_viewport->viewports.vp1.dvMinZ;
1032         This->active_viewport.dvMaxZ = This->current_viewport->viewports.vp1.dvMaxZ;
1033     }
1034
1035     return DD_OK;
1036 }
1037
1038 HRESULT WINAPI
1039 Main_IDirect3DDeviceImpl_3_2T_GetCurrentViewport(LPDIRECT3DDEVICE3 iface,
1040                                                  LPDIRECT3DVIEWPORT3* lplpDirect3DViewport3)
1041 {
1042     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
1043     TRACE("(%p/%p)->(%p)\n", This, iface, lplpDirect3DViewport3);
1044
1045     *lplpDirect3DViewport3 = ICOM_INTERFACE(This->current_viewport, IDirect3DViewport3);
1046     TRACE(" returning interface %p\n", *lplpDirect3DViewport3);
1047     
1048     return DD_OK;
1049 }
1050
1051 HRESULT WINAPI
1052 Main_IDirect3DDeviceImpl_3_Begin(LPDIRECT3DDEVICE3 iface,
1053                                  D3DPRIMITIVETYPE d3dptPrimitiveType,
1054                                  DWORD dwVertexTypeDesc,
1055                                  DWORD dwFlags)
1056 {
1057     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
1058     FIXME("(%p/%p)->(%08x,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, dwVertexTypeDesc, dwFlags);
1059     return DD_OK;
1060 }
1061
1062 HRESULT WINAPI
1063 Main_IDirect3DDeviceImpl_3_BeginIndexed(LPDIRECT3DDEVICE3 iface,
1064                                         D3DPRIMITIVETYPE d3dptPrimitiveType,
1065                                         DWORD d3dvtVertexType,
1066                                         LPVOID lpvVertices,
1067                                         DWORD dwNumVertices,
1068                                         DWORD dwFlags)
1069 {
1070     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
1071     FIXME("(%p/%p)->(%08x,%08lx,%p,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwNumVertices, dwFlags);
1072     return DD_OK;
1073 }
1074
1075 HRESULT WINAPI
1076 Main_IDirect3DDeviceImpl_3_2T_Vertex(LPDIRECT3DDEVICE3 iface,
1077                                      LPVOID lpVertexType)
1078 {
1079     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
1080     FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpVertexType);
1081     return DD_OK;
1082 }
1083
1084 HRESULT WINAPI
1085 Main_IDirect3DDeviceImpl_3_2T_Index(LPDIRECT3DDEVICE3 iface,
1086                                     WORD wVertexIndex)
1087 {
1088     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
1089     FIXME("(%p/%p)->(%04x): stub!\n", This, iface, wVertexIndex);
1090     return DD_OK;
1091 }
1092
1093 HRESULT WINAPI
1094 Main_IDirect3DDeviceImpl_3_2T_End(LPDIRECT3DDEVICE3 iface,
1095                                   DWORD dwFlags)
1096 {
1097     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
1098     FIXME("(%p/%p)->(%08lx): stub!\n", This, iface, dwFlags);
1099     return DD_OK;
1100 }
1101
1102 HRESULT WINAPI
1103 Main_IDirect3DDeviceImpl_3_2T_GetLightState(LPDIRECT3DDEVICE3 iface,
1104                                             D3DLIGHTSTATETYPE dwLightStateType,
1105                                             LPDWORD lpdwLightState)
1106 {
1107     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
1108     FIXME("(%p/%p)->(%08x,%p): stub !\n", This, iface, dwLightStateType, lpdwLightState);
1109     return DD_OK;
1110 }
1111
1112 HRESULT WINAPI
1113 Main_IDirect3DDeviceImpl_3_2T_SetLightState(LPDIRECT3DDEVICE3 iface,
1114                                             D3DLIGHTSTATETYPE dwLightStateType,
1115                                             DWORD dwLightState)
1116 {
1117     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
1118     FIXME("(%p/%p)->(%08x,%08lx): stub!\n", This, iface, dwLightStateType, dwLightState);
1119     return DD_OK;
1120 }
1121
1122 HRESULT WINAPI
1123 Main_IDirect3DDeviceImpl_2_1T_SwapTextureHandles(LPDIRECT3DDEVICE2 iface,
1124                                                  LPDIRECT3DTEXTURE2 lpD3DTex1,
1125                                                  LPDIRECT3DTEXTURE2 lpD3DTex2)
1126 {
1127     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
1128     IDirectDrawSurfaceImpl tmp,*surf1,*surf2;
1129     TRACE("(%p/%p)->(%p,%p):\n", This, iface, lpD3DTex1, lpD3DTex2);
1130
1131     surf1 = ICOM_OBJECT(IDirectDrawSurfaceImpl,IDirect3DTexture2,lpD3DTex1);
1132     surf2 = ICOM_OBJECT(IDirectDrawSurfaceImpl,IDirect3DTexture2,lpD3DTex2);
1133     tmp = *surf1;
1134     *surf1 = *surf2;
1135     *surf2 = tmp;
1136     
1137     return DD_OK;
1138 }
1139
1140 HRESULT WINAPI
1141 Main_IDirect3DDeviceImpl_2_NextViewport(LPDIRECT3DDEVICE2 iface,
1142                                         LPDIRECT3DVIEWPORT2 lpDirect3DViewport2,
1143                                         LPDIRECT3DVIEWPORT2* lplpDirect3DViewport2,
1144                                         DWORD dwFlags)
1145 {
1146     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
1147     FIXME("(%p/%p)->(%p,%p,%08lx): stub!\n", This, iface, lpDirect3DViewport2, lplpDirect3DViewport2, dwFlags);
1148     return DD_OK;
1149 }
1150
1151 HRESULT WINAPI
1152 Main_IDirect3DDeviceImpl_2_1T_EnumTextureFormats(LPDIRECT3DDEVICE2 iface,
1153                                                  LPD3DENUMTEXTUREFORMATSCALLBACK lpD3DEnumTextureProc,
1154                                                  LPVOID lpArg)
1155 {
1156     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
1157     FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpD3DEnumTextureProc, lpArg);
1158     return DD_OK;
1159 }
1160
1161 HRESULT WINAPI
1162 Main_IDirect3DDeviceImpl_2_Begin(LPDIRECT3DDEVICE2 iface,
1163                                  D3DPRIMITIVETYPE d3dpt,
1164                                  D3DVERTEXTYPE dwVertexTypeDesc,
1165                                  DWORD dwFlags)
1166 {
1167     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
1168     FIXME("(%p/%p)->(%08x,%08x,%08lx): stub!\n", This, iface, d3dpt, dwVertexTypeDesc, dwFlags);
1169     return DD_OK;
1170 }
1171
1172 HRESULT WINAPI
1173 Main_IDirect3DDeviceImpl_2_BeginIndexed(LPDIRECT3DDEVICE2 iface,
1174                                         D3DPRIMITIVETYPE d3dptPrimitiveType,
1175                                         D3DVERTEXTYPE d3dvtVertexType,
1176                                         LPVOID lpvVertices,
1177                                         DWORD dwNumVertices,
1178                                         DWORD dwFlags)
1179 {
1180     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
1181     FIXME("(%p/%p)->(%08x,%08x,%p,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwNumVertices, dwFlags);
1182     return DD_OK;
1183 }
1184
1185 HRESULT WINAPI
1186 Main_IDirect3DDeviceImpl_2_DrawPrimitive(LPDIRECT3DDEVICE2 iface,
1187                                          D3DPRIMITIVETYPE d3dptPrimitiveType,
1188                                          D3DVERTEXTYPE d3dvtVertexType,
1189                                          LPVOID lpvVertices,
1190                                          DWORD dwVertexCount,
1191                                          DWORD dwFlags)
1192 {
1193     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
1194     FIXME("(%p/%p)->(%08x,%08x,%p,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwVertexCount, dwFlags);
1195     return DD_OK;
1196 }
1197
1198 HRESULT WINAPI
1199 Main_IDirect3DDeviceImpl_2_DrawIndexedPrimitive(LPDIRECT3DDEVICE2 iface,
1200                                                 D3DPRIMITIVETYPE d3dptPrimitiveType,
1201                                                 D3DVERTEXTYPE d3dvtVertexType,
1202                                                 LPVOID lpvVertices,
1203                                                 DWORD dwVertexCount,
1204                                                 LPWORD dwIndices,
1205                                                 DWORD dwIndexCount,
1206                                                 DWORD dwFlags)
1207 {
1208     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
1209     FIXME("(%p/%p)->(%08x,%08x,%p,%08lx,%p,%08lx,%08lx): stub!\n", This, iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwVertexCount, dwIndices, dwIndexCount, dwFlags);
1210     return DD_OK;
1211 }
1212
1213 HRESULT WINAPI
1214 Main_IDirect3DDeviceImpl_1_Initialize(LPDIRECT3DDEVICE iface,
1215                                       LPDIRECT3D lpDirect3D,
1216                                       LPGUID lpGUID,
1217                                       LPD3DDEVICEDESC lpD3DDVDesc)
1218 {
1219     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
1220     FIXME("(%p/%p)->(%p,%p,%p): stub!\n", This, iface, lpDirect3D, lpGUID, lpD3DDVDesc);
1221     return DD_OK;
1222 }
1223
1224 HRESULT WINAPI
1225 Main_IDirect3DDeviceImpl_1_CreateExecuteBuffer(LPDIRECT3DDEVICE iface,
1226                                                LPD3DEXECUTEBUFFERDESC lpDesc,
1227                                                LPDIRECT3DEXECUTEBUFFER* lplpDirect3DExecuteBuffer,
1228                                                IUnknown* pUnkOuter)
1229 {
1230     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
1231     FIXME("(%p/%p)->(%p,%p,%p): stub!\n", This, iface, lpDesc, lplpDirect3DExecuteBuffer, pUnkOuter);
1232     return DD_OK;
1233 }
1234
1235 HRESULT WINAPI
1236 Main_IDirect3DDeviceImpl_1_Execute(LPDIRECT3DDEVICE iface,
1237                                    LPDIRECT3DEXECUTEBUFFER lpDirect3DExecuteBuffer,
1238                                    LPDIRECT3DVIEWPORT lpDirect3DViewport,
1239                                    DWORD dwFlags)
1240 {
1241     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
1242     IDirect3DExecuteBufferImpl *lpDirect3DExecuteBufferImpl = ICOM_OBJECT(IDirect3DExecuteBufferImpl, IDirect3DExecuteBuffer, lpDirect3DExecuteBuffer);
1243     IDirect3DViewportImpl *lpDirect3DViewportImpl = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, lpDirect3DViewport);
1244     
1245     TRACE("(%p/%p)->(%p,%p,%08lx)\n", This, iface, lpDirect3DExecuteBuffer, lpDirect3DViewport, dwFlags);
1246
1247     /* Put this as the default context */
1248
1249     /* Execute... */
1250     lpDirect3DExecuteBufferImpl->execute(lpDirect3DExecuteBufferImpl, This, lpDirect3DViewportImpl);
1251
1252     return DD_OK;
1253 }
1254
1255 HRESULT WINAPI
1256 Main_IDirect3DDeviceImpl_1_NextViewport(LPDIRECT3DDEVICE iface,
1257                                         LPDIRECT3DVIEWPORT lpDirect3DViewport,
1258                                         LPDIRECT3DVIEWPORT* lplpDirect3DViewport,
1259                                         DWORD dwFlags)
1260 {
1261     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
1262     FIXME("(%p/%p)->(%p,%p,%08lx): stub!\n", This, iface, lpDirect3DViewport, lplpDirect3DViewport, dwFlags);
1263     return DD_OK;
1264 }
1265
1266 HRESULT WINAPI
1267 Main_IDirect3DDeviceImpl_1_Pick(LPDIRECT3DDEVICE iface,
1268                                 LPDIRECT3DEXECUTEBUFFER lpDirect3DExecuteBuffer,
1269                                 LPDIRECT3DVIEWPORT lpDirect3DViewport,
1270                                 DWORD dwFlags,
1271                                 LPD3DRECT lpRect)
1272 {
1273     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
1274     FIXME("(%p/%p)->(%p,%p,%08lx,%p): stub!\n", This, iface, lpDirect3DExecuteBuffer, lpDirect3DViewport, dwFlags, lpRect);
1275     return DD_OK;
1276 }
1277
1278 HRESULT WINAPI
1279 Main_IDirect3DDeviceImpl_1_GetPickRecords(LPDIRECT3DDEVICE iface,
1280                                           LPDWORD lpCount,
1281                                           LPD3DPICKRECORD lpD3DPickRec)
1282 {
1283     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
1284     FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpCount, lpD3DPickRec);
1285     return DD_OK;
1286 }
1287
1288 HRESULT WINAPI
1289 Main_IDirect3DDeviceImpl_1_CreateMatrix(LPDIRECT3DDEVICE iface,
1290                                         LPD3DMATRIXHANDLE lpD3DMatHandle)
1291 {
1292     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
1293     TRACE("(%p/%p)->(%p)\n", This, iface, lpD3DMatHandle);
1294
1295     *lpD3DMatHandle = (D3DMATRIXHANDLE) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(D3DMATRIX));
1296     TRACE(" returning matrix handle %p\n", (void *) *lpD3DMatHandle);
1297     
1298     return DD_OK;
1299 }
1300
1301 HRESULT WINAPI
1302 Main_IDirect3DDeviceImpl_1_SetMatrix(LPDIRECT3DDEVICE iface,
1303                                      D3DMATRIXHANDLE D3DMatHandle,
1304                                      LPD3DMATRIX lpD3DMatrix)
1305 {
1306     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
1307     TRACE("(%p/%p)->(%08lx,%p)\n", This, iface, (DWORD) D3DMatHandle, lpD3DMatrix);
1308
1309     dump_D3DMATRIX(lpD3DMatrix);
1310     *((D3DMATRIX *) D3DMatHandle) = *lpD3DMatrix;   
1311     
1312     return DD_OK;
1313 }
1314
1315 HRESULT WINAPI
1316 Main_IDirect3DDeviceImpl_1_GetMatrix(LPDIRECT3DDEVICE iface,
1317                                      D3DMATRIXHANDLE D3DMatHandle,
1318                                      LPD3DMATRIX lpD3DMatrix)
1319 {
1320     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
1321     TRACE("(%p/%p)->(%08lx,%p)\n", This, iface, (DWORD) D3DMatHandle, lpD3DMatrix);
1322
1323     *lpD3DMatrix = *((D3DMATRIX *) D3DMatHandle);
1324     
1325     return DD_OK;
1326 }
1327
1328 HRESULT WINAPI
1329 Main_IDirect3DDeviceImpl_1_DeleteMatrix(LPDIRECT3DDEVICE iface,
1330                                         D3DMATRIXHANDLE D3DMatHandle)
1331 {
1332     ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
1333     TRACE("(%p/%p)->(%08lx)\n", This, iface, (DWORD) D3DMatHandle);
1334
1335     HeapFree(GetProcessHeap(), 0, (void *) D3DMatHandle);
1336     
1337     return DD_OK;
1338 }
1339
1340 HRESULT WINAPI
1341 Thunk_IDirect3DDeviceImpl_3_QueryInterface(LPDIRECT3DDEVICE3 iface,
1342                                            REFIID riid,
1343                                            LPVOID* obp)
1344 {
1345     TRACE("(%p)->(%s,%p) thunking to IDirect3DDevice7 interface.\n", iface, debugstr_guid(riid), obp);
1346     return IDirect3DDevice7_QueryInterface(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1347                                            riid,
1348                                            obp);
1349 }
1350
1351 HRESULT WINAPI
1352 Thunk_IDirect3DDeviceImpl_2_QueryInterface(LPDIRECT3DDEVICE2 iface,
1353                                            REFIID riid,
1354                                            LPVOID* obp)
1355 {
1356     TRACE("(%p)->(%s,%p) thunking to IDirect3DDevice7 interface.\n", iface, debugstr_guid(riid), obp);
1357     return IDirect3DDevice7_QueryInterface(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1358                                            riid,
1359                                            obp);
1360 }
1361
1362 HRESULT WINAPI
1363 Thunk_IDirect3DDeviceImpl_1_QueryInterface(LPDIRECT3DDEVICE iface,
1364                                            REFIID riid,
1365                                            LPVOID* obp)
1366 {
1367     TRACE("(%p)->(%s,%p) thunking to IDirect3DDevice7 interface.\n", iface, debugstr_guid(riid), obp);
1368     return IDirect3DDevice7_QueryInterface(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice7, iface),
1369                                            riid,
1370                                            obp);
1371 }
1372
1373 ULONG WINAPI
1374 Thunk_IDirect3DDeviceImpl_3_AddRef(LPDIRECT3DDEVICE3 iface)
1375 {
1376     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1377     return IDirect3DDevice7_AddRef(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface));
1378 }
1379
1380 ULONG WINAPI
1381 Thunk_IDirect3DDeviceImpl_2_AddRef(LPDIRECT3DDEVICE2 iface)
1382 {
1383     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1384     return IDirect3DDevice7_AddRef(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface));
1385 }
1386
1387 ULONG WINAPI
1388 Thunk_IDirect3DDeviceImpl_1_AddRef(LPDIRECT3DDEVICE iface)
1389 {
1390     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1391     return IDirect3DDevice7_AddRef(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice7, iface));
1392 }
1393
1394 ULONG WINAPI
1395 Thunk_IDirect3DDeviceImpl_3_Release(LPDIRECT3DDEVICE3 iface)
1396 {
1397     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1398     return IDirect3DDevice7_Release(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface));
1399 }
1400
1401 ULONG WINAPI
1402 Thunk_IDirect3DDeviceImpl_2_Release(LPDIRECT3DDEVICE2 iface)
1403 {
1404     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1405     return IDirect3DDevice7_Release(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface));
1406 }
1407
1408 ULONG WINAPI
1409 Thunk_IDirect3DDeviceImpl_1_Release(LPDIRECT3DDEVICE iface)
1410 {
1411     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1412     return IDirect3DDevice7_Release(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice7, iface));
1413 }
1414
1415 HRESULT WINAPI
1416 Thunk_IDirect3DDeviceImpl_2_AddViewport(LPDIRECT3DDEVICE2 iface,
1417                                         LPDIRECT3DVIEWPORT2 lpDirect3DViewport2)
1418 {
1419     TRACE("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", iface, lpDirect3DViewport2);
1420     return IDirect3DDevice3_AddViewport(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1421                                         (LPDIRECT3DVIEWPORT3) lpDirect3DViewport2 /* No need to cast here as all interfaces are equivalent */);
1422 }
1423
1424 HRESULT WINAPI
1425 Thunk_IDirect3DDeviceImpl_1_AddViewport(LPDIRECT3DDEVICE iface,
1426                                         LPDIRECT3DVIEWPORT lpDirect3DViewport)
1427 {
1428     TRACE("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", iface, lpDirect3DViewport);
1429     return IDirect3DDevice3_AddViewport(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice3, iface),
1430                                         (LPDIRECT3DVIEWPORT3) lpDirect3DViewport /* No need to cast here as all interfaces are equivalent */);
1431 }
1432
1433 HRESULT WINAPI
1434 Thunk_IDirect3DDeviceImpl_2_DeleteViewport(LPDIRECT3DDEVICE2 iface,
1435                                            LPDIRECT3DVIEWPORT2 lpDirect3DViewport2)
1436 {
1437     TRACE("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", iface, lpDirect3DViewport2);
1438     return IDirect3DDevice3_DeleteViewport(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1439                                            (LPDIRECT3DVIEWPORT3) lpDirect3DViewport2 /* No need to cast here as all interfaces are equivalent */);
1440 }
1441
1442 HRESULT WINAPI
1443 Thunk_IDirect3DDeviceImpl_1_DeleteViewport(LPDIRECT3DDEVICE iface,
1444                                            LPDIRECT3DVIEWPORT lpDirect3DViewport)
1445 {
1446     TRACE("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", iface, lpDirect3DViewport);
1447     return IDirect3DDevice3_DeleteViewport(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice3, iface),
1448                                            (LPDIRECT3DVIEWPORT3) lpDirect3DViewport /* No need to cast here as all interfaces are equivalent */);
1449 }
1450
1451 HRESULT WINAPI
1452 Thunk_IDirect3DDeviceImpl_2_NextViewport(LPDIRECT3DDEVICE3 iface,
1453                                          LPDIRECT3DVIEWPORT2 lpDirect3DViewport2,
1454                                          LPDIRECT3DVIEWPORT2* lplpDirect3DViewport2,
1455                                          DWORD dwFlags)
1456 {
1457     TRACE("(%p)->(%p,%p,%08lx) thunking to IDirect3DDevice3 interface.\n", iface, lpDirect3DViewport2, lplpDirect3DViewport2, dwFlags);
1458     return IDirect3DDevice3_NextViewport(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1459                                          (LPDIRECT3DVIEWPORT3) lpDirect3DViewport2 /* No need to cast here as all interfaces are equivalent */,
1460                                          (LPDIRECT3DVIEWPORT3*) lplpDirect3DViewport2,
1461                                          dwFlags);
1462 }
1463
1464 HRESULT WINAPI
1465 Thunk_IDirect3DDeviceImpl_1_NextViewport(LPDIRECT3DDEVICE3 iface,
1466                                          LPDIRECT3DVIEWPORT lpDirect3DViewport,
1467                                          LPDIRECT3DVIEWPORT* lplpDirect3DViewport,
1468                                          DWORD dwFlags)
1469 {
1470     TRACE("(%p)->(%p,%p,%08lx) thunking to IDirect3DDevice3 interface.\n", iface, lpDirect3DViewport, lplpDirect3DViewport, dwFlags);
1471     return IDirect3DDevice3_NextViewport(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice3, iface),
1472                                          (LPDIRECT3DVIEWPORT3) lpDirect3DViewport /* No need to cast here as all interfaces are equivalent */,
1473                                          (LPDIRECT3DVIEWPORT3*) lplpDirect3DViewport,
1474                                          dwFlags);
1475 }
1476
1477 HRESULT WINAPI
1478 Thunk_IDirect3DDeviceImpl_3_GetDirect3D(LPDIRECT3DDEVICE3 iface,
1479                                         LPDIRECT3D3* lplpDirect3D3)
1480 {
1481     HRESULT ret;
1482     LPDIRECT3D7 ret_ptr;
1483   
1484     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lplpDirect3D3);
1485     ret = IDirect3DDevice7_GetDirect3D(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1486                                        &ret_ptr);
1487     *lplpDirect3D3 = COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D7, IDirect3D3, ret_ptr);
1488     TRACE(" returning interface %p\n", *lplpDirect3D3);
1489     return ret;
1490 }
1491
1492 HRESULT WINAPI
1493 Thunk_IDirect3DDeviceImpl_2_GetDirect3D(LPDIRECT3DDEVICE2 iface,
1494                                         LPDIRECT3D2* lplpDirect3D2)
1495 {
1496     HRESULT ret;
1497     LPDIRECT3D7 ret_ptr;
1498   
1499     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lplpDirect3D2);
1500     ret = IDirect3DDevice7_GetDirect3D(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1501                                        &ret_ptr);
1502     *lplpDirect3D2 = COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D7, IDirect3D2, ret_ptr);
1503     TRACE(" returning interface %p\n", *lplpDirect3D2);
1504     return ret;
1505 }
1506
1507 HRESULT WINAPI
1508 Thunk_IDirect3DDeviceImpl_1_GetDirect3D(LPDIRECT3DDEVICE iface,
1509                                         LPDIRECT3D* lplpDirect3D)
1510 {
1511     HRESULT ret;
1512     LPDIRECT3D7 ret_ptr;
1513   
1514     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lplpDirect3D);
1515     ret = IDirect3DDevice7_GetDirect3D(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice7, iface),
1516                                        &ret_ptr);
1517     *lplpDirect3D = COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D7, IDirect3D, ret_ptr);
1518     TRACE(" returning interface %p\n", *lplpDirect3D);
1519     return ret;
1520 }
1521
1522 HRESULT WINAPI
1523 Thunk_IDirect3DDeviceImpl_2_SetCurrentViewport(LPDIRECT3DDEVICE2 iface,
1524                                                LPDIRECT3DVIEWPORT2 lpDirect3DViewport2)
1525 {
1526     TRACE("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", iface, lpDirect3DViewport2);
1527     return IDirect3DDevice3_SetCurrentViewport(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1528                                                (LPDIRECT3DVIEWPORT3) lpDirect3DViewport2 /* No need to cast here as all interfaces are equivalent */);
1529 }
1530
1531 HRESULT WINAPI
1532 Thunk_IDirect3DDeviceImpl_2_GetCurrentViewport(LPDIRECT3DDEVICE2 iface,
1533                                                LPDIRECT3DVIEWPORT2* lplpDirect3DViewport2)
1534 {
1535     TRACE("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", iface, lplpDirect3DViewport2);
1536     return IDirect3DDevice3_GetCurrentViewport(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1537                                                (LPDIRECT3DVIEWPORT3*) lplpDirect3DViewport2 /* No need to cast here as all interfaces are equivalent */);
1538 }
1539
1540 HRESULT WINAPI
1541 Thunk_IDirect3DDeviceImpl_3_EnumTextureFormats(LPDIRECT3DDEVICE3 iface,
1542                                                LPD3DENUMPIXELFORMATSCALLBACK lpD3DEnumPixelProc,
1543                                                LPVOID lpArg)
1544 {
1545     TRACE("(%p)->(%p,%p) thunking to IDirect3DDevice7 interface.\n", iface, lpD3DEnumPixelProc, lpArg);
1546     return IDirect3DDevice7_EnumTextureFormats(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1547                                                lpD3DEnumPixelProc,
1548                                                lpArg);
1549 }
1550
1551 HRESULT WINAPI
1552 Thunk_IDirect3DDeviceImpl_3_BeginScene(LPDIRECT3DDEVICE3 iface)
1553 {
1554     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1555     return IDirect3DDevice7_BeginScene(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface));
1556 }
1557
1558 HRESULT WINAPI
1559 Thunk_IDirect3DDeviceImpl_2_BeginScene(LPDIRECT3DDEVICE2 iface)
1560 {
1561     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1562     return IDirect3DDevice7_BeginScene(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface));
1563 }
1564
1565 HRESULT WINAPI
1566 Thunk_IDirect3DDeviceImpl_1_BeginScene(LPDIRECT3DDEVICE iface)
1567 {
1568     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1569     return IDirect3DDevice7_BeginScene(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice7, iface));
1570 }
1571
1572 HRESULT WINAPI
1573 Thunk_IDirect3DDeviceImpl_3_EndScene(LPDIRECT3DDEVICE3 iface)
1574 {
1575     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1576     return IDirect3DDevice7_EndScene(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface));
1577 }
1578
1579 HRESULT WINAPI
1580 Thunk_IDirect3DDeviceImpl_2_EndScene(LPDIRECT3DDEVICE2 iface)
1581 {
1582     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1583     return IDirect3DDevice7_EndScene(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface));
1584 }
1585
1586 HRESULT WINAPI
1587 Thunk_IDirect3DDeviceImpl_1_EndScene(LPDIRECT3DDEVICE iface)
1588 {
1589     TRACE("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface);
1590     return IDirect3DDevice7_EndScene(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice7, iface));
1591 }
1592
1593 HRESULT WINAPI
1594 Thunk_IDirect3DDeviceImpl_3_SetTransform(LPDIRECT3DDEVICE3 iface,
1595                                          D3DTRANSFORMSTATETYPE dtstTransformStateType,
1596                                          LPD3DMATRIX lpD3DMatrix)
1597 {
1598     TRACE("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", iface, dtstTransformStateType, lpD3DMatrix);
1599     return IDirect3DDevice7_SetTransform(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1600                                          dtstTransformStateType,
1601                                          lpD3DMatrix);
1602 }
1603
1604 HRESULT WINAPI
1605 Thunk_IDirect3DDeviceImpl_2_SetTransform(LPDIRECT3DDEVICE2 iface,
1606                                          D3DTRANSFORMSTATETYPE dtstTransformStateType,
1607                                          LPD3DMATRIX lpD3DMatrix)
1608 {
1609     TRACE("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", iface, dtstTransformStateType, lpD3DMatrix);
1610     return IDirect3DDevice7_SetTransform(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1611                                          dtstTransformStateType,
1612                                          lpD3DMatrix);
1613 }
1614
1615 HRESULT WINAPI
1616 Thunk_IDirect3DDeviceImpl_3_GetTransform(LPDIRECT3DDEVICE3 iface,
1617                                          D3DTRANSFORMSTATETYPE dtstTransformStateType,
1618                                          LPD3DMATRIX lpD3DMatrix)
1619 {
1620     TRACE("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", iface, dtstTransformStateType, lpD3DMatrix);
1621     return IDirect3DDevice7_GetTransform(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1622                                          dtstTransformStateType,
1623                                          lpD3DMatrix);
1624 }
1625
1626 HRESULT WINAPI
1627 Thunk_IDirect3DDeviceImpl_2_GetTransform(LPDIRECT3DDEVICE2 iface,
1628                                          D3DTRANSFORMSTATETYPE dtstTransformStateType,
1629                                          LPD3DMATRIX lpD3DMatrix)
1630 {
1631     TRACE("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", iface, dtstTransformStateType, lpD3DMatrix);
1632     return IDirect3DDevice7_GetTransform(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1633                                          dtstTransformStateType,
1634                                          lpD3DMatrix);
1635 }
1636
1637 HRESULT WINAPI
1638 Thunk_IDirect3DDeviceImpl_3_MultiplyTransform(LPDIRECT3DDEVICE3 iface,
1639                                               D3DTRANSFORMSTATETYPE dtstTransformStateType,
1640                                               LPD3DMATRIX lpD3DMatrix)
1641 {
1642     TRACE("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", iface, dtstTransformStateType, lpD3DMatrix);
1643     return IDirect3DDevice7_MultiplyTransform(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1644                                               dtstTransformStateType,
1645                                               lpD3DMatrix);
1646 }
1647
1648 HRESULT WINAPI
1649 Thunk_IDirect3DDeviceImpl_2_MultiplyTransform(LPDIRECT3DDEVICE2 iface,
1650                                               D3DTRANSFORMSTATETYPE dtstTransformStateType,
1651                                               LPD3DMATRIX lpD3DMatrix)
1652 {
1653     TRACE("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", iface, dtstTransformStateType, lpD3DMatrix);
1654     return IDirect3DDevice7_MultiplyTransform(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1655                                               dtstTransformStateType,
1656                                               lpD3DMatrix);
1657 }
1658
1659 HRESULT WINAPI
1660 Thunk_IDirect3DDeviceImpl_3_SetRenderState(LPDIRECT3DDEVICE3 iface,
1661                                            D3DRENDERSTATETYPE dwRenderStateType,
1662                                            DWORD dwRenderState)
1663 {
1664     TRACE("(%p)->(%08x,%08lx) thunking to IDirect3DDevice7 interface.\n", iface, dwRenderStateType, dwRenderState);
1665     return IDirect3DDevice7_SetRenderState(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1666                                            dwRenderStateType,
1667                                            dwRenderState);
1668 }
1669
1670 HRESULT WINAPI
1671 Thunk_IDirect3DDeviceImpl_2_SetRenderState(LPDIRECT3DDEVICE2 iface,
1672                                            D3DRENDERSTATETYPE dwRenderStateType,
1673                                            DWORD dwRenderState)
1674 {
1675     TRACE("(%p)->(%08x,%08lx) thunking to IDirect3DDevice7 interface.\n", iface, dwRenderStateType, dwRenderState);
1676     return IDirect3DDevice7_SetRenderState(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1677                                            dwRenderStateType,
1678                                            dwRenderState);
1679 }
1680
1681 HRESULT WINAPI
1682 Thunk_IDirect3DDeviceImpl_3_GetRenderState(LPDIRECT3DDEVICE3 iface,
1683                                            D3DRENDERSTATETYPE dwRenderStateType,
1684                                            LPDWORD lpdwRenderState)
1685 {
1686     TRACE("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", iface, dwRenderStateType, lpdwRenderState);
1687     return IDirect3DDevice7_GetRenderState(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1688                                            dwRenderStateType,
1689                                            lpdwRenderState);
1690 }
1691
1692 HRESULT WINAPI
1693 Thunk_IDirect3DDeviceImpl_2_GetRenderState(LPDIRECT3DDEVICE2 iface,
1694                                            D3DRENDERSTATETYPE dwRenderStateType,
1695                                            LPDWORD lpdwRenderState)
1696 {
1697     TRACE("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", iface, dwRenderStateType, lpdwRenderState);
1698     return IDirect3DDevice7_GetRenderState(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1699                                            dwRenderStateType,
1700                                            lpdwRenderState);
1701 }
1702
1703 HRESULT WINAPI
1704 Thunk_IDirect3DDeviceImpl_3_DrawPrimitive(LPDIRECT3DDEVICE3 iface,
1705                                           D3DPRIMITIVETYPE d3dptPrimitiveType,
1706                                           DWORD d3dvtVertexType,
1707                                           LPVOID lpvVertices,
1708                                           DWORD dwVertexCount,
1709                                           DWORD dwFlags)
1710 {
1711     TRACE("(%p)->(%08x,%08lx,%p,%08lx,%08lx) thunking to IDirect3DDevice7 interface.\n", iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwVertexCount, dwFlags);
1712     return IDirect3DDevice7_DrawPrimitive(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1713                                           d3dptPrimitiveType,
1714                                           d3dvtVertexType,
1715                                           lpvVertices,
1716                                           dwVertexCount,
1717                                           dwFlags);
1718 }
1719
1720 HRESULT WINAPI
1721 Thunk_IDirect3DDeviceImpl_3_DrawIndexedPrimitive(LPDIRECT3DDEVICE3 iface,
1722                                                  D3DPRIMITIVETYPE d3dptPrimitiveType,
1723                                                  DWORD d3dvtVertexType,
1724                                                  LPVOID lpvVertices,
1725                                                  DWORD dwVertexCount,
1726                                                  LPWORD dwIndices,
1727                                                  DWORD dwIndexCount,
1728                                                  DWORD dwFlags)
1729 {
1730     TRACE("(%p)->(%08x,%08lx,%p,%08lx,%p,%08lx,%08lx) thunking to IDirect3DDevice7 interface.\n", iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwVertexCount, dwIndices, dwIndexCount, dwFlags);
1731     return IDirect3DDevice7_DrawIndexedPrimitive(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1732                                                  d3dptPrimitiveType,
1733                                                  d3dvtVertexType,
1734                                                  lpvVertices,
1735                                                  dwVertexCount,
1736                                                  dwIndices,
1737                                                  dwIndexCount,
1738                                                  dwFlags);
1739 }
1740
1741 HRESULT WINAPI
1742 Thunk_IDirect3DDeviceImpl_3_SetClipStatus(LPDIRECT3DDEVICE3 iface,
1743                                           LPD3DCLIPSTATUS lpD3DClipStatus)
1744 {
1745     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lpD3DClipStatus);
1746     return IDirect3DDevice7_SetClipStatus(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1747                                           lpD3DClipStatus);
1748 }
1749
1750 HRESULT WINAPI
1751 Thunk_IDirect3DDeviceImpl_2_SetClipStatus(LPDIRECT3DDEVICE2 iface,
1752                                           LPD3DCLIPSTATUS lpD3DClipStatus)
1753 {
1754     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lpD3DClipStatus);
1755     return IDirect3DDevice7_SetClipStatus(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1756                                           lpD3DClipStatus);
1757 }
1758
1759 HRESULT WINAPI
1760 Thunk_IDirect3DDeviceImpl_3_GetClipStatus(LPDIRECT3DDEVICE3 iface,
1761                                           LPD3DCLIPSTATUS lpD3DClipStatus)
1762 {
1763     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lpD3DClipStatus);
1764     return IDirect3DDevice7_GetClipStatus(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1765                                           lpD3DClipStatus);
1766 }
1767
1768 HRESULT WINAPI
1769 Thunk_IDirect3DDeviceImpl_2_GetClipStatus(LPDIRECT3DDEVICE2 iface,
1770                                           LPD3DCLIPSTATUS lpD3DClipStatus)
1771 {
1772     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lpD3DClipStatus);
1773     return IDirect3DDevice7_GetClipStatus(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1774                                           lpD3DClipStatus);
1775 }
1776
1777 HRESULT WINAPI
1778 Thunk_IDirect3DDeviceImpl_3_DrawPrimitiveStrided(LPDIRECT3DDEVICE3 iface,
1779                                                  D3DPRIMITIVETYPE d3dptPrimitiveType,
1780                                                  DWORD dwVertexType,
1781                                                  LPD3DDRAWPRIMITIVESTRIDEDDATA lpD3DDrawPrimStrideData,
1782                                                  DWORD dwVertexCount,
1783                                                  DWORD dwFlags)
1784 {
1785     TRACE("(%p)->(%08x,%08lx,%p,%08lx,%08lx) thunking to IDirect3DDevice7 interface.\n", iface, d3dptPrimitiveType, dwVertexType, lpD3DDrawPrimStrideData, dwVertexCount, dwFlags);
1786     return IDirect3DDevice7_DrawPrimitiveStrided(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1787                                                  d3dptPrimitiveType,
1788                                                  dwVertexType,
1789                                                  lpD3DDrawPrimStrideData,
1790                                                  dwVertexCount,
1791                                                  dwFlags);
1792 }
1793
1794 HRESULT WINAPI
1795 Thunk_IDirect3DDeviceImpl_3_DrawIndexedPrimitiveStrided(LPDIRECT3DDEVICE3 iface,
1796                                                         D3DPRIMITIVETYPE d3dptPrimitiveType,
1797                                                         DWORD dwVertexType,
1798                                                         LPD3DDRAWPRIMITIVESTRIDEDDATA lpD3DDrawPrimStrideData,
1799                                                         DWORD dwVertexCount,
1800                                                         LPWORD lpIndex,
1801                                                         DWORD dwIndexCount,
1802                                                         DWORD dwFlags)
1803 {
1804     TRACE("(%p)->(%08x,%08lx,%p,%08lx,%p,%08lx,%08lx) thunking to IDirect3DDevice7 interface.\n", iface, d3dptPrimitiveType, dwVertexType, lpD3DDrawPrimStrideData, dwVertexCount, lpIndex, dwIndexCount, dwFlags);
1805     return IDirect3DDevice7_DrawIndexedPrimitiveStrided(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1806                                                         d3dptPrimitiveType,
1807                                                         dwVertexType,
1808                                                         lpD3DDrawPrimStrideData,
1809                                                         dwVertexCount,
1810                                                         lpIndex,
1811                                                         dwIndexCount,
1812                                                         dwFlags);
1813 }
1814
1815 HRESULT WINAPI
1816 Thunk_IDirect3DDeviceImpl_3_ComputeSphereVisibility(LPDIRECT3DDEVICE3 iface,
1817                                                     LPD3DVECTOR lpCenters,
1818                                                     LPD3DVALUE lpRadii,
1819                                                     DWORD dwNumSpheres,
1820                                                     DWORD dwFlags,
1821                                                     LPDWORD lpdwReturnValues)
1822 {
1823     TRACE("(%p)->(%p,%p,%08lx,%08lx,%p) thunking to IDirect3DDevice7 interface.\n", iface, lpCenters, lpRadii, dwNumSpheres, dwFlags, lpdwReturnValues);
1824     return IDirect3DDevice7_ComputeSphereVisibility(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1825                                                     lpCenters,
1826                                                     lpRadii,
1827                                                     dwNumSpheres,
1828                                                     dwFlags,
1829                                                     lpdwReturnValues);
1830 }
1831
1832 HRESULT WINAPI
1833 Thunk_IDirect3DDeviceImpl_3_GetTextureStageState(LPDIRECT3DDEVICE3 iface,
1834                                                  DWORD dwStage,
1835                                                  D3DTEXTURESTAGESTATETYPE d3dTexStageStateType,
1836                                                  LPDWORD lpdwState)
1837 {
1838     TRACE("(%p)->(%08lx,%08x,%p) thunking to IDirect3DDevice7 interface.\n", iface, dwStage, d3dTexStageStateType, lpdwState);
1839     return IDirect3DDevice7_GetTextureStageState(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1840                                                  dwStage,
1841                                                  d3dTexStageStateType,
1842                                                  lpdwState);
1843 }
1844
1845 HRESULT WINAPI
1846 Thunk_IDirect3DDeviceImpl_3_SetTextureStageState(LPDIRECT3DDEVICE3 iface,
1847                                                  DWORD dwStage,
1848                                                  D3DTEXTURESTAGESTATETYPE d3dTexStageStateType,
1849                                                  DWORD dwState)
1850 {
1851     TRACE("(%p)->(%08lx,%08x,%08lx) thunking to IDirect3DDevice7 interface.\n", iface, dwStage, d3dTexStageStateType, dwState);
1852     return IDirect3DDevice7_SetTextureStageState(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1853                                                  dwStage,
1854                                                  d3dTexStageStateType,
1855                                                  dwState);
1856 }
1857
1858 HRESULT WINAPI
1859 Thunk_IDirect3DDeviceImpl_3_ValidateDevice(LPDIRECT3DDEVICE3 iface,
1860                                            LPDWORD lpdwPasses)
1861 {
1862     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lpdwPasses);
1863     return IDirect3DDevice7_ValidateDevice(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1864                                            lpdwPasses);
1865 }
1866
1867 HRESULT WINAPI
1868 Thunk_IDirect3DDeviceImpl_2_GetCaps(LPDIRECT3DDEVICE2 iface,
1869                                     LPD3DDEVICEDESC lpD3DHWDevDesc,
1870                                     LPD3DDEVICEDESC lpD3DHELDevDesc)
1871 {
1872     TRACE("(%p)->(%p,%p) thunking to IDirect3DDevice3 interface.\n", iface, lpD3DHWDevDesc, lpD3DHELDevDesc);
1873     return IDirect3DDevice3_GetCaps(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1874                                     lpD3DHWDevDesc,
1875                                     lpD3DHELDevDesc);
1876 }
1877
1878 HRESULT WINAPI
1879 Thunk_IDirect3DDeviceImpl_1_GetCaps(LPDIRECT3DDEVICE iface,
1880                                     LPD3DDEVICEDESC lpD3DHWDevDesc,
1881                                     LPD3DDEVICEDESC lpD3DHELDevDesc)
1882 {
1883     TRACE("(%p)->(%p,%p) thunking to IDirect3DDevice3 interface.\n", iface, lpD3DHWDevDesc, lpD3DHELDevDesc);
1884     return IDirect3DDevice3_GetCaps(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice3, iface),
1885                                     lpD3DHWDevDesc,
1886                                     lpD3DHELDevDesc);
1887 }
1888
1889 HRESULT WINAPI
1890 Thunk_IDirect3DDeviceImpl_1_SwapTextureHandles(LPDIRECT3DDEVICE iface,
1891                                               LPDIRECT3DTEXTURE lpD3DTex1,
1892                                               LPDIRECT3DTEXTURE lpD3DTex2)
1893 {
1894     TRACE("(%p)->(%p,%p) thunking to IDirect3DDevice2 interface.\n", iface, lpD3DTex1, lpD3DTex2);
1895     return IDirect3DDevice2_SwapTextureHandles(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice2, iface),
1896                                                COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture, IDirect3DTexture2, lpD3DTex1),
1897                                                COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture, IDirect3DTexture2, lpD3DTex2));
1898 }
1899
1900 HRESULT WINAPI
1901 Thunk_IDirect3DDeviceImpl_2_GetStats(LPDIRECT3DDEVICE2 iface,
1902                                      LPD3DSTATS lpD3DStats)
1903 {
1904     TRACE("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", iface, lpD3DStats);
1905     return IDirect3DDevice3_GetStats(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1906                                      lpD3DStats);
1907 }
1908
1909 HRESULT WINAPI
1910 Thunk_IDirect3DDeviceImpl_1_GetStats(LPDIRECT3DDEVICE iface,
1911                                      LPD3DSTATS lpD3DStats)
1912 {
1913     TRACE("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", iface, lpD3DStats);
1914     return IDirect3DDevice3_GetStats(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice3, iface),
1915                                      lpD3DStats);
1916 }
1917
1918 HRESULT WINAPI
1919 Thunk_IDirect3DDeviceImpl_3_SetRenderTarget(LPDIRECT3DDEVICE3 iface,
1920                                             LPDIRECTDRAWSURFACE4 lpNewRenderTarget,
1921                                             DWORD dwFlags)
1922 {
1923     TRACE("(%p)->(%p,%08lx) thunking to IDirect3DDevice7 interface.\n", iface, lpNewRenderTarget, dwFlags);
1924     return IDirect3DDevice7_SetRenderTarget(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1925                                             (LPDIRECTDRAWSURFACE7) lpNewRenderTarget /* No cast needed as DSurf4 == DSurf7 */,
1926                                             dwFlags);
1927 }
1928
1929 HRESULT WINAPI
1930 Thunk_IDirect3DDeviceImpl_3_GetRenderTarget(LPDIRECT3DDEVICE3 iface,
1931                                             LPDIRECTDRAWSURFACE4* lplpRenderTarget)
1932 {
1933     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lplpRenderTarget);
1934     return IDirect3DDevice7_GetRenderTarget(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
1935                                             (LPDIRECTDRAWSURFACE7*) lplpRenderTarget /* No cast needed as DSurf4 == DSurf7 */);
1936 }
1937
1938 HRESULT WINAPI
1939 Thunk_IDirect3DDeviceImpl_2_SetRenderTarget(LPDIRECT3DDEVICE2 iface,
1940                                             LPDIRECTDRAWSURFACE lpNewRenderTarget,
1941                                             DWORD dwFlags)
1942 {
1943     TRACE("(%p)->(%p,%08lx) thunking to IDirect3DDevice7 interface.\n", iface, lpNewRenderTarget, dwFlags);
1944     return IDirect3DDevice7_SetRenderTarget(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1945                                             COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface3, IDirectDrawSurface7, lpNewRenderTarget),
1946                                             dwFlags);
1947 }
1948
1949 HRESULT WINAPI
1950 Thunk_IDirect3DDeviceImpl_2_GetRenderTarget(LPDIRECT3DDEVICE2 iface,
1951                                             LPDIRECTDRAWSURFACE* lplpRenderTarget)
1952 {
1953     HRESULT ret;
1954     LPDIRECTDRAWSURFACE7 ret_val;
1955   
1956     TRACE("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", iface, lplpRenderTarget);
1957     ret = IDirect3DDevice7_GetRenderTarget(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice7, iface),
1958                                            &ret_val);
1959     *lplpRenderTarget = (LPDIRECTDRAWSURFACE) COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7, IDirectDrawSurface3, ret_val);
1960     TRACE(" returning interface %p\n", *lplpRenderTarget);
1961     return ret;
1962 }
1963
1964 HRESULT WINAPI
1965 Thunk_IDirect3DDeviceImpl_2_Vertex(LPDIRECT3DDEVICE2 iface,
1966                                    LPVOID lpVertexType)
1967 {
1968     TRACE("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", iface, lpVertexType);
1969     return IDirect3DDevice3_Vertex(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1970                                    lpVertexType);
1971 }
1972
1973 HRESULT WINAPI
1974 Thunk_IDirect3DDeviceImpl_2_Index(LPDIRECT3DDEVICE2 iface,
1975                                   WORD wVertexIndex)
1976 {
1977     TRACE("(%p)->(%04x) thunking to IDirect3DDevice3 interface.\n", iface, wVertexIndex);
1978     return IDirect3DDevice3_Index(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1979                                   wVertexIndex);
1980 }
1981
1982 HRESULT WINAPI
1983 Thunk_IDirect3DDeviceImpl_2_End(LPDIRECT3DDEVICE2 iface,
1984                                 DWORD dwFlags)
1985 {
1986     TRACE("(%p)->(%08lx) thunking to IDirect3DDevice3 interface.\n", iface, dwFlags);
1987     return IDirect3DDevice3_End(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1988                                 dwFlags);
1989 }
1990
1991 HRESULT WINAPI
1992 Thunk_IDirect3DDeviceImpl_2_GetLightState(LPDIRECT3DDEVICE2 iface,
1993                                           D3DLIGHTSTATETYPE dwLightStateType,
1994                                           LPDWORD lpdwLightState)
1995 {
1996     TRACE("(%p)->(%08x,%p) thunking to IDirect3DDevice3 interface.\n", iface, dwLightStateType, lpdwLightState);
1997     return IDirect3DDevice3_GetLightState(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
1998                                           dwLightStateType,
1999                                           lpdwLightState);
2000 }
2001
2002 HRESULT WINAPI
2003 Thunk_IDirect3DDeviceImpl_2_SetLightState(LPDIRECT3DDEVICE2 iface,
2004                                           D3DLIGHTSTATETYPE dwLightStateType,
2005                                           DWORD dwLightState)
2006 {
2007     TRACE("(%p)->(%08x,%08lx) thunking to IDirect3DDevice3 interface.\n", iface, dwLightStateType, dwLightState);
2008     return IDirect3DDevice3_SetLightState(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice2, IDirect3DDevice3, iface),
2009                                           dwLightStateType,
2010                                           dwLightState);
2011 }
2012
2013 HRESULT WINAPI
2014 Thunk_IDirect3DDeviceImpl_1_EnumTextureFormats(LPDIRECT3DDEVICE iface,
2015                                                LPD3DENUMTEXTUREFORMATSCALLBACK lpD3DEnumTextureProc,
2016                                                LPVOID lpArg)
2017 {
2018     TRACE("(%p)->(%p,%p) thunking to IDirect3DDevice2 interface.\n", iface, lpD3DEnumTextureProc, lpArg);
2019     return IDirect3DDevice2_EnumTextureFormats(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice, IDirect3DDevice2, iface),
2020                                                lpD3DEnumTextureProc,
2021                                                lpArg);
2022 }
2023
2024 HRESULT WINAPI
2025 Thunk_IDirect3DDeviceImpl_3_SetTexture(LPDIRECT3DDEVICE3 iface,
2026                                        DWORD dwStage,
2027                                        LPDIRECT3DTEXTURE2 lpTexture2)
2028 {
2029     TRACE("(%p)->(%ld,%p) thunking to IDirect3DDevice7 interface.\n", iface, dwStage, lpTexture2);
2030     return IDirect3DDevice7_SetTexture(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
2031                                        dwStage,
2032                                        COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture2, IDirectDrawSurface7, lpTexture2));
2033 }
2034
2035 HRESULT WINAPI
2036 Thunk_IDirect3DDeviceImpl_3_DrawPrimitiveVB(LPDIRECT3DDEVICE3 iface,
2037                                             D3DPRIMITIVETYPE d3dptPrimitiveType,
2038                                             LPDIRECT3DVERTEXBUFFER lpD3DVertexBuf,
2039                                             DWORD dwStartVertex,
2040                                             DWORD dwNumVertices,
2041                                             DWORD dwFlags)
2042 {
2043     TRACE("(%p)->(%08x,%p,%08lx,%08lx,%08lx) thunking to IDirect3DDevice7 interface.\n", iface, 
2044           d3dptPrimitiveType, lpD3DVertexBuf, dwStartVertex, dwNumVertices, dwFlags);
2045     return IDirect3DDevice7_DrawPrimitiveVB(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
2046                                             d3dptPrimitiveType,
2047                                             COM_INTERFACE_CAST(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer, IDirect3DVertexBuffer7, lpD3DVertexBuf),
2048                                             dwStartVertex,
2049                                             dwNumVertices,
2050                                             dwFlags);
2051 }
2052
2053 HRESULT WINAPI
2054 Thunk_IDirect3DDeviceImpl_3_DrawIndexedPrimitiveVB(LPDIRECT3DDEVICE3 iface,
2055                                                    D3DPRIMITIVETYPE d3dptPrimitiveType,
2056                                                    LPDIRECT3DVERTEXBUFFER lpD3DVertexBuf,
2057                                                    LPWORD lpwIndices,
2058                                                    DWORD dwIndexCount,
2059                                                    DWORD dwFlags)
2060 {
2061     TRACE("(%p)->(%08x,%p,%p,%08lx,%08lx) thunking to IDirect3DDevice7 interface.\n", iface,
2062           d3dptPrimitiveType, lpD3DVertexBuf, lpwIndices, dwIndexCount, dwFlags);
2063     return IDirect3DDevice7_DrawIndexedPrimitiveVB(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
2064                                                    d3dptPrimitiveType,
2065                                                    COM_INTERFACE_CAST(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer, IDirect3DVertexBuffer7, lpD3DVertexBuf),
2066                                                    0,
2067                                                    dwIndexCount,
2068                                                    lpwIndices,
2069                                                    dwIndexCount,
2070                                                    dwFlags);
2071 }
2072
2073 HRESULT WINAPI
2074 Thunk_IDirect3DDeviceImpl_3_GetTexture(LPDIRECT3DDEVICE3 iface,
2075                                        DWORD dwStage,
2076                                        LPDIRECT3DTEXTURE2* lplpTexture2)
2077 {
2078     HRESULT ret;
2079     LPDIRECTDRAWSURFACE7 ret_val;
2080
2081     TRACE("(%p)->(%ld,%p) thunking to IDirect3DDevice7 interface.\n", iface, dwStage, lplpTexture2);
2082     ret = IDirect3DDevice7_GetTexture(COM_INTERFACE_CAST(IDirect3DDeviceImpl, IDirect3DDevice3, IDirect3DDevice7, iface),
2083                                       dwStage,
2084                                       &ret_val);
2085
2086     *lplpTexture2 = COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirectDrawSurface7, IDirect3DTexture2, ret_val);
2087
2088     TRACE(" returning interface %p.\n", *lplpTexture2);
2089     
2090     return ret;
2091 }