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