[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