* PURPOSE: IDirect3D9 implementation
* PROGRAMERS: Gregor Brunmar <gregor (dot) brunmar (at) home (dot) se>
*/
-#include "d3d9_private.h"
+#include "d3d9_common.h"
+#include <d3d9.h>
+#include "d3d9_helpers.h"
#include <debug.h>
/* IDirect3D9: IUnknown implementation */
-static HRESULT WINAPI IDirect3D9Impl_QueryInterface(LPDIRECT3D9 iface, REFIID riid, LPVOID* ppobj)
+static HRESULT WINAPI IDirect3D9Impl_QueryInterface(LPDIRECT3D9 iface, REFIID riid, LPVOID* ppvObject)
{
- UNIMPLEMENTED
+ LPDIRECT3D9_INT This = impl_from_IDirect3D9(iface);
+
+ if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDirect3D9))
+ {
+ IUnknown_AddRef(iface);
+ *ppvObject = &This->lpVtbl;
+ return S_OK;
+ }
+ *ppvObject = NULL;
return E_NOINTERFACE;
}
static ULONG WINAPI IDirect3D9Impl_AddRef(LPDIRECT3D9 iface)
{
- LPDIRECTD3D9_INT This = (LPDIRECTD3D9_INT)iface;
+ LPDIRECT3D9_INT This = impl_from_IDirect3D9(iface);
ULONG ref = InterlockedIncrement(&This->dwRefCnt);
return ref;
static ULONG WINAPI IDirect3D9Impl_Release(LPDIRECT3D9 iface)
{
- LPDIRECTD3D9_INT This = (LPDIRECTD3D9_INT)iface;
+ LPDIRECT3D9_INT This = impl_from_IDirect3D9(iface);
ULONG ref = InterlockedDecrement(&This->dwRefCnt);
if (ref == 0)
EnterCriticalSection(&This->d3d9_cs);
/* TODO: Free resources here */
LeaveCriticalSection(&This->d3d9_cs);
- HeapFree(GetProcessHeap(), 0, This);
+ AlignedFree(This);
}
return ref;
static HRESULT WINAPI IDirect3D9Impl_CreateDevice(LPDIRECT3D9 iface, UINT Adapter, D3DDEVTYPE DeviceType,
HWND hFocusWindow, DWORD BehaviourFlags,
D3DPRESENT_PARAMETERS* pPresentationParameters,
- IDirect3DDevice9** ppReturnedDeviceInterface)
+ struct IDirect3DDevice9** ppReturnedDeviceInterface)
{
UNIMPLEMENTED