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

Fabian Maurer <[email protected]>
Newsgroups gmane.comp.emulators.wine.patches
Message-ID <[email protected]>
Signed-off-by: Fabian Maurer <[email protected]>
---
 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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.