Author: gbrunmar Date: Sat Feb 16 14:17:46 2008 New Revision: 32385
URL: http://svn.reactos.org/svn/reactos?rev=32385&view=rev Log: Implemented IDirect3D::GetDeviceCaps()
Modified: trunk/reactos/dll/directx/d3d9/adapter.c trunk/reactos/dll/directx/d3d9/adapter.h trunk/reactos/dll/directx/d3d9/d3d9_create.c trunk/reactos/dll/directx/d3d9/d3d9_impl.c trunk/reactos/dll/directx/d3d9/d3d9_private.h
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 (original) +++ trunk/reactos/dll/directx/d3d9/adapter.c Sat Feb 16 14:17:46 2008 @@ -6,12 +6,24 @@ * PROGRAMERS: Gregor Brunmar <gregor (dot) brunmar (at) home (dot) se> */
+#define _WIN32_WINNT 0x0502 #include "d3d9_common.h" #include <d3d9.h> #include <ddraw.h> #include <strsafe.h> #include <debug.h> +#include "d3d9_private.h" #include "adapter.h" + +#define D3D9_CAPS1 (D3DCAPS_READ_SCANLINE) +#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 D3DCAPS2_PRESENT_INTERVAL_SEVERAL 0x00200000 +#define D3DCAPS2_PRESENT_INTERVAL_IMMEDIATE 0x00400000 + +#define D3DVTXPCAPS_FOGVERTEX 0x00000004
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); typedef BOOL (WINAPI *LPFN_DISABLEWOW64FSREDIRECTION) (PVOID*); @@ -165,6 +177,98 @@ GenerateDeviceIdentifier(pIdentifier);
return TRUE; +} + + + +static BOOL IsWindowsXPorLaterCompatible() +{ + OSVERSIONINFOA osvi; + + ZeroMemory(&osvi, sizeof(OSVERSIONINFOA)); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); + + if (GetVersionExA(&osvi) != 0) + { + return ( (osvi.dwMajorVersion > 5) || + ( (osvi.dwMajorVersion == 5) && (osvi.dwMinorVersion >= 1) )); + } + + return FALSE; +} + +static void CopyDriverCaps(const D3DCAPS9* pSrcCaps, D3DCAPS9* pDstCaps) +{ + *pDstCaps = *pSrcCaps; + + pDstCaps->Caps = pSrcCaps->Caps & D3D9_CAPS1; + + /* TODO: Fit in D3DCAPS2_CANCALIBRATEGAMMA somewhere here */ + if (IsWindowsXPorLaterCompatible()) + pDstCaps->Caps2 = pSrcCaps->Caps2 & D3D9_XP_OR_LATER_CAPS2; + else + pDstCaps->Caps2 = pSrcCaps->Caps2 & D3D9_PRE_XP_CAPS2; + + pDstCaps->Caps3 = pSrcCaps->Caps3 & D3D9_CAPS3; + + pDstCaps->PresentationIntervals = D3DPRESENT_INTERVAL_ONE; + if (pSrcCaps->Caps2 & D3DCAPS2_PRESENT_INTERVAL_SEVERAL) + pDstCaps->PresentationIntervals |= (D3DPRESENT_INTERVAL_TWO | D3DPRESENT_INTERVAL_THREE | D3DPRESENT_INTERVAL_FOUR); + if (pSrcCaps->Caps2 & D3DCAPS2_PRESENT_INTERVAL_IMMEDIATE) + pDstCaps->PresentationIntervals |= D3DPRESENT_INTERVAL_IMMEDIATE; + + pDstCaps->PrimitiveMiscCaps = pSrcCaps->PrimitiveMiscCaps & ~D3DPMISCCAPS_SEPERATEFVFFOG; + + if (pSrcCaps->VertexProcessingCaps & D3DVTXPCAPS_FOGVERTEX) + { + pDstCaps->RasterCaps |= D3DPRASTERCAPS_FOGVERTEX; + pDstCaps->VertexProcessingCaps &= ~D3DVTXPCAPS_FOGVERTEX; + } + + if (pSrcCaps->MaxPointSize < 0.0f) + pDstCaps->MaxPointSize = 1.0f; +} + +HRESULT GetAdapterCaps(const LPDIRECT3D9_DISPLAYADAPTER_INT pDisplayAdapter, D3DDEVTYPE DeviceType, D3DCAPS9* pDstCaps) +{ + HRESULT hResult = D3DERR_INVALIDDEVICE; + LPD3D9_DRIVERCAPS pDriverCaps = NULL; + + ZeroMemory(pDstCaps, sizeof(D3DCAPS9)); + + switch (DeviceType) + { + case D3DDEVTYPE_HAL: + pDriverCaps = &pDisplayAdapter->DriverCaps; + hResult = D3D_OK; + break; + + case D3DDEVTYPE_REF: + case D3DDEVTYPE_SW: + case D3DDEVTYPE_NULLREF: + UNIMPLEMENTED; + hResult = D3D_OK; + break; + + default: + DPRINT1("Unknown DeviceType argument"); + break; + } + + if (pDriverCaps != NULL) + { + CopyDriverCaps(&pDriverCaps->DriverCaps, pDstCaps); + } + + if (SUCCEEDED(hResult)) + { + pDstCaps->DeviceType = DeviceType; + pDstCaps->MasterAdapterOrdinal = pDisplayAdapter->MasterAdapterIndex; + pDstCaps->AdapterOrdinalInGroup = pDisplayAdapter->AdapterIndexInGroup; + pDstCaps->NumberOfAdaptersInGroup = pDisplayAdapter->NumAdaptersInGroup; + } + + return hResult; }
Modified: trunk/reactos/dll/directx/d3d9/adapter.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/adapter.h?... ============================================================================== --- trunk/reactos/dll/directx/d3d9/adapter.h (original) +++ trunk/reactos/dll/directx/d3d9/adapter.h Sat Feb 16 14:17:46 2008 @@ -13,6 +13,8 @@
BOOL GetAdapterMode(LPCSTR lpszDeviceName, D3DDISPLAYMODE* pMode);
+HRESULT GetAdapterCaps(const LPDIRECT3D9_DISPLAYADAPTER_INT pDisplayAdapter, D3DDEVTYPE DeviceType, D3DCAPS9* pDstCaps); + HMONITOR GetAdapterMonitor(LPCSTR lpszDeviceName);
UINT GetDisplayFormatCount(D3DFORMAT Format, const D3DDISPLAYMODE* pSupportedDisplayModes, UINT NumDisplayModes);
Modified: trunk/reactos/dll/directx/d3d9/d3d9_create.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/d3d9_creat... ============================================================================== --- trunk/reactos/dll/directx/d3d9/d3d9_create.c (original) +++ trunk/reactos/dll/directx/d3d9/d3d9_create.c Sat Feb 16 14:17:46 2008 @@ -6,8 +6,7 @@ * PROGRAMERS: Gregor Brunmar <gregor (dot) brunmar (at) home (dot) se> */
-typedef struct IDirect3D9 *LPDIRECT3D9; - +#include <d3d9.h> #include "d3d9_create.h" #include "d3d9_helpers.h" #include <debug.h>
Modified: trunk/reactos/dll/directx/d3d9/d3d9_impl.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/d3d9_impl.... ============================================================================== --- trunk/reactos/dll/directx/d3d9/d3d9_impl.c (original) +++ trunk/reactos/dll/directx/d3d9/d3d9_impl.c Sat Feb 16 14:17:46 2008 @@ -312,7 +312,8 @@ * If the method successfully fills the pMode structure, the return value is D3D_OK. * If Adapter is out of range or pMode is a bad pointer, the return value will be D3DERR_INVALIDCALL. * -*/static HRESULT WINAPI IDirect3D9Impl_GetAdapterDisplayMode(LPDIRECT3D9 iface, UINT Adapter, D3DDISPLAYMODE* pMode) +*/ +static HRESULT WINAPI IDirect3D9Impl_GetAdapterDisplayMode(LPDIRECT3D9 iface, UINT Adapter, D3DDISPLAYMODE* pMode) { LPDIRECT3D9_INT This = impl_from_IDirect3D9(iface); LOCK_D3D9(); @@ -382,11 +383,58 @@ return D3D_OK; }
+ +/*++ +* @name IDirect3D9::GetDeviceCaps +* @implemented +* +* The function IDirect3D9Impl_GetDeviceCaps fills the pCaps argument with the +* capabilities of the specified adapter and device type. +* +* @param LPDIRECT3D iface +* Pointer to the IDirect3D object returned from Direct3DCreate9() +* +* @param UINT Adapter +* Adapter index to get information about. D3DADAPTER_DEFAULT is the primary display. +* The maximum value for this is the value returned by IDirect3D::GetAdapterCount(). +* +* @param D3DDEVTYPE DeviceType +* One of the D3DDEVTYPE enum members. +* NOTE: Currently only D3DDEVTYPE_HAL is implemented. +* +* @param D3DCAPS9* pCaps +* Pointer to a D3DCAPS9 structure to be filled with the adapter's device type capabilities. +* +* @return HRESULT +* If the method successfully fills the pCaps structure, the return value is D3D_OK. +* If Adapter is out of range or pCaps is a bad pointer, the return value will be D3DERR_INVALIDCALL. +* If DeviceType is invalid, the return value will be D3DERR_INVALIDDEVICE. +* +*/ static HRESULT WINAPI IDirect3D9Impl_GetDeviceCaps(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9* pCaps) { - UNIMPLEMENTED - - return D3D_OK; + HRESULT hResult; + LPDIRECT3D9_INT This = impl_from_IDirect3D9(iface); + LOCK_D3D9(); + + if (Adapter >= This->NumDisplayAdapters) + { + DPRINT1("Invalid Adapter number specified"); + UNLOCK_D3D9(); + return D3DERR_INVALIDCALL; + } + + if (IsBadWritePtr(pCaps, sizeof(D3DCAPS9))) + { + DPRINT1("Invalid pCaps parameter specified"); + UNLOCK_D3D9(); + return D3DERR_INVALIDCALL; + } + + hResult = GetAdapterCaps(&This->DisplayAdapters[Adapter], DeviceType, pCaps); + + UNLOCK_D3D9(); + return hResult; }
/*++
Modified: trunk/reactos/dll/directx/d3d9/d3d9_private.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/d3d9_priva... ============================================================================== --- trunk/reactos/dll/directx/d3d9/d3d9_private.h (original) +++ trunk/reactos/dll/directx/d3d9/d3d9_private.h Sat Feb 16 14:17:46 2008 @@ -12,96 +12,26 @@
#define DX_D3D9_MAX_NUM_ADAPTERS 12
+typedef struct _tagD3D9_DRIVERCAPS +{ + D3DCAPS9 DriverCaps; +} D3D9_DRIVERCAPS, FAR* LPD3D9_DRIVERCAPS; + typedef struct _tagDIRECT3D9DisplayAdapterInfo_ { /* 0x0000 */ GUID DisplayGuid; /* 0x0010 */ CHAR szDeviceName[MAX_PATH]; /* 0x0114 */ DWORD dwStateFlags; /* 0x0118 */ BOOL bInUseFlag; -/* 0x011c */ DWORD unknown000002; -/* 0x0120 */ DWORD unknown000003; -/* 0x0124 */ DWORD unknown000004; /* 0x00000001 */ +/* 0x011c */ DWORD MasterAdapterIndex; +/* 0x0120 */ DWORD AdapterIndexInGroup; +/* 0x0124 */ DWORD NumAdaptersInGroup; /* 0x00000001 */ /* 0x0128 */ DWORD NumSupportedD3DFormats; /* 0x012c */ DWORD NumSupportedD3DExtendedFormats; /* 0x0130 */ D3DDISPLAYMODE* pSupportedD3DFormats; /* 0x0134 */ D3DDISPLAYMODE* pSupportedD3DExtendedFormats; /* 0x0138 */ DWORD unknown000009; -/* 0x013c */ DWORD unknown000010; /* D3D9_DRIVERCAPS? */ -/* 0x0140 */ DWORD unknown000011; -/* 0x0144 */ DWORD unknown000012; -/* 0x0148 */ DWORD unknown000013; -/* 0x014c */ DWORD unknown000014; -/* 0x0150 */ DWORD unknown000015; -/* 0x0154 */ DWORD unknown000016; -/* 0x0158 */ DWORD unknown000017; -/* 0x015c */ DWORD unknown000018; -/* 0x0160 */ DWORD unknown000019; -/* 0x0164 */ DWORD unknown000020; -/* 0x0168 */ DWORD unknown000021; -/* 0x016c */ DWORD unknown000022; -/* 0x0170 */ DWORD unknown000023; -/* 0x0174 */ DWORD unknown000024; -/* 0x0178 */ DWORD unknown000025; -/* 0x017c */ DWORD unknown000026; -/* 0x0180 */ DWORD unknown000027; -/* 0x0184 */ DWORD unknown000028; -/* 0x0188 */ DWORD unknown000029; -/* 0x018c */ DWORD unknown000030; -/* 0x0190 */ DWORD unknown000031; -/* 0x0194 */ DWORD unknown000032; -/* 0x0198 */ DWORD unknown000033; -/* 0x019c */ DWORD unknown000034; -/* 0x01a0 */ DWORD unknown000035; -/* 0x01a4 */ DWORD unknown000036; -/* 0x01a8 */ DWORD unknown000037; -/* 0x01ac */ DWORD unknown000038; -/* 0x01b0 */ DWORD unknown000039; -/* 0x01b4 */ DWORD unknown000040; -/* 0x01b8 */ DWORD unknown000041; -/* 0x01bc */ DWORD unknown000042; -/* 0x01c0 */ DWORD unknown000043; -/* 0x01c4 */ DWORD unknown000044; -/* 0x01c8 */ DWORD unknown000045; -/* 0x01cc */ DWORD unknown000046; -/* 0x01d0 */ DWORD unknown000047; -/* 0x01d4 */ DWORD unknown000048; -/* 0x01d8 */ DWORD unknown000049; -/* 0x01dc */ DWORD unknown000050; -/* 0x01e0 */ DWORD unknown000051; -/* 0x01e4 */ DWORD unknown000052; -/* 0x01e8 */ DWORD unknown000053; -/* 0x01ec */ DWORD unknown000054; -/* 0x01f0 */ DWORD unknown000055; -/* 0x01f4 */ DWORD unknown000056; -/* 0x01f8 */ DWORD unknown000057; -/* 0x01fc */ DWORD unknown000058; -/* 0x0200 */ DWORD unknown000059; -/* 0x0204 */ DWORD unknown000060; -/* 0x0208 */ DWORD unknown000061; -/* 0x020c */ DWORD unknown000062; -/* 0x0210 */ DWORD unknown000063; -/* 0x0214 */ DWORD unknown000064; -/* 0x0218 */ DWORD unknown000065; -/* 0x021c */ DWORD unknown000066; -/* 0x0220 */ DWORD unknown000067; -/* 0x0224 */ DWORD unknown000068; -/* 0x0228 */ DWORD unknown000069; -/* 0x022c */ DWORD unknown000070; -/* 0x0230 */ DWORD unknown000071; -/* 0x0234 */ DWORD unknown000072; -/* 0x0238 */ DWORD unknown000073; -/* 0x023c */ DWORD unknown000074; -/* 0x0240 */ DWORD unknown000075; -/* 0x0244 */ DWORD unknown000076; -/* 0x0248 */ DWORD unknown000077; -/* 0x024c */ DWORD unknown000078; -/* 0x0250 */ DWORD unknown000079; -/* 0x0254 */ DWORD unknown000080; -/* 0x0258 */ DWORD unknown000081; -/* 0x025c */ DWORD unknown000082; -/* 0x0260 */ DWORD unknown000083; -/* 0x0264 */ DWORD unknown000084; -/* 0x0268 */ DWORD unknown000085; +/* 0x013c */ D3D9_DRIVERCAPS DriverCaps; /* 0x026c */ DWORD dwDisplayWidth; /* Current display res */ /* 0x0270 */ DWORD dwDisplayHeight; /* Current display res */ /* 0x0274 */ DWORD unknown000088; /* Current D3DFORMAT */ @@ -119,10 +49,10 @@ /* 0x02a4 */ DWORD unknown000100; /* 0x02a8 */ DWORD unknown000101; /*? 0xf7627000 */ /* 0x02ac */ DWORD unknown000102; /*? 0x00000002 */ -/* 0x02b0 */ DWORD unknown000103; /*? 0x001552A0 */ +/* 0x02b0 */ LPDWORD unknown000103; /*? 0x001552A0 */ /* 0x02b4 */ DWORD unknown000104; /* 0x02b8 */ DWORD unknown000105; -} Direct3D9DisplayAdapterInfo_INT, *LPDIRECT3D9_DISPLAYADAPTER_INT; +} Direct3D9DisplayAdapterInfo_INT, FAR* LPDIRECT3D9_DISPLAYADAPTER_INT;
typedef struct _tagDIRECT3D9_INT_ {