From: Fabian Maurer Subject: [v2 3/3] dx8vb: Add Direct3D8 interface with stubs Message-Id: <20171104204214.3257-3-dark.shadow4@web.de> Date: Sat, 4 Nov 2017 21:42:14 +0100 In-Reply-To: <20171104204214.3257-1-dark.shadow4@web.de> References: <20171104204214.3257-1-dark.shadow4@web.de> v2: -Improved QueryInterface -don't typedef struct -properly format FIXME messages -use lowercase variable names Signed-off-by: Fabian Maurer --- dlls/dx8vb/Makefile.in | 2 +- dlls/dx8vb/directx8.c | 265 ++++++++++++++++++++++++++++++++++++++++++++++++- dlls/dx8vb/dx8vb.idl | 86 +++++++++++++++- 3 files changed, 349 insertions(+), 4 deletions(-) diff --git a/dlls/dx8vb/Makefile.in b/dlls/dx8vb/Makefile.in index 8438d022f4..33fe651503 100644 --- a/dlls/dx8vb/Makefile.in +++ b/dlls/dx8vb/Makefile.in @@ -1,5 +1,5 @@ MODULE = dx8vb.dll -IMPORTS = uuid ole32 +IMPORTS = uuid ole32 d3d8 C_SRCS = \ d3dx8.c \ diff --git a/dlls/dx8vb/directx8.c b/dlls/dx8vb/directx8.c index 9294d5b3e6..ce5ad3937e 100644 --- a/dlls/dx8vb/directx8.c +++ b/dlls/dx8vb/directx8.c @@ -21,6 +21,9 @@ #include "config.h" #include "dx8vb_private.h" +#define __WINE_D3D8TYPES_H +#define __WINE_D3D8CAPS_H +#include "d3d8.h" #include "ocidl.h" #include "wine/debug.h" @@ -33,11 +36,267 @@ struct directx8 LONG ref; }; +struct direct3d8 +{ + Direct3D8 Direct3D8_iface; + IDirect3D8 *direct3d8; + LONG ref; +}; + + static inline struct directx8 *impl_from_IDirectX8(IDirectX8 *iface) { return CONTAINING_RECORD(iface, struct directx8, IDirectX8_iface); } +static inline struct direct3d8 *impl_from_Direct3D8(Direct3D8 *iface) +{ + return CONTAINING_RECORD(iface, struct direct3d8, Direct3D8_iface); +} + +/*** direct3d8 - IUnknown methods ***/ + +static HRESULT WINAPI direct3d8_QueryInterface(Direct3D8 *iface, REFIID riid, void **ppv) +{ + struct direct3d8 *this = impl_from_Direct3D8(iface); + + TRACE("(%p/%p)->(%s,%p)\n", iface, this, debugstr_guid(riid), ppv); + + if (IsEqualGUID(riid, &IID_Direct3D8) + || IsEqualGUID(riid, &IID_IUnknown)) + { + IUnknown_AddRef(iface); + *ppv = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); + *ppv = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI direct3d8_AddRef(Direct3D8 *iface) +{ + struct direct3d8 *this = impl_from_Direct3D8(iface); + ULONG ref = InterlockedIncrement(&this->ref); + + TRACE("(%p/%p)->(): new ref %d\n", iface, this, ref); + + return ref; +} + +static ULONG WINAPI direct3d8_Release(Direct3D8 *iface) +{ + struct direct3d8 *this = impl_from_Direct3D8(iface); + ULONG ref = InterlockedDecrement(&this->ref); + + TRACE("(%p/%p)->(): new ref %d\n", iface, this, ref); + + if (!ref) + { + IDirect3D8_Release(this->direct3d8); + HeapFree(GetProcessHeap(), 0, this); + } + + return ref; +} + +/*** direct3d8 - Direct3D8 methods ***/ + +static HRESULT WINAPI direct3d8_RegisterSoftwareDevice(Direct3D8 *iface, void *initialize_function) +{ + struct direct3d8 *this = impl_from_Direct3D8(iface); + + HRESULT ret = IDirect3D8_RegisterSoftwareDevice(this->direct3d8, initialize_function); + + TRACE("(%p) -> (%#x)\n", initialize_function, ret); + + return ret; +} + +static int WINAPI direct3d8_GetAdapterCount(Direct3D8 *iface) +{ + struct direct3d8 *this = impl_from_Direct3D8(iface); + + int ret = IDirect3D8_GetAdapterCount(this->direct3d8); + + TRACE("() -> (%d)\n", ret); + + return ret; +} + +static HRESULT WINAPI direct3d8_GetAdapterIdentifier(Direct3D8 *iface, int adapter, + LONG flags, D3DADAPTER_IDENTIFIER8 *identifier) +{ + struct direct3d8 *this = impl_from_Direct3D8(iface); + + HRESULT ret = IDirect3D8_GetAdapterIdentifier(this->direct3d8, adapter, flags, identifier); + + TRACE("(%d, %d, %p) -> (%#x)\n", adapter, flags, identifier, ret); + + return ret; +} + +static int WINAPI direct3d8_GetAdapterModeCount(Direct3D8 *iface, int adapter) +{ + struct direct3d8 *this = impl_from_Direct3D8(iface); + + int ret = IDirect3D8_GetAdapterModeCount(this->direct3d8, adapter); + + TRACE("(%d) -> (%d)\n", adapter, ret); + + return ret; +} + +static HRESULT WINAPI direct3d8_EnumAdapterModes(Direct3D8 *iface, int adapter, int mode, D3DDISPLAYMODE *display_mode) +{ + struct direct3d8 *this = impl_from_Direct3D8(iface); + + HRESULT ret = IDirect3D8_EnumAdapterModes(this->direct3d8, adapter, mode, display_mode); + + TRACE("(%d, %d, %p) -> (%#x)\n", adapter, mode, display_mode, ret); + + return ret; +} + +static HRESULT WINAPI direct3d8_GetAdapterDisplayMode(Direct3D8 *iface, int adapter, D3DDISPLAYMODE *display_mode) +{ + struct direct3d8 *this = impl_from_Direct3D8(iface); + + HRESULT ret = IDirect3D8_GetAdapterDisplayMode(this->direct3d8, adapter, display_mode); + + TRACE("(%d, %p) -> (%#x)\n", adapter, display_mode, ret); + + return ret; +} + +static LONG WINAPI direct3d8_CheckDeviceType(Direct3D8 *iface, int adapter, D3DDEVTYPE check_type, + D3DFORMAT display_format, D3DFORMAT backbuffer_format, LONG windowed) +{ + struct direct3d8 *this = impl_from_Direct3D8(iface); + + LONG ret = IDirect3D8_CheckDeviceType(this->direct3d8, adapter, check_type, + display_format, backbuffer_format, windowed); + + TRACE("(%d, %u, %u, %u, %d) -> (%d)\n", adapter, check_type, display_format, backbuffer_format, windowed, ret); + + return ret; +} + +static LONG WINAPI direct3d8_CheckDeviceFormat(Direct3D8 *iface, int adapter, D3DDEVTYPE device_type, + D3DFORMAT adapter_format, LONG usage, D3DRESOURCETYPE resourcetype, D3DFORMAT check_format) +{ + struct direct3d8 *this = impl_from_Direct3D8(iface); + + LONG ret = IDirect3D8_CheckDeviceFormat(this->direct3d8, adapter, device_type, + adapter_format, usage, resourcetype, check_format); + + TRACE("(%d, %u, %u, %d, %u, %u) -> (%d)\n", adapter, device_type, adapter_format, usage, resourcetype, check_format, ret); + + return ret; +} + +static LONG WINAPI direct3d8_CheckDeviceMultiSampleType(Direct3D8 *iface, int adapter, D3DDEVTYPE device_type, + D3DFORMAT rendertarget_format, LONG windowed, D3DMULTISAMPLE_TYPE multisample_type) +{ + struct direct3d8 *this = impl_from_Direct3D8(iface); + + LONG ret = IDirect3D8_CheckDeviceMultiSampleType(this->direct3d8, adapter, device_type, + rendertarget_format, windowed, multisample_type); + + TRACE("(%d, %u, %u, %d, %u) -> (%d)\n", adapter, device_type, rendertarget_format, windowed, multisample_type, ret); + + return ret; +} + +static LONG WINAPI direct3d8_CheckDepthStencilMatch(Direct3D8 *iface, int adapter, D3DDEVTYPE device_type, + D3DFORMAT adapter_format, D3DFORMAT rendertarget_format, D3DFORMAT depth_stencil_format) +{ + struct direct3d8 *this = impl_from_Direct3D8(iface); + + LONG ret = IDirect3D8_CheckDepthStencilMatch(this->direct3d8, adapter, device_type, adapter_format, + rendertarget_format, depth_stencil_format); + + TRACE("(%d, %u, %u, %u, %u) ->(%d)\n", adapter, device_type, adapter_format, + rendertarget_format, depth_stencil_format, ret); + + return ret; +} + +static HRESULT WINAPI direct3d8_GetDeviceCaps(Direct3D8 *iface, int adapter, D3DDEVTYPE device_type, D3DCAPS8 *caps) +{ + struct direct3d8 *this = impl_from_Direct3D8(iface); + + HRESULT ret = IDirect3D8_GetDeviceCaps(this->direct3d8, adapter, device_type, caps); + + TRACE("(%d, %u, %p) -> (%#x)\n", adapter, device_type, caps, ret); + + return ret; +} + +static LONG WINAPI direct3d8_GetAdapterMonitor(Direct3D8 *iface, int adapter) +{ + struct direct3d8 *this = impl_from_Direct3D8(iface); + + LONG ret = (LONG)IDirect3D8_GetAdapterMonitor(this->direct3d8, adapter); + + TRACE("(%d) -> (%d)!\n", adapter, ret); + + return ret; +} + +static HRESULT WINAPI direct3d8_CreateDevice(Direct3D8 *iface, int adapter, D3DDEVTYPE device_type, HWND focus_window, + D3DCREATEFLAGS behavior_flags, D3DPRESENT_PARAMETERS *presentation_parameters, Direct3DDevice8 **device) +{ + FIXME("(%d, %u, %p, %#x, %p, %p): stub!\n", adapter, device_type, focus_window, behavior_flags, + presentation_parameters, device); + + return E_NOTIMPL; +} + +static const Direct3D8Vtbl direct3d8_vtbl = +{ + /*** IUnknown methods ***/ + direct3d8_QueryInterface, + direct3d8_AddRef, + direct3d8_Release, + /*** Direct3D8 methods ***/ + direct3d8_RegisterSoftwareDevice, + direct3d8_GetAdapterCount, + direct3d8_GetAdapterIdentifier, + direct3d8_GetAdapterModeCount, + direct3d8_EnumAdapterModes, + direct3d8_GetAdapterDisplayMode, + direct3d8_CheckDeviceType, + direct3d8_CheckDeviceFormat, + direct3d8_CheckDeviceMultiSampleType, + direct3d8_CheckDepthStencilMatch, + direct3d8_GetDeviceCaps, + direct3d8_GetAdapterMonitor, + direct3d8_CreateDevice +}; + +HRESULT direct3d8_create(Direct3D8 **ppv) +{ + struct direct3d8 *object; + + TRACE("(%p)\n", ppv); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + return E_OUTOFMEMORY; + + object->Direct3D8_iface.lpVtbl = &direct3d8_vtbl; + object->ref = 1; + object->direct3d8 = Direct3DCreate8(D3D_SDK_VERSION); + if(!object->direct3d8) + ERR("Can't create D3D8 object\n"); + + *ppv = &object->Direct3D8_iface; + + return S_OK; +} + /*** directx8 - IUnknown methods ***/ static HRESULT WINAPI directx8_QueryInterface(IDirectX8 *iface, REFIID riid, void **ppv) @@ -226,9 +485,11 @@ static HRESULT WINAPI directx8_DirectPlayAddressCreate(IDirectX8 *iface, DirectP static HRESULT WINAPI directx8_Direct3DCreate(IDirectX8 *iface, Direct3D8 **ret) { - FIXME("(%p): stub!\n", ret); + HRESULT res = direct3d8_create(ret); - return E_NOTIMPL; + TRACE("(%p) -> (%#x)\n", ret, res); + + return res; } static HRESULT WINAPI directx8_DirectPlayLobbyClientCreate(IDirectX8 *iface, DirectPlay8LobbyClient **ret) diff --git a/dlls/dx8vb/dx8vb.idl b/dlls/dx8vb/dx8vb.idl index 8f4b93f0aa..47c5d54078 100644 --- a/dlls/dx8vb/dx8vb.idl +++ b/dlls/dx8vb/dx8vb.idl @@ -21,6 +21,7 @@ #include "unknwn.idl" #include "d3d8types.h" +#include "d3d8caps.h" interface Direct3DDevice8; interface D3DXFont; @@ -54,7 +55,6 @@ interface DirectPlay8Peer; interface DirectPlay8Server; interface DirectPlay8Client; interface DirectPlay8Address; -interface Direct3D8; interface DirectPlay8LobbyClient; interface DirectPlay8LobbiedApplication; @@ -69,6 +69,15 @@ typedef enum { D3DXIFF_FORCE_DWORD = 0x7fffffff } D3DXIMAGE_FILEFORMAT; +typedef enum { + D3DCREATE_FPU_PRESERVE = 2, + D3DCREATE_MULTITHREADED = 4, + D3DCREATE_PUREDEVICE = 16, + D3DCREATE_SOFTWARE_VERTEXPROCESSING = 32, + D3DCREATE_HARDWARE_VERTEXPROCESSING = 64, + D3DCREATE_MIXED_VERTEXPROCESSING = 128 +} D3DCREATEFLAGS; + typedef struct tagD3DXDECLARATOR { LONG value[32]; } D3DXDECLARATOR; @@ -721,6 +730,81 @@ interface ID3DX8 : IUnknown { ); }; +[ + object, + uuid(1dd9e8da-1c77-4d40-b0cf-98fefdff9512), + local +] +interface Direct3D8 : IUnknown { + HRESULT RegisterSoftwareDevice( + [in] void *initializeFunction + ); + int GetAdapterCount( + ); + HRESULT GetAdapterIdentifier( + [in] int adapter, + [in] LONG flags, + [in, out] D3DADAPTER_IDENTIFIER8 *identifier + ); + int GetAdapterModeCount( + [in] int adapter + ); + HRESULT EnumAdapterModes( + [in] int adapter, + [in] int mode, + [in, out] D3DDISPLAYMODE *displayMode + ); + HRESULT GetAdapterDisplayMode( + [in] int adapter, + [in, out] D3DDISPLAYMODE *displayMode + ); + LONG CheckDeviceType( + [in] int adapter, + [in] D3DDEVTYPE checkType, + [in] D3DFORMAT displayFormat, + [in] D3DFORMAT backBufferFormat, + [in] LONG bWindowed + ); + LONG CheckDeviceFormat( + [in] int adapter, + [in] D3DDEVTYPE deviceType, + [in] D3DFORMAT adapterFormat, + [in] LONG usage, + [in] D3DRESOURCETYPE rType, + [in] D3DFORMAT checkFormat + ); + LONG CheckDeviceMultiSampleType( + [in] int adapter, + [in] D3DDEVTYPE deviceType, + [in] D3DFORMAT renderTargetFormat, + [in] LONG windowed, + [in] D3DMULTISAMPLE_TYPE multiSampleType + ); + LONG CheckDepthStencilMatch( + [in] int adapter, + [in] D3DDEVTYPE deviceType, + [in] D3DFORMAT adapterFormat, + [in] D3DFORMAT renderTargetFormat, + [in] D3DFORMAT depthStencilFormat + ); + HRESULT GetDeviceCaps( + [in] int adapter, + [in] D3DDEVTYPE deviceType, + [in, out] D3DCAPS8 *caps + ); + LONG GetAdapterMonitor( + [in] int adapter + ); + HRESULT CreateDevice( + [in] int adapter, + [in] D3DDEVTYPE deviceType, + [in] HWND hFocusWindow, + [in] D3DCREATEFLAGS behaviorFlags, + [in] D3DPRESENT_PARAMETERS *presentationParameters, + [out, retval] Direct3DDevice8 **ppReturnedDeviceInterface + ); +}; + [ object, uuid(e7ff1301-96a5-11d3-ac85-00c04fc2c602), -- 2.15.0