2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS ReactX
4 * FILE: dll/directx/d3d9/d3d9_helpers.c
5 * PURPOSE: d3d9.dll helper functions
6 * PROGRAMERS: Gregor Brunmar <gregor (dot) brunmar (at) home (dot) se>
9 #include "d3d9_helpers.h"
14 #define MEM_ALIGNMENT 0x20
16 static LPCSTR D3dDebugRegPath
= "Software\\Microsoft\\Direct3D";
18 static const GUID DISPLAY_GUID
= { 0x67685559, 0x3106, 0x11D0, { 0xB9, 0x71, 0x00, 0xAA, 0x00, 0x34, 0x2F, 0x9F } };
20 LPDIRECT3D9_INT
impl_from_IDirect3D9(LPDIRECT3D9 iface
)
22 return (LPDIRECT3D9_INT
)((ULONG_PTR
)iface
- FIELD_OFFSET(DIRECT3D9_INT
, lpVtbl
));
25 BOOL
ReadRegistryValue(IN DWORD ValueType
, IN LPCSTR ValueName
, OUT LPBYTE DataBuffer
, IN OUT LPDWORD DataBufferSize
)
31 if (ERROR_SUCCESS
!= RegOpenKeyEx(HKEY_LOCAL_MACHINE
, D3dDebugRegPath
, 0, KEY_QUERY_VALUE
, &hKey
))
34 Ret
= RegQueryValueEx(hKey
, ValueName
, 0, &Type
, DataBuffer
, DataBufferSize
);
38 if (ERROR_SUCCESS
!= Ret
)
41 if (Type
!= ValueType
)
47 HRESULT
FormatDebugString(IN OUT LPSTR Buffer
, IN LONG BufferSize
, IN LPCSTR FormatString
, ... )
53 return DDERR_INVALIDPARAMS
;
55 va_start(vargs
, FormatString
);
56 BytesWritten
= _vsnprintf(Buffer
, BufferSize
-1, FormatString
, vargs
);
58 if (BytesWritten
< BufferSize
)
61 Buffer
[BufferSize
-1] = '\0';
66 HRESULT
CreateD3D9(OUT LPDIRECT3D9
*ppDirect3D9
)
68 LPDIRECT3D9_INT pDirect3D9
;
71 return DDERR_INVALIDPARAMS
;
73 if (AlignedAlloc((LPVOID
*)&pDirect3D9
, sizeof(DIRECT3D9_INT
)) != S_OK
)
74 return DDERR_OUTOFMEMORY
;
77 return DDERR_OUTOFMEMORY
;
79 pDirect3D9
->unknown000007
= 0;
80 pDirect3D9
->lpInt
= 0;
82 pDirect3D9
->lpVtbl
= &Direct3D9_Vtbl
;
83 pDirect3D9
->dwProcessId
= GetCurrentThreadId();
84 pDirect3D9
->dwRefCnt
= 1;
86 pDirect3D9
->unknown004576
= 0;
87 pDirect3D9
->unknown004578
= 0;
88 pDirect3D9
->unknown004579
= 0;
89 pDirect3D9
->unknown004580
= 0;
90 pDirect3D9
->unknown004581
= 0;
91 pDirect3D9
->unknown004582
= 0;
92 pDirect3D9
->unknown004583
= 0;
93 pDirect3D9
->unknown004589
= 0x20;
95 pDirect3D9
->lpInt
= pDirect3D9
;
96 pDirect3D9
->unknown000007
= 1;
98 InitializeCriticalSection(&pDirect3D9
->d3d9_cs
);
100 memcpy(&pDirect3D9
->DisplayGuid
, &DISPLAY_GUID
, sizeof(GUID
));
102 *ppDirect3D9
= (LPDIRECT3D9
)&pDirect3D9
->lpVtbl
;
104 return ERROR_SUCCESS
;
107 HRESULT
AlignedAlloc(IN OUT LPVOID
*ppObject
, IN SIZE_T dwSize
)
110 ULONG AlignedMask
= MEM_ALIGNMENT
- 1;
112 ULONG_PTR
*AlignedOffsetPtr
;
115 return DDERR_INVALIDPARAMS
;
123 dwSize
+= MEM_ALIGNMENT
;
125 AlignedPtr
= (CHAR
*)LocalAlloc(LMEM_ZEROINIT
, dwSize
);
128 return DDERR_OUTOFMEMORY
;
130 AddressOffset
= MEM_ALIGNMENT
- ((ULONG
)AlignedPtr
& AlignedMask
);
132 AlignedPtr
+= AddressOffset
;
134 AlignedOffsetPtr
= (ULONG_PTR
*)(AlignedPtr
- sizeof(ULONG
));
135 *AlignedOffsetPtr
= AddressOffset
;
137 *ppObject
= (ULONG_PTR
*)AlignedPtr
;
142 VOID
AlignedFree(IN OUT LPVOID pObject
)
144 CHAR
*NonAlignedPtr
= pObject
;
145 ULONG_PTR
*AlignedPtr
= pObject
;
150 NonAlignedPtr
-= *(AlignedPtr
- 1);
152 LocalFree(NonAlignedPtr
);