/* * Copyright 2000 Marcus Meissner * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "config.h" #include #ifdef HAVE_UNISTD_H # include #endif #include #include #include #include "winerror.h" #include "ddraw.h" #include "d3d.h" #include "wine/debug.h" #include "d3d_private.h" WINE_DEFAULT_DEBUG_CHANNEL(ddraw); HRESULT WINAPI Main_IDirect3DImpl_7_3T_2T_1T_QueryInterface(LPDIRECT3D7 iface, REFIID riid, LPVOID* obp) { ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface); TRACE("(%p/%p)->(%s,%p)\n", This, iface, debugstr_guid(riid), obp); /* By default, set the object pointer to NULL */ *obp = NULL; if (( IsEqualGUID( &IID_IDirectDraw, riid ) ) || ( IsEqualGUID (&IID_IDirectDraw2, riid ) ) || ( IsEqualGUID (&IID_IDirectDraw4, riid ) ) || ( IsEqualGUID( &IID_IDirectDraw7, riid ) ) ) { HRESULT ret; TRACE(" Creating IDirectDrawX interface by calling DirectDraw function.\n"); ret = IDirectDraw_QueryInterface(ICOM_INTERFACE(This->ddraw,IDirectDraw), riid, obp); if (ret == S_OK) { IDirectDraw_Release(ICOM_INTERFACE(This->ddraw,IDirectDraw)); IDirect3D_AddRef(ICOM_INTERFACE(This,IDirect3D)); } return ret; } if ( IsEqualGUID( &IID_IUnknown, riid ) ) { IDirect3D_AddRef(ICOM_INTERFACE(This,IDirect3D)); *obp = iface; TRACE(" Creating IUnknown interface at %p.\n", *obp); return S_OK; } if ( IsEqualGUID( &IID_IDirect3D, riid ) ) { IDirect3D_AddRef(ICOM_INTERFACE(This,IDirect3D)); *obp = ICOM_INTERFACE(This, IDirect3D); TRACE(" Creating IDirect3D interface %p\n", *obp); return S_OK; } if ( IsEqualGUID( &IID_IDirect3D2, riid ) ) { IDirect3D_AddRef(ICOM_INTERFACE(This,IDirect3D)); *obp = ICOM_INTERFACE(This, IDirect3D2); TRACE(" Creating IDirect3D2 interface %p\n", *obp); return S_OK; } if ( IsEqualGUID( &IID_IDirect3D3, riid ) ) { IDirect3D_AddRef(ICOM_INTERFACE(This,IDirect3D)); *obp = ICOM_INTERFACE(This, IDirect3D3); TRACE(" Creating IDirect3D3 interface %p\n", *obp); return S_OK; } if ( IsEqualGUID( &IID_IDirect3D7, riid ) ) { /* This is not 100 % true as we should not be able to QueryInterface a '7' version from another one. But well, to factorize the code, why check for application bugs :-) ? */ IDirect3D_AddRef(ICOM_INTERFACE(This,IDirect3D)); *obp = ICOM_INTERFACE(This, IDirect3D7); TRACE(" Creating IDirect3D7 interface %p\n", *obp); return S_OK; } FIXME("(%p): interface for IID %s NOT found!\n", This, debugstr_guid(riid)); return OLE_E_ENUM_NOMORE; } ULONG WINAPI Main_IDirect3DImpl_7_3T_2T_1T_AddRef(LPDIRECT3D7 iface) { ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface); TRACE("(%p/%p)->() incrementing from %lu.\n", This, iface, This->ref); return ++(This->ref); } ULONG WINAPI Main_IDirect3DImpl_7_3T_2T_1T_Release(LPDIRECT3D7 iface) { ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface); TRACE("(%p/%p)->() decrementing from %lu.\n", This, iface, This->ref); if (--(This->ref) == 0) { IDirectDraw_Release(ICOM_INTERFACE(This->ddraw, IDirectDraw)); HeapFree(GetProcessHeap(), 0, This); return 0; } return This->ref; } HRESULT WINAPI Main_IDirect3DImpl_1_Initialize(LPDIRECT3D iface, REFIID riid) { ICOM_THIS_FROM(IDirect3DImpl, IDirect3D, iface); TRACE("(%p/%p)->(%s) no-op...\n", This, iface, debugstr_guid(riid)); return D3D_OK; } HRESULT WINAPI Main_IDirect3DImpl_3_2T_1T_EnumDevices(LPDIRECT3D3 iface, LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback, LPVOID lpUserArg) { ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface); FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpEnumDevicesCallback, lpUserArg); return D3D_OK; } HRESULT WINAPI Main_IDirect3DImpl_3_2T_1T_CreateLight(LPDIRECT3D3 iface, LPDIRECT3DLIGHT* lplpDirect3DLight, IUnknown* pUnkOuter) { ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface); FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lplpDirect3DLight, pUnkOuter); return D3D_OK; } HRESULT WINAPI Main_IDirect3DImpl_3_2T_1T_CreateMaterial(LPDIRECT3D3 iface, LPDIRECT3DMATERIAL3* lplpDirect3DMaterial3, IUnknown* pUnkOuter) { ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface); FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lplpDirect3DMaterial3, pUnkOuter); return D3D_OK; } HRESULT WINAPI Main_IDirect3DImpl_3_2T_1T_CreateViewport(LPDIRECT3D3 iface, LPDIRECT3DVIEWPORT3* lplpD3DViewport3, IUnknown* pUnkOuter) { ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface); FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lplpD3DViewport3, pUnkOuter); return D3D_OK; } HRESULT WINAPI Main_IDirect3DImpl_3_2T_1T_FindDevice(LPDIRECT3D3 iface, LPD3DFINDDEVICESEARCH lpD3DDFS, LPD3DFINDDEVICERESULT lpD3DFDR) { ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface); FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpD3DDFS, lpD3DFDR); return D3D_OK; } HRESULT WINAPI Main_IDirect3DImpl_2_CreateDevice(LPDIRECT3D2 iface, REFCLSID rclsid, LPDIRECTDRAWSURFACE lpDDS, LPDIRECT3DDEVICE2* lplpD3DDevice2) { ICOM_THIS_FROM(IDirect3DImpl, IDirect3D2, iface); FIXME("(%p/%p)->(%s,%p,%p): stub!\n", This, iface, debugstr_guid(rclsid), lpDDS, lplpD3DDevice2); return D3D_OK; } HRESULT WINAPI Main_IDirect3DImpl_3_CreateDevice(LPDIRECT3D3 iface, REFCLSID rclsid, LPDIRECTDRAWSURFACE4 lpDDS, LPDIRECT3DDEVICE3* lplpD3DDevice3, LPUNKNOWN lpUnk) { ICOM_THIS_FROM(IDirect3DImpl, IDirect3D3, iface); FIXME("(%p/%p)->(%s,%p,%p,%p): stub!\n", This, iface, debugstr_guid(rclsid), lpDDS, lplpD3DDevice3, lpUnk); return D3D_OK; } HRESULT WINAPI Main_IDirect3DImpl_7_3T_EnumZBufferFormats(LPDIRECT3D7 iface, REFCLSID riidDevice, LPD3DENUMPIXELFORMATSCALLBACK lpEnumCallback, LPVOID lpContext) { ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface); FIXME("(%p/%p)->(%s,%p,%p): stub!\n", This, iface, debugstr_guid(riidDevice), lpEnumCallback, lpContext); return D3D_OK; } HRESULT WINAPI Main_IDirect3DImpl_7_3T_EvictManagedTextures(LPDIRECT3D7 iface) { ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface); FIXME("(%p/%p)->(): stub!\n", This, iface); return D3D_OK; } HRESULT WINAPI Main_IDirect3DImpl_7_EnumDevices(LPDIRECT3D7 iface, LPD3DENUMDEVICESCALLBACK7 lpEnumDevicesCallback, LPVOID lpUserArg) { ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface); FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpEnumDevicesCallback, lpUserArg); return D3D_OK; } HRESULT WINAPI Main_IDirect3DImpl_7_CreateDevice(LPDIRECT3D7 iface, REFCLSID rclsid, LPDIRECTDRAWSURFACE7 lpDDS, LPDIRECT3DDEVICE7* lplpD3DDevice) { ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface); FIXME("(%p/%p)->(%s,%p,%p): stub!\n", This, iface, debugstr_guid(rclsid), lpDDS, lplpD3DDevice); return D3D_OK; } HRESULT WINAPI Main_IDirect3DImpl_7_3T_CreateVertexBuffer(LPDIRECT3D7 iface, LPD3DVERTEXBUFFERDESC lpD3DVertBufDesc, LPDIRECT3DVERTEXBUFFER7* lplpD3DVertBuf, DWORD dwFlags) { ICOM_THIS_FROM(IDirect3DImpl, IDirect3D7, iface); FIXME("(%p/%p)->(%p,%p,%08lx): stub!\n", This, iface, lpD3DVertBufDesc, lplpD3DVertBuf, dwFlags); return D3D_OK; } HRESULT WINAPI Thunk_IDirect3DImpl_3_QueryInterface(LPDIRECT3D3 iface, REFIID riid, LPVOID* obp) { TRACE("(%p)->(%s,%p) thunking to IDirect3D7 interface.\n", iface, debugstr_guid(riid), obp); return IDirect3D7_QueryInterface(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D3, IDirect3D7, iface), riid, obp); } HRESULT WINAPI Thunk_IDirect3DImpl_2_QueryInterface(LPDIRECT3D2 iface, REFIID riid, LPVOID* obp) { TRACE("(%p)->(%s,%p) thunking to IDirect3D7 interface.\n", iface, debugstr_guid(riid), obp); return IDirect3D7_QueryInterface(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D7, iface), riid, obp); } HRESULT WINAPI Thunk_IDirect3DImpl_1_QueryInterface(LPDIRECT3D iface, REFIID riid, LPVOID* obp) { TRACE("(%p)->(%s,%p) thunking to IDirect3D7 interface.\n", iface, debugstr_guid(riid), obp); return IDirect3D7_QueryInterface(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D7, iface), riid, obp); } ULONG WINAPI Thunk_IDirect3DImpl_3_AddRef(LPDIRECT3D3 iface) { TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface); return IDirect3D7_AddRef(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D3, IDirect3D7, iface)); } ULONG WINAPI Thunk_IDirect3DImpl_2_AddRef(LPDIRECT3D2 iface) { TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface); return IDirect3D7_AddRef(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D7, iface)); } ULONG WINAPI Thunk_IDirect3DImpl_1_AddRef(LPDIRECT3D iface) { TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface); return IDirect3D7_AddRef(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D7, iface)); } ULONG WINAPI Thunk_IDirect3DImpl_3_Release(LPDIRECT3D3 iface) { TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface); return IDirect3D7_Release(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D3, IDirect3D7, iface)); } ULONG WINAPI Thunk_IDirect3DImpl_2_Release(LPDIRECT3D2 iface) { TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface); return IDirect3D7_Release(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D7, iface)); } ULONG WINAPI Thunk_IDirect3DImpl_1_Release(LPDIRECT3D iface) { TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface); return IDirect3D7_Release(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D7, iface)); } HRESULT WINAPI Thunk_IDirect3DImpl_3_EnumZBufferFormats(LPDIRECT3D3 iface, REFCLSID riidDevice, LPD3DENUMPIXELFORMATSCALLBACK lpEnumCallback, LPVOID lpContext) { TRACE("(%p)->(%s,%p,%p) thunking to IDirect3D7 interface.\n", iface, debugstr_guid(riidDevice), lpEnumCallback, lpContext); return IDirect3D7_EnumZBufferFormats(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D3, IDirect3D7, iface), riidDevice, lpEnumCallback, lpContext); } HRESULT WINAPI Thunk_IDirect3DImpl_3_EvictManagedTextures(LPDIRECT3D3 iface) { TRACE("(%p)->() thunking to IDirect3D7 interface.\n", iface); return IDirect3D7_EvictManagedTextures(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D3, IDirect3D7, iface)); } HRESULT WINAPI Thunk_IDirect3DImpl_2_EnumDevices(LPDIRECT3D2 iface, LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback, LPVOID lpUserArg) { TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lpEnumDevicesCallback, lpUserArg); return IDirect3D3_EnumDevices(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D3, iface), lpEnumDevicesCallback, lpUserArg); } HRESULT WINAPI Thunk_IDirect3DImpl_1_EnumDevices(LPDIRECT3D iface, LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback, LPVOID lpUserArg) { TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lpEnumDevicesCallback, lpUserArg); return IDirect3D3_EnumDevices(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D3, iface), lpEnumDevicesCallback, lpUserArg); } HRESULT WINAPI Thunk_IDirect3DImpl_2_CreateLight(LPDIRECT3D2 iface, LPDIRECT3DLIGHT* lplpDirect3DLight, IUnknown* pUnkOuter) { TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lplpDirect3DLight, pUnkOuter); return IDirect3D3_CreateLight(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D3, iface), lplpDirect3DLight, pUnkOuter); } HRESULT WINAPI Thunk_IDirect3DImpl_1_CreateLight(LPDIRECT3D iface, LPDIRECT3DLIGHT* lplpDirect3DLight, IUnknown* pUnkOuter) { TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lplpDirect3DLight, pUnkOuter); return IDirect3D3_CreateLight(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D3, iface), lplpDirect3DLight, pUnkOuter); } HRESULT WINAPI Thunk_IDirect3DImpl_1_CreateMaterial(LPDIRECT3D iface, LPDIRECT3DMATERIAL* lplpDirect3DMaterial, IUnknown* pUnkOuter) { HRESULT ret; LPDIRECT3DMATERIAL3 ret_val; TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lplpDirect3DMaterial, pUnkOuter); ret = IDirect3D3_CreateMaterial(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D3, iface), &ret_val, pUnkOuter); *lplpDirect3DMaterial = COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial3, IDirect3DMaterial, ret_val); TRACE(" returning interface %p.\n", *lplpDirect3DMaterial); return ret; } HRESULT WINAPI Thunk_IDirect3DImpl_1_CreateViewport(LPDIRECT3D iface, LPDIRECT3DVIEWPORT* lplpD3DViewport, IUnknown* pUnkOuter) { TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lplpD3DViewport, pUnkOuter); return IDirect3D3_CreateViewport(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D3, iface), (LPDIRECT3DVIEWPORT3 *) lplpD3DViewport /* No need to cast here */, pUnkOuter); } HRESULT WINAPI Thunk_IDirect3DImpl_2_CreateMaterial(LPDIRECT3D2 iface, LPDIRECT3DMATERIAL2* lplpDirect3DMaterial2, IUnknown* pUnkOuter) { HRESULT ret; LPDIRECT3DMATERIAL3 ret_val; TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lplpDirect3DMaterial2, pUnkOuter); ret = IDirect3D3_CreateMaterial(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D3, iface), &ret_val, pUnkOuter); *lplpDirect3DMaterial2 = COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial3, IDirect3DMaterial2, ret_val); TRACE(" returning interface %p.\n", *lplpDirect3DMaterial2); return ret; } HRESULT WINAPI Thunk_IDirect3DImpl_2_CreateViewport(LPDIRECT3D2 iface, LPDIRECT3DVIEWPORT* lplpD3DViewport2, IUnknown* pUnkOuter) { TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lplpD3DViewport2, pUnkOuter); return IDirect3D3_CreateViewport(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D3, iface), (LPDIRECT3DVIEWPORT3 *) lplpD3DViewport2 /* No need to cast here */, pUnkOuter); } HRESULT WINAPI Thunk_IDirect3DImpl_3_CreateVertexBuffer(LPDIRECT3D3 iface, LPD3DVERTEXBUFFERDESC lpD3DVertBufDesc, LPDIRECT3DVERTEXBUFFER* lplpD3DVertBuf, DWORD dwFlags, LPUNKNOWN lpUnk) { HRESULT ret; LPDIRECT3DVERTEXBUFFER7 ret_val; TRACE("(%p)->(%p,%p,%08lx,%p) thunking to IDirect3D7 interface.\n", iface, lpD3DVertBufDesc, lplpD3DVertBuf, dwFlags, lpUnk); /* dwFlags is not used in the D3D7 interface, use the vertex buffer description instead */ if (dwFlags & D3DDP_DONOTCLIP) lpD3DVertBufDesc->dwCaps |= D3DVBCAPS_DONOTCLIP; ret = IDirect3D7_CreateVertexBuffer(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D3, IDirect3D7, iface), lpD3DVertBufDesc, &ret_val, dwFlags); *lplpD3DVertBuf = COM_INTERFACE_CAST(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7, IDirect3DVertexBuffer, ret_val); TRACE(" returning interface %p.\n", *lplpD3DVertBuf); return ret; } HRESULT WINAPI Thunk_IDirect3DImpl_1_FindDevice(LPDIRECT3D iface, LPD3DFINDDEVICESEARCH lpD3DDFS, LPD3DFINDDEVICERESULT lplpD3DDevice) { TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lpD3DDFS, lplpD3DDevice); return IDirect3D3_FindDevice(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D, IDirect3D3, iface), lpD3DDFS, lplpD3DDevice); } HRESULT WINAPI Thunk_IDirect3DImpl_2_FindDevice(LPDIRECT3D2 iface, LPD3DFINDDEVICESEARCH lpD3DDFS, LPD3DFINDDEVICERESULT lpD3DFDR) { TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, lpD3DDFS, lpD3DFDR); return IDirect3D3_FindDevice(COM_INTERFACE_CAST(IDirect3DImpl, IDirect3D2, IDirect3D3, iface), lpD3DDFS, lpD3DFDR); }