Added regedit unit test, a couple minor changes to regedit.
[wine] / dlls / ddraw / d3ddevice / main.c
1 /* Direct3D Device
2  * Copyright (c) 1998 Lionel ULMER
3  *
4  * This file contains all the common stuff for D3D devices.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #include "config.h"
22
23 #include <string.h>
24
25 #include "windef.h"
26 #include "winerror.h"
27 #include "wine/obj_base.h"
28 #include "ddraw.h"
29 #include "d3d.h"
30 #include "wine/debug.h"
31
32 #include "d3d_private.h"
33
34 WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
35
36 /*******************************************************************************
37  *                              IDirect3DDevice2
38  */
39
40 HRESULT WINAPI IDirect3DDevice2Impl_QueryInterface(
41     LPDIRECT3DDEVICE2 iface, REFIID riid, LPVOID* ppvObj
42 ) {
43     ICOM_THIS(IDirect3DDevice2Impl,iface);
44     FIXME("(%p)->(%s,%p): stub\n", This, debugstr_guid(riid),ppvObj);
45     return S_OK;
46 }
47
48 ULONG WINAPI IDirect3DDevice2Impl_AddRef(LPDIRECT3DDEVICE2 iface)
49 {
50     ICOM_THIS(IDirect3DDevice2Impl,iface);
51     TRACE("(%p)->()incrementing from %lu.\n", This, This->ref );
52
53     return ++(This->ref);
54 }
55
56
57
58 ULONG WINAPI IDirect3DDevice2Impl_Release(LPDIRECT3DDEVICE2 iface)
59 {
60     ICOM_THIS(IDirect3DDevice2Impl,iface);
61     FIXME("(%p)->() decrementing from %lu.\n", This, This->ref );
62
63     if (!--(This->ref)) {
64         HeapFree(GetProcessHeap(),0,This);
65         return 0;
66     }
67     return This->ref;
68 }
69
70
71 /*** IDirect3DDevice2 methods ***/
72 HRESULT WINAPI IDirect3DDevice2Impl_GetCaps(
73     LPDIRECT3DDEVICE2 iface, LPD3DDEVICEDESC lpdescsoft,
74     LPD3DDEVICEDESC lpdeschard
75 ) {
76     ICOM_THIS(IDirect3DDevice2Impl,iface);
77     FIXME("(%p)->(%p,%p), stub!\n", This, lpdescsoft, lpdeschard);
78     return DD_OK;
79 }
80
81
82
83 HRESULT WINAPI IDirect3DDevice2Impl_SwapTextureHandles(
84     LPDIRECT3DDEVICE2 iface,LPDIRECT3DTEXTURE2 lptex1,LPDIRECT3DTEXTURE2 lptex2
85 ) {
86     ICOM_THIS(IDirect3DDevice2Impl,iface);
87     FIXME("(%p)->(%p,%p): stub\n", This, lptex1, lptex2);
88
89     return DD_OK;
90 }
91
92 HRESULT WINAPI IDirect3DDevice2Impl_GetStats(
93     LPDIRECT3DDEVICE2 iface, LPD3DSTATS lpstats)
94 {
95     ICOM_THIS(IDirect3DDevice2Impl,iface);
96     FIXME("(%p)->(%p): stub\n", This, lpstats);
97
98     return DD_OK;
99 }
100
101 HRESULT WINAPI IDirect3DDevice2Impl_AddViewport(
102     LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 lpvp
103 ) {
104     ICOM_THIS(IDirect3DDevice2Impl,iface);
105     IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
106     FIXME("(%p)->(%p): stub\n", This, ilpvp);
107
108     /* Adds this viewport to the viewport list */
109     ilpvp->next = This->viewport_list;
110     This->viewport_list = ilpvp;
111
112     return DD_OK;
113 }
114
115 HRESULT WINAPI IDirect3DDevice2Impl_DeleteViewport(
116     LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 lpvp)
117 {
118     ICOM_THIS(IDirect3DDevice2Impl,iface);
119     IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
120     IDirect3DViewport2Impl *cur, *prev;
121     FIXME("(%p)->(%p): stub\n", This, lpvp);
122
123     /* Finds this viewport in the list */
124     prev = NULL;
125     cur = This->viewport_list;
126     while ((cur != NULL) && (cur != ilpvp)) {
127         prev = cur;
128         cur = cur->next;
129     }
130     if (cur == NULL)
131         return DDERR_INVALIDOBJECT;
132
133     /* And remove it */
134     if (prev == NULL)
135         This->viewport_list = cur->next;
136     else
137         prev->next = cur->next;
138     return DD_OK;
139 }
140
141 HRESULT WINAPI IDirect3DDevice2Impl_NextViewport(
142     LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 lpvp,
143     LPDIRECT3DVIEWPORT2* lplpvp, DWORD dwFlags
144 ) {
145     ICOM_THIS(IDirect3DDevice2Impl,iface);
146     IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
147     IDirect3DViewport2Impl** ilplpvp=(IDirect3DViewport2Impl**)lplpvp;
148     FIXME("(%p)->(%p,%p,%08lx): stub\n", This, lpvp, lpvp, dwFlags);
149
150     switch (dwFlags) {
151     case D3DNEXT_NEXT:
152         *ilplpvp = ilpvp->next;
153         break;
154     case D3DNEXT_HEAD:
155         *ilplpvp = This->viewport_list;
156         break;
157     case D3DNEXT_TAIL:
158         ilpvp = This->viewport_list;
159         while (ilpvp->next != NULL)
160             ilpvp = ilpvp->next;
161         *ilplpvp = ilpvp;
162         break;
163     default:
164         return DDERR_INVALIDPARAMS;
165     }
166     return DD_OK;
167 }
168
169 HRESULT WINAPI IDirect3DDevice2Impl_EnumTextureFormats(
170     LPDIRECT3DDEVICE2 iface, LPD3DENUMTEXTUREFORMATSCALLBACK cb, LPVOID context
171 ) {
172     ICOM_THIS(IDirect3DDevice2Impl,iface);
173     FIXME("(%p)->(%p,%p), stub!\n", This, cb, context);
174
175     return DD_OK; /* no texture formats in stub implementation */
176 }
177
178
179
180 HRESULT WINAPI IDirect3DDevice2Impl_BeginScene(LPDIRECT3DDEVICE2 iface)
181 {
182     ICOM_THIS(IDirect3DDevice2Impl,iface);
183
184     FIXME("(%p)->(), stub!\n", This);
185
186     /* Here, we should get the DDraw surface and 'copy it' to the
187      OpenGL surface.... */
188     return DD_OK;
189 }
190
191 HRESULT WINAPI IDirect3DDevice2Impl_EndScene(LPDIRECT3DDEVICE2 iface)
192 {
193     ICOM_THIS(IDirect3DDevice2Impl,iface);
194     FIXME("(%p)->(): stub\n", This);
195     return DD_OK;
196 }
197
198 HRESULT WINAPI IDirect3DDevice2Impl_GetDirect3D(
199     LPDIRECT3DDEVICE2 iface, LPDIRECT3D2 *lpd3d2
200 ) {
201     ICOM_THIS(IDirect3DDevice2Impl,iface);
202     TRACE("(%p)->(%p): stub\n", This, lpd3d2);
203     *lpd3d2 = (LPDIRECT3D2)This->d3d;
204     return DD_OK;
205 }
206
207 /*** DrawPrimitive API ***/
208 HRESULT WINAPI IDirect3DDevice2Impl_SetCurrentViewport(
209     LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 lpvp
210 ) {
211     ICOM_THIS(IDirect3DDevice2Impl,iface);
212     IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
213     FIXME("(%p)->(%p): stub\n", This, ilpvp);
214
215     /* Should check if the viewport was added or not */
216
217     /* Set this viewport as the current viewport */
218     This->current_viewport = ilpvp;
219
220     /* Activate this viewport */
221     ilpvp->device.active_device2 = This;
222     ilpvp->activate(ilpvp);
223
224     return DD_OK;
225 }
226
227
228
229 HRESULT WINAPI IDirect3DDevice2Impl_GetCurrentViewport(
230     LPDIRECT3DDEVICE2 iface, LPDIRECT3DVIEWPORT2 *lplpvp
231 ) {
232     ICOM_THIS(IDirect3DDevice2Impl,iface);
233     FIXME("(%p)->(%p): stub\n", This, lplpvp);
234
235     /* Returns the current viewport */
236     *lplpvp = (LPDIRECT3DVIEWPORT2)This->current_viewport;
237
238     return DD_OK;
239 }
240
241 HRESULT WINAPI IDirect3DDevice2Impl_SetRenderTarget(
242     LPDIRECT3DDEVICE2 iface, LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags
243 ) {
244     ICOM_THIS(IDirect3DDevice2Impl,iface);
245     FIXME("(%p)->(%p,%08lx): stub\n", This, lpdds, dwFlags);
246
247     return DD_OK;
248 }
249
250 HRESULT WINAPI IDirect3DDevice2Impl_GetRenderTarget(
251     LPDIRECT3DDEVICE2 iface, LPDIRECTDRAWSURFACE *lplpdds
252 ) {
253     ICOM_THIS(IDirect3DDevice2Impl,iface);
254     FIXME("(%p)->(%p): stub\n", This, lplpdds);
255
256     /* Returns the current rendering target (the surface on wich we render) */
257     *lplpdds = (LPDIRECTDRAWSURFACE)This->surface;
258
259     return DD_OK;
260 }
261
262 HRESULT WINAPI IDirect3DDevice2Impl_Begin(
263     LPDIRECT3DDEVICE2 iface, D3DPRIMITIVETYPE d3dp, D3DVERTEXTYPE d3dv,
264     DWORD dwFlags
265 ) {
266     ICOM_THIS(IDirect3DDevice2Impl,iface);
267     FIXME("(%p)->(%d,%d,%08lx): stub\n", This, d3dp, d3dv, dwFlags);
268
269     return DD_OK;
270 }
271
272 HRESULT WINAPI IDirect3DDevice2Impl_BeginIndexed(
273     LPDIRECT3DDEVICE2 iface, D3DPRIMITIVETYPE d3dp, D3DVERTEXTYPE d3dv,
274     LPVOID lpvert, DWORD numvert, DWORD dwFlags
275 ) {
276     ICOM_THIS(IDirect3DDevice2Impl,iface);
277     FIXME("(%p)->(%d,%d,%p,%ld,%08lx): stub\n", This, d3dp, d3dv, lpvert, numvert, dwFlags);
278
279     return DD_OK;
280 }
281
282 HRESULT WINAPI IDirect3DDevice2Impl_Vertex(
283     LPDIRECT3DDEVICE2 iface,LPVOID lpvert
284 ) {
285     ICOM_THIS(IDirect3DDevice2Impl,iface);
286     FIXME("(%p)->(%p): stub\n", This, lpvert);
287
288     return DD_OK;
289 }
290
291 HRESULT WINAPI IDirect3DDevice2Impl_Index(LPDIRECT3DDEVICE2 iface, WORD index) {
292     ICOM_THIS(IDirect3DDevice2Impl,iface);
293     FIXME("(%p)->(%d): stub\n", This, index);
294
295     return DD_OK;
296 }
297
298
299
300 HRESULT WINAPI IDirect3DDevice2Impl_End(LPDIRECT3DDEVICE2 iface,DWORD dwFlags) {
301     ICOM_THIS(IDirect3DDevice2Impl,iface);
302     FIXME("(%p)->(%08lx): stub\n", This, dwFlags);
303
304     return DD_OK;
305 }
306
307 HRESULT WINAPI IDirect3DDevice2Impl_GetRenderState(
308     LPDIRECT3DDEVICE2 iface, D3DRENDERSTATETYPE d3drs, LPDWORD lprstate
309 ) {
310     ICOM_THIS(IDirect3DDevice2Impl,iface);
311     FIXME("(%p)->(%d,%p): stub\n", This, d3drs, lprstate);
312
313     return DD_OK;
314 }
315
316 HRESULT WINAPI IDirect3DDevice2Impl_SetRenderState(
317     LPDIRECT3DDEVICE2 iface, D3DRENDERSTATETYPE dwRenderStateType,
318     DWORD dwRenderState
319 ) {
320     ICOM_THIS(IDirect3DDevice2Impl,iface);
321
322     FIXME("(%p)->(%d,%ld)\n", This, dwRenderStateType, dwRenderState);
323
324     return DD_OK;
325 }
326
327 HRESULT WINAPI IDirect3DDevice2Impl_GetLightState(
328     LPDIRECT3DDEVICE2 iface, D3DLIGHTSTATETYPE d3dls, LPDWORD lplstate
329 ) {
330     ICOM_THIS(IDirect3DDevice2Impl,iface);
331     FIXME("(%p)->(%d,%p): stub\n", This, d3dls, lplstate);
332
333     return DD_OK;
334 }
335
336
337
338 HRESULT WINAPI IDirect3DDevice2Impl_SetLightState(
339     LPDIRECT3DDEVICE2 iface, D3DLIGHTSTATETYPE dwLightStateType,
340     DWORD dwLightState
341 ) {
342     ICOM_THIS(IDirect3DDevice2Impl,iface);
343     FIXME("(%p)->(%d,%08lx): stub\n", This, dwLightStateType, dwLightState);
344     return DD_OK;
345 }
346
347 HRESULT WINAPI IDirect3DDevice2Impl_SetTransform(
348     LPDIRECT3DDEVICE2 iface, D3DTRANSFORMSTATETYPE d3dts, LPD3DMATRIX lpmatrix
349 ) {
350     ICOM_THIS(IDirect3DDevice2Impl,iface);
351     FIXME("(%p)->(%d,%p),stub!\n",This,d3dts,lpmatrix);
352     return DD_OK;
353 }
354
355
356
357 HRESULT WINAPI IDirect3DDevice2Impl_GetTransform(
358     LPDIRECT3DDEVICE2 iface, D3DTRANSFORMSTATETYPE d3dts, LPD3DMATRIX lpmatrix
359 ) {
360     ICOM_THIS(IDirect3DDevice2Impl,iface);
361     FIXME("(%p)->(%d,%p): stub\n", This, d3dts, lpmatrix);
362
363     return DD_OK;
364 }
365
366
367
368 HRESULT WINAPI IDirect3DDevice2Impl_MultiplyTransform(
369     LPDIRECT3DDEVICE2 iface, D3DTRANSFORMSTATETYPE d3dts, LPD3DMATRIX lpmatrix
370 ) {
371     ICOM_THIS(IDirect3DDevice2Impl,iface);
372     FIXME("(%p)->(%d,%p): stub\n", This, d3dts, lpmatrix);
373
374     return DD_OK;
375 }
376
377 HRESULT WINAPI IDirect3DDevice2Impl_DrawPrimitive(
378     LPDIRECT3DDEVICE2 iface, D3DPRIMITIVETYPE d3dp, D3DVERTEXTYPE d3dv,
379     LPVOID lpvertex, DWORD vertcount, DWORD dwFlags
380 ) {
381   ICOM_THIS(IDirect3DDevice2Impl,iface);
382
383   TRACE("(%p)->(%d,%d,%p,%ld,%08lx): stub\n", This, d3dp, d3dv, lpvertex, vertcount, dwFlags);
384
385   return D3D_OK;
386 }
387
388 HRESULT WINAPI IDirect3DDevice2Impl_DrawIndexedPrimitive(
389     LPDIRECT3DDEVICE2 iface, D3DPRIMITIVETYPE d3dp, D3DVERTEXTYPE d3dv,
390     LPVOID lpvertex, DWORD vertcount, LPWORD lpindexes, DWORD indexcount,
391     DWORD dwFlags
392 ) {
393     ICOM_THIS(IDirect3DDevice2Impl,iface);
394     TRACE("(%p)->(%d,%d,%p,%ld,%p,%ld,%08lx): stub\n", This, d3dp, d3dv, lpvertex, vertcount, lpindexes, indexcount, dwFlags);
395     return D3D_OK;
396 }
397
398 HRESULT WINAPI IDirect3DDevice2Impl_SetClipStatus(
399     LPDIRECT3DDEVICE2 iface, LPD3DCLIPSTATUS lpcs
400 ) {
401     ICOM_THIS(IDirect3DDevice2Impl,iface);
402     FIXME("(%p)->(%p): stub\n", This, lpcs);
403
404     return DD_OK;
405 }
406
407 HRESULT WINAPI IDirect3DDevice2Impl_GetClipStatus(
408     LPDIRECT3DDEVICE2 iface, LPD3DCLIPSTATUS lpcs
409 ) {
410     ICOM_THIS(IDirect3DDevice2Impl,iface);
411     FIXME("(%p)->(%p): stub\n", This, lpcs);
412
413     return DD_OK;
414 }
415
416 /*******************************************************************************
417  *                              Direct3DDevice
418  */
419 HRESULT WINAPI IDirect3DDeviceImpl_QueryInterface(
420     LPDIRECT3DDEVICE iface, REFIID riid, LPVOID* ppvObj
421 ) {
422     ICOM_THIS(IDirect3DDeviceImpl,iface);
423     FIXME("(%p)->(%s,%p): stub\n", This, debugstr_guid(riid),ppvObj);
424     return S_OK;
425 }
426
427 ULONG WINAPI IDirect3DDeviceImpl_AddRef(LPDIRECT3DDEVICE iface)
428 {
429     ICOM_THIS(IDirect3DDeviceImpl,iface);
430     TRACE("(%p)->()incrementing from %lu.\n", This, This->ref );
431
432     return ++(This->ref);
433 }
434
435 ULONG WINAPI IDirect3DDeviceImpl_Release(LPDIRECT3DDEVICE iface)
436 {
437     ICOM_THIS(IDirect3DDeviceImpl,iface);
438     FIXME("(%p)->() decrementing from %lu.\n", This, This->ref );
439
440     if (!--(This->ref)) {
441         HeapFree(GetProcessHeap(),0,This);
442         return 0;
443     }
444     return This->ref;
445 }
446
447 HRESULT WINAPI IDirect3DDeviceImpl_Initialize(
448     LPDIRECT3DDEVICE iface, LPDIRECT3D lpd3d, LPGUID lpGUID,
449     LPD3DDEVICEDESC lpd3ddvdesc
450 ) {
451     ICOM_THIS(IDirect3DDeviceImpl,iface);
452     TRACE("(%p)->(%p,%p,%p): stub\n", This, lpd3d,lpGUID, lpd3ddvdesc);
453
454     return DDERR_ALREADYINITIALIZED;
455 }
456
457
458 HRESULT WINAPI IDirect3DDeviceImpl_GetCaps(
459     LPDIRECT3DDEVICE iface, LPD3DDEVICEDESC lpD3DHWDevDesc,
460     LPD3DDEVICEDESC lpD3DSWDevDesc
461 ) {
462     ICOM_THIS(IDirect3DDeviceImpl,iface);
463     TRACE("(%p)->(%p,%p): stub\n", This, lpD3DHWDevDesc, lpD3DSWDevDesc);
464
465     return DD_OK;
466 }
467
468
469 HRESULT WINAPI IDirect3DDeviceImpl_SwapTextureHandles(
470     LPDIRECT3DDEVICE iface, LPDIRECT3DTEXTURE lpD3DTex1,
471     LPDIRECT3DTEXTURE lpD3DTex2
472 ) {
473     ICOM_THIS(IDirect3DDeviceImpl,iface);
474     TRACE("(%p)->(%p,%p): stub\n", This, lpD3DTex1, lpD3DTex2);
475
476     return DD_OK;
477 }
478
479 HRESULT WINAPI IDirect3DDeviceImpl_CreateExecuteBuffer(
480     LPDIRECT3DDEVICE iface, LPD3DEXECUTEBUFFERDESC lpDesc,
481     LPDIRECT3DEXECUTEBUFFER *lplpDirect3DExecuteBuffer, IUnknown *pUnkOuter
482 ) {
483     ICOM_THIS(IDirect3DDeviceImpl,iface);
484     FIXME("(%p)->(%p,%p,%p): stub\n", This, lpDesc, lplpDirect3DExecuteBuffer, pUnkOuter);
485     return DD_OK;
486 }
487
488 HRESULT WINAPI IDirect3DDeviceImpl_GetStats(
489     LPDIRECT3DDEVICE iface, LPD3DSTATS lpD3DStats
490 ) {
491     ICOM_THIS(IDirect3DDeviceImpl,iface);
492     TRACE("(%p)->(%p): stub\n", This, lpD3DStats);
493
494     return DD_OK;
495 }
496
497
498 HRESULT WINAPI IDirect3DDeviceImpl_Execute(
499     LPDIRECT3DDEVICE iface, LPDIRECT3DEXECUTEBUFFER lpDirect3DExecuteBuffer,
500     LPDIRECT3DVIEWPORT lpDirect3DViewport, DWORD dwFlags
501 ) {
502     ICOM_THIS(IDirect3DDeviceImpl,iface);
503     TRACE("(%p)->(%p,%p,%08ld): stub\n", This, lpDirect3DExecuteBuffer, lpDirect3DViewport, dwFlags);
504
505     /* Put this as the default context */
506
507     /* Execute... */
508     ((IDirect3DExecuteBufferImpl*)lpDirect3DExecuteBuffer)->execute(lpDirect3DExecuteBuffer, iface, (IDirect3DViewport*)lpDirect3DViewport);
509
510     return DD_OK;
511 }
512
513 HRESULT WINAPI IDirect3DDeviceImpl_AddViewport(
514     LPDIRECT3DDEVICE iface, LPDIRECT3DVIEWPORT lpvp
515 ) {
516     ICOM_THIS(IDirect3DDeviceImpl,iface);
517     IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
518     FIXME("(%p)->(%p): stub\n", This, ilpvp);
519
520     /* Adds this viewport to the viewport list */
521     ilpvp->next = This->viewport_list;
522     This->viewport_list = ilpvp;
523
524     return DD_OK;
525 }
526
527
528
529 HRESULT WINAPI IDirect3DDeviceImpl_DeleteViewport(
530     LPDIRECT3DDEVICE iface, LPDIRECT3DVIEWPORT lpvp
531 ) {
532     ICOM_THIS(IDirect3DDeviceImpl,iface);
533     IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
534     IDirect3DViewport2Impl *cur, *prev;
535     FIXME("(%p)->(%p): stub\n", This, lpvp);
536
537     /* Finds this viewport in the list */
538     prev = NULL;
539     cur = This->viewport_list;
540     while ((cur != NULL) && (cur != ilpvp)) {
541         prev = cur;
542         cur = cur->next;
543     }
544     if (cur == NULL)
545         return DDERR_INVALIDOBJECT;
546
547     /* And remove it */
548     if (prev == NULL)
549         This->viewport_list = cur->next;
550     else
551         prev->next = cur->next;
552     return DD_OK;
553 }
554
555 HRESULT WINAPI IDirect3DDeviceImpl_NextViewport(
556     LPDIRECT3DDEVICE iface, LPDIRECT3DVIEWPORT lpvp,
557     LPDIRECT3DVIEWPORT* lplpvp, DWORD dwFlags
558 ) {
559     ICOM_THIS(IDirect3DDeviceImpl,iface);
560     IDirect3DViewport2Impl* ilpvp=(IDirect3DViewport2Impl*)lpvp;
561     IDirect3DViewport2Impl** ilplpvp=(IDirect3DViewport2Impl**)lplpvp;
562     FIXME("(%p)->(%p,%p,%08lx): stub\n", This, ilpvp, ilplpvp, dwFlags);
563
564     switch (dwFlags) {
565     case D3DNEXT_NEXT:
566         *ilplpvp = ilpvp->next;
567         break;
568     case D3DNEXT_HEAD:
569         *ilplpvp = This->viewport_list;
570         break;
571     case D3DNEXT_TAIL:
572         ilpvp = This->viewport_list;
573         while (ilpvp->next != NULL)
574             ilpvp = ilpvp->next;
575         *ilplpvp = ilpvp;
576         break;
577     default:
578         return DDERR_INVALIDPARAMS;
579     }
580     return DD_OK;
581 }
582
583 HRESULT WINAPI IDirect3DDeviceImpl_Pick(
584     LPDIRECT3DDEVICE iface, LPDIRECT3DEXECUTEBUFFER lpDirect3DExecuteBuffer,
585     LPDIRECT3DVIEWPORT lpDirect3DViewport, DWORD dwFlags, LPD3DRECT lpRect
586 ) {
587     ICOM_THIS(IDirect3DDeviceImpl,iface);
588     TRACE("(%p)->(%p,%p,%08lx,%p): stub\n", This, lpDirect3DExecuteBuffer, lpDirect3DViewport, dwFlags, lpRect);
589     return DD_OK;
590 }
591
592 HRESULT WINAPI IDirect3DDeviceImpl_GetPickRecords(
593     LPDIRECT3DDEVICE iface, LPDWORD lpCount, LPD3DPICKRECORD lpD3DPickRec
594 ) {
595     ICOM_THIS(IDirect3DDeviceImpl,iface);
596     TRACE("(%p)->(%p,%p): stub\n", This, lpCount, lpD3DPickRec);
597
598     return DD_OK;
599 }
600
601
602 HRESULT WINAPI IDirect3DDeviceImpl_EnumTextureFormats(
603     LPDIRECT3DDEVICE iface,LPD3DENUMTEXTUREFORMATSCALLBACK lpd3dEnumTextureProc,
604     LPVOID lpArg
605 ) {
606     ICOM_THIS(IDirect3DDeviceImpl,iface);
607     TRACE("(%p)->(%p,%p): stub\n", This, lpd3dEnumTextureProc, lpArg);
608     return D3D_OK;
609 }
610
611
612 HRESULT WINAPI IDirect3DDeviceImpl_CreateMatrix(
613     LPDIRECT3DDEVICE iface, LPD3DMATRIXHANDLE lpD3DMatHandle
614 )
615 {
616     ICOM_THIS(IDirect3DDeviceImpl,iface);
617     TRACE("(%p)->(%p)\n", This, lpD3DMatHandle);
618
619     *lpD3DMatHandle = (D3DMATRIXHANDLE) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(D3DMATRIX));
620
621     return DD_OK;
622 }
623
624
625 HRESULT WINAPI IDirect3DDeviceImpl_SetMatrix(
626     LPDIRECT3DDEVICE iface, D3DMATRIXHANDLE d3dMatHandle,
627     const LPD3DMATRIX lpD3DMatrix)
628 {
629     ICOM_THIS(IDirect3DDeviceImpl,iface);
630     TRACE("(%p)->(%08lx,%p)\n", This, d3dMatHandle, lpD3DMatrix);
631
632     dump_mat(lpD3DMatrix);
633     *((D3DMATRIX *) d3dMatHandle) = *lpD3DMatrix;
634     return DD_OK;
635 }
636
637
638 HRESULT WINAPI IDirect3DDeviceImpl_GetMatrix(
639     LPDIRECT3DDEVICE iface,D3DMATRIXHANDLE D3DMatHandle,LPD3DMATRIX lpD3DMatrix
640 ) {
641     ICOM_THIS(IDirect3DDeviceImpl,iface);
642     TRACE("(%p)->(%08lx,%p)\n", This, D3DMatHandle, lpD3DMatrix);
643
644     *lpD3DMatrix = *((D3DMATRIX *) D3DMatHandle);
645
646     return DD_OK;
647 }
648
649
650 HRESULT WINAPI IDirect3DDeviceImpl_DeleteMatrix(
651     LPDIRECT3DDEVICE iface, D3DMATRIXHANDLE d3dMatHandle
652 ) {
653     ICOM_THIS(IDirect3DDeviceImpl,iface);
654     TRACE("(%p)->(%08lx)\n", This, d3dMatHandle);
655     HeapFree(GetProcessHeap(),0, (void *) d3dMatHandle);
656     return DD_OK;
657 }
658
659
660 HRESULT WINAPI IDirect3DDeviceImpl_BeginScene(LPDIRECT3DDEVICE iface)
661 {
662     ICOM_THIS(IDirect3DDeviceImpl,iface);
663     FIXME("(%p)->(): stub\n", This);
664     return DD_OK;
665 }
666
667 /* This is for the moment copy-pasted from IDirect3DDevice2...
668    Will make a common function ... */
669 HRESULT WINAPI IDirect3DDeviceImpl_EndScene(LPDIRECT3DDEVICE iface)
670 {
671     ICOM_THIS(IDirect3DDeviceImpl,iface);
672     FIXME("(%p)->(): stub\n", This);
673     return DD_OK;
674 }
675
676 HRESULT WINAPI IDirect3DDeviceImpl_GetDirect3D(
677     LPDIRECT3DDEVICE iface, LPDIRECT3D *lpDirect3D
678 ) {
679     ICOM_THIS(IDirect3DDeviceImpl,iface);
680     TRACE("(%p)->(%p): stub\n", This, lpDirect3D);
681
682     return DD_OK;
683 }
684
685 /*******************************************************************************
686  *                              Direct3DDevice VTable
687  */
688 static ICOM_VTABLE(IDirect3DDevice) WINE_UNUSED d3d_d3ddevice_vtbl =
689 {
690   ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
691   IDirect3DDeviceImpl_QueryInterface,
692   IDirect3DDeviceImpl_AddRef,
693   IDirect3DDeviceImpl_Release,
694   IDirect3DDeviceImpl_Initialize,
695   IDirect3DDeviceImpl_GetCaps,
696   IDirect3DDeviceImpl_SwapTextureHandles,
697   IDirect3DDeviceImpl_CreateExecuteBuffer,
698   IDirect3DDeviceImpl_GetStats,
699   IDirect3DDeviceImpl_Execute,
700   IDirect3DDeviceImpl_AddViewport,
701   IDirect3DDeviceImpl_DeleteViewport,
702   IDirect3DDeviceImpl_NextViewport,
703   IDirect3DDeviceImpl_Pick,
704   IDirect3DDeviceImpl_GetPickRecords,
705   IDirect3DDeviceImpl_EnumTextureFormats,
706   IDirect3DDeviceImpl_CreateMatrix,
707   IDirect3DDeviceImpl_SetMatrix,
708   IDirect3DDeviceImpl_GetMatrix,
709   IDirect3DDeviceImpl_DeleteMatrix,
710   IDirect3DDeviceImpl_BeginScene,
711   IDirect3DDeviceImpl_EndScene,
712   IDirect3DDeviceImpl_GetDirect3D,
713 };