[v2 3/3] dx8vb: Add Direct3D8 interface with stubs
Fabian Maurer
dark.shadow4 at web.de
Sat Nov 4 15:42:14 CDT 2017
v2:
-Improved QueryInterface
-don't typedef struct
-properly format FIXME messages
-use lowercase variable names
Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
---
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
More information about the wine-patches
mailing list