Author: gbrunmar
Date: Mon May 5 10:58:23 2008
New Revision: 33298
URL:
http://svn.reactos.org/svn/reactos?rev=33298&view=rev
Log:
* Implemented IDirect3DDevice9::GetDirect3D() and GetDeviceCaps()
* Added a DevCaps filter when retrieving D3DCAPS9 from device caps
Modified:
trunk/reactos/dll/directx/d3d9/adapter.c
trunk/reactos/dll/directx/d3d9/d3d9_device.c
Modified: trunk/reactos/dll/directx/d3d9/adapter.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/adapter.c…
==============================================================================
--- trunk/reactos/dll/directx/d3d9/adapter.c [iso-8859-1] (original)
+++ trunk/reactos/dll/directx/d3d9/adapter.c [iso-8859-1] Mon May 5 10:58:23 2008
@@ -20,6 +20,13 @@
#define D3D9_PRE_XP_CAPS2 (D3DCAPS2_CANAUTOGENMIPMAP | D3DCAPS2_DYNAMICTEXTURES |
D3DCAPS2_RESERVED | D3DCAPS2_FULLSCREENGAMMA)
#define D3D9_XP_OR_LATER_CAPS2 (D3D9_PRE_XP_CAPS2 | D3DCAPS2_CANMANAGERESOURCE)
#define D3D9_CAPS3 (D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD |
D3DCAPS3_LINEAR_TO_SRGB_PRESENTATION | D3DCAPS3_COPY_TO_VIDMEM |
D3DCAPS3_COPY_TO_SYSTEMMEM)
+#define D3D9_DEVCAPS (D3DDEVCAPS_EXECUTESYSTEMMEMORY |
D3DDEVCAPS_EXECUTEVIDEOMEMORY | D3DDEVCAPS_TLVERTEXSYSTEMMEMORY \
+ | D3DDEVCAPS_TLVERTEXVIDEOMEMORY |
D3DDEVCAPS_TEXTURESYSTEMMEMORY | D3DDEVCAPS_TEXTUREVIDEOMEMORY \
+ | D3DDEVCAPS_DRAWPRIMTLVERTEX |
D3DDEVCAPS_CANRENDERAFTERFLIP | D3DDEVCAPS_TEXTURENONLOCALVIDMEM \
+ | D3DDEVCAPS_DRAWPRIMITIVES2 |
D3DDEVCAPS_SEPARATETEXTUREMEMORIES | D3DDEVCAPS_DRAWPRIMITIVES2EX \
+ | D3DDEVCAPS_HWTRANSFORMANDLIGHT |
D3DDEVCAPS_CANBLTSYSTONONLOCAL | D3DDEVCAPS_HWRASTERIZATION \
+ | D3DDEVCAPS_PUREDEVICE | D3DDEVCAPS_QUINTICRTPATCHES |
D3DDEVCAPS_RTPATCHES | D3DDEVCAPS_RTPATCHHANDLEZERO \
+ | D3DDEVCAPS_NPATCHES)
#define D3DCAPS2_PRESENT_INTERVAL_SEVERAL 0x00200000
#define D3DCAPS2_PRESENT_INTERVAL_IMMEDIATE 0x00400000
@@ -211,6 +218,7 @@
pDstCaps->Caps2 = pSrcCaps->Caps2 & D3D9_PRE_XP_CAPS2;
pDstCaps->Caps3 = pSrcCaps->Caps3 & D3D9_CAPS3;
+ pDstCaps->DevCaps = pSrcCaps->DevCaps & D3D9_DEVCAPS;
pDstCaps->PresentationIntervals = D3DPRESENT_INTERVAL_ONE;
if (pSrcCaps->Caps2 & D3DCAPS2_PRESENT_INTERVAL_SEVERAL)
Modified: trunk/reactos/dll/directx/d3d9/d3d9_device.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/d3d9_devi…
==============================================================================
--- trunk/reactos/dll/directx/d3d9/d3d9_device.c [iso-8859-1] (original)
+++ trunk/reactos/dll/directx/d3d9/d3d9_device.c [iso-8859-1] Mon May 5 10:58:23 2008
@@ -7,6 +7,7 @@
*/
#include "d3d9_device.h"
#include "d3d9_helpers.h"
+#include "adapter.h"
#include "debug.h"
#define LOCK_D3DDEVICE9() if (This->bLockDevice)
EnterCriticalSection(&This->CriticalSection);
@@ -83,17 +84,78 @@
return D3D_OK;
}
+/*++
+* @name IDirect3DDevice9::GetDirect3D
+* @implemented
+*
+* The function IDirect3DDevice9Impl_GetDirect3D returns a pointer to the IDirect3D9
object
+* that created this device.
+*
+* @param LPDIRECT3D iface
+* Pointer to the IDirect3DDevice9 object returned from IDirect3D9::CreateDevice()
+*
+* @param IDirect3D9** ppD3D9
+* Pointer to a IDirect3D9* to receive the IDirect3D9 object pointer.
+*
+* @return HRESULT
+* If the method successfully fills the ppD3D9 structure, the return value is D3D_OK.
+* If ppD3D9 is a bad pointer, the return value will be D3DERR_INVALIDCALL.
+*
+*/
static HRESULT WINAPI IDirect3DDevice9Impl_GetDirect3D(LPDIRECT3DDEVICE9 iface,
IDirect3D9** ppD3D9)
{
- UNIMPLEMENTED
-
- return D3D_OK;
-}
-
+ IDirect3D9* pDirect3D9;
+ LPDIRECT3DDEVICE9_INT This = impl_from_IDirect3DDevice9(iface);
+ LOCK_D3DDEVICE9();
+
+ if (IsBadWritePtr(ppD3D9, sizeof(IDirect3D9*)))
+ {
+ DPRINT1("Invalid ppD3D9 parameter specified");
+ UNLOCK_D3DDEVICE9();
+ return D3DERR_INVALIDCALL;
+ }
+
+ pDirect3D9 = (IDirect3D9*)&This->pDirect3D9->lpVtbl;
+ IDirect3D9_AddRef(pDirect3D9);
+ *ppD3D9 = pDirect3D9;
+
+ UNLOCK_D3DDEVICE9();
+ return D3D_OK;
+}
+
+/*++
+* @name IDirect3DDevice9::GetDeviceCaps
+* @implemented
+*
+* The function IDirect3DDevice9Impl_GetDeviceCaps fills the pCaps argument with the
+* capabilities of the device.
+*
+* @param LPDIRECT3D iface
+* Pointer to the IDirect3D9 object returned from Direct3DCreate9()
+*
+* @param D3DCAPS9* pCaps
+* Pointer to a D3DCAPS9 structure to be filled with the device's capabilities.
+*
+* @return HRESULT
+* If the method successfully fills the pCaps structure, the return value is D3D_OK.
+* If pCaps is a bad pointer the return value will be D3DERR_INVALIDCALL.
+*
+*/
static HRESULT WINAPI IDirect3DDevice9Impl_GetDeviceCaps(LPDIRECT3DDEVICE9 iface,
D3DCAPS9* pCaps)
{
- UNIMPLEMENTED
-
+ LPDIRECT3DDEVICE9_INT This = impl_from_IDirect3DDevice9(iface);
+ LOCK_D3DDEVICE9();
+
+ if (IsBadWritePtr(pCaps, sizeof(D3DCAPS9)))
+ {
+ DPRINT1("Invalid pCaps parameter specified");
+ UNLOCK_D3DDEVICE9();
+ return D3DERR_INVALIDCALL;
+ }
+
+ GetAdapterCaps(&This->pDirect3D9->DisplayAdapters[0],
This->DeviceData[0].DeviceType, pCaps);
+
+ UNLOCK_D3DDEVICE9();
return D3D_OK;
}