2003-07-01 03:09:17 +02:00
/*
* IDirect3DDevice9 implementation
*
2005-01-28 15:03:32 +01:00
* Copyright 2002 - 2005 Jason Edmeades
2005-03-02 13:16:10 +01:00
* Copyright 2002 - 2005 Raphael Junqueira
* Copyright 2005 Oliver Stieber
2003-07-01 03:09:17 +02:00
*
* 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
2006-05-18 14:49:52 +02:00
* Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 , USA
2003-07-01 03:09:17 +02:00
*/
# include "config.h"
# include "d3d9_private.h"
2005-03-02 13:16:10 +01:00
WINE_DEFAULT_DEBUG_CHANNEL ( d3d9 ) ;
2003-07-01 03:09:17 +02:00
/* IDirect3D IUnknown parts follow: */
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_QueryInterface ( LPDIRECT3DDEVICE9 iface , REFIID riid , LPVOID * ppobj ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2003-07-01 03:09:17 +02:00
if ( IsEqualGUID ( riid , & IID_IUnknown )
| | IsEqualGUID ( riid , & IID_IDirect3DDevice9 ) ) {
2005-08-23 11:34:57 +02:00
IUnknown_AddRef ( iface ) ;
2003-07-01 03:09:17 +02:00
* ppobj = This ;
2006-06-07 15:13:29 +02:00
return S_OK ;
2003-07-01 03:09:17 +02:00
}
WARN ( " (%p)->(%s,%p),not found \n " , This , debugstr_guid ( riid ) , ppobj ) ;
2006-06-07 15:13:29 +02:00
* ppobj = NULL ;
2003-07-01 03:09:17 +02:00
return E_NOINTERFACE ;
}
2006-06-10 11:51:05 +02:00
static ULONG WINAPI IDirect3DDevice9Impl_AddRef ( LPDIRECT3DDEVICE9 iface ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2005-01-24 12:31:45 +01:00
ULONG ref = InterlockedIncrement ( & This - > ref ) ;
2006-10-10 19:23:22 +02:00
TRACE ( " (%p) : AddRef from %d \n " , This , ref - 1 ) ;
2005-01-24 12:31:45 +01:00
return ref ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static ULONG WINAPI IDirect3DDevice9Impl_Release ( LPDIRECT3DDEVICE9 iface ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2006-12-18 00:17:16 +01:00
ULONG ref ;
if ( This - > inDestruction ) return 0 ;
ref = InterlockedDecrement ( & This - > ref ) ;
2005-01-24 12:31:45 +01:00
2006-10-10 19:23:22 +02:00
TRACE ( " (%p) : ReleaseRef to %d \n " , This , ref ) ;
2005-01-24 12:31:45 +01:00
2003-07-01 03:09:17 +02:00
if ( ref = = 0 ) {
2008-01-03 22:30:11 +01:00
unsigned i ;
2006-12-18 00:17:16 +01:00
This - > inDestruction = TRUE ;
2007-04-17 20:04:26 +02:00
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
2007-04-17 20:04:26 +02:00
for ( i = 0 ; i < This - > numConvertedDecls ; i + + ) {
/* Unless Wine is buggy or the app has a bug the refcount will be 0, because decls hold a reference to the
* device
*/
IDirect3DVertexDeclaration9Impl_Destroy ( This - > convertedDecls [ i ] ) ;
}
HeapFree ( GetProcessHeap ( ) , 0 , This - > convertedDecls ) ;
2006-12-18 00:17:24 +01:00
IWineD3DDevice_Uninit3D ( This - > WineD3DDevice , D3D9CB_DestroyDepthStencilSurface , D3D9CB_DestroySwapChain ) ;
2004-10-08 22:52:33 +02:00
IWineD3DDevice_Release ( This - > WineD3DDevice ) ;
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
2003-07-01 03:09:17 +02:00
HeapFree ( GetProcessHeap ( ) , 0 , This ) ;
}
return ref ;
}
/* IDirect3DDevice Interface follow: */
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_TestCooperativeLevel ( LPDIRECT3DDEVICE9 iface ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2008-02-06 20:35:06 +01:00
TRACE ( " (%p) \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_TestCooperativeLevel ( This - > WineD3DDevice ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
2008-02-06 20:35:06 +01:00
if ( hr = = WINED3D_OK & & This - > notreset ) {
TRACE ( " D3D9 Device is marked not reset \n " ) ;
hr = D3DERR_DEVICENOTRESET ;
}
2007-06-11 23:14:37 +02:00
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static UINT WINAPI IDirect3DDevice9Impl_GetAvailableTextureMem ( LPDIRECT3DDEVICE9 iface ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetAvailableTextureMem ( This - > WineD3DDevice ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_EvictManagedResources ( LPDIRECT3DDEVICE9 iface ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-07-01 21:15:42 +02:00
TRACE ( " (%p) : Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_EvictManagedResources ( This - > WineD3DDevice ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
HRESULT WINAPI IDirect3DDevice9Impl_GetDirect3D ( LPDIRECT3DDEVICE9 iface , IDirect3D9 * * ppD3D9 ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2005-06-21 22:04:07 +02:00
HRESULT hr = D3D_OK ;
IWineD3D * pWineD3D ;
TRACE ( " (%p) Relay \n " , This ) ;
if ( NULL = = ppD3D9 ) {
return D3DERR_INVALIDCALL ;
}
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
2005-06-21 22:04:07 +02:00
hr = IWineD3DDevice_GetDirect3D ( This - > WineD3DDevice , & pWineD3D ) ;
if ( hr = = D3D_OK & & pWineD3D ! = NULL )
{
2006-12-01 00:16:10 +01:00
IWineD3D_GetParent ( pWineD3D , ( IUnknown * * ) ppD3D9 ) ;
IWineD3D_Release ( pWineD3D ) ;
2005-06-21 22:04:07 +02:00
} else {
FIXME ( " Call to IWineD3DDevice_GetDirect3D failed \n " ) ;
* ppD3D9 = NULL ;
}
2005-11-10 12:17:38 +01:00
TRACE ( " (%p) returning %p \n " , This , * ppD3D9 ) ;
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
2005-06-21 22:04:07 +02:00
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetDeviceCaps ( LPDIRECT3DDEVICE9 iface , D3DCAPS9 * pCaps ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2005-06-17 11:59:03 +02:00
HRESULT hrc = D3D_OK ;
WINED3DCAPS * pWineCaps ;
2005-11-10 13:14:56 +01:00
TRACE ( " (%p) : Relay pCaps %p \n " , This , pCaps ) ;
2005-06-17 11:59:03 +02:00
if ( NULL = = pCaps ) {
return D3DERR_INVALIDCALL ;
}
pWineCaps = HeapAlloc ( GetProcessHeap ( ) , HEAP_ZERO_MEMORY , sizeof ( WINED3DCAPS ) ) ;
if ( pWineCaps = = NULL ) {
return D3DERR_INVALIDCALL ; /* well this is what MSDN says to return */
}
2007-08-21 12:13:42 +02:00
memset ( pCaps , 0 , sizeof ( * pCaps ) ) ;
2005-06-17 11:59:03 +02:00
D3D9CAPSTOWINECAPS ( pCaps , pWineCaps )
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
2005-06-17 11:59:03 +02:00
hrc = IWineD3DDevice_GetDeviceCaps ( This - > WineD3DDevice , pWineCaps ) ;
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
2005-06-17 11:59:03 +02:00
HeapFree ( GetProcessHeap ( ) , 0 , pWineCaps ) ;
2007-08-21 12:13:42 +02:00
/* Some functionality is implemented in d3d9.dll, not wined3d.dll. Add the needed caps */
pCaps - > DevCaps2 | = D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES ;
filter_caps ( pCaps ) ;
2005-06-17 11:59:03 +02:00
TRACE ( " Returning %p %p \n " , This , pCaps ) ;
return hrc ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetDisplayMode ( LPDIRECT3DDEVICE9 iface , UINT iSwapChain , D3DDISPLAYMODE * pMode ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetDisplayMode ( This - > WineD3DDevice , iSwapChain , ( WINED3DDISPLAYMODE * ) pMode ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetCreationParameters ( LPDIRECT3DDEVICE9 iface , D3DDEVICE_CREATION_PARAMETERS * pParameters ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-07-01 21:15:42 +02:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetCreationParameters ( This - > WineD3DDevice , ( WINED3DDEVICE_CREATION_PARAMETERS * ) pParameters ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetCursorProperties ( LPDIRECT3DDEVICE9 iface , UINT XHotSpot , UINT YHotSpot , IDirect3DSurface9 * pCursorBitmap ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2005-03-02 13:16:10 +01:00
IDirect3DSurface9Impl * pSurface = ( IDirect3DSurface9Impl * ) pCursorBitmap ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2006-08-09 22:23:31 +02:00
if ( ! pCursorBitmap ) {
WARN ( " No cursor bitmap, returning WINED3DERR_INVALIDCALL \n " ) ;
return WINED3DERR_INVALIDCALL ;
}
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
2007-12-04 22:45:09 +01:00
hr = IWineD3DDevice_SetCursorProperties ( This - > WineD3DDevice , XHotSpot , YHotSpot , pSurface - > wineD3DSurface ) ;
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static void WINAPI IDirect3DDevice9Impl_SetCursorPosition ( LPDIRECT3DDEVICE9 iface , int XScreenSpace , int YScreenSpace , DWORD Flags ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
2007-04-07 22:58:48 +02:00
IWineD3DDevice_SetCursorPosition ( This - > WineD3DDevice , XScreenSpace , YScreenSpace , Flags ) ;
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static BOOL WINAPI IDirect3DDevice9Impl_ShowCursor ( LPDIRECT3DDEVICE9 iface , BOOL bShow ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
BOOL ret ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2003-07-01 03:09:17 +02:00
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
ret = IWineD3DDevice_ShowCursor ( This - > WineD3DDevice , bShow ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return ret ;
2003-07-01 03:09:17 +02:00
}
2008-01-11 15:38:54 +01:00
static HRESULT WINAPI reset_enum_callback ( IWineD3DResource * resource , void * data ) {
BOOL * resources_ok = ( BOOL * ) data ;
WINED3DRESOURCETYPE type ;
HRESULT ret = S_OK ;
WINED3DSURFACE_DESC surface_desc ;
WINED3DVOLUME_DESC volume_desc ;
WINED3DINDEXBUFFER_DESC index_desc ;
WINED3DVERTEXBUFFER_DESC vertex_desc ;
WINED3DFORMAT dummy_format ;
DWORD dummy_dword ;
WINED3DPOOL pool = WINED3DPOOL_SCRATCH ; /* a harmless pool */
IUnknown * parent ;
type = IWineD3DResource_GetType ( resource ) ;
switch ( type ) {
case WINED3DRTYPE_SURFACE :
surface_desc . Format = & dummy_format ;
surface_desc . Type = & type ;
surface_desc . Usage = & dummy_dword ;
surface_desc . Pool = & pool ;
surface_desc . Size = & dummy_dword ;
surface_desc . MultiSampleType = & dummy_dword ;
surface_desc . MultiSampleQuality = & dummy_dword ;
surface_desc . Width = & dummy_dword ;
surface_desc . Height = & dummy_dword ;
IWineD3DSurface_GetDesc ( ( IWineD3DSurface * ) resource , & surface_desc ) ;
break ;
case WINED3DRTYPE_VOLUME :
volume_desc . Format = & dummy_format ;
volume_desc . Type = & type ;
volume_desc . Usage = & dummy_dword ;
volume_desc . Pool = & pool ;
volume_desc . Size = & dummy_dword ;
volume_desc . Width = & dummy_dword ;
volume_desc . Height = & dummy_dword ;
volume_desc . Depth = & dummy_dword ;
IWineD3DVolume_GetDesc ( ( IWineD3DVolume * ) resource , & volume_desc ) ;
break ;
case WINED3DRTYPE_INDEXBUFFER :
IWineD3DIndexBuffer_GetDesc ( ( IWineD3DIndexBuffer * ) resource , & index_desc ) ;
pool = index_desc . Pool ;
break ;
case WINED3DRTYPE_VERTEXBUFFER :
IWineD3DVertexBuffer_GetDesc ( ( IWineD3DVertexBuffer * ) resource , & vertex_desc ) ;
2008-02-19 12:37:09 +01:00
pool = vertex_desc . Pool ;
2008-01-11 15:38:54 +01:00
break ;
/* No need to check for textures. If there is a D3DPOOL_DEFAULT texture, there
* is a D3DPOOL_DEFAULT surface or volume as well
*/
default :
break ;
}
if ( pool = = WINED3DPOOL_DEFAULT ) {
IWineD3DResource_GetParent ( resource , & parent ) ;
if ( IUnknown_Release ( parent ) = = 0 ) {
TRACE ( " Parent %p is an implicit resource with ref 0 \n " , parent ) ;
} else {
WARN ( " Resource %p(wineD3D %p) with pool D3DPOOL_DEFAULT blocks the Reset call \n " , parent , resource ) ;
ret = S_FALSE ;
* resources_ok = FALSE ;
}
}
IWineD3DResource_Release ( resource ) ;
return ret ;
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_Reset ( LPDIRECT3DDEVICE9 iface , D3DPRESENT_PARAMETERS * pPresentationParameters ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2005-03-02 13:16:10 +01:00
WINED3DPRESENT_PARAMETERS localParameters ;
2007-02-15 22:36:50 +01:00
HRESULT hr ;
2008-01-11 15:38:54 +01:00
BOOL resources_ok = TRUE ;
UINT i ;
2007-02-15 22:36:50 +01:00
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay pPresentationParameters(%p) \n " , This , pPresentationParameters ) ;
2007-02-15 22:36:50 +01:00
2008-01-11 15:38:54 +01:00
/* Reset states that hold a COM object. WineD3D holds an internal reference to set objects, because
* such objects can still be used for rendering after their external d3d9 object has been destroyed .
* These objects must not be enumerated . Unsetting them tells WineD3D that the application will not
* make use of the hidden reference and destroys the objects .
*
* Unsetting them is no problem , because the states are supposed to be reset anyway . If the validation
* below fails , the device is considered " lost " , and _Reset and _Release are the only allowed calls
*/
IWineD3DDevice_SetIndices ( This - > WineD3DDevice , NULL ) ;
for ( i = 0 ; i < 16 ; i + + ) {
IWineD3DDevice_SetStreamSource ( This - > WineD3DDevice , i , NULL , 0 , 0 ) ;
}
for ( i = 0 ; i < 16 ; i + + ) {
IWineD3DDevice_SetTexture ( This - > WineD3DDevice , i , NULL ) ;
}
IWineD3DDevice_EnumResources ( This - > WineD3DDevice , reset_enum_callback , & resources_ok ) ;
if ( ! resources_ok ) {
WARN ( " The application is holding D3DPOOL_DEFAULT resources, rejecting reset \n " ) ;
2008-02-06 20:35:06 +01:00
This - > notreset = TRUE ;
2008-01-11 15:38:54 +01:00
return WINED3DERR_INVALIDCALL ;
}
2007-02-15 22:36:50 +01:00
localParameters . BackBufferWidth = pPresentationParameters - > BackBufferWidth ;
localParameters . BackBufferHeight = pPresentationParameters - > BackBufferHeight ;
localParameters . BackBufferFormat = pPresentationParameters - > BackBufferFormat ;
localParameters . BackBufferCount = pPresentationParameters - > BackBufferCount ;
localParameters . MultiSampleType = pPresentationParameters - > MultiSampleType ;
localParameters . MultiSampleQuality = pPresentationParameters - > MultiSampleQuality ;
localParameters . SwapEffect = pPresentationParameters - > SwapEffect ;
localParameters . hDeviceWindow = pPresentationParameters - > hDeviceWindow ;
localParameters . Windowed = pPresentationParameters - > Windowed ;
localParameters . EnableAutoDepthStencil = pPresentationParameters - > EnableAutoDepthStencil ;
localParameters . AutoDepthStencilFormat = pPresentationParameters - > AutoDepthStencilFormat ;
localParameters . Flags = pPresentationParameters - > Flags ;
localParameters . FullScreen_RefreshRateInHz = pPresentationParameters - > FullScreen_RefreshRateInHz ;
localParameters . PresentationInterval = pPresentationParameters - > PresentationInterval ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
2007-02-15 22:36:50 +01:00
hr = IWineD3DDevice_Reset ( This - > WineD3DDevice , & localParameters ) ;
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
2008-02-06 20:35:06 +01:00
if ( FAILED ( hr ) ) {
This - > notreset = TRUE ;
pPresentationParameters - > BackBufferWidth = localParameters . BackBufferWidth ;
pPresentationParameters - > BackBufferHeight = localParameters . BackBufferHeight ;
pPresentationParameters - > BackBufferFormat = localParameters . BackBufferFormat ;
pPresentationParameters - > BackBufferCount = localParameters . BackBufferCount ;
pPresentationParameters - > MultiSampleType = localParameters . MultiSampleType ;
pPresentationParameters - > MultiSampleQuality = localParameters . MultiSampleQuality ;
pPresentationParameters - > SwapEffect = localParameters . SwapEffect ;
pPresentationParameters - > hDeviceWindow = localParameters . hDeviceWindow ;
pPresentationParameters - > Windowed = localParameters . Windowed ;
pPresentationParameters - > EnableAutoDepthStencil = localParameters . EnableAutoDepthStencil ;
pPresentationParameters - > AutoDepthStencilFormat = localParameters . AutoDepthStencilFormat ;
pPresentationParameters - > Flags = localParameters . Flags ;
pPresentationParameters - > FullScreen_RefreshRateInHz = localParameters . FullScreen_RefreshRateInHz ;
pPresentationParameters - > PresentationInterval = localParameters . PresentationInterval ;
} else {
This - > notreset = FALSE ;
}
2007-02-15 22:36:50 +01:00
return hr ;
2005-03-02 13:16:10 +01:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_Present ( LPDIRECT3DDEVICE9 iface , CONST RECT * pSourceRect , CONST RECT * pDestRect , HWND hDestWindowOverride , CONST RGNDATA *
2005-03-02 13:16:10 +01:00
pDirtyRegion ) {
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_Present ( This - > WineD3DDevice , pSourceRect , pDestRect , hDestWindowOverride , pDirtyRegion ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
}
2003-07-01 03:09:17 +02:00
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetBackBuffer ( LPDIRECT3DDEVICE9 iface , UINT iSwapChain , UINT BackBuffer , D3DBACKBUFFER_TYPE Type , IDirect3DSurface9 * * ppBackBuffer ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2005-01-18 12:42:29 +01:00
IWineD3DSurface * retSurface = NULL ;
HRESULT rc = D3D_OK ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
2007-12-04 22:45:09 +01:00
rc = IWineD3DDevice_GetBackBuffer ( This - > WineD3DDevice , iSwapChain , BackBuffer , ( WINED3DBACKBUFFER_TYPE ) Type , & retSurface ) ;
2005-03-02 13:16:10 +01:00
if ( rc = = D3D_OK & & NULL ! = retSurface & & NULL ! = ppBackBuffer ) {
2005-01-18 12:42:29 +01:00
IWineD3DSurface_GetParent ( retSurface , ( IUnknown * * ) ppBackBuffer ) ;
2006-11-30 13:33:52 +01:00
IWineD3DSurface_Release ( retSurface ) ;
2003-07-01 03:09:17 +02:00
}
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
2005-01-18 12:42:29 +01:00
return rc ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetRasterStatus ( LPDIRECT3DDEVICE9 iface , UINT iSwapChain , D3DRASTER_STATUS * pRasterStatus ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetRasterStatus ( This - > WineD3DDevice , iSwapChain , ( WINED3DRASTER_STATUS * ) pRasterStatus ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetDialogBoxMode ( LPDIRECT3DDEVICE9 iface , BOOL bEnableDialogs ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetDialogBoxMode ( This - > WineD3DDevice , bEnableDialogs ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static void WINAPI IDirect3DDevice9Impl_SetGammaRamp ( LPDIRECT3DDEVICE9 iface , UINT iSwapChain , DWORD Flags , CONST D3DGAMMARAMP * pRamp ) {
2005-03-02 13:16:10 +01:00
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
/* Note: D3DGAMMARAMP is compatible with WINED3DGAMMARAMP */
2007-04-07 22:58:48 +02:00
IWineD3DDevice_SetGammaRamp ( This - > WineD3DDevice , iSwapChain , Flags , ( CONST WINED3DGAMMARAMP * ) pRamp ) ;
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static void WINAPI IDirect3DDevice9Impl_GetGammaRamp ( LPDIRECT3DDEVICE9 iface , UINT iSwapChain , D3DGAMMARAMP * pRamp ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
2006-10-11 03:58:01 +02:00
/* Note: D3DGAMMARAMP is compatible with WINED3DGAMMARAMP */
2007-04-07 22:58:48 +02:00
IWineD3DDevice_GetGammaRamp ( This - > WineD3DDevice , iSwapChain , ( WINED3DGAMMARAMP * ) pRamp ) ;
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
2003-07-01 03:09:17 +02:00
}
2005-03-02 13:16:10 +01:00
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_CreateSurface ( LPDIRECT3DDEVICE9 iface , UINT Width , UINT Height , D3DFORMAT Format , BOOL Lockable , BOOL Discard , UINT Level , IDirect3DSurface9 * * ppSurface , D3DRESOURCETYPE Type , UINT Usage , D3DPOOL Pool , D3DMULTISAMPLE_TYPE MultiSample , DWORD MultisampleQuality , HANDLE * pSharedHandle ) {
2005-03-02 13:16:10 +01:00
HRESULT hrc ;
2005-01-09 18:37:02 +01:00
IDirect3DSurface9Impl * object ;
2005-03-02 13:16:10 +01:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
TRACE ( " (%p) Relay \n " , This ) ;
if ( MultisampleQuality > 0 ) {
2006-10-10 19:23:22 +02:00
FIXME ( " MultisampleQuality set to %d, bstituting 0 \n " , MultisampleQuality ) ;
2005-03-02 13:16:10 +01:00
/*
MultisampleQuality
[ in ] Quality level . The valid range is between zero and one less than the level returned by pQualityLevels used by IDirect3D9 : : CheckDeviceMultiSampleType . Passing a larger value returns the error D3DERR_INVALIDCALL . The MultisampleQuality values of paired render targets , depth stencil surfaces , and the MultiSample type must all match .
*/
MultisampleQuality = 0 ;
}
/*FIXME: Check MAX bounds of MultisampleQuality*/
2005-01-09 18:37:02 +01:00
/* Allocate the storage for the device */
object = HeapAlloc ( GetProcessHeap ( ) , HEAP_ZERO_MEMORY , sizeof ( IDirect3DSurface9Impl ) ) ;
2005-01-18 12:42:29 +01:00
if ( NULL = = object ) {
FIXME ( " Allocation of memory failed \n " ) ;
return D3DERR_OUTOFVIDEOMEMORY ;
}
2005-01-09 18:37:02 +01:00
object - > lpVtbl = & Direct3DSurface9_Vtbl ;
object - > ref = 1 ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) : w(%d) h(%d) fmt(%d) surf@%p \n " , This , Width , Height , Format , * ppSurface ) ;
2006-10-05 17:56:54 +02:00
hrc = IWineD3DDevice_CreateSurface ( This - > WineD3DDevice , Width , Height , Format , Lockable , Discard , Level , & object - > wineD3DSurface , Type , Usage & WINED3DUSAGE_MASK , ( WINED3DPOOL ) Pool , MultiSample , MultisampleQuality , pSharedHandle , SURFACE_OPENGL , ( IUnknown * ) object ) ;
2005-03-02 13:16:10 +01:00
2005-07-01 21:15:42 +02:00
if ( hrc ! = D3D_OK | | NULL = = object - > wineD3DSurface ) {
2005-11-14 12:21:46 +01:00
2005-03-02 13:16:10 +01:00
/* free up object */
2005-07-01 21:15:42 +02:00
FIXME ( " (%p) call to IWineD3DDevice_CreateSurface failed \n " , This ) ;
2005-01-18 12:42:29 +01:00
HeapFree ( GetProcessHeap ( ) , 0 , object ) ;
} else {
2006-05-29 23:01:04 +02:00
IUnknown_AddRef ( iface ) ;
object - > parentDevice = iface ;
2005-11-14 12:21:46 +01:00
TRACE ( " (%p) : Created surface %p \n " , This , object ) ;
2005-01-18 12:42:29 +01:00
* ppSurface = ( LPDIRECT3DSURFACE9 ) object ;
2005-11-14 12:21:46 +01:00
}
2005-01-18 12:42:29 +01:00
return hrc ;
2003-07-01 03:09:17 +02:00
}
2005-03-02 13:16:10 +01:00
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_CreateRenderTarget ( LPDIRECT3DDEVICE9 iface , UINT Width , UINT Height ,
2005-03-02 13:16:10 +01:00
D3DFORMAT Format , D3DMULTISAMPLE_TYPE MultiSample ,
DWORD MultisampleQuality , BOOL Lockable ,
IDirect3DSurface9 * * ppSurface , HANDLE * pSharedHandle ) {
2007-06-11 23:14:37 +02:00
HRESULT hr ;
TRACE ( " Relay \n " ) ;
2005-03-02 13:16:10 +01:00
2007-06-11 23:14:37 +02:00
/* Is this correct? */
EnterCriticalSection ( & d3d9_cs ) ;
hr = IDirect3DDevice9Impl_CreateSurface ( iface , Width , Height , Format , Lockable , FALSE /*Discard*/ , 0 /*Level*/ , ppSurface , D3DRTYPE_SURFACE , D3DUSAGE_RENDERTARGET , D3DPOOL_DEFAULT , MultiSample , MultisampleQuality , pSharedHandle ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2005-03-02 13:16:10 +01:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_CreateDepthStencilSurface ( LPDIRECT3DDEVICE9 iface , UINT Width , UINT Height ,
2005-03-02 13:16:10 +01:00
D3DFORMAT Format , D3DMULTISAMPLE_TYPE MultiSample ,
DWORD MultisampleQuality , BOOL Discard ,
IDirect3DSurface9 * * ppSurface , HANDLE * pSharedHandle ) {
2007-06-11 23:14:37 +02:00
HRESULT hr ;
TRACE ( " Relay \n " ) ;
EnterCriticalSection ( & d3d9_cs ) ;
hr = IDirect3DDevice9Impl_CreateSurface ( iface , Width , Height , Format , TRUE /* Lockable */ , Discard , 0 /* Level */
2005-03-02 13:16:10 +01:00
, ppSurface , D3DRTYPE_SURFACE , D3DUSAGE_DEPTHSTENCIL ,
D3DPOOL_DEFAULT , MultiSample , MultisampleQuality , pSharedHandle ) ;
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2005-03-02 13:16:10 +01:00
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_UpdateSurface ( LPDIRECT3DDEVICE9 iface , IDirect3DSurface9 * pSourceSurface , CONST RECT * pSourceRect , IDirect3DSurface9 * pDestinationSurface , CONST POINT * pDestPoint ) {
2007-06-11 23:14:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_UpdateSurface ( This - > WineD3DDevice , ( ( IDirect3DSurface9Impl * ) pSourceSurface ) - > wineD3DSurface , pSourceRect , ( ( IDirect3DSurface9Impl * ) pDestinationSurface ) - > wineD3DSurface , pDestPoint ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_UpdateTexture ( LPDIRECT3DDEVICE9 iface , IDirect3DBaseTexture9 * pSourceTexture , IDirect3DBaseTexture9 * pDestinationTexture ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_UpdateTexture ( This - > WineD3DDevice , ( ( IDirect3DBaseTexture9Impl * ) pSourceTexture ) - > wineD3DBaseTexture , ( ( IDirect3DBaseTexture9Impl * ) pDestinationTexture ) - > wineD3DBaseTexture ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2005-03-02 13:16:10 +01:00
/* This isn't in MSDN!
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetFrontBuffer ( LPDIRECT3DDEVICE9 iface , IDirect3DSurface9 * pDestSurface ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2003-07-01 03:09:17 +02:00
FIXME ( " (%p) : stub \n " , This ) ;
return D3D_OK ;
}
2005-03-02 13:16:10 +01:00
*/
2003-07-01 03:09:17 +02:00
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetRenderTargetData ( LPDIRECT3DDEVICE9 iface , IDirect3DSurface9 * pRenderTarget , IDirect3DSurface9 * pDestSurface ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2005-03-02 13:16:10 +01:00
IDirect3DSurface9Impl * renderTarget = ( IDirect3DSurface9Impl * ) pRenderTarget ;
IDirect3DSurface9Impl * destSurface = ( IDirect3DSurface9Impl * ) pDestSurface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2007-02-13 20:14:41 +01:00
TRACE ( " (%p)->(%p,%p) \n " , This , renderTarget , destSurface ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DSurface_BltFast ( destSurface - > wineD3DSurface , 0 , 0 , renderTarget - > wineD3DSurface , NULL , WINEDDBLTFAST_NOCOLORKEY ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetFrontBufferData ( LPDIRECT3DDEVICE9 iface , UINT iSwapChain , IDirect3DSurface9 * pDestSurface ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2005-03-02 13:16:10 +01:00
IDirect3DSurface9Impl * destSurface = ( IDirect3DSurface9Impl * ) pDestSurface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetFrontBufferData ( This - > WineD3DDevice , iSwapChain , destSurface - > wineD3DSurface ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_StretchRect ( LPDIRECT3DDEVICE9 iface , IDirect3DSurface9 * pSourceSurface , CONST RECT * pSourceRect , IDirect3DSurface9 * pDestSurface , CONST RECT * pDestRect , D3DTEXTUREFILTERTYPE Filter ) {
2007-01-12 00:08:29 +01:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
IDirect3DSurface9Impl * src = ( IDirect3DSurface9Impl * ) pSourceSurface ;
IDirect3DSurface9Impl * dst = ( IDirect3DSurface9Impl * ) pDestSurface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2007-01-12 00:08:29 +01:00
TRACE ( " (%p)->(%p,%p,%p,%p,%d) \n " , This , src , pSourceRect , dst , pDestRect , Filter ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DSurface_Blt ( dst - > wineD3DSurface , ( RECT * ) pDestRect , src - > wineD3DSurface , ( RECT * ) pSourceRect , 0 , NULL , Filter ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_ColorFill ( LPDIRECT3DDEVICE9 iface , IDirect3DSurface9 * pSurface , CONST RECT * pRect , D3DCOLOR color ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2005-03-02 13:16:10 +01:00
IDirect3DSurface9Impl * surface = ( IDirect3DSurface9Impl * ) pSurface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2006-10-12 08:22:18 +02:00
/* Note: D3DRECT is compatible with WINED3DRECT */
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_ColorFill ( This - > WineD3DDevice , surface - > wineD3DSurface , ( CONST WINED3DRECT * ) pRect , color ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2005-03-02 13:16:10 +01:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_CreateOffscreenPlainSurface ( LPDIRECT3DDEVICE9 iface , UINT Width , UINT Height , D3DFORMAT Format , D3DPOOL Pool , IDirect3DSurface9 * * ppSurface , HANDLE * pSharedHandle ) {
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " Relay \n " ) ;
if ( Pool = = D3DPOOL_MANAGED ) {
FIXME ( " Attempting to create a managed offscreen plain surface \n " ) ;
return D3DERR_INVALIDCALL ;
}
/*MSDN: D3DPOOL_SCRATCH will return a surface that has identical characteristics to a surface created by the Microsoft DirectX 8.x method CreateImageSurface.
' Off - screen plain surfaces are always lockable , regardless of their pool types . '
but then . . .
D3DPOOL_DEFAULT is the appropriate pool for use with the IDirect3DDevice9 : : StretchRect and IDirect3DDevice9 : : ColorFill .
Why , their always lockable ?
should I change the usage to dynamic ?
*/
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IDirect3DDevice9Impl_CreateSurface ( iface , Width , Height , Format , TRUE /*Loackable*/ , FALSE /*Discard*/ , 0 /*Level*/ , ppSurface , D3DRTYPE_SURFACE , 0 /*Usage (undefined/none)*/ , ( WINED3DPOOL ) Pool , D3DMULTISAMPLE_NONE , 0 /*MultisampleQuality*/ , pSharedHandle ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2005-03-02 13:16:10 +01:00
}
/* TODO: move to wineD3D */
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetRenderTarget ( LPDIRECT3DDEVICE9 iface , DWORD RenderTargetIndex , IDirect3DSurface9 * pRenderTarget ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2005-07-07 22:35:05 +02:00
IDirect3DSurface9Impl * pSurface = ( IDirect3DSurface9Impl * ) pRenderTarget ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-07-07 22:35:05 +02:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
2007-12-04 22:45:09 +01:00
hr = IWineD3DDevice_SetRenderTarget ( This - > WineD3DDevice , RenderTargetIndex , pSurface ? pSurface - > wineD3DSurface : NULL ) ;
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2005-07-07 22:35:05 +02:00
}
2005-01-28 15:03:32 +01:00
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetRenderTarget ( LPDIRECT3DDEVICE9 iface , DWORD RenderTargetIndex , IDirect3DSurface9 * * ppRenderTarget ) {
2005-07-07 22:35:05 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
HRESULT hr = D3D_OK ;
IWineD3DSurface * pRenderTarget ;
TRACE ( " (%p) Relay \n " , This ) ;
if ( ppRenderTarget = = NULL ) {
return D3DERR_INVALIDCALL ;
2005-01-28 15:03:32 +01:00
}
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
2005-07-07 22:35:05 +02:00
hr = IWineD3DDevice_GetRenderTarget ( This - > WineD3DDevice , RenderTargetIndex , & pRenderTarget ) ;
2005-01-28 15:03:32 +01:00
2005-07-07 22:35:05 +02:00
if ( hr = = D3D_OK & & pRenderTarget ! = NULL ) {
2006-12-01 00:16:10 +01:00
IWineD3DSurface_GetParent ( pRenderTarget , ( IUnknown * * ) ppRenderTarget ) ;
IWineD3DSurface_Release ( pRenderTarget ) ;
2005-07-07 22:35:05 +02:00
} else {
FIXME ( " Call to IWineD3DDevice_GetRenderTarget failed \n " ) ;
* ppRenderTarget = NULL ;
}
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
2005-07-07 22:35:05 +02:00
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetDepthStencilSurface ( LPDIRECT3DDEVICE9 iface , IDirect3DSurface9 * pZStencilSurface ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2005-07-07 22:35:05 +02:00
IDirect3DSurface9Impl * pSurface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-07-07 22:35:05 +02:00
TRACE ( " (%p) Relay \n " , This ) ;
pSurface = ( IDirect3DSurface9Impl * ) pZStencilSurface ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetDepthStencilSurface ( This - > WineD3DDevice , NULL = = pSurface ? NULL : pSurface - > wineD3DSurface ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetDepthStencilSurface ( LPDIRECT3DDEVICE9 iface , IDirect3DSurface9 * * ppZStencilSurface ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2005-07-07 22:35:05 +02:00
HRESULT hr = D3D_OK ;
IWineD3DSurface * pZStencilSurface ;
TRACE ( " (%p) Relay \n " , This ) ;
if ( ppZStencilSurface = = NULL ) {
return D3DERR_INVALIDCALL ;
2005-01-28 15:03:32 +01:00
}
2003-07-01 03:09:17 +02:00
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
2007-08-14 20:23:52 +02:00
hr = IWineD3DDevice_GetDepthStencilSurface ( This - > WineD3DDevice , & pZStencilSurface ) ;
if ( hr = = D3D_OK ) {
if ( pZStencilSurface ! = NULL ) {
IWineD3DSurface_GetParent ( pZStencilSurface , ( IUnknown * * ) ppZStencilSurface ) ;
IWineD3DSurface_Release ( pZStencilSurface ) ;
} else {
* ppZStencilSurface = NULL ;
}
} else {
WARN ( " Call to IWineD3DDevice_GetDepthStencilSurface failed \n " ) ;
2007-11-10 00:19:19 +01:00
* ppZStencilSurface = NULL ;
2005-07-07 22:35:05 +02:00
}
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
2007-08-14 20:23:52 +02:00
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_BeginScene ( LPDIRECT3DDEVICE9 iface ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_BeginScene ( This - > WineD3DDevice ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_EndScene ( LPDIRECT3DDEVICE9 iface ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_EndScene ( This - > WineD3DDevice ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_Clear ( LPDIRECT3DDEVICE9 iface , DWORD Count , CONST D3DRECT * pRects , DWORD Flags , D3DCOLOR Color , float Z , DWORD Stencil ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2006-10-12 08:22:18 +02:00
/* Note: D3DRECT is compatible with WINED3DRECT */
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_Clear ( This - > WineD3DDevice , Count , ( CONST WINED3DRECT * ) pRects , Flags , Color , Z , Stencil ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetTransform ( LPDIRECT3DDEVICE9 iface , D3DTRANSFORMSTATETYPE State , CONST D3DMATRIX * lpMatrix ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2006-10-12 08:21:39 +02:00
/* Note: D3DMATRIX is compatible with WINED3DMATRIX */
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetTransform ( This - > WineD3DDevice , State , ( CONST WINED3DMATRIX * ) lpMatrix ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetTransform ( LPDIRECT3DDEVICE9 iface , D3DTRANSFORMSTATETYPE State , D3DMATRIX * pMatrix ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2006-10-12 08:21:39 +02:00
/* Note: D3DMATRIX is compatible with WINED3DMATRIX */
return IWineD3DDevice_GetTransform ( This - > WineD3DDevice , State , ( WINED3DMATRIX * ) pMatrix ) ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_MultiplyTransform ( LPDIRECT3DDEVICE9 iface , D3DTRANSFORMSTATETYPE State , CONST D3DMATRIX * pMatrix ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2006-10-12 08:21:39 +02:00
/* Note: D3DMATRIX is compatible with WINED3DMATRIX */
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_MultiplyTransform ( This - > WineD3DDevice , State , ( CONST WINED3DMATRIX * ) pMatrix ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetViewport ( LPDIRECT3DDEVICE9 iface , CONST D3DVIEWPORT9 * pViewport ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2006-10-11 03:57:25 +02:00
/* Note: D3DVIEWPORT9 is compatible with WINED3DVIEWPORT */
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetViewport ( This - > WineD3DDevice , ( const WINED3DVIEWPORT * ) pViewport ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetViewport ( LPDIRECT3DDEVICE9 iface , D3DVIEWPORT9 * pViewport ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2006-10-11 03:57:25 +02:00
/* Note: D3DVIEWPORT9 is compatible with WINED3DVIEWPORT */
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetViewport ( This - > WineD3DDevice , ( WINED3DVIEWPORT * ) pViewport ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetMaterial ( LPDIRECT3DDEVICE9 iface , CONST D3DMATERIAL9 * pMaterial ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2006-10-11 03:56:41 +02:00
/* Note: D3DMATERIAL9 is compatible with WINED3DMATERIAL */
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetMaterial ( This - > WineD3DDevice , ( const WINED3DMATERIAL * ) pMaterial ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetMaterial ( LPDIRECT3DDEVICE9 iface , D3DMATERIAL9 * pMaterial ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2006-10-11 03:56:41 +02:00
/* Note: D3DMATERIAL9 is compatible with WINED3DMATERIAL */
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetMaterial ( This - > WineD3DDevice , ( WINED3DMATERIAL * ) pMaterial ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetLight ( LPDIRECT3DDEVICE9 iface , DWORD Index , CONST D3DLIGHT9 * pLight ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2006-10-11 03:55:47 +02:00
/* Note: D3DLIGHT9 is compatible with WINED3DLIGHT */
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetLight ( This - > WineD3DDevice , Index , ( const WINED3DLIGHT * ) pLight ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetLight ( LPDIRECT3DDEVICE9 iface , DWORD Index , D3DLIGHT9 * pLight ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2006-10-11 03:55:47 +02:00
/* Note: D3DLIGHT9 is compatible with WINED3DLIGHT */
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetLight ( This - > WineD3DDevice , Index , ( WINED3DLIGHT * ) pLight ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_LightEnable ( LPDIRECT3DDEVICE9 iface , DWORD Index , BOOL Enable ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetLightEnable ( This - > WineD3DDevice , Index , Enable ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetLightEnable ( LPDIRECT3DDEVICE9 iface , DWORD Index , BOOL * pEnable ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetLightEnable ( This - > WineD3DDevice , Index , pEnable ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetClipPlane ( LPDIRECT3DDEVICE9 iface , DWORD Index , CONST float * pPlane ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetClipPlane ( This - > WineD3DDevice , Index , pPlane ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetClipPlane ( LPDIRECT3DDEVICE9 iface , DWORD Index , float * pPlane ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetClipPlane ( This - > WineD3DDevice , Index , pPlane ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetRenderState ( LPDIRECT3DDEVICE9 iface , D3DRENDERSTATETYPE State , DWORD Value ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetRenderState ( This - > WineD3DDevice , State , Value ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetRenderState ( LPDIRECT3DDEVICE9 iface , D3DRENDERSTATETYPE State , DWORD * pValue ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetRenderState ( This - > WineD3DDevice , State , pValue ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetClipStatus ( LPDIRECT3DDEVICE9 iface , CONST D3DCLIPSTATUS9 * pClipStatus ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetClipStatus ( This - > WineD3DDevice , ( const WINED3DCLIPSTATUS * ) pClipStatus ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetClipStatus ( LPDIRECT3DDEVICE9 iface , D3DCLIPSTATUS9 * pClipStatus ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetClipStatus ( This - > WineD3DDevice , ( WINED3DCLIPSTATUS * ) pClipStatus ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetTexture ( LPDIRECT3DDEVICE9 iface , DWORD Stage , IDirect3DBaseTexture9 * * ppTexture ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2005-01-18 12:42:29 +01:00
IWineD3DBaseTexture * retTexture = NULL ;
HRESULT rc = D3D_OK ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
if ( ppTexture = = NULL ) {
return D3DERR_INVALIDCALL ;
}
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
2007-12-04 22:45:09 +01:00
rc = IWineD3DDevice_GetTexture ( This - > WineD3DDevice , Stage , & retTexture ) ;
2005-03-02 13:16:10 +01:00
if ( rc = = D3D_OK & & NULL ! = retTexture ) {
2005-01-18 12:42:29 +01:00
IWineD3DBaseTexture_GetParent ( retTexture , ( IUnknown * * ) ppTexture ) ;
2006-11-30 13:33:29 +01:00
IWineD3DBaseTexture_Release ( retTexture ) ;
2005-03-02 13:16:10 +01:00
} else {
2006-10-10 19:23:22 +02:00
FIXME ( " Call to get texture (%d) failed (%p) \n " , Stage , retTexture ) ;
2005-03-02 13:16:10 +01:00
* ppTexture = NULL ;
2005-01-18 12:42:29 +01:00
}
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
2005-01-18 12:42:29 +01:00
return rc ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetTexture ( LPDIRECT3DDEVICE9 iface , DWORD Stage , IDirect3DBaseTexture9 * pTexture ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2006-10-10 19:23:22 +02:00
TRACE ( " (%p) Relay %d %p \n " , This , Stage , pTexture ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetTexture ( This - > WineD3DDevice , Stage ,
pTexture = = NULL ? NULL : ( ( IDirect3DBaseTexture9Impl * ) pTexture ) - > wineD3DBaseTexture ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetTextureStageState ( LPDIRECT3DDEVICE9 iface , DWORD Stage , D3DTEXTURESTAGESTATETYPE Type , DWORD * pValue ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetTextureStageState ( This - > WineD3DDevice , Stage , Type , pValue ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetTextureStageState ( LPDIRECT3DDEVICE9 iface , DWORD Stage , D3DTEXTURESTAGESTATETYPE Type , DWORD Value ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetTextureStageState ( This - > WineD3DDevice , Stage , Type , Value ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetSamplerState ( LPDIRECT3DDEVICE9 iface , DWORD Sampler , D3DSAMPLERSTATETYPE Type , DWORD * pValue ) {
2005-03-02 13:16:10 +01:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetSamplerState ( This - > WineD3DDevice , Sampler , Type , pValue ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetSamplerState ( LPDIRECT3DDEVICE9 iface , DWORD Sampler , D3DSAMPLERSTATETYPE Type , DWORD Value ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetSamplerState ( This - > WineD3DDevice , Sampler , Type , Value ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_ValidateDevice ( LPDIRECT3DDEVICE9 iface , DWORD * pNumPasses ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_ValidateDevice ( This - > WineD3DDevice , pNumPasses ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetPaletteEntries ( LPDIRECT3DDEVICE9 iface , UINT PaletteNumber , CONST PALETTEENTRY * pEntries ) {
2005-03-02 13:16:10 +01:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetPaletteEntries ( This - > WineD3DDevice , PaletteNumber , pEntries ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetPaletteEntries ( LPDIRECT3DDEVICE9 iface , UINT PaletteNumber , PALETTEENTRY * pEntries ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetPaletteEntries ( This - > WineD3DDevice , PaletteNumber , pEntries ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetCurrentTexturePalette ( LPDIRECT3DDEVICE9 iface , UINT PaletteNumber ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetCurrentTexturePalette ( This - > WineD3DDevice , PaletteNumber ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetCurrentTexturePalette ( LPDIRECT3DDEVICE9 iface , UINT * PaletteNumber ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetCurrentTexturePalette ( This - > WineD3DDevice , PaletteNumber ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetScissorRect ( LPDIRECT3DDEVICE9 iface , CONST RECT * pRect ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetScissorRect ( This - > WineD3DDevice , pRect ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetScissorRect ( LPDIRECT3DDEVICE9 iface , RECT * pRect ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetScissorRect ( This - > WineD3DDevice , pRect ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetSoftwareVertexProcessing ( LPDIRECT3DDEVICE9 iface , BOOL bSoftware ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetSoftwareVertexProcessing ( This - > WineD3DDevice , bSoftware ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static BOOL WINAPI IDirect3DDevice9Impl_GetSoftwareVertexProcessing ( LPDIRECT3DDEVICE9 iface ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetSoftwareVertexProcessing ( This - > WineD3DDevice ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetNPatchMode ( LPDIRECT3DDEVICE9 iface , float nSegments ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetNPatchMode ( This - > WineD3DDevice , nSegments ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static float WINAPI IDirect3DDevice9Impl_GetNPatchMode ( LPDIRECT3DDEVICE9 iface ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetNPatchMode ( This - > WineD3DDevice ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_DrawPrimitive ( LPDIRECT3DDEVICE9 iface , D3DPRIMITIVETYPE PrimitiveType , UINT StartVertex , UINT PrimitiveCount ) {
2005-03-02 13:16:10 +01:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_DrawPrimitive ( This - > WineD3DDevice , PrimitiveType , StartVertex , PrimitiveCount ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_DrawIndexedPrimitive ( LPDIRECT3DDEVICE9 iface , D3DPRIMITIVETYPE PrimitiveType ,
2003-07-01 03:09:17 +02:00
INT BaseVertexIndex , UINT MinVertexIndex , UINT NumVertices , UINT startIndex , UINT primCount ) {
2007-01-02 21:07:39 +01:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-01-02 21:07:39 +01:00
/* D3D8 passes the baseVertexIndex in SetIndices, and due to the stateblock functions wined3d has to work that way */
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
2007-01-02 21:07:39 +01:00
IWineD3DDevice_SetBaseVertexIndex ( This - > WineD3DDevice , BaseVertexIndex ) ;
2007-06-11 23:14:37 +02:00
hr = IWineD3DDevice_DrawIndexedPrimitive ( This - > WineD3DDevice , PrimitiveType , MinVertexIndex , NumVertices , startIndex , primCount ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_DrawPrimitiveUP ( LPDIRECT3DDEVICE9 iface , D3DPRIMITIVETYPE PrimitiveType , UINT PrimitiveCount , CONST void * pVertexStreamZeroData , UINT VertexStreamZeroStride ) {
2005-03-02 13:16:10 +01:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_DrawPrimitiveUP ( This - > WineD3DDevice , PrimitiveType , PrimitiveCount , pVertexStreamZeroData , VertexStreamZeroStride ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_DrawIndexedPrimitiveUP ( LPDIRECT3DDEVICE9 iface , D3DPRIMITIVETYPE PrimitiveType , UINT MinVertexIndex ,
2003-07-01 03:09:17 +02:00
UINT NumVertexIndices , UINT PrimitiveCount , CONST void * pIndexData ,
D3DFORMAT IndexDataFormat , CONST void * pVertexStreamZeroData , UINT VertexStreamZeroStride ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_DrawIndexedPrimitiveUP ( This - > WineD3DDevice , PrimitiveType , MinVertexIndex , NumVertexIndices , PrimitiveCount ,
2004-12-09 12:42:34 +01:00
pIndexData , IndexDataFormat , pVertexStreamZeroData , VertexStreamZeroStride ) ;
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_ProcessVertices ( LPDIRECT3DDEVICE9 iface , UINT SrcStartIndex , UINT DestIndex , UINT VertexCount , IDirect3DVertexBuffer9 * pDestBuffer , IDirect3DVertexDeclaration9 * pVertexDecl , DWORD Flags ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-04-22 18:06:07 +02:00
IDirect3DVertexDeclaration9Impl * Decl = ( IDirect3DVertexDeclaration9Impl * ) pVertexDecl ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_ProcessVertices ( This - > WineD3DDevice , SrcStartIndex , DestIndex , VertexCount , ( ( IDirect3DVertexBuffer9Impl * ) pDestBuffer ) - > wineD3DVertexBuffer , Decl ? Decl - > wineD3DVertexDeclaration : NULL , Flags ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2007-04-17 20:04:26 +02:00
IDirect3DVertexDeclaration9 * getConvertedDecl ( IDirect3DDevice9Impl * This , DWORD fvf ) {
HRESULT hr ;
D3DVERTEXELEMENT9 * elements = NULL ;
IDirect3DVertexDeclaration9 * pDecl = NULL ;
int p , low , high ; /* deliberately signed */
IDirect3DVertexDeclaration9 * * convertedDecls = This - > convertedDecls ;
TRACE ( " Searching for declaration for fvf %08x... " , fvf ) ;
low = 0 ;
high = This - > numConvertedDecls - 1 ;
while ( low < = high ) {
p = ( low + high ) > > 1 ;
TRACE ( " %d " , p ) ;
if ( ( ( IDirect3DVertexDeclaration9Impl * ) convertedDecls [ p ] ) - > convFVF = = fvf ) {
TRACE ( " found %p \n " , convertedDecls [ p ] ) ;
return convertedDecls [ p ] ;
} else if ( ( ( IDirect3DVertexDeclaration9Impl * ) convertedDecls [ p ] ) - > convFVF < fvf ) {
low = p + 1 ;
} else {
high = p - 1 ;
}
}
TRACE ( " not found. Creating and inserting at position %d. \n " , low ) ;
hr = vdecl_convert_fvf ( fvf , & elements ) ;
if ( hr ! = S_OK ) return NULL ;
hr = IDirect3DDevice9Impl_CreateVertexDeclaration ( ( IDirect3DDevice9 * ) This , elements , & pDecl ) ;
2007-11-16 19:06:58 +01:00
HeapFree ( GetProcessHeap ( ) , 0 , elements ) ; /* CreateVertexDeclaration makes a copy */
2007-04-17 20:04:26 +02:00
if ( hr ! = S_OK ) return NULL ;
if ( This - > declArraySize = = This - > numConvertedDecls ) {
int grow = max ( This - > declArraySize / 2 , 8 ) ;
convertedDecls = HeapReAlloc ( GetProcessHeap ( ) , 0 , convertedDecls ,
sizeof ( convertedDecls [ 0 ] ) * ( This - > numConvertedDecls + grow ) ) ;
if ( ! convertedDecls ) {
/* This will destroy it */
IDirect3DVertexDeclaration9_Release ( pDecl ) ;
return NULL ;
}
This - > convertedDecls = convertedDecls ;
This - > declArraySize + = grow ;
}
memmove ( convertedDecls + low + 1 , convertedDecls + low , sizeof ( IDirect3DVertexDeclaration9Impl * ) * ( This - > numConvertedDecls - low ) ) ;
convertedDecls [ low ] = pDecl ;
This - > numConvertedDecls + + ;
2007-04-30 02:06:11 +02:00
/* Will prevent the decl from being destroyed */
2007-04-17 20:04:26 +02:00
( ( IDirect3DVertexDeclaration9Impl * ) pDecl ) - > convFVF = fvf ;
IDirect3DVertexDeclaration9_Release ( pDecl ) ; /* Does not destroy now */
TRACE ( " Returning %p. %d decls in array \n " , pDecl , This - > numConvertedDecls ) ;
return pDecl ;
}
2003-07-01 03:09:17 +02:00
HRESULT WINAPI IDirect3DDevice9Impl_SetFVF ( LPDIRECT3DDEVICE9 iface , DWORD FVF ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2006-07-04 10:53:13 +02:00
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
2006-07-04 10:53:13 +02:00
if ( 0 ! = FVF ) {
HRESULT hr ;
2007-04-17 20:04:26 +02:00
IDirect3DVertexDeclaration9 * pDecl = getConvertedDecl ( This , FVF ) ;
2006-07-04 10:53:13 +02:00
2007-04-17 20:04:26 +02:00
if ( ! pDecl ) {
/* Any situation when this should happen, except out of memory? */
ERR ( " Failed to create a converted vertex declaration \n " ) ;
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
2007-04-17 20:04:26 +02:00
return D3DERR_DRIVERINTERNALERROR ;
}
2007-04-08 00:11:09 +02:00
2006-07-04 10:53:13 +02:00
hr = IDirect3DDevice9Impl_SetVertexDeclaration ( iface , pDecl ) ;
2007-06-11 23:14:37 +02:00
if ( hr ! = S_OK ) {
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
}
2006-07-04 10:53:13 +02:00
}
2007-06-11 23:14:37 +02:00
hr = IWineD3DDevice_SetFVF ( This - > WineD3DDevice , FVF ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
2006-07-04 10:53:13 +02:00
2007-06-11 23:14:37 +02:00
return hr ;
2003-07-01 03:09:17 +02:00
}
HRESULT WINAPI IDirect3DDevice9Impl_GetFVF ( LPDIRECT3DDEVICE9 iface , DWORD * pFVF ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetFVF ( This - > WineD3DDevice , pFVF ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
HRESULT WINAPI IDirect3DDevice9Impl_SetStreamSource ( LPDIRECT3DDEVICE9 iface , UINT StreamNumber , IDirect3DVertexBuffer9 * pStreamData , UINT OffsetInBytes , UINT Stride ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetStreamSource ( This - > WineD3DDevice , StreamNumber ,
2004-11-23 14:52:46 +01:00
pStreamData = = NULL ? NULL : ( ( IDirect3DVertexBuffer9Impl * ) pStreamData ) - > wineD3DVertexBuffer ,
OffsetInBytes , Stride ) ;
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2005-03-02 13:16:10 +01:00
HRESULT WINAPI IDirect3DDevice9Impl_GetStreamSource ( LPDIRECT3DDEVICE9 iface , UINT StreamNumber , IDirect3DVertexBuffer9 * * pStream , UINT * OffsetInBytes , UINT * pStride ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2004-11-23 14:52:46 +01:00
IWineD3DVertexBuffer * retStream = NULL ;
HRESULT rc = D3D_OK ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
if ( pStream = = NULL ) {
return D3DERR_INVALIDCALL ;
}
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
2007-12-04 22:45:09 +01:00
rc = IWineD3DDevice_GetStreamSource ( This - > WineD3DDevice , StreamNumber , & retStream , OffsetInBytes , pStride ) ;
2005-03-02 13:16:10 +01:00
if ( rc = = D3D_OK & & NULL ! = retStream ) {
2004-12-09 12:42:34 +01:00
IWineD3DVertexBuffer_GetParent ( retStream , ( IUnknown * * ) pStream ) ;
2006-11-30 13:33:23 +01:00
IWineD3DVertexBuffer_Release ( retStream ) ;
2005-03-02 13:16:10 +01:00
} else {
2006-12-24 10:00:05 +01:00
if ( rc ! = D3D_OK ) {
FIXME ( " Call to GetStreamSource failed %p %p \n " , OffsetInBytes , pStride ) ;
}
2005-03-02 13:16:10 +01:00
* pStream = NULL ;
2004-12-09 12:42:34 +01:00
}
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
2004-11-23 14:52:46 +01:00
return rc ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetStreamSourceFreq ( LPDIRECT3DDEVICE9 iface , UINT StreamNumber , UINT Divider ) {
2005-03-02 13:16:10 +01:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetStreamSourceFreq ( This - > WineD3DDevice , StreamNumber , Divider ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetStreamSourceFreq ( LPDIRECT3DDEVICE9 iface , UINT StreamNumber , UINT * Divider ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_GetStreamSourceFreq ( This - > WineD3DDevice , StreamNumber , Divider ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_SetIndices ( LPDIRECT3DDEVICE9 iface , IDirect3DIndexBuffer9 * pIndexData ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_SetIndices ( This - > WineD3DDevice ,
2007-06-05 18:52:21 +02:00
pIndexData ? ( ( IDirect3DIndexBuffer9Impl * ) pIndexData ) - > wineD3DIndexBuffer : NULL ) ;
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_GetIndices ( LPDIRECT3DDEVICE9 iface , IDirect3DIndexBuffer9 * * ppIndexData ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2004-12-09 12:42:34 +01:00
IWineD3DIndexBuffer * retIndexData = NULL ;
HRESULT rc = D3D_OK ;
2003-07-01 03:09:17 +02:00
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
if ( ppIndexData = = NULL ) {
return D3DERR_INVALIDCALL ;
}
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
2007-06-06 18:40:09 +02:00
rc = IWineD3DDevice_GetIndices ( This - > WineD3DDevice , & retIndexData ) ;
if ( SUCCEEDED ( rc ) & & retIndexData ) {
2006-12-01 00:16:10 +01:00
IWineD3DIndexBuffer_GetParent ( retIndexData , ( IUnknown * * ) ppIndexData ) ;
IWineD3DIndexBuffer_Release ( retIndexData ) ;
2007-06-06 18:40:09 +02:00
} else {
if ( FAILED ( rc ) ) FIXME ( " Call to GetIndices failed \n " ) ;
2005-03-02 13:16:10 +01:00
* ppIndexData = NULL ;
2004-12-09 12:42:34 +01:00
}
2007-06-11 23:14:37 +02:00
LeaveCriticalSection ( & d3d9_cs ) ;
2004-12-09 12:42:34 +01:00
return rc ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_DrawRectPatch ( LPDIRECT3DDEVICE9 iface , UINT Handle , CONST float * pNumSegs , CONST D3DRECTPATCH_INFO * pRectPatchInfo ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_DrawRectPatch ( This - > WineD3DDevice , Handle , pNumSegs , ( CONST WINED3DRECTPATCH_INFO * ) pRectPatchInfo ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2008-03-01 05:33:54 +01:00
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_DrawTriPatch ( LPDIRECT3DDEVICE9 iface , UINT Handle , CONST float * pNumSegs , CONST D3DTRIPATCH_INFO * pTriPatchInfo ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_DrawTriPatch ( This - > WineD3DDevice , Handle , pNumSegs , ( CONST WINED3DTRIPATCH_INFO * ) pTriPatchInfo ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2006-06-10 11:51:05 +02:00
static HRESULT WINAPI IDirect3DDevice9Impl_DeletePatch ( LPDIRECT3DDEVICE9 iface , UINT Handle ) {
2004-09-08 03:50:37 +02:00
IDirect3DDevice9Impl * This = ( IDirect3DDevice9Impl * ) iface ;
2007-06-11 23:14:37 +02:00
HRESULT hr ;
2005-03-02 13:16:10 +01:00
TRACE ( " (%p) Relay \n " , This ) ;
2007-06-11 23:14:37 +02:00
EnterCriticalSection ( & d3d9_cs ) ;
hr = IWineD3DDevice_DeletePatch ( This - > WineD3DDevice , Handle ) ;
LeaveCriticalSection ( & d3d9_cs ) ;
return hr ;
2003-07-01 03:09:17 +02:00
}
2005-05-27 22:17:35 +02:00
const IDirect3DDevice9Vtbl Direct3DDevice9_Vtbl =
2003-07-01 03:09:17 +02:00
{
2005-08-23 11:34:57 +02:00
/* IUnknown */
2003-07-01 03:09:17 +02:00
IDirect3DDevice9Impl_QueryInterface ,
IDirect3DDevice9Impl_AddRef ,
IDirect3DDevice9Impl_Release ,
2005-08-23 11:34:57 +02:00
/* IDirect3DDevice9 */
2003-07-01 03:09:17 +02:00
IDirect3DDevice9Impl_TestCooperativeLevel ,
IDirect3DDevice9Impl_GetAvailableTextureMem ,
2005-03-02 13:16:10 +01:00
IDirect3DDevice9Impl_EvictManagedResources ,
2003-07-01 03:09:17 +02:00
IDirect3DDevice9Impl_GetDirect3D ,
IDirect3DDevice9Impl_GetDeviceCaps ,
IDirect3DDevice9Impl_GetDisplayMode ,
IDirect3DDevice9Impl_GetCreationParameters ,
IDirect3DDevice9Impl_SetCursorProperties ,
IDirect3DDevice9Impl_SetCursorPosition ,
IDirect3DDevice9Impl_ShowCursor ,
IDirect3DDevice9Impl_CreateAdditionalSwapChain ,
IDirect3DDevice9Impl_GetSwapChain ,
IDirect3DDevice9Impl_GetNumberOfSwapChains ,
IDirect3DDevice9Impl_Reset ,
IDirect3DDevice9Impl_Present ,
IDirect3DDevice9Impl_GetBackBuffer ,
IDirect3DDevice9Impl_GetRasterStatus ,
IDirect3DDevice9Impl_SetDialogBoxMode ,
IDirect3DDevice9Impl_SetGammaRamp ,
IDirect3DDevice9Impl_GetGammaRamp ,
IDirect3DDevice9Impl_CreateTexture ,
IDirect3DDevice9Impl_CreateVolumeTexture ,
IDirect3DDevice9Impl_CreateCubeTexture ,
IDirect3DDevice9Impl_CreateVertexBuffer ,
IDirect3DDevice9Impl_CreateIndexBuffer ,
IDirect3DDevice9Impl_CreateRenderTarget ,
IDirect3DDevice9Impl_CreateDepthStencilSurface ,
IDirect3DDevice9Impl_UpdateSurface ,
IDirect3DDevice9Impl_UpdateTexture ,
IDirect3DDevice9Impl_GetRenderTargetData ,
IDirect3DDevice9Impl_GetFrontBufferData ,
2005-03-02 13:16:10 +01:00
IDirect3DDevice9Impl_StretchRect ,
2003-07-01 03:09:17 +02:00
IDirect3DDevice9Impl_ColorFill ,
IDirect3DDevice9Impl_CreateOffscreenPlainSurface ,
IDirect3DDevice9Impl_SetRenderTarget ,
IDirect3DDevice9Impl_GetRenderTarget ,
IDirect3DDevice9Impl_SetDepthStencilSurface ,
IDirect3DDevice9Impl_GetDepthStencilSurface ,
IDirect3DDevice9Impl_BeginScene ,
IDirect3DDevice9Impl_EndScene ,
IDirect3DDevice9Impl_Clear ,
IDirect3DDevice9Impl_SetTransform ,
IDirect3DDevice9Impl_GetTransform ,
IDirect3DDevice9Impl_MultiplyTransform ,
IDirect3DDevice9Impl_SetViewport ,
IDirect3DDevice9Impl_GetViewport ,
IDirect3DDevice9Impl_SetMaterial ,
IDirect3DDevice9Impl_GetMaterial ,
IDirect3DDevice9Impl_SetLight ,
IDirect3DDevice9Impl_GetLight ,
IDirect3DDevice9Impl_LightEnable ,
IDirect3DDevice9Impl_GetLightEnable ,
IDirect3DDevice9Impl_SetClipPlane ,
IDirect3DDevice9Impl_GetClipPlane ,
IDirect3DDevice9Impl_SetRenderState ,
IDirect3DDevice9Impl_GetRenderState ,
IDirect3DDevice9Impl_CreateStateBlock ,
IDirect3DDevice9Impl_BeginStateBlock ,
IDirect3DDevice9Impl_EndStateBlock ,
IDirect3DDevice9Impl_SetClipStatus ,
IDirect3DDevice9Impl_GetClipStatus ,
IDirect3DDevice9Impl_GetTexture ,
IDirect3DDevice9Impl_SetTexture ,
IDirect3DDevice9Impl_GetTextureStageState ,
IDirect3DDevice9Impl_SetTextureStageState ,
IDirect3DDevice9Impl_GetSamplerState ,
IDirect3DDevice9Impl_SetSamplerState ,
IDirect3DDevice9Impl_ValidateDevice ,
IDirect3DDevice9Impl_SetPaletteEntries ,
IDirect3DDevice9Impl_GetPaletteEntries ,
IDirect3DDevice9Impl_SetCurrentTexturePalette ,
IDirect3DDevice9Impl_GetCurrentTexturePalette ,
IDirect3DDevice9Impl_SetScissorRect ,
IDirect3DDevice9Impl_GetScissorRect ,
IDirect3DDevice9Impl_SetSoftwareVertexProcessing ,
IDirect3DDevice9Impl_GetSoftwareVertexProcessing ,
IDirect3DDevice9Impl_SetNPatchMode ,
IDirect3DDevice9Impl_GetNPatchMode ,
IDirect3DDevice9Impl_DrawPrimitive ,
IDirect3DDevice9Impl_DrawIndexedPrimitive ,
IDirect3DDevice9Impl_DrawPrimitiveUP ,
IDirect3DDevice9Impl_DrawIndexedPrimitiveUP ,
IDirect3DDevice9Impl_ProcessVertices ,
IDirect3DDevice9Impl_CreateVertexDeclaration ,
IDirect3DDevice9Impl_SetVertexDeclaration ,
IDirect3DDevice9Impl_GetVertexDeclaration ,
IDirect3DDevice9Impl_SetFVF ,
IDirect3DDevice9Impl_GetFVF ,
IDirect3DDevice9Impl_CreateVertexShader ,
IDirect3DDevice9Impl_SetVertexShader ,
IDirect3DDevice9Impl_GetVertexShader ,
IDirect3DDevice9Impl_SetVertexShaderConstantF ,
IDirect3DDevice9Impl_GetVertexShaderConstantF ,
IDirect3DDevice9Impl_SetVertexShaderConstantI ,
IDirect3DDevice9Impl_GetVertexShaderConstantI ,
IDirect3DDevice9Impl_SetVertexShaderConstantB ,
IDirect3DDevice9Impl_GetVertexShaderConstantB ,
IDirect3DDevice9Impl_SetStreamSource ,
IDirect3DDevice9Impl_GetStreamSource ,
IDirect3DDevice9Impl_SetStreamSourceFreq ,
IDirect3DDevice9Impl_GetStreamSourceFreq ,
IDirect3DDevice9Impl_SetIndices ,
IDirect3DDevice9Impl_GetIndices ,
IDirect3DDevice9Impl_CreatePixelShader ,
IDirect3DDevice9Impl_SetPixelShader ,
IDirect3DDevice9Impl_GetPixelShader ,
IDirect3DDevice9Impl_SetPixelShaderConstantF ,
IDirect3DDevice9Impl_GetPixelShaderConstantF ,
IDirect3DDevice9Impl_SetPixelShaderConstantI ,
IDirect3DDevice9Impl_GetPixelShaderConstantI ,
IDirect3DDevice9Impl_SetPixelShaderConstantB ,
IDirect3DDevice9Impl_GetPixelShaderConstantB ,
IDirect3DDevice9Impl_DrawRectPatch ,
IDirect3DDevice9Impl_DrawTriPatch ,
IDirect3DDevice9Impl_DeletePatch ,
IDirect3DDevice9Impl_CreateQuery
} ;
2005-03-02 13:16:10 +01:00
/* Internal function called back during the CreateDevice to create a render target */
2006-12-03 21:52:03 +01:00
HRESULT WINAPI D3D9CB_CreateSurface ( IUnknown * device , IUnknown * pSuperior , UINT Width , UINT Height ,
2006-03-28 14:20:47 +02:00
WINED3DFORMAT Format , DWORD Usage , WINED3DPOOL Pool , UINT Level ,
2007-04-24 10:29:22 +02:00
WINED3DCUBEMAP_FACES Face , IWineD3DSurface * * ppSurface ,
HANDLE * pSharedHandle ) {
2006-12-03 21:52:03 +01:00
2005-03-02 13:16:10 +01:00
HRESULT res = D3D_OK ;
IDirect3DSurface9Impl * d3dSurface = NULL ;
BOOL Lockable = TRUE ;
if ( ( Pool = = D3DPOOL_DEFAULT & & Usage ! = D3DUSAGE_DYNAMIC ) )
Lockable = FALSE ;
TRACE ( " relay \n " ) ;
2006-05-29 23:01:04 +02:00
res = IDirect3DDevice9Impl_CreateSurface ( ( IDirect3DDevice9 * ) device , Width , Height , ( D3DFORMAT ) Format ,
Lockable , FALSE /*Discard*/ , Level , ( IDirect3DSurface9 * * ) & d3dSurface , D3DRTYPE_SURFACE ,
Usage , ( D3DPOOL ) Pool , D3DMULTISAMPLE_NONE , 0 /* MultisampleQuality */ , pSharedHandle ) ;
2005-03-02 13:16:10 +01:00
2006-05-29 23:01:04 +02:00
if ( SUCCEEDED ( res ) ) {
2005-03-02 13:16:10 +01:00
* ppSurface = d3dSurface - > wineD3DSurface ;
2006-12-18 00:17:51 +01:00
d3dSurface - > container = pSuperior ;
2006-05-29 23:01:04 +02:00
IUnknown_Release ( d3dSurface - > parentDevice ) ;
d3dSurface - > parentDevice = NULL ;
2006-12-18 00:16:48 +01:00
d3dSurface - > forwardReference = pSuperior ;
2006-05-29 23:01:04 +02:00
} else {
2005-03-02 13:16:10 +01:00
FIXME ( " (%p) IDirect3DDevice9_CreateSurface failed \n " , device ) ;
}
return res ;
}
2006-12-18 00:16:48 +01:00
ULONG WINAPI D3D9CB_DestroySurface ( IWineD3DSurface * pSurface ) {
IDirect3DSurface9Impl * surfaceParent ;
TRACE ( " (%p) call back \n " , pSurface ) ;
IWineD3DSurface_GetParent ( pSurface , ( IUnknown * * ) & surfaceParent ) ;
/* GetParent's AddRef was forwarded to an object in destruction.
* Releasing it here again would cause an endless recursion . */
surfaceParent - > forwardReference = NULL ;
return IDirect3DSurface9_Release ( ( IDirect3DSurface9 * ) surfaceParent ) ;
}