Changed last IDirect3D9->QueryInterface() according to hpoussin's feedback
[reactos.git] / reactos / dll / directx / d3d9 / d3d9_impl.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS ReactX
4 * FILE: dll/directx/d3d9/d3d9_impl.c
5 * PURPOSE: IDirect3D9 implementation
6 * PROGRAMERS: Gregor Brunmar <gregor (dot) brunmar (at) home (dot) se>
7 */
8 #include "d3d9_private.h"
9
10 #include <debug.h>
11
12 static ULONG WINAPI IDirect3D9Impl_AddRef(LPDIRECT3D9 iface);
13
14 /* IDirect3D9: IUnknown implementation */
15 static HRESULT WINAPI IDirect3D9Impl_QueryInterface(LPDIRECT3D9 iface, REFIID riid, LPVOID* ppvObject)
16 {
17 LPDIRECTD3D9_INT This = (LPDIRECTD3D9_INT)iface;
18
19 if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDirect3D9))
20 {
21 IDirect3D9Impl_AddRef(iface);
22 *ppvObject = &This->lpVtbl;
23 return S_OK;
24 }
25
26 *ppvObject = NULL;
27 return E_NOINTERFACE;
28 }
29
30 static ULONG WINAPI IDirect3D9Impl_AddRef(LPDIRECT3D9 iface)
31 {
32 LPDIRECTD3D9_INT This = (LPDIRECTD3D9_INT)iface;
33 ULONG ref = InterlockedIncrement(&This->dwRefCnt);
34
35 return ref;
36 }
37
38 static ULONG WINAPI IDirect3D9Impl_Release(LPDIRECT3D9 iface)
39 {
40 LPDIRECTD3D9_INT This = (LPDIRECTD3D9_INT)iface;
41 ULONG ref = InterlockedDecrement(&This->dwRefCnt);
42
43 if (ref == 0)
44 {
45 EnterCriticalSection(&This->d3d9_cs);
46 /* TODO: Free resources here */
47 LeaveCriticalSection(&This->d3d9_cs);
48 HeapFree(GetProcessHeap(), 0, This);
49 }
50
51 return ref;
52 }
53
54 /* IDirect3D9 interface */
55 static HRESULT WINAPI IDirect3D9Impl_RegisterSoftwareDevice(LPDIRECT3D9 iface, void* pInitializeFunction)
56 {
57 UNIMPLEMENTED
58
59 return D3D_OK;
60 }
61
62 static UINT WINAPI IDirect3D9Impl_GetAdapterCount(LPDIRECT3D9 iface)
63 {
64 UNIMPLEMENTED
65
66 return D3D_OK;
67 }
68
69 static HRESULT WINAPI IDirect3D9Impl_GetAdapterIdentifier(LPDIRECT3D9 iface, UINT Adapter, DWORD Flags,
70 D3DADAPTER_IDENTIFIER9* pIdentifier)
71 {
72 UNIMPLEMENTED
73
74 return D3D_OK;
75 }
76
77 static UINT WINAPI IDirect3D9Impl_GetAdapterModeCount(LPDIRECT3D9 iface, UINT Adapter, D3DFORMAT Format)
78 {
79 UNIMPLEMENTED
80
81 return D3D_OK;
82 }
83
84 static HRESULT WINAPI IDirect3D9Impl_EnumAdapterModes(LPDIRECT3D9 iface, UINT Adapter, D3DFORMAT Format,
85 UINT Mode, D3DDISPLAYMODE* pMode)
86 {
87 UNIMPLEMENTED
88
89 return D3D_OK;
90 }
91
92 static HRESULT WINAPI IDirect3D9Impl_GetAdapterDisplayMode(LPDIRECT3D9 iface, UINT Adapter, D3DDISPLAYMODE* pMode)
93 {
94 UNIMPLEMENTED
95
96 return D3D_OK;
97 }
98
99 static HRESULT WINAPI IDirect3D9Impl_CheckDeviceType(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE CheckType,
100 D3DFORMAT DisplayFormat, D3DFORMAT BackBufferFormat, BOOL Windowed)
101 {
102 UNIMPLEMENTED
103
104 return D3D_OK;
105 }
106
107 static HRESULT WINAPI IDirect3D9Impl_CheckDeviceFormat(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE DeviceType,
108 D3DFORMAT AdapterFormat, DWORD Usage, D3DRESOURCETYPE RType,
109 D3DFORMAT CheckFormat)
110 {
111 UNIMPLEMENTED
112
113 return D3D_OK;
114 }
115
116 static HRESULT WINAPI IDirect3D9Impl_CheckDeviceMultiSampleType(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE DeviceType,
117 D3DFORMAT SurfaceFormat, BOOL Windowed,
118 D3DMULTISAMPLE_TYPE MultiSampleType, DWORD* pQualityLevels)
119 {
120 UNIMPLEMENTED
121
122 return D3D_OK;
123 }
124
125 static HRESULT WINAPI IDirect3D9Impl_CheckDepthStencilMatch(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE DeviceType,
126 D3DFORMAT AdapterFormat, D3DFORMAT RenderTargetFormat,
127 D3DFORMAT DepthStencilFormat)
128 {
129 UNIMPLEMENTED
130
131 return D3D_OK;
132 }
133
134 static HRESULT WINAPI IDirect3D9Impl_CheckDeviceFormatConversion(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE DeviceType,
135 D3DFORMAT SourceFormat, D3DFORMAT TargetFormat)
136 {
137 UNIMPLEMENTED
138
139 return D3D_OK;
140 }
141
142 static HRESULT WINAPI IDirect3D9Impl_GetDeviceCaps(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9* pCaps)
143 {
144 UNIMPLEMENTED
145
146 return D3D_OK;
147 }
148
149 static HMONITOR WINAPI IDirect3D9Impl_GetAdapterMonitor(LPDIRECT3D9 iface, UINT Adapter)
150 {
151 UNIMPLEMENTED
152
153 return D3D_OK;
154 }
155
156 static HRESULT WINAPI IDirect3D9Impl_CreateDevice(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE DeviceType,
157 HWND hFocusWindow, DWORD BehaviourFlags,
158 D3DPRESENT_PARAMETERS* pPresentationParameters,
159 struct IDirect3DDevice9** ppReturnedDeviceInterface)
160 {
161 UNIMPLEMENTED
162
163 return D3D_OK;
164 }
165
166 const IDirect3D9Vtbl Direct3D9_Vtbl =
167 {
168 /* IUnknown */
169 IDirect3D9Impl_QueryInterface,
170 IDirect3D9Impl_AddRef,
171 IDirect3D9Impl_Release,
172
173 /* IDirect3D9 */
174 IDirect3D9Impl_RegisterSoftwareDevice,
175 IDirect3D9Impl_GetAdapterCount,
176 IDirect3D9Impl_GetAdapterIdentifier,
177 IDirect3D9Impl_GetAdapterModeCount,
178 IDirect3D9Impl_EnumAdapterModes,
179 IDirect3D9Impl_GetAdapterDisplayMode,
180 IDirect3D9Impl_CheckDeviceType,
181 IDirect3D9Impl_CheckDeviceFormat,
182 IDirect3D9Impl_CheckDeviceMultiSampleType,
183 IDirect3D9Impl_CheckDepthStencilMatch,
184 IDirect3D9Impl_CheckDeviceFormatConversion,
185 IDirect3D9Impl_GetDeviceCaps,
186 IDirect3D9Impl_GetAdapterMonitor,
187 IDirect3D9Impl_CreateDevice
188 };