diff --git a/reactos/dll/directx/d3d9/d3d9.rbuild b/reactos/dll/directx/d3d9/d3d9.rbuild
index 340085f2101..61369d65d50 100644
--- a/reactos/dll/directx/d3d9/d3d9.rbuild
+++ b/reactos/dll/directx/d3d9/d3d9.rbuild
@@ -14,6 +14,7 @@
d3d9.c
d3d9_baseobject.c
+ d3d9_callbacks.c
d3d9_caps.c
d3d9_create.c
d3d9_cursor.c
diff --git a/reactos/dll/directx/d3d9/d3d9_callbacks.c b/reactos/dll/directx/d3d9/d3d9_callbacks.c
new file mode 100644
index 00000000000..7069ea28762
--- /dev/null
+++ b/reactos/dll/directx/d3d9/d3d9_callbacks.c
@@ -0,0 +1,51 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS ReactX
+ * FILE: dll/directx/d3d9/d3d9_callbacks.c
+ * PURPOSE: Direct3D9's callback functions
+ * PROGRAMERS: Gregor Gullwi
+ */
+#include "d3d9_common.h"
+#include "d3d9_callbacks.h"
+#define STDCALL __stdcall
+#include
+#include
+#include "d3d9_private.h"
+#include "ddrawi.h"
+
+DWORD WINAPI D3d9GetAvailDriverMemory(LPD3D9_GETAVAILDRIVERMEMORYDATA pData)
+{
+ DWORD Ret = FALSE;
+ DDHAL_GETAVAILDRIVERMEMORYDATA Data;
+ ZeroMemory(&Data, sizeof(Data));
+
+ if (D3D9_GETAVAILDRIVERMEMORY_TYPE_ALL == pData->dwMemoryType)
+ {
+ Data.DDSCaps.dwCaps = DDSCAPS_VIDEOMEMORY;
+ }
+ else if (D3D9_GETAVAILDRIVERMEMORY_TYPE_LOCAL == pData->dwMemoryType)
+ {
+ Data.DDSCaps.dwCaps = DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM;
+ }
+ else if (D3D9_GETAVAILDRIVERMEMORY_TYPE_NONLOCAL == pData->dwMemoryType)
+ {
+ Data.DDSCaps.dwCaps = DDSCAPS_VIDEOMEMORY | DDSCAPS_NONLOCALVIDMEM;
+ }
+
+ if (Data.DDSCaps.dwCaps != 0)
+ {
+ if (0 == pData->dwTextureType)
+ Data.DDSCaps.dwCaps |= DDSCAPS_TEXTURE;
+
+ if (pData->dwTextureType & D3D9_TEXTURETYPE_HALSURFACE)
+ Data.DDSCaps.dwCaps |= DDSCAPS_TEXTURE | DDSCAPS_3DDEVICE;
+
+ if (pData->dwTextureType & D3D9_TEXTURETYPE_BACKBUFFER)
+ Data.DDSCaps.dwCaps |= DDSCAPS_ZBUFFER;
+
+ Ret = OsThunkDdGetAvailDriverMemory(pData->pUnknown6BC->hDirectDrawLocal, (DD_GETAVAILDRIVERMEMORYDATA*)&Data);
+ pData->dwFree = Data.dwFree;
+ }
+
+ return Ret;
+}
diff --git a/reactos/dll/directx/d3d9/d3d9_callbacks.h b/reactos/dll/directx/d3d9/d3d9_callbacks.h
new file mode 100644
index 00000000000..8090f9aaeee
--- /dev/null
+++ b/reactos/dll/directx/d3d9/d3d9_callbacks.h
@@ -0,0 +1,33 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS ReactX
+ * FILE: dll/directx/d3d9/d3d9_callbacks.h
+ * PURPOSE: Direct3D9's callback structs and constants
+ * PROGRAMERS: Gregor Gullwi
+ */
+#ifndef _D3D9_CALLBACKS_H_
+#define _D3D9_CALLBACKS_H_
+
+typedef enum _D3D9_GETAVAILDRIVERMEMORY_TYPE
+{
+ D3D9_GETAVAILDRIVERMEMORY_TYPE_ALL = 0,
+ D3D9_GETAVAILDRIVERMEMORY_TYPE_LOCAL = 4,
+ D3D9_GETAVAILDRIVERMEMORY_TYPE_NONLOCAL = 5,
+} D3D9_GETAVAILDRIVERMEMORY_TYPE;
+
+#define D3D9_TEXTURETYPE_HALSURFACE 1
+#define D3D9_TEXTURETYPE_BACKBUFFER 2
+
+typedef struct _D3D9_GETAVAILDRIVERMEMORYDATA
+{
+/* 0x0000 */ struct _D3D9_Unknown6BC* pUnknown6BC;
+/* 0x0004 */ D3D9_GETAVAILDRIVERMEMORY_TYPE dwMemoryType;
+/* 0x0008 */ DWORD dwTextureType;
+/* 0x000c */ DWORD dwFree;
+} D3D9_GETAVAILDRIVERMEMORYDATA, FAR* LPD3D9_GETAVAILDRIVERMEMORYDATA;
+
+typedef DWORD (WINAPI FAR* LPD3D9_GETAVAILDRIVERMEMORY)(LPD3D9_GETAVAILDRIVERMEMORYDATA);
+
+DWORD WINAPI D3d9GetAvailDriverMemory(LPD3D9_GETAVAILDRIVERMEMORYDATA pData);
+
+#endif // _D3D9_CALLBACKS_H_
diff --git a/reactos/dll/directx/d3d9/d3d9_caps.c b/reactos/dll/directx/d3d9/d3d9_caps.c
index 65e81a2e478..2e175ba761e 100644
--- a/reactos/dll/directx/d3d9/d3d9_caps.c
+++ b/reactos/dll/directx/d3d9/d3d9_caps.c
@@ -11,6 +11,7 @@
#include "d3d9_helpers.h"
#include "d3d9_caps.h"
#include "adapter.h"
+#include "d3d9_callbacks.h"
static INT g_NumDevices = 0;
@@ -833,6 +834,7 @@ BOOL GetD3D9DriverInfo( D3D9_Unknown6BC* pUnknown6BC,
}
/* TODO: Set all internal function pointers to create surface, etc. */
+ pD3D9Callbacks->DdGetAvailDriverMemory = &D3d9GetAvailDriverMemory;
/* Set device rect */
{
diff --git a/reactos/dll/directx/d3d9/d3d9_private.h b/reactos/dll/directx/d3d9/d3d9_private.h
index cba2c867d70..1b11bf58d9a 100644
--- a/reactos/dll/directx/d3d9/d3d9_private.h
+++ b/reactos/dll/directx/d3d9/d3d9_private.h
@@ -10,28 +10,13 @@
#include "d3d9_common.h"
#include
+#include "d3d9_callbacks.h"
#define D3D9_INT_MAX_NUM_ADAPTERS 12
#define D3D9_INT_D3DCAPS8_VALID 1
#define D3D9_INT_D3DCAPS9_VALID 2
-typedef enum _D3D9_GETAVAILDRIVERMEMORY_TYPE
-{
- D3D9_GETAVAILDRIVERMEMORY_TYPE_ALL = 0,
- D3D9_GETAVAILDRIVERMEMORY_TYPE_LOCAL = 4,
- D3D9_GETAVAILDRIVERMEMORY_TYPE_NONLOCAL = 5,
-} D3D9_GETAVAILDRIVERMEMORY_TYPE;
-
-typedef struct _D3D9_GETAVAILDRIVERMEMORYDATA
-{
-/* 0x0000 */ struct _D3D9_Unknown6BC* pUnknown6BC;
-/* 0x0004 */ D3D9_GETAVAILDRIVERMEMORY_TYPE dwMemoryType;
-/* 0x0008 */ DWORD dwTextureType;
-/* 0x000c */ DWORD dwFree;
-} D3D9_GETAVAILDRIVERMEMORYDATA, FAR* LPD3D9_GETAVAILDRIVERMEMORYDATA;
-typedef BOOL (WINAPI FAR* LPD3D9_GETAVAILDRIVERMEMORY)(LPD3D9_GETAVAILDRIVERMEMORYDATA);
-
typedef struct _D3D9_Unknown6BC
{
/* 0x0000 */ HANDLE hDirectDrawLocal;