[PATCH 4/5] d3d9: Add a separate function for d3d9 initialization.

Henri Verbeet hverbeet at codeweavers.com
Fri May 25 09:10:30 CDT 2012


---
 dlls/d3d9/d3d9_main.c    |   58 +++++++++++++++++++++++++++------------------
 dlls/d3d9/d3d9_private.h |   14 +----------
 dlls/d3d9/directx.c      |   18 ++++++++++++-
 3 files changed, 52 insertions(+), 38 deletions(-)

diff --git a/dlls/d3d9/d3d9_main.c b/dlls/d3d9/d3d9_main.c
index 6eed9b7..e3bb9f8 100644
--- a/dlls/d3d9/d3d9_main.c
+++ b/dlls/d3d9/d3d9_main.c
@@ -33,40 +33,52 @@ void WINAPI DebugSetMute(void) {
     /* nothing to do */
 }
 
-IDirect3D9* WINAPI DECLSPEC_HOTPATCH Direct3DCreate9(UINT SDKVersion) {
-    IDirect3D9Impl* object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D9Impl));
-
-    object->IDirect3D9Ex_iface.lpVtbl = &Direct3D9_Vtbl;
-    object->ref = 1;
+IDirect3D9 * WINAPI DECLSPEC_HOTPATCH Direct3DCreate9(UINT sdk_version)
+{
+    IDirect3D9Impl *object;
 
-    wined3d_mutex_lock();
-    object->WineD3D = wined3d_create(9, 0);
-    wined3d_mutex_unlock();
+    TRACE("sdk_version %#x.\n", sdk_version);
 
-    TRACE("SDKVersion = %x, Created Direct3D object @ %p, WineObj @ %p\n", SDKVersion, object, object->WineD3D);
+    if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
+    {
+        ERR("Failed to allocate d3d9 object memory.\n");
+        return NULL;
+    }
 
-    if (!object->WineD3D)
+    if (!d3d9_init(object, FALSE))
     {
-        HeapFree( GetProcessHeap(), 0, object );
-        object = NULL;
+        WARN("Failed to initialize d3d9.\n");
+        HeapFree(GetProcessHeap(), 0, object);
+        return NULL;
     }
-    return (IDirect3D9*) object;
+
+    TRACE("Created d3d9 object %p.\n", object);
+
+    return (IDirect3D9 *)&object->IDirect3D9Ex_iface;
 }
 
-HRESULT WINAPI DECLSPEC_HOTPATCH Direct3DCreate9Ex(UINT SDKVersion, IDirect3D9Ex **direct3d9ex) {
-    IDirect3D9 *ret;
-    IDirect3D9Impl* object;
+HRESULT WINAPI DECLSPEC_HOTPATCH Direct3DCreate9Ex(UINT sdk_version, IDirect3D9Ex **d3d9ex)
+{
+    IDirect3D9Impl *object;
 
-    TRACE("Calling Direct3DCreate9\n");
-    ret = Direct3DCreate9(SDKVersion);
-    if(!ret) {
-        *direct3d9ex = NULL;
+    TRACE("sdk_version %#x, d3d9ex %p.\n", sdk_version, d3d9ex);
+
+    if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
+    {
+        ERR("Failed to allocate d3d9 object memory.\n");
+        return E_OUTOFMEMORY;
+    }
+
+    if (!d3d9_init(object, TRUE))
+    {
+        WARN("Failed to initialize d3d9.\n");
+        HeapFree(GetProcessHeap(), 0, object);
         return D3DERR_NOTAVAILABLE;
     }
 
-    object = (IDirect3D9Impl *) ret;
-    object->extended = TRUE; /* Enables QI for extended interfaces */
-    *direct3d9ex = &object->IDirect3D9Ex_iface;
+    TRACE("Created d3d9 object %p.\n", object);
+    *d3d9ex = &object->IDirect3D9Ex_iface;
+
     return D3D_OK;
 }
 
diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h
index d814dd0..793c948 100644
--- a/dlls/d3d9/d3d9_private.h
+++ b/dlls/d3d9/d3d9_private.h
@@ -127,19 +127,6 @@ enum wined3d_format_id wined3dformat_from_d3dformat(D3DFORMAT format) DECLSPEC_H
     _pD3D9Caps->MaxVertexShader30InstructionSlots = _pWineCaps->MaxVertexShader30InstructionSlots; \
     _pD3D9Caps->MaxPixelShader30InstructionSlots  = _pWineCaps->MaxPixelShader30InstructionSlots;
 
-/* ===========================================================================
-    D3D9 interfaces
-   =========================================================================== */
-
-/* ---------- */
-/* IDirect3D9 */
-/* ---------- */
-
-/*****************************************************************************
- * Predeclare the interface implementation structures
- */
-extern const IDirect3D9ExVtbl Direct3D9_Vtbl DECLSPEC_HIDDEN;
-
 /*****************************************************************************
  * IDirect3D implementation structure
  */
@@ -155,6 +142,7 @@ typedef struct IDirect3D9Impl
     BOOL                    extended;
 } IDirect3D9Impl;
 
+BOOL d3d9_init(IDirect3D9Impl *d3d9, BOOL extended) DECLSPEC_HIDDEN;
 void filter_caps(D3DCAPS9* pCaps) DECLSPEC_HIDDEN;
 
 struct fvf_declaration
diff --git a/dlls/d3d9/directx.c b/dlls/d3d9/directx.c
index d8a5d78..80b862d 100644
--- a/dlls/d3d9/directx.c
+++ b/dlls/d3d9/directx.c
@@ -551,8 +551,7 @@ static HRESULT WINAPI IDirect3D9ExImpl_GetAdapterLUID(IDirect3D9Ex *iface, UINT
     return hr;
 }
 
-
-const IDirect3D9ExVtbl Direct3D9_Vtbl =
+static const struct IDirect3D9ExVtbl Direct3D9_Vtbl =
 {
     /* IUnknown */
     IDirect3D9Impl_QueryInterface,
@@ -581,3 +580,18 @@ const IDirect3D9ExVtbl Direct3D9_Vtbl =
     IDirect3D9ExImpl_GetAdapterLUID
 
 };
+
+BOOL d3d9_init(IDirect3D9Impl *d3d9, BOOL extended)
+{
+    d3d9->IDirect3D9Ex_iface.lpVtbl = &Direct3D9_Vtbl;
+    d3d9->ref = 1;
+
+    wined3d_mutex_lock();
+    d3d9->WineD3D = wined3d_create(9, 0);
+    wined3d_mutex_unlock();
+    if (!d3d9->WineD3D)
+        return FALSE;
+    d3d9->extended = extended;
+
+    return TRUE;
+}
-- 
1.7.3.4




More information about the wine-patches mailing list