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