* Refactored D3D9 structures a bit

* Started implementing IDirect3D9::CreateDevice()

svn path=/trunk/; revision=35563
This commit is contained in:
Gregor Brunmar 2008-08-23 15:01:19 +00:00
parent 94c1c807bc
commit ce56b08815
12 changed files with 503 additions and 183 deletions

View file

@ -15,10 +15,13 @@
<file>d3d9.c</file> <file>d3d9.c</file>
<file>d3d9_helpers.c</file> <file>d3d9_helpers.c</file>
<file>d3d9_impl.c</file> <file>d3d9_impl.c</file>
<file>d3d9_baseobject.c</file>
<file>d3d9_create.c</file> <file>d3d9_create.c</file>
<file>d3d9_caps.c</file> <file>d3d9_caps.c</file>
<file>d3d9_device.c</file> <file>d3d9_device.c</file>
<file>d3d9_swapchain.c</file>
<file>adapter.c</file> <file>adapter.c</file>
<file>device.c</file>
<file>format.c</file> <file>format.c</file>
<file>d3d9.rc</file> <file>d3d9.rc</file>
<file>d3d9.spec</file> <file>d3d9.spec</file>

View file

@ -0,0 +1,36 @@
#include "d3d9_baseobject.h"
#include "d3d9_device.h"
#include <debug.h>
VOID D3D9BaseObject_Destroy()
{
}
ID3D9BaseObjectVtbl D3D9BaseObject_Vtbl =
{
/* D3D9BaseObject */
D3D9BaseObject_Destroy
};
VOID InitD3D9BaseObject(D3D9BaseObject* pBaseObject, enum REF_TYPE RefType, struct _Direct3DDevice9_INT* pBaseDevice)
{
// TODO: Add dtor to vtbl
pBaseObject->lpVtbl = &D3D9BaseObject_Vtbl;
pBaseObject->RefType = RefType;
pBaseObject->pBaseDevice = pBaseDevice;
}
ULONG D3D9BaseObject_AddRef(D3D9BaseObject* pBaseObject)
{
// TODO: Implement ref counting
UNIMPLEMENTED
return 1;
}
ULONG D3D9BaseObject_Release(D3D9BaseObject* pBaseObject)
{
// TODO: Implement ref counting
UNIMPLEMENTED
return 0;
}

View file

@ -0,0 +1,35 @@
#ifndef _D3D9_BASEOBJECT_H_
#define _D3D9_BASEOBJECT_H_
#include "d3d9_common.h"
enum REF_TYPE
{
RT_EXTERNAL,
RT_BUILTIN,
RT_INTERNAL,
};
typedef struct _D3D9BaseObjectVtbl
{
VOID (*Destroy)();
} ID3D9BaseObjectVtbl;
typedef struct _D3D9BaseObject
{
/* 0x0000 */ ID3D9BaseObjectVtbl* lpVtbl;
/* 0x0004 */ DWORD dwUnknown0004;
/* 0x0008 */ DWORD dwUnknown0008;
/* 0x000c */ struct _Direct3DDevice9_INT* pBaseDevice;
/* 0x0010 */ DWORD dwUnknown0010; // Index? Unique id?
/* 0x0014 */ HANDLE hKernelHandle;
/* 0x0018 */ LPDWORD dwUnknown0018;
/* 0x001c */ enum REF_TYPE RefType;
} D3D9BaseObject;
VOID InitD3D9BaseObject(D3D9BaseObject* pBaseObject, enum REF_TYPE RefType, struct _Direct3DDevice9_INT* pBaseDevice);
ULONG D3D9BaseObject_AddRef(D3D9BaseObject* pBaseObject);
ULONG D3D9BaseObject_Release(D3D9BaseObject* pBaseObject);
#endif // _D3D9_BASEOBJECT_H_

View file

@ -11,83 +11,32 @@
#include "d3d9_common.h" #include "d3d9_common.h"
#include <d3d9.h> #include <d3d9.h>
#include "d3d9_private.h" #include "d3d9_private.h"
#include "d3d9_swapchain.h"
#include "d3d9_surface.h"
extern struct IDirect3DDevice9Vtbl Direct3DDevice9_Vtbl; extern struct IDirect3DDevice9Vtbl Direct3DDevice9_Vtbl;
enum REF_TYPE typedef struct _D3D9HeapTexture
{ {
RT_EXTERNAL, /* 0x0000 */ DWORD dwUnknown00;
RT_BUILTIN, /* 0x0004 */ DWORD dwUnknown04;
RT_INTERNAL, /* 0x0008 */ LPDWORD pUnknown08;
}; } D3D9HeapTexture;
typedef struct _tagD3D9BaseObject_ typedef struct _D3D9ResourceManager
{
/* 0x0000 */ LPDWORD lpVtbl;
/* 0x0004 */ DWORD dwUnknown0004;
/* 0x0008 */ DWORD dwUnknown0008;
/* 0x000c */ struct _tagDirect3DDevice9_INT_* pBaseDevice;
/* 0x0010 */ DWORD dwUnknown0010; // Index? Unique id?
/* 0x0014 */ HANDLE hKernelHandle;
/* 0x0018 */ LPDWORD dwUnknown0018;
/* 0x001c */ enum REF_TYPE RefType;
} D3D9BaseObject;
typedef struct _tagD3D9BaseSurface_
{
/* 0x0000 */ LPDWORD lpVtbl;
/* 0x0024 */ D3DFORMAT DisplayFormat2; // Back buffer format?
/* 0x0028 */ DWORD dwUnknown0028; // Constant/ref count? (1)
/* 0x002c */ DWORD dwUnknown002c; // Refresh rate?
/* 0x0030 */ D3DPOOL SurfacePool;
/* 0x0034 */ DWORD dwUnknown0034;
/* 0x0038 */ DWORD dwUnknown0038;
/* 0x003c */ DWORD dwWidth;
/* 0x0040 */ DWORD dwHeight;
/* 0x0044 */ D3DPOOL ResourcePool;
/* 0x0048 */ D3DFORMAT DisplayFormat;
/* 0x004c */ DWORD dwUnknown004c;
/* 0x0050 */ DWORD dwUnknown0050;
/* 0x0054 */ DWORD dwUnknown0054;
/* 0x0058 */ DWORD dwBpp;
} D3D9BaseSurface;
typedef struct _tagD3D9Surface_
{
/* 0x0000 */ D3D9BaseObject BaseObject;
/* 0x0020 */ D3D9BaseSurface BaseSurface;
} D3D9Surface;
typedef struct _tagD3D9DriverSurface_
{
/* 0x0000 */ D3D9Surface BaseD3D9Surface;
/* 0x005c */ DWORD dwUnknown5c;
/* 0x0060 */ DWORD dwUnknown60;
/* 0x0064 */ struct _tagD3D9DriverSurface_* pPreviousDriverSurface;
/* 0x0068 */ struct _tagD3D9DriverSurface_* pNextDriverSurface;
/* 0x006c */ DWORD dwUnknown6c[8];
} D3D9DriverSurface;
typedef struct _tagD3D9TextureHeap_
{
/* 0x0000 */ DWORD NumTextures;
/* 0x0004 */ LPDWORD pFirstTexture;
} D3D9TextureHeap;
typedef struct _tagD3D9ResourceManager_
{ {
#ifdef D3D_DEBUG_INFO #ifdef D3D_DEBUG_INFO
/* N/A - 0x0000 */ DDSURFACEDESC SurfaceDesc[8]; /* N/A - 0x0000 */ DDSURFACEDESC SurfaceDesc[8];
#endif #endif
/* 0x0000 - 0x0160 */ struct _tagDirect3DDevice9_INT_* pBaseDevice; /* 0x0000 - 0x0160 */ struct _Direct3DDevice9_INT* pBaseDevice;
/* 0x0004 - 0x0164 */ DWORD dwUnknown0004; /* 0x0004 - 0x0164 */ DWORD dwUnknown0004;
/* 0x0008 - 0x0168 */ DWORD dwUnknown0008; /* 0x0008 - 0x0168 */ DWORD dwUnknown0008;
/* 0x000c - 0x016c */ DWORD MaxSimultaneousTextures; /* 0x000c - 0x016c */ DWORD MaxSimultaneousTextures;
/* 0x0010 - 0x0170 */ DWORD dwUnknown0010; /* 0x0010 - 0x0170 */ DWORD dwUnknown0010;
/* 0x0014 - 0x0174 */ LPDWORD pFirstHeapTexture; /* 0x0014 - 0x0174 */ D3D9HeapTexture* pTextureHeap;
} D3D9ResourceManager; } D3D9ResourceManager;
typedef struct _tagDirect3D9Cursor_ typedef struct _D3D9Cursor
{ {
/* 0x0000 */ DWORD dwUnknown0000; /* 0x0000 */ DWORD dwUnknown0000;
/* 0x0004 */ DWORD dwUnknown0004; /* 0x0004 */ DWORD dwUnknown0004;
@ -98,71 +47,15 @@ typedef struct _tagDirect3D9Cursor_
/* 0x0018 */ DWORD dwWidth; /* 0x0018 */ DWORD dwWidth;
/* 0x001c */ DWORD dwHeight; /* 0x001c */ DWORD dwHeight;
/* 0x0020 */ DWORD dwUnknown0020[18]; /* 0x0020 */ DWORD dwUnknown0020[18];
/* 0x0070 */ struct _tagD3D9BaseDevice_* pBaseDevice; /* 0x0070 */ struct _Direct3DDevice9_INT* pBaseDevice;
/* 0x0074 */ struct _tagD3D9SwapChain_* pSwapChain; /* 0x0074 */ struct _Direct3DSwapChain9_INT* pSwapChain;
/* 0x0078 */ DWORD dwUnknown0078; /* 0x0078 */ DWORD dwUnknown0078;
/* 0x007c */ DWORD dwMonitorVirtualX; /* 0x007c */ DWORD dwMonitorVirtualX;
/* 0x0080 */ DWORD dwMonitorVirtualY; /* 0x0080 */ DWORD dwMonitorVirtualY;
/* 0x0084 */ DWORD dwUnknown0084; /* 0x0084 */ DWORD dwUnknown0084;
} D3D9Cursor; } D3D9Cursor;
typedef struct _tagDirect3DSwapChain9_INT_ typedef struct _Direct3DDevice9_INT
{
/* 0x0000 */ D3D9BaseObject BaseObject;
/* 0x0020 */ struct IDirect3DSwapChain9Vtbl* lpVtbl;
/* 0x0024 */ DWORD dwUnknown0024;
/* 0x0028 */ D3D9Surface* pPrimarySurface;
/* 0x002c */ D3D9Surface* pExtendedPrimarySurface;
/* 0x0030 */ DWORD dwUnknown0030;
/* 0x0034 */ D3D9DriverSurface** ppBackBufferList;
/* 0x0038 */ DWORD dwNumBackBuffers;
/* 0x003c */ DWORD ChainIndex;
/* 0x0040 */ DWORD AdapterGroupIndex;
/* 0x0044 */ D3DPRESENT_PARAMETERS PresentParameters;
/* 0x007c */ DWORD dwUnknown007c;
/* 0x0080 */ DWORD dwUnknown0080[2]; /* Extended format? */
/* 0x0088 */ D3D9Cursor* pCursor;
/* 0x008c */ DWORD dwUnknown008c[4];
/* 0x009c */ D3D9_Unknown6BC* pUnknown6BC;
/* 0x00a0 */ LPDWORD dwUnknown00a0;
/* 0x00a4 */ DWORD dwUnknown00a4;
/* 0x00a8 */ DWORD dwUnknown00a8;
/* 0x00ac */ DWORD dwWidth;
/* 0x00b0 */ DWORD dwHeight;
/* 0x00b4 */ DWORD dwUnknown00b4;
/* 0x00b8 */ DWORD dwUnknown00b8;
/* 0x00bc */ DWORD dwUnknown00bc;
/* 0x00c0 */ DWORD dwWidth2;
/* 0x00c4 */ DWORD dwHeight2;
/* 0x00c8 */ DWORD dwUnknown00c8;
/* 0x00cc */ DWORD dwUnknown00cc;
/* 0x00d0 */ DWORD dwUnknown00d0;
/* 0x00d4 */ DWORD dwUnknown00d4;
/* 0x00d8 */ DWORD dwUnknown00d8;
/* 0x00dc */ DWORD dwUnknown00dc;
/* 0x00e0 */ DWORD dwDevModeScale;
/* 0x00e4 */ DWORD dwUnknown00e4;
/* 0x00e8 */ DWORD dwUnknown00e8;
/* 0x00ec */ DWORD dwUnknown00ec;
/* 0x00f0 */ DWORD dwUnknown00f0[27];
/* 0x015c */ LPDWORD pUnknown015c;
/* 0x0160 */ DWORD dwUnknown0160[4];
/* 0x0170 */ HRESULT hResult;
/* 0x0174 */ DWORD dwUnknown0174[26];
/* 0x01DC */ DWORD dwUnknownFlags; /* 1 = Show frame rate, 2 = Flip without vsync */
/* 0x01E0 */ BOOL bForceRefreshRate;
/* 0x01E4 */ DWORD dwUnknown01dc[4];
/* 0x01f4 */ D3DSWAPEFFECT SwapEffect;
/* 0x01f8 */ DWORD dwUnknown01f8;
/* 0x01fc */ DWORD dwUnknown01fc;
/* 0x0200 */ DDGAMMARAMP GammaRamp;
} Direct3DSwapChain9_INT, FAR* LPDIRECT3DSWAPCHAIN9_INT;
typedef struct _tagDirect3DDevice9_INT_
{ {
/* 0x0000 */ struct IDirect3DDevice9Vtbl* lpVtbl; /* 0x0000 */ struct IDirect3DDevice9Vtbl* lpVtbl;
/* 0x0004 */ CRITICAL_SECTION CriticalSection; /* 0x0004 */ CRITICAL_SECTION CriticalSection;
@ -184,7 +77,7 @@ typedef struct _tagDirect3DDevice9_INT_
#endif #endif
/* 0x001c - 0x0054 */ BOOL bLockDevice; /* 0x001c - 0x0054 */ BOOL bLockDevice;
/* 0x0020 - 0x0058 */ DWORD dwProcessId; /* 0x0020 - 0x0058 */ DWORD dwProcessId;
/* 0x0024 - 0x005c */ struct _tagD3D9PUREDEVICE_* lpThis; /* 0x0024 - 0x005c */ struct _D3D9PUREDEVICE* lpThis;
/* 0x0028 - 0x0060 */ DWORD dwDXVersion; /* 0x0028 - 0x0060 */ DWORD dwDXVersion;
/* 0x002c - 0x0064 */ DWORD unknown000011; /* 0x002c - 0x0064 */ DWORD unknown000011;
/* 0x0030 - 0x0068 */ LONG lRefCnt; /* 0x0030 - 0x0068 */ LONG lRefCnt;
@ -195,51 +88,7 @@ typedef struct _tagDirect3DDevice9_INT_
/* 0x0044 - 0x007c */ DWORD BehaviourFlags; /* 0x0044 - 0x007c */ DWORD BehaviourFlags;
/* 0x0048 - 0x0080 */ D3D9BaseSurface* pUnknown0010; /* 0x0048 - 0x0080 */ D3D9BaseSurface* pUnknown0010;
/* 0x004c - 0x0084 */ DWORD NumAdaptersInDevice; /* 0x004c - 0x0084 */ DWORD NumAdaptersInDevice;
/* 0x0050 - 0x0088 */ D3DDISPLAYMODE CurrentDisplayMode; /* 0x0050 - 0x0088 */ D3DDISPLAYMODE CurrentDisplayMode[D3D9_INT_MAX_NUM_ADAPTERS];
/* 0x0060 - 0x0098 */ DWORD unknown000024;
/* 0x0064 - 0x009c */ DWORD unknown000025;
/* 0x0068 - 0x00a0 */ DWORD unknown000026;
/* 0x006c - 0x00a4 */ DWORD unknown000027;
/* 0x0070 - 0x00a8 */ DWORD unknown000028;
/* 0x0074 - 0x00ac */ DWORD unknown000029;
/* 0x0078 - 0x00b0 */ DWORD unknown000030;
/* 0x007c - 0x00b4 */ DWORD unknown000031;
/* 0x0080 - 0x00b8 */ DWORD unknown000032;
/* 0x0084 - 0x00bc */ DWORD unknown000033;
/* 0x0088 - 0x00c0 */ DWORD unknown000034;
/* 0x008c - 0x00c4 */ DWORD unknown000035;
/* 0x0090 - 0x00c8 */ DWORD unknown000036;
/* 0x0094 - 0x00cc */ DWORD unknown000037;
/* 0x0098 - 0x00d0 */ DWORD unknown000038;
/* 0x009c - 0x00d4 */ DWORD unknown000039;
/* 0x00a0 - 0x00d8 */ DWORD unknown000040;
/* 0x00a4 - 0x00dc */ DWORD unknown000041;
/* 0x00a8 - 0x00e0 */ DWORD unknown000042;
/* 0x00ac - 0x00e4 */ DWORD unknown000043;
/* 0x00b0 - 0x00e8 */ DWORD unknown000044;
/* 0x00b4 - 0x00ec */ DWORD unknown000045;
/* 0x00b8 - 0x00f0 */ DWORD unknown000046;
/* 0x00bc - 0x00f4 */ DWORD unknown000047;
/* 0x00c0 - 0x00f8 */ DWORD unknown000048;
/* 0x00c4 - 0x00fc */ DWORD unknown000049;
/* 0x00c8 - 0x0100 */ DWORD unknown000050;
/* 0x00cc - 0x0104 */ DWORD unknown000051;
/* 0x00d0 - 0x0108 */ DWORD unknown000052;
/* 0x00d4 - 0x010c */ DWORD unknown000053;
/* 0x00d8 - 0x0110 */ DWORD unknown000054;
/* 0x00dc - 0x0114 */ DWORD unknown000055;
/* 0x00e0 - 0x0118 */ DWORD unknown000056;
/* 0x00e4 - 0x011c */ DWORD unknown000057;
/* 0x00e8 - 0x0120 */ DWORD unknown000058;
/* 0x00ec - 0x0124 */ DWORD unknown000059;
/* 0x00f0 - 0x0128 */ DWORD unknown000060;
/* 0x00f4 - 0x012c */ DWORD unknown000061;
/* 0x00f8 - 0x0130 */ DWORD unknown000062;
/* 0x00fc - 0x0134 */ DWORD unknown000063;
/* 0x0100 - 0x0138 */ DWORD unknown000064;
/* 0x0104 - 0x013c */ DWORD unknown000065;
/* 0x0108 - 0x0140 */ DWORD unknown000066;
/* 0x010c - 0x0144 */ DWORD unknown000067;
/* 0x0110 - 0x0148 */ DWORD AdapterIndexInGroup[D3D9_INT_MAX_NUM_ADAPTERS]; /* 0x0110 - 0x0148 */ DWORD AdapterIndexInGroup[D3D9_INT_MAX_NUM_ADAPTERS];
/* 0x0140 - 0x0178 */ D3D9_DEVICEDATA DeviceData[D3D9_INT_MAX_NUM_ADAPTERS]; /* 0x0140 - 0x0178 */ D3D9_DEVICEDATA DeviceData[D3D9_INT_MAX_NUM_ADAPTERS];
/* 0x1df0 - 0x1e28 */ LPDIRECT3DSWAPCHAIN9_INT pSwapChains[D3D9_INT_MAX_NUM_ADAPTERS]; /* 0x1df0 - 0x1e28 */ LPDIRECT3DSWAPCHAIN9_INT pSwapChains[D3D9_INT_MAX_NUM_ADAPTERS];
@ -308,7 +157,7 @@ typedef struct _tagDirect3DDevice9_INT_
/* 0x1f44 */ DWORD unknown002001; /* 0x1f44 */ DWORD unknown002001;
} DIRECT3DDEVICE9_INT, FAR* LPDIRECT3DDEVICE9_INT; } DIRECT3DDEVICE9_INT, FAR* LPDIRECT3DDEVICE9_INT;
typedef struct _tagD3D9PUREDEVICE_ typedef struct _D3D9PUREDEVICE
{ {
/* 0x0000 - 0x0000 */ DIRECT3DDEVICE9_INT BaseDevice; /* 0x0000 - 0x0000 */ DIRECT3DDEVICE9_INT BaseDevice;
/* 0x1f48 */ DWORD unknown002002; /* 0x1f48 */ DWORD unknown002002;
@ -392,7 +241,7 @@ typedef struct _tagD3D9PUREDEVICE_
/* 0x2080 */ DWORD unknown002080; /* 0x2080 */ DWORD unknown002080;
/* 0x2084 */ DWORD unknown002081; /* 0x2084 */ DWORD unknown002081;
/* 0x2088 */ DWORD unknown002082; /* 0x2088 */ DWORD unknown002082;
/* 0x208c */ DWORD unknown002083; /* 0x208c */ DWORD unknown002083;
/* 0x2090 */ DWORD unknown002084; /* 0x2090 */ DWORD unknown002084;
/* 0x2094 */ DWORD unknown002085; /* 0x2094 */ DWORD unknown002085;
/* 0x2098 */ DWORD unknown002086; /* 0x2098 */ DWORD unknown002086;
@ -409,7 +258,7 @@ typedef struct _tagD3D9PUREDEVICE_
/* 0x20c4 */ DWORD unknown002097; /* 0x20c4 */ DWORD unknown002097;
/* 0x20c8 */ DWORD unknown002098; /* 0x20c8 */ DWORD unknown002098;
/* 0x20cc */ DWORD unknown002099; /* 0x20cc */ DWORD unknown002099;
/* 0x20d0 */ DWORD unknown002100; /* 0x20d0 */ DWORD unknown002100;
/* 0x20d4 */ DWORD unknown002101; /* 0x20d4 */ DWORD unknown002101;
/* 0x20d8 */ DWORD unknown002102; /* 0x20d8 */ DWORD unknown002102;
/* 0x20dc */ DWORD unknown002103; /* 0x20dc */ DWORD unknown002103;
@ -629,7 +478,7 @@ typedef struct _tagD3D9PUREDEVICE_
/* 0x2434 */ DWORD unknown002317; /* 0x2434 */ DWORD unknown002317;
} D3D9PUREDEVICE, FAR *LPD3D9PUREDEVICE; } D3D9PUREDEVICE, FAR *LPD3D9PUREDEVICE;
typedef struct _tagD3D9HALDEVICE_ typedef struct _D3D9HALDEVICE
{ {
/* 0x0000 */ D3D9PUREDEVICE PureDevice; /* 0x0000 */ D3D9PUREDEVICE PureDevice;
#ifdef D3D_DEBUG_INFO #ifdef D3D_DEBUG_INFO

View file

@ -81,7 +81,7 @@ HRESULT SafeCopyString(OUT LPSTR Dst, IN DWORD DstSize, IN LPCSTR Src)
HRESULT SafeAppendString(IN OUT LPSTR Dst, IN DWORD DstSize, IN LPCSTR Src) HRESULT SafeAppendString(IN OUT LPSTR Dst, IN DWORD DstSize, IN LPCSTR Src)
{ {
DWORD CurrentDstLength; size_t CurrentDstLength;
if (Dst == NULL || DstSize == 0) if (Dst == NULL || DstSize == 0)
return DDERR_INVALIDPARAMS; return DDERR_INVALIDPARAMS;

View file

@ -11,6 +11,7 @@
#include <debug.h> #include <debug.h>
#include "d3d9_helpers.h" #include "d3d9_helpers.h"
#include "adapter.h" #include "adapter.h"
#include "device.h"
#include "format.h" #include "format.h"
#define LOCK_D3D9() EnterCriticalSection(&This->d3d9_cs); #define LOCK_D3D9() EnterCriticalSection(&This->d3d9_cs);
@ -894,6 +895,7 @@ static HRESULT WINAPI IDirect3D9Impl_CreateDevice(LPDIRECT3D9 iface, UINT Adapte
struct IDirect3DDevice9** ppReturnedDeviceInterface) struct IDirect3DDevice9** ppReturnedDeviceInterface)
{ {
DWORD NumAdaptersToCreate; DWORD NumAdaptersToCreate;
HRESULT Ret;
LPDIRECT3D9_INT This = impl_from_IDirect3D9(iface); LPDIRECT3D9_INT This = impl_from_IDirect3D9(iface);
LOCK_D3D9(); LOCK_D3D9();
@ -977,9 +979,10 @@ static HRESULT WINAPI IDirect3D9Impl_CreateDevice(LPDIRECT3D9 iface, UINT Adapte
*ppReturnedDeviceInterface = 0; *ppReturnedDeviceInterface = 0;
UNIMPLEMENTED Ret = CreateD3D9HalDevice(This, Adapter, hFocusWindow, BehaviourFlags, pPresentationParameters, NumAdaptersToCreate, ppReturnedDeviceInterface);
return D3D_OK; UNLOCK_D3D9();
return Ret;
} }
IDirect3D9Vtbl Direct3D9_Vtbl = IDirect3D9Vtbl Direct3D9_Vtbl =

View file

@ -8,7 +8,7 @@
#ifndef _D3D9_PRIVATE_H_ #ifndef _D3D9_PRIVATE_H_
#define _D3D9_PRIVATE_H_ #define _D3D9_PRIVATE_H_
#include <windows.h> #include "d3d9_common.h"
#include <ddraw.h> #include <ddraw.h>
#define D3D9_INT_MAX_NUM_ADAPTERS 12 #define D3D9_INT_MAX_NUM_ADAPTERS 12
@ -25,14 +25,14 @@ typedef enum _D3D9_GETAVAILDRIVERMEMORY_TYPE
typedef struct _D3D9_GETAVAILDRIVERMEMORYDATA typedef struct _D3D9_GETAVAILDRIVERMEMORYDATA
{ {
/* 0x0000 */ struct _D3D9Unknown6BC_* pUnknown6BC; /* 0x0000 */ struct _D3D9_Unknown6BC* pUnknown6BC;
/* 0x0004 */ D3D9_GETAVAILDRIVERMEMORY_TYPE dwMemoryType; /* 0x0004 */ D3D9_GETAVAILDRIVERMEMORY_TYPE dwMemoryType;
/* 0x0008 */ DWORD dwTextureType; /* 0x0008 */ DWORD dwTextureType;
/* 0x000c */ DWORD dwFree; /* 0x000c */ DWORD dwFree;
} D3D9_GETAVAILDRIVERMEMORYDATA, FAR* LPD3D9_GETAVAILDRIVERMEMORYDATA; } D3D9_GETAVAILDRIVERMEMORYDATA, FAR* LPD3D9_GETAVAILDRIVERMEMORYDATA;
typedef BOOL (WINAPI FAR* LPD3D9_GETAVAILDRIVERMEMORY)(LPD3D9_GETAVAILDRIVERMEMORYDATA); typedef BOOL (WINAPI FAR* LPD3D9_GETAVAILDRIVERMEMORY)(LPD3D9_GETAVAILDRIVERMEMORYDATA);
typedef struct _D3D9Unknown6BC_ typedef struct _D3D9_Unknown6BC
{ {
/* 0x0000 */ HANDLE hDirectDrawLocal; /* 0x0000 */ HANDLE hDirectDrawLocal;
/* 0x0004 */ LPDWORD pUnknown0004; /* 0x0004 */ LPDWORD pUnknown0004;
@ -78,7 +78,7 @@ typedef struct _D3D9Unknown6BC_
/* 0x00BC */ DDGAMMARAMP GammaRamp; /* 0x00BC */ DDGAMMARAMP GammaRamp;
} D3D9_Unknown6BC; } D3D9_Unknown6BC;
typedef struct _tagD3D9_DRIVERCAPS typedef struct _D3D9_DRIVERCAPS
{ {
/* 0x0000 */ D3DCAPS9 DriverCaps9; /* 0x0000 */ D3DCAPS9 DriverCaps9;
/* 0x0130 */ DWORD dwDisplayWidth; /* 0x0130 */ DWORD dwDisplayWidth;
@ -147,20 +147,20 @@ typedef struct _tagD3D9_CALLBACKS
/* 0x00a4 */ D3DDEVTYPE DeviceType; /* 0x00a4 */ D3DDEVTYPE DeviceType;
} D3D9_CALLBACKS; } D3D9_CALLBACKS;
typedef struct _tagD3D9_DEVICEDATA_ typedef struct _D3D9_DEVICEDATA
{ {
/* 0x0000 */ D3D9_DRIVERCAPS DriverCaps; /* 0x0000 */ D3D9_DRIVERCAPS DriverCaps;
/* 0x0178 */ D3D9_CALLBACKS D3D9Callbacks; /* 0x0178 */ D3D9_CALLBACKS D3D9Callbacks;
/* 0x0220 */ CHAR szDeviceName[CCHDEVICENAME]; /* 0x0220 */ CHAR szDeviceName[CCHDEVICENAME];
/* 0x0240 */ HDC hDC; /* 0x0240 */ HDC hDC;
/* 0x0244 */ GUID DisplayGuid; /* 0x0244 */ GUID DisplayGuid;
/* 0x0254 */ D3D9_Unknown6BC* pUnknown6BC; /* 0x0254 */ struct _D3D9_Unknown6BC* pUnknown6BC;
/* 0x0258 */ D3DDEVTYPE DeviceType; /* 0x0258 */ D3DDEVTYPE DeviceType;
/* 0x025c */ HMODULE hD3DRefDll; /* 0x025c */ HMODULE hD3DRefDll;
/* 0x0260 */ DWORD unknown0152; /* 0x0260 */ DWORD unknown0152;
} D3D9_DEVICEDATA, FAR *LPD3D9_DEVICEDATA; } D3D9_DEVICEDATA, FAR *LPD3D9_DEVICEDATA;
typedef struct _tagDIRECT3D9DisplayAdapterInfo_ typedef struct _Direct3D9DisplayAdapterInfo
{ {
/* 0x0000 */ GUID DisplayGuid; /* 0x0000 */ GUID DisplayGuid;
/* 0x0010 */ CHAR szDeviceName[MAX_PATH]; /* 0x0010 */ CHAR szDeviceName[MAX_PATH];
@ -179,13 +179,13 @@ typedef struct _tagDIRECT3D9DisplayAdapterInfo_
/* 0x02b8 */ DWORD unknown000105; /* 0x02b8 */ DWORD unknown000105;
} Direct3D9DisplayAdapterInfo, FAR* LPDIRECT3D9_DISPLAYADAPTER; } Direct3D9DisplayAdapterInfo, FAR* LPDIRECT3D9_DISPLAYADAPTER;
typedef struct _tagDIRECT3D9_INT_ typedef struct _DIRECT3D9_INT
{ {
/* 0x0000 */ struct IDirect3D9Vtbl *lpVtbl; /* LPDIRECTD3D9 function table */ /* 0x0000 */ struct IDirect3D9Vtbl *lpVtbl; /* LPDIRECTD3D9 function table */
/* 0x0004 */ CRITICAL_SECTION d3d9_cs; /* 0x0004 */ CRITICAL_SECTION d3d9_cs;
/* 0x001c */ DWORD unknown000007; /* 0x00000001 */ /* 0x001c */ DWORD unknown000007; /* 0x00000001 */
/* 0x0020 */ DWORD dwProcessId; /* 0x0020 */ DWORD dwProcessId;
/* 0x0024 */ struct _tagDIRECT3D9_INT_ *lpInt; /* 0x0024 */ struct _DIRECT3D9_INT *lpInt;
/* 0x0028 */ LONG lRefCnt; /* Increases and decreases by AddRef() and Release() */ /* 0x0028 */ LONG lRefCnt; /* Increases and decreases by AddRef() and Release() */
/* 0x002c */ UINT NumDisplayAdapters; /* 0x002c */ UINT NumDisplayAdapters;
/* 0x0030 */ Direct3D9DisplayAdapterInfo DisplayAdapters[D3D9_INT_MAX_NUM_ADAPTERS]; /* 0x0030 */ Direct3D9DisplayAdapterInfo DisplayAdapters[D3D9_INT_MAX_NUM_ADAPTERS];

View file

@ -0,0 +1,41 @@
#ifndef _D3D9_SURFACE_H_
#define _D3D9_SURFACE_H_
#include "d3d9_baseobject.h"
typedef struct _D3D9BaseSurface
{
/* 0x0000 */ LPDWORD lpVtbl;
/* 0x0024 */ D3DFORMAT DisplayFormat2; // Back buffer format?
/* 0x0028 */ DWORD dwUnknown0028; // Constant/ref count? (1)
/* 0x002c */ DWORD dwUnknown002c; // Refresh rate?
/* 0x0030 */ D3DPOOL SurfacePool;
/* 0x0034 */ DWORD dwUnknown0034;
/* 0x0038 */ DWORD dwUnknown0038;
/* 0x003c */ DWORD dwWidth;
/* 0x0040 */ DWORD dwHeight;
/* 0x0044 */ D3DPOOL ResourcePool;
/* 0x0048 */ D3DFORMAT DisplayFormat;
/* 0x004c */ DWORD dwUnknown004c;
/* 0x0050 */ DWORD dwUnknown0050;
/* 0x0054 */ DWORD dwUnknown0054;
/* 0x0058 */ DWORD dwBpp;
} D3D9BaseSurface;
typedef struct _D3D9Surface
{
/* 0x0000 */ D3D9BaseObject BaseObject;
/* 0x0020 */ D3D9BaseSurface BaseSurface;
} D3D9Surface;
typedef struct _D3D9DriverSurface
{
/* 0x0000 */ D3D9Surface BaseD3D9Surface;
/* 0x005c */ DWORD dwUnknown5c;
/* 0x0060 */ DWORD dwUnknown60;
/* 0x0064 */ struct _D3D9DriverSurface* pPreviousDriverSurface;
/* 0x0068 */ struct _D3D9DriverSurface* pNextDriverSurface;
/* 0x006c */ DWORD dwUnknown6c[8];
} D3D9DriverSurface;
#endif // _D3D9_SURFACE_H_

View file

@ -0,0 +1,153 @@
#include "d3d9_swapchain.h"
#include <debug.h>
#include <ddraw.h>
#include "d3d9_helpers.h"
#include "d3d9_device.h"
/* Convert a IDirect3DSwapChain9 pointer safely to the internal implementation struct */
static LPDIRECT3DSWAPCHAIN9_INT IDirect3DSwapChain9ToImpl(LPDIRECT3DSWAPCHAIN9 iface)
{
if (IsBadWritePtr(iface, sizeof(LPDIRECT3DSWAPCHAIN9_INT)))
return NULL;
return (LPDIRECT3DSWAPCHAIN9_INT)((ULONG_PTR)iface - FIELD_OFFSET(Direct3DSwapChain9_INT, lpVtbl));
}
/* IDirect3DSwapChain9: IUnknown implementation */
static HRESULT WINAPI Direct3DSwapChain9_QueryInterface(LPDIRECT3DSWAPCHAIN9 iface, REFIID riid, void** ppvObject)
{
LPDIRECT3DSWAPCHAIN9_INT This = IDirect3DSwapChain9ToImpl(iface);
if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDirect3DSwapChain9))
{
IUnknown_AddRef(iface);
*ppvObject = &This->lpVtbl;
return S_OK;
}
*ppvObject = NULL;
return E_NOINTERFACE;
}
static ULONG WINAPI Direct3DSwapChain9_AddRef(LPDIRECT3DSWAPCHAIN9 iface)
{
LPDIRECT3DSWAPCHAIN9_INT This = IDirect3DSwapChain9ToImpl(iface);
D3D9BaseObject* BaseObject = (D3D9BaseObject*)((ULONG_PTR)This - FIELD_OFFSET(Direct3DSwapChain9_INT, lpVtbl) - FIELD_OFFSET(Direct3DSwapChain9_INT, BaseObject));
return D3D9BaseObject_AddRef(BaseObject);
}
static ULONG WINAPI Direct3DSwapChain9_Release(LPDIRECT3DSWAPCHAIN9 iface)
{
LPDIRECT3DSWAPCHAIN9_INT This = IDirect3DSwapChain9ToImpl(iface);
D3D9BaseObject* BaseObject = (D3D9BaseObject*)((ULONG_PTR)This - FIELD_OFFSET(Direct3DSwapChain9_INT, lpVtbl) - FIELD_OFFSET(Direct3DSwapChain9_INT, BaseObject));
return D3D9BaseObject_Release(BaseObject);
}
/* IDirect3DSwapChain9 interface */
static HRESULT WINAPI Direct3DSwapChain9_Present(LPDIRECT3DSWAPCHAIN9 iface, CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion,DWORD dwFlags)
{
UNIMPLEMENTED
return D3D_OK;
}
static HRESULT WINAPI Direct3DSwapChain9_GetFrontBufferData(LPDIRECT3DSWAPCHAIN9 iface, IDirect3DSurface9* pDestSurface)
{
UNIMPLEMENTED
return D3D_OK;
}
static HRESULT WINAPI Direct3DSwapChain9_GetBackBuffer(LPDIRECT3DSWAPCHAIN9 iface, UINT iBackBuffer,D3DBACKBUFFER_TYPE Type,IDirect3DSurface9** ppBackBuffer)
{
UNIMPLEMENTED
return D3D_OK;
}
static HRESULT WINAPI Direct3DSwapChain9_GetRasterStatus(LPDIRECT3DSWAPCHAIN9 iface, D3DRASTER_STATUS* pRasterStatus)
{
UNIMPLEMENTED
return D3D_OK;
}
static HRESULT WINAPI Direct3DSwapChain9_GetDisplayMode(LPDIRECT3DSWAPCHAIN9 iface, D3DDISPLAYMODE* pMode)
{
UNIMPLEMENTED
return D3D_OK;
}
static HRESULT WINAPI Direct3DSwapChain9_GetDevice(LPDIRECT3DSWAPCHAIN9 iface, IDirect3DDevice9** ppDevice)
{
UNIMPLEMENTED
return D3D_OK;
}
static HRESULT WINAPI Direct3DSwapChain9_GetPresentParameters(LPDIRECT3DSWAPCHAIN9 iface, D3DPRESENT_PARAMETERS* pPresentationParameters)
{
UNIMPLEMENTED
return D3D_OK;
}
static IDirect3DSwapChain9Vtbl Direct3DSwapChain9_Vtbl =
{
/* IUnknown */
Direct3DSwapChain9_QueryInterface,
Direct3DSwapChain9_AddRef,
Direct3DSwapChain9_Release,
/* IDirect3DSwapChain9 */
Direct3DSwapChain9_Present,
Direct3DSwapChain9_GetFrontBufferData,
Direct3DSwapChain9_GetBackBuffer,
Direct3DSwapChain9_GetRasterStatus,
Direct3DSwapChain9_GetDisplayMode,
Direct3DSwapChain9_GetDevice,
Direct3DSwapChain9_GetPresentParameters,
};
Direct3DSwapChain9_INT* CreateDirect3DSwapChain9(enum REF_TYPE RefType, struct _Direct3DDevice9_INT* pBaseDevice, DWORD ChainIndex)
{
Direct3DSwapChain9_INT* pThisSwapChain;
if (FAILED(AlignedAlloc((LPVOID *)&pThisSwapChain, sizeof(Direct3DSwapChain9_INT))))
{
DPRINT1("Could not create Direct3DSwapChain9_INT");
return NULL;
}
InitD3D9BaseObject(&pThisSwapChain->BaseObject, RefType, pBaseDevice);
pThisSwapChain->lpVtbl = &Direct3DSwapChain9_Vtbl;
pThisSwapChain->ChainIndex = ChainIndex;
pThisSwapChain->AdapterGroupIndex = ChainIndex;
pThisSwapChain->pUnknown6BC = pBaseDevice->DeviceData[ChainIndex].pUnknown6BC;
pThisSwapChain->pUnknown015c = (LPVOID)0xD3D9D3D9;
return pThisSwapChain;
}
VOID Direct3DSwapChain9_SetDisplayMode(Direct3DSwapChain9_INT* pThisSwapChain, D3DDISPLAYMODE* pMode)
{
pThisSwapChain->dwWidth = pMode->Width;
pThisSwapChain->dwHeight = pMode->Height;
}
HRESULT Direct3DSwapChain9_Init(Direct3DSwapChain9_INT* pThisSwapChain, D3DPRESENT_PARAMETERS* pPresentationParameters)
{
int i;
for (i = 0; i < 256; i++)
{
pThisSwapChain->GammaRamp.red[i] =
pThisSwapChain->GammaRamp.green[i] =
pThisSwapChain->GammaRamp.blue[i] = i;
}
return Direct3DSwapChain9_Reset(pThisSwapChain, pPresentationParameters);
}
HRESULT Direct3DSwapChain9_Reset(Direct3DSwapChain9_INT* pThisSwapChain, D3DPRESENT_PARAMETERS* pPresentationParameters)
{
// TODO: Do all the dirty work...
return D3D_OK;
}

View file

@ -0,0 +1,72 @@
#ifndef _D3D9_SWAPCHAIN_H_
#define _D3D9_SWAPCHAIN_H_
#include "d3d9_common.h"
#include <d3d9.h>
#include <ddraw.h>
#include "d3d9_baseobject.h"
typedef struct _Direct3DSwapChain9_INT
{
/* 0x0000 */ D3D9BaseObject BaseObject;
/* 0x0020 */ struct IDirect3DSwapChain9Vtbl* lpVtbl;
/* 0x0024 */ DWORD dwUnknown0024;
/* 0x0028 */ struct _D3D9Surface* pPrimarySurface;
/* 0x002c */ struct _D3D9Surface* pExtendedPrimarySurface;
/* 0x0030 */ DWORD dwUnknown0030;
/* 0x0034 */ struct _D3D9DriverSurface** ppBackBufferList;
/* 0x0038 */ DWORD dwNumBackBuffers;
/* 0x003c */ DWORD ChainIndex;
/* 0x0040 */ DWORD AdapterGroupIndex;
/* 0x0044 */ D3DPRESENT_PARAMETERS PresentParameters;
/* 0x007c */ DWORD dwUnknown007c;
/* 0x0080 */ DWORD dwUnknown0080[2]; /* Extended format? */
/* 0x0088 */ struct _D3D9Cursor* pCursor;
/* 0x008c */ DWORD dwUnknown008c[4];
/* 0x009c */ struct _D3D9_Unknown6BC* pUnknown6BC;
/* 0x00a0 */ LPDWORD dwUnknown00a0;
/* 0x00a4 */ DWORD dwUnknown00a4;
/* 0x00a8 */ DWORD dwUnknown00a8;
/* 0x00ac */ DWORD dwWidth;
/* 0x00b0 */ DWORD dwHeight;
/* 0x00b4 */ DWORD dwUnknown00b4;
/* 0x00b8 */ DWORD dwUnknown00b8;
/* 0x00bc */ DWORD dwUnknown00bc;
/* 0x00c0 */ DWORD dwWidth2;
/* 0x00c4 */ DWORD dwHeight2;
/* 0x00c8 */ DWORD dwUnknown00c8;
/* 0x00cc */ DWORD dwUnknown00cc;
/* 0x00d0 */ DWORD dwUnknown00d0;
/* 0x00d4 */ DWORD dwUnknown00d4;
/* 0x00d8 */ DWORD dwUnknown00d8;
/* 0x00dc */ DWORD dwUnknown00dc;
/* 0x00e0 */ DWORD dwDevModeScale;
/* 0x00e4 */ DWORD dwUnknown00e4;
/* 0x00e8 */ DWORD dwUnknown00e8;
/* 0x00ec */ DWORD dwUnknown00ec;
/* 0x00f0 */ DWORD dwUnknown00f0[27];
/* 0x015c */ LPVOID pUnknown015c;
/* 0x0160 */ DWORD dwUnknown0160[4];
/* 0x0170 */ HRESULT hResult;
/* 0x0174 */ DWORD dwUnknown0174[26];
/* 0x01DC */ DWORD dwUnknownFlags; /* 1 = Show frame rate, 2 = Flip without vsync */
/* 0x01E0 */ BOOL bForceRefreshRate;
/* 0x01E4 */ DWORD dwUnknown01dc[4];
/* 0x01f4 */ D3DSWAPEFFECT SwapEffect;
/* 0x01f8 */ DWORD dwUnknown01f8;
/* 0x01fc */ DWORD dwUnknown01fc;
/* 0x0200 */ DDGAMMARAMP GammaRamp;
} Direct3DSwapChain9_INT, FAR* LPDIRECT3DSWAPCHAIN9_INT;
Direct3DSwapChain9_INT* CreateDirect3DSwapChain9(enum REF_TYPE RefType, struct _Direct3DDevice9_INT* pBaseDevice, DWORD ChainIndex);
VOID Direct3DSwapChain9_SetDisplayMode(Direct3DSwapChain9_INT* pThisSwapChain, D3DDISPLAYMODE* pMode);
HRESULT Direct3DSwapChain9_Init(Direct3DSwapChain9_INT* pThisSwapChain, D3DPRESENT_PARAMETERS* pPresentationParameters);
HRESULT Direct3DSwapChain9_Reset(Direct3DSwapChain9_INT* pThisSwapChain, D3DPRESENT_PARAMETERS* pPresentationParameters);
#endif // _D3D9_SWAPCHAIN_H_

View file

@ -0,0 +1,108 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS ReactX
* FILE: dll/directx/d3d9/device.c
* PURPOSE: Direct3D9's device creation
* PROGRAMERS: Gregor Gullwi <gbrunmar (dot) ros (at) gmail (dot) com>
*/
#include "device.h"
#include <debug.h>
#include "d3d9_helpers.h"
static HRESULT InitD3D9ResourceManager(D3D9ResourceManager* pThisResourceManager, LPDIRECT3DDEVICE9_INT pDirect3DDevice9)
{
DWORD MaxSimultaneousTextures;
MaxSimultaneousTextures = max(1, pDirect3DDevice9->DeviceData[0].DriverCaps.DriverCaps9.MaxSimultaneousTextures);
if (FAILED(AlignedAlloc((LPVOID *)&pThisResourceManager->pTextureHeap, sizeof(DWORD) + MaxSimultaneousTextures * sizeof(int) * 3)))
{
DPRINT1("Could not allocate texture heap");
return DDERR_OUTOFMEMORY;
}
// TODO: Init texture heap
pThisResourceManager->MaxSimultaneousTextures = MaxSimultaneousTextures;
pThisResourceManager->pBaseDevice = pDirect3DDevice9;
return D3D_OK;
}
HRESULT InitD3D9BaseDevice(LPDIRECT3DDEVICE9_INT pThisBaseDevice, LPDIRECT3D9_INT pDirect3D9,
UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviourFlags,
D3DPRESENT_PARAMETERS* pPresentationParameters, DWORD NumAdaptersToCreate)
{
D3D9ResourceManager* pResourceManager;
DWORD i;
D3DDISPLAYMODE DisplayMode;
// Insert Reset/Ctor here
if (FAILED(AlignedAlloc((LPVOID *)&pResourceManager, sizeof(D3D9ResourceManager))) ||
FAILED(InitD3D9ResourceManager(pResourceManager, pThisBaseDevice)))
{
DPRINT1("Could not create resource manager");
return DDERR_OUTOFMEMORY;
}
pThisBaseDevice->pResourceManager = pResourceManager;
pThisBaseDevice->pDirect3D9 = pDirect3D9;
pThisBaseDevice->DeviceType = DeviceType;
pThisBaseDevice->hWnd = hFocusWindow;
pThisBaseDevice->AdjustedBehaviourFlags = BehaviourFlags;
pThisBaseDevice->BehaviourFlags = BehaviourFlags;
pThisBaseDevice->NumAdaptersInDevice = NumAdaptersToCreate;
// TODO: Query driver for correct DX version
pThisBaseDevice->dwDXVersion = 9;
DisplayMode = pThisBaseDevice->CurrentDisplayMode[0];
for (i = 0; i < NumAdaptersToCreate; i++)
{
pThisBaseDevice->CurrentDisplayMode[i] = pThisBaseDevice->CurrentDisplayMode[0];
pThisBaseDevice->AdapterIndexInGroup[i] = i;
// TODO: Fill pThisBaseDevice->DeviceData[i]
pThisBaseDevice->pSwapChains[i] = CreateDirect3DSwapChain9(RT_BUILTIN, pThisBaseDevice, i);
pThisBaseDevice->pSwapChains2[i] = pThisBaseDevice->pSwapChains[i];
Direct3DSwapChain9_SetDisplayMode(pThisBaseDevice->pSwapChains[i], &DisplayMode);
if (FAILED(Direct3DSwapChain9_Init(pThisBaseDevice->pSwapChains[i], pPresentationParameters)))
{
DPRINT1("Failed to init swap chain: %d", i);
return DDERR_GENERIC;
}
}
return D3D_OK;
}
HRESULT CreateD3D9HalDevice(LPDIRECT3D9_INT pDirect3D9, UINT Adapter,
HWND hFocusWindow, DWORD BehaviourFlags,
D3DPRESENT_PARAMETERS* pPresentationParameters,
DWORD NumAdaptersToCreate,
struct IDirect3DDevice9** ppReturnedDeviceInterface)
{
HRESULT Ret;
if (FAILED(AlignedAlloc((LPVOID *)ppReturnedDeviceInterface, sizeof(D3D9HALDEVICE))))
{
DPRINT1("Not enough memory to create HAL device");
return DDERR_OUTOFMEMORY;
}
Ret = InitD3D9BaseDevice((LPDIRECT3DDEVICE9_INT)*ppReturnedDeviceInterface, pDirect3D9, Adapter,
D3DDEVTYPE_HAL, hFocusWindow, BehaviourFlags,
pPresentationParameters, NumAdaptersToCreate);
if (FAILED(Ret))
{
AlignedFree((LPVOID)*ppReturnedDeviceInterface);
return Ret;
}
return D3D_OK;
}

View file

@ -0,0 +1,20 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS ReactX
* FILE: dll/directx/d3d9/device.h
* PURPOSE: Direct3D9's device creation
* PROGRAMERS: Gregor Gullwi <gbrunmar (dot) ros (at) gmail (dot) com>
*/
#ifndef _DEVICE_H_
#define _DEVICE_H_
#include "d3d9_device.h"
HRESULT CreateD3D9HalDevice(LPDIRECT3D9_INT pDirect3D9, UINT Adapter,
HWND hFocusWindow, DWORD BehaviourFlags,
D3DPRESENT_PARAMETERS* pPresentationParameters,
DWORD NumAdaptersToCreate,
struct IDirect3DDevice9** ppReturnedDeviceInterface);
#endif // _DEVICE_H_