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