2 * Copyright 2000 Marcus Meissner
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32 #include "wine/debug.h"
34 #include "d3d_private.h"
36 WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
39 Main_IDirect3DImpl_7_3T_2T_1T_QueryInterface(LPDIRECT3D7 iface,
43 ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface);
45 TRACE("(%p/%p)->(%s,%p)\n", This, iface, debugstr_guid(riid), obp);
47 /* By default, set the object pointer to NULL */
50 if (( IsEqualGUID( &IID_IDirectDraw, riid ) ) ||
51 ( IsEqualGUID (&IID_IDirectDraw2, riid ) ) ||
52 ( IsEqualGUID (&IID_IDirectDraw4, riid ) ) ||
53 ( IsEqualGUID( &IID_IDirectDraw7, riid ) )
56 TRACE(" Creating IDirectDrawX interface by calling DirectDraw function.\n");
57 ret = IDirectDraw_QueryInterface(ICOM_INTERFACE(This->ddraw,IDirectDraw), riid, obp);
59 IDirectDraw_Release(ICOM_INTERFACE(This->ddraw,IDirectDraw));
60 IDirect3D_AddRef(ICOM_INTERFACE(This,IDirect3D));
64 if ( IsEqualGUID( &IID_IUnknown, riid ) ) {
65 IDirect3D_AddRef(ICOM_INTERFACE(This,IDirect3D));
67 TRACE(" Creating IUnknown interface at %p.\n", *obp);
70 if ( IsEqualGUID( &IID_IDirect3D, riid ) ) {
71 IDirect3D_AddRef(ICOM_INTERFACE(This,IDirect3D));
72 *obp = ICOM_INTERFACE(This, IDirect3D);
73 TRACE(" Creating IDirect3D interface %p\n", *obp);
76 if ( IsEqualGUID( &IID_IDirect3D2, riid ) ) {
77 IDirect3D_AddRef(ICOM_INTERFACE(This,IDirect3D));
78 *obp = ICOM_INTERFACE(This, IDirect3D2);
79 TRACE(" Creating IDirect3D2 interface %p\n", *obp);
82 if ( IsEqualGUID( &IID_IDirect3D3, riid ) ) {
83 IDirect3D_AddRef(ICOM_INTERFACE(This,IDirect3D));
84 *obp = ICOM_INTERFACE(This, IDirect3D3);
85 TRACE(" Creating IDirect3D3 interface %p\n", *obp);
88 if ( IsEqualGUID( &IID_IDirect3D7, riid ) ) {
89 /* This is not 100 % true as we should not be able to QueryInterface a '7' version from another one.
90 But well, to factorize the code, why check for application bugs :-) ?
92 IDirect3D_AddRef(ICOM_INTERFACE(This,IDirect3D));
93 *obp = ICOM_INTERFACE(This, IDirect3D7);
94 TRACE(" Creating IDirect3D7 interface %p\n", *obp);
97 FIXME("(%p): interface for IID %s NOT found!\n", This, debugstr_guid(riid));
98 return OLE_E_ENUM_NOMORE;
102 Main_IDirect3DImpl_7_3T_2T_1T_AddRef(LPDIRECT3D7 iface)
104 ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface);
105 TRACE("(%p/%p)->() incrementing from %lu.\n", This, iface, This->ref);
107 return ++(This->ref);
111 Main_IDirect3DImpl_7_3T_2T_1T_Release(LPDIRECT3D7 iface)
113 ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface);
114 TRACE("(%p/%p)->() decrementing from %lu.\n", This, iface, This->ref);
115 if (--(This->ref) == 0) {
116 IDirectDraw_Release(ICOM_INTERFACE(This->ddraw, IDirectDraw));
117 HeapFree(GetProcessHeap(), 0, This);
124 Main_IDirect3DImpl_1_Initialize(LPDIRECT3D iface,
127 ICOM_THIS_FROM(IDirect3DImpl, IDirect3D, iface);
128 TRACE("(%p/%p)->(%s) no-op...\n", This, iface, debugstr_guid(riid));
133 Main_IDirect3DImpl_3_2T_1T_EnumDevices(LPDIRECT3D3 iface,
134 LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback,
137 ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface);
138 FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpEnumDevicesCallback, lpUserArg);
143 Main_IDirect3DImpl_3_2T_1T_CreateLight(LPDIRECT3D3 iface,
144 LPDIRECT3DLIGHT* lplpDirect3DLight,
147 ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface);
148 FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lplpDirect3DLight, pUnkOuter);
153 Main_IDirect3DImpl_3_2T_1T_CreateMaterial(LPDIRECT3D3 iface,
154 LPDIRECT3DMATERIAL3* lplpDirect3DMaterial3,
157 ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface);
158 FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lplpDirect3DMaterial3, pUnkOuter);
163 Main_IDirect3DImpl_3_2T_1T_CreateViewport(LPDIRECT3D3 iface,
164 LPDIRECT3DVIEWPORT3* lplpD3DViewport3,
167 ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface);
168 FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lplpD3DViewport3, pUnkOuter);
173 Main_IDirect3DImpl_3_2T_1T_FindDevice(LPDIRECT3D3 iface,
174 LPD3DFINDDEVICESEARCH lpD3DDFS,
175 LPD3DFINDDEVICERESULT lpD3DFDR)
177 ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface);
178 FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpD3DDFS, lpD3DFDR);
183 Main_IDirect3DImpl_2_CreateDevice(LPDIRECT3D2 iface,
185 LPDIRECTDRAWSURFACE lpDDS,
186 LPDIRECT3DDEVICE2* lplpD3DDevice2)
188 ICOM_THIS_FROM(IDirect3DImpl, IDirect3D2, iface);
189 FIXME("(%p/%p)->(%s,%p,%p): stub!\n", This, iface, debugstr_guid(rclsid), lpDDS, lplpD3DDevice2);
194 Main_IDirect3DImpl_3_CreateDevice(LPDIRECT3D3 iface,
196 LPDIRECTDRAWSURFACE4 lpDDS,
197 LPDIRECT3DDEVICE3* lplpD3DDevice3,
200 ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface);
201 FIXME("(%p/%p)->(%s,%p,%p,%p): stub!\n", This, iface, debugstr_guid(rclsid), lpDDS, lplpD3DDevice3, lpUnk);
206 Main_IDirect3DImpl_7_3T_EnumZBufferFormats(LPDIRECT3D7 iface,
208 LPD3DENUMPIXELFORMATSCALLBACK lpEnumCallback,
211 ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface);
212 FIXME("(%p/%p)->(%s,%p,%p): stub!\n", This, iface, debugstr_guid(riidDevice), lpEnumCallback, lpContext);
217 Main_IDirect3DImpl_7_3T_EvictManagedTextures(LPDIRECT3D7 iface)
219 ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface);
220 FIXME("(%p/%p)->(): stub!\n", This, iface);
225 Main_IDirect3DImpl_7_EnumDevices(LPDIRECT3D7 iface,
226 LPD3DENUMDEVICESCALLBACK7 lpEnumDevicesCallback,
229 ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface);
230 FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpEnumDevicesCallback, lpUserArg);
235 Main_IDirect3DImpl_7_CreateDevice(LPDIRECT3D7 iface,
237 LPDIRECTDRAWSURFACE7 lpDDS,
238 LPDIRECT3DDEVICE7* lplpD3DDevice)
240 ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface);
241 FIXME("(%p/%p)->(%s,%p,%p): stub!\n", This, iface, debugstr_guid(rclsid), lpDDS, lplpD3DDevice);
246 Main_IDirect3DImpl_7_3T_CreateVertexBuffer(LPDIRECT3D7 iface,
247 LPD3DVERTEXBUFFERDESC lpD3DVertBufDesc,
248 LPDIRECT3DVERTEXBUFFER7* lplpD3DVertBuf,
251 ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface);
252 FIXME("(%p/%p)->(%p,%p,%08lx): stub!\n", This, iface, lpD3DVertBufDesc, lplpD3DVertBuf, dwFlags);
257 Thunk_IDirect3DImpl_3_QueryInterface(LPDIRECT3D3 iface,
261 TRACE("(%p)->(%s,%p) thunking to IDirect3D7 interface.\n", iface, debugstr_guid(riid), obp);
262 return IDirect3D7_QueryInterface(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D3, IDirect3D7, iface),
268 Thunk_IDirect3DImpl_2_QueryInterface(LPDIRECT3D2 iface,
272 TRACE("(%p)->(%s,%p) thunking to IDirect3D7 interface.\n", iface, debugstr_guid(riid), obp);
273 return IDirect3D7_QueryInterface(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D7, iface),
279 Thunk_IDirect3DImpl_1_QueryInterface(LPDIRECT3D iface,
283 TRACE("(%p)->(%s,%p) thunking to IDirect3D7 interface.\n", iface, debugstr_guid(riid), obp);
284 return IDirect3D7_QueryInterface(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D7, iface),
290 Thunk_IDirect3DImpl_3_AddRef(LPDIRECT3D3 iface)
292 TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface);
293 return IDirect3D7_AddRef(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D3, IDirect3D7, iface));
297 Thunk_IDirect3DImpl_2_AddRef(LPDIRECT3D2 iface)
299 TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface);
300 return IDirect3D7_AddRef(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D7, iface));
304 Thunk_IDirect3DImpl_1_AddRef(LPDIRECT3D iface)
306 TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface);
307 return IDirect3D7_AddRef(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D7, iface));
311 Thunk_IDirect3DImpl_3_Release(LPDIRECT3D3 iface)
313 TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface);
314 return IDirect3D7_Release(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D3, IDirect3D7, iface));
318 Thunk_IDirect3DImpl_2_Release(LPDIRECT3D2 iface)
320 TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface);
321 return IDirect3D7_Release(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D7, iface));
325 Thunk_IDirect3DImpl_1_Release(LPDIRECT3D iface)
327 TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface);
328 return IDirect3D7_Release(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D7, iface));
332 Thunk_IDirect3DImpl_3_EnumZBufferFormats(LPDIRECT3D3 iface,
334 LPD3DENUMPIXELFORMATSCALLBACK lpEnumCallback,
337 TRACE("(%p)->(%s,%p,%p) thunking to IDirect3D7 interface.\n", iface, debugstr_guid(riidDevice), lpEnumCallback, lpContext);
338 return IDirect3D7_EnumZBufferFormats(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D3, IDirect3D7, iface),
345 Thunk_IDirect3DImpl_3_EvictManagedTextures(LPDIRECT3D3 iface)
347 TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface);
348 return IDirect3D7_EvictManagedTextures(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D3, IDirect3D7, iface));
352 Thunk_IDirect3DImpl_2_EnumDevices(LPDIRECT3D2 iface,
353 LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback,
356 TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lpEnumDevicesCallback, lpUserArg);
357 return IDirect3D3_EnumDevices(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D3, iface),
358 lpEnumDevicesCallback,
363 Thunk_IDirect3DImpl_1_EnumDevices(LPDIRECT3D iface,
364 LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback,
367 TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lpEnumDevicesCallback, lpUserArg);
368 return IDirect3D3_EnumDevices(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D3, iface),
369 lpEnumDevicesCallback,
374 Thunk_IDirect3DImpl_2_CreateLight(LPDIRECT3D2 iface,
375 LPDIRECT3DLIGHT* lplpDirect3DLight,
378 TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lplpDirect3DLight, pUnkOuter);
379 return IDirect3D3_CreateLight(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D3, iface),
385 Thunk_IDirect3DImpl_1_CreateLight(LPDIRECT3D iface,
386 LPDIRECT3DLIGHT* lplpDirect3DLight,
389 TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lplpDirect3DLight, pUnkOuter);
390 return IDirect3D3_CreateLight(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D3, iface),
396 Thunk_IDirect3DImpl_1_CreateMaterial(LPDIRECT3D iface,
397 LPDIRECT3DMATERIAL* lplpDirect3DMaterial,
401 LPDIRECT3DMATERIAL3 ret_val;
403 TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lplpDirect3DMaterial, pUnkOuter);
404 ret = IDirect3D3_CreateMaterial(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D3, iface),
408 *lplpDirect3DMaterial = COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial3, IDirect3DMaterial, ret_val);
410 TRACE(" returning interface %p.\n", *lplpDirect3DMaterial);
416 Thunk_IDirect3DImpl_1_CreateViewport(LPDIRECT3D iface,
417 LPDIRECT3DVIEWPORT* lplpD3DViewport,
420 TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lplpD3DViewport, pUnkOuter);
421 return IDirect3D3_CreateViewport(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D3, iface),
422 (LPDIRECT3DVIEWPORT3 *) lplpD3DViewport /* No need to cast here */,
427 Thunk_IDirect3DImpl_2_CreateMaterial(LPDIRECT3D2 iface,
428 LPDIRECT3DMATERIAL2* lplpDirect3DMaterial2,
432 LPDIRECT3DMATERIAL3 ret_val;
434 TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lplpDirect3DMaterial2, pUnkOuter);
435 ret = IDirect3D3_CreateMaterial(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D3, iface),
439 *lplpDirect3DMaterial2 = COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial3, IDirect3DMaterial2, ret_val);
441 TRACE(" returning interface %p.\n", *lplpDirect3DMaterial2);
447 Thunk_IDirect3DImpl_2_CreateViewport(LPDIRECT3D2 iface,
448 LPDIRECT3DVIEWPORT* lplpD3DViewport2,
451 TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lplpD3DViewport2, pUnkOuter);
452 return IDirect3D3_CreateViewport(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D3, iface),
453 (LPDIRECT3DVIEWPORT3 *) lplpD3DViewport2 /* No need to cast here */,
459 Thunk_IDirect3DImpl_3_CreateVertexBuffer(LPDIRECT3D3 iface,
460 LPD3DVERTEXBUFFERDESC lpD3DVertBufDesc,
461 LPDIRECT3DVERTEXBUFFER* lplpD3DVertBuf,
466 LPDIRECT3DVERTEXBUFFER7 ret_val;
468 TRACE("(%p)->(%p,%p,%08lx,%p) thunking to IDirect3D7 interface.\n", iface, lpD3DVertBufDesc, lplpD3DVertBuf, dwFlags, lpUnk);
470 /* dwFlags is not used in the D3D7 interface, use the vertex buffer description instead */
471 if (dwFlags & D3DDP_DONOTCLIP) lpD3DVertBufDesc->dwCaps |= D3DVBCAPS_DONOTCLIP;
473 ret = IDirect3D7_CreateVertexBuffer(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D3, IDirect3D7, iface),
478 *lplpD3DVertBuf = COM_INTERFACE_CAST(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7, IDirect3DVertexBuffer, ret_val);
480 TRACE(" returning interface %p.\n", *lplpD3DVertBuf);
486 Thunk_IDirect3DImpl_1_FindDevice(LPDIRECT3D iface,
487 LPD3DFINDDEVICESEARCH lpD3DDFS,
488 LPD3DFINDDEVICERESULT lplpD3DDevice)
490 TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lpD3DDFS, lplpD3DDevice);
491 return IDirect3D3_FindDevice(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D3, iface),
497 Thunk_IDirect3DImpl_2_FindDevice(LPDIRECT3D2 iface,
498 LPD3DFINDDEVICESEARCH lpD3DDFS,
499 LPD3DFINDDEVICERESULT lpD3DFDR)
501 TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lpD3DDFS, lpD3DFDR);
502 return IDirect3D3_FindDevice(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D3, iface),