[PATCH 3/4] dx8vb: Add Direct3D8 interface with stubs

Fabian Maurer dark.shadow4 at web.de
Mon Oct 30 18:31:26 CDT 2017


Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
---
 dlls/dx8vb/directx8.c | 209 +++++++++++++++++++++++++++++++++++++++++++++++++-
 dlls/dx8vb/dx8vb.idl  |  86 ++++++++++++++++++++-
 2 files changed, 292 insertions(+), 3 deletions(-)

diff --git a/dlls/dx8vb/directx8.c b/dlls/dx8vb/directx8.c
index 510bb7a724..338862a4ff 100644
--- a/dlls/dx8vb/directx8.c
+++ b/dlls/dx8vb/directx8.c
@@ -33,11 +33,214 @@ typedef struct
     LONG ref;
 } directx8;
 
+typedef struct
+{
+    Direct3D8 Direct3D8_iface;
+    LONG ref;
+} direct3d8;
+
 static inline directx8 *impl_from_IDirectX8(IDirectX8 *iface)
 {
     return CONTAINING_RECORD(iface, directx8, IDirectX8_iface);
 }
 
+static inline direct3d8 *impl_from_Direct3D8(Direct3D8 *iface)
+{
+    return CONTAINING_RECORD(iface, direct3d8, Direct3D8_iface);
+}
+
+/*** direct3d8 - IUnknown methods ***/
+
+static HRESULT WINAPI direct3d8_QueryInterface(Direct3D8 *iface, REFIID riid, void **ppv)
+{
+    direct3d8 *This = impl_from_Direct3D8(iface);
+
+    TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppv);
+
+    *ppv = NULL;
+
+    if (IsEqualGUID(riid, &IID_IUnknown))
+        *ppv = &This->Direct3D8_iface;
+    else if(IsEqualGUID(riid, &IID_Direct3D8))
+        *ppv = &This->Direct3D8_iface;
+    else if(IsEqualGUID(riid, &IID_ISupportErrorInfo))
+        FIXME("No interface for IID_ISupportErrorInfo\n");
+    else
+        FIXME("No interface for %s\n", debugstr_guid(riid));
+
+    if (*ppv)
+    {
+        IUnknown_AddRef((IUnknown *)(*ppv));
+        return S_OK;
+    }
+
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI direct3d8_AddRef(Direct3D8 *iface)
+{
+    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)
+{
+    direct3d8 *This = impl_from_Direct3D8(iface);
+    ULONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p/%p)->(): new ref %d\n", iface, This, ref);
+
+    if (!ref)
+        HeapFree(GetProcessHeap(), 0, This);
+
+    return ref;
+}
+
+/*** direct3d8 - Direct3D8 methods ***/
+
+static HRESULT WINAPI direct3d8_RegisterSoftwareDevice(Direct3D8 *iface, void *initializeFunction)
+{
+    FIXME("(%p): stub!\n", initializeFunction);
+
+    return E_NOTIMPL;
+}
+
+static int WINAPI direct3d8_GetAdapterCount(Direct3D8 *iface)
+{
+    FIXME("(): stub!\n");
+
+    return 0;
+}
+
+static HRESULT WINAPI direct3d8_GetAdapterIdentifier(Direct3D8 *iface, int adapter,
+        LONG flags, D3DADAPTER_IDENTIFIER8 *identifier)
+{
+    FIXME("(%i, %i, %p): stub!\n", adapter, flags, identifier);
+
+    return E_NOTIMPL;
+}
+
+static int WINAPI direct3d8_GetAdapterModeCount(Direct3D8 *iface, int adapter)
+{
+    FIXME("(%i): stub!\n", adapter);
+
+    return 0;
+}
+
+static HRESULT WINAPI direct3d8_EnumAdapterModes(Direct3D8 *iface, int adapter, int mode, D3DDISPLAYMODE *displayMode)
+{
+    FIXME("(%i, %i, %p): stub!\n", adapter, mode, displayMode);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI direct3d8_GetAdapterDisplayMode(Direct3D8 *iface, int adapter, D3DDISPLAYMODE *displayMode)
+{
+    FIXME("(%i, %p): stub!\n", adapter, displayMode);
+
+    return E_NOTIMPL;
+}
+
+static LONG WINAPI direct3d8_CheckDeviceType(Direct3D8 *iface, int adapter, D3DDEVTYPE checkType,
+        D3DFORMAT displayFormat, D3DFORMAT backBufferFormat, LONG bWindowed)
+{
+    FIXME("(%i, %u, %u, %u, %i): stub!\n", adapter, checkType, displayFormat, backBufferFormat, bWindowed);
+
+    return 0;
+}
+
+static LONG WINAPI direct3d8_CheckDeviceFormat(Direct3D8 *iface, int adapter, D3DDEVTYPE deviceType,
+        D3DFORMAT adapterFormat, LONG usage, D3DRESOURCETYPE rType, D3DFORMAT checkFormat)
+{
+    FIXME("(%i, %u, %u, %i, %u, %u): stub!\n", adapter, deviceType, adapterFormat, usage, rType, checkFormat);
+
+    return 0;
+}
+
+static LONG WINAPI direct3d8_CheckDeviceMultiSampleType(Direct3D8 *iface, int adapter, D3DDEVTYPE deviceType,
+        D3DFORMAT renderTargetFormat, LONG windowed, D3DMULTISAMPLE_TYPE multiSampleType)
+{
+    FIXME("(%i, %u, %u, %i, %u): stub!\n", adapter, deviceType, renderTargetFormat, windowed, multiSampleType);
+
+    return 0;
+}
+
+static LONG WINAPI direct3d8_CheckDepthStencilMatch(Direct3D8 *iface, int adapter, D3DDEVTYPE deviceType,
+        D3DFORMAT adapterFormat, D3DFORMAT renderTargetFormat, D3DFORMAT depthStencilFormat)
+{
+    FIXME("(%i, %u, %u, %u, %u): stub!\n", adapter, deviceType, adapterFormat, renderTargetFormat, depthStencilFormat);
+
+    return 0;
+}
+
+static HRESULT WINAPI direct3d8_GetDeviceCaps(Direct3D8 *iface, int adapter, D3DDEVTYPE deviceType, D3DCAPS8 *caps)
+{
+    FIXME("(%i, %u, %p): stub!\n", adapter, deviceType, caps);
+
+    return E_NOTIMPL;
+}
+
+static LONG WINAPI direct3d8_GetAdapterMonitor(Direct3D8 *iface, int adapter)
+{
+    FIXME("(%i): stub!\n", adapter);
+
+    return 0;
+}
+
+static HRESULT WINAPI direct3d8_CreateDevice(Direct3D8 *iface, int adapter, D3DDEVTYPE deviceType, HWND hFocusWindow,
+        D3DCREATEFLAGS behaviorFlags, D3DPRESENT_PARAMETERS *presentationParameters,
+        Direct3DDevice8 **ppReturnedDeviceInterface)
+{
+    FIXME("(%i, %u, %p, %u, %p, %p): stub!\n", adapter, deviceType, hFocusWindow, behaviorFlags,
+            presentationParameters, ppReturnedDeviceInterface);
+
+    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)
+{
+    direct3d8 *object;
+
+    TRACE("(%p)\n", ppv);
+
+    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(direct3d8));
+    if (!object)
+        return E_OUTOFMEMORY;
+
+    object->Direct3D8_iface.lpVtbl = &Direct3D8_Vtbl;
+    object->ref = 1;
+
+    *ppv = &object->Direct3D8_iface;
+
+    return S_OK;
+}
+
 /*** directx8 - IUnknown methods ***/
 
 static HRESULT WINAPI directx8_QueryInterface(IDirectX8 *iface, REFIID riid, void **ppv)
@@ -237,9 +440,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