Henri Verbeet : ddraw: Add a separate function for vertex buffer initialization.

Alexandre Julliard julliard at winehq.org
Fri Aug 20 10:19:10 CDT 2010


Module: wine
Branch: master
Commit: 0e955daed2616e2212ca735e19e10bbb8834d035
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0e955daed2616e2212ca735e19e10bbb8834d035

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Thu Aug 19 18:57:47 2010 +0200

ddraw: Add a separate function for vertex buffer initialization.

---

 dlls/ddraw/ddraw.c         |   40 ++------------------------------
 dlls/ddraw/ddraw_private.h |    5 +--
 dlls/ddraw/vertexbuffer.c  |   54 ++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 57 insertions(+), 42 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index c8cebcb..13d9366 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -4739,9 +4739,7 @@ static HRESULT WINAPI d3d2_CreateDevice(IDirect3D2 *iface, REFCLSID riid,
 static HRESULT WINAPI d3d7_CreateVertexBuffer(IDirect3D7 *iface, D3DVERTEXBUFFERDESC *desc,
         IDirect3DVertexBuffer7 **vertex_buffer, DWORD flags)
 {
-    IDirectDrawImpl *ddraw = ddraw_from_d3d7(iface);
     IDirect3DVertexBufferImpl *object;
-    DWORD usage;
     HRESULT hr;
 
     TRACE("iface %p, desc %p, vertex_buffer %p, flags %#x.\n",
@@ -4763,49 +4761,17 @@ static HRESULT WINAPI d3d7_CreateVertexBuffer(IDirect3D7 *iface, D3DVERTEXBUFFER
         return DDERR_OUTOFMEMORY;
     }
 
-    object->ref = 1;
-    object->lpVtbl = &IDirect3DVertexBuffer7_Vtbl;
-    object->IDirect3DVertexBuffer_vtbl = &IDirect3DVertexBuffer1_Vtbl;
-
-    object->ddraw = ddraw;
-    object->Caps = desc->dwCaps;
-    object->fvf = desc->dwFVF;
-
-    usage = desc->dwCaps & D3DVBCAPS_WRITEONLY ? WINED3DUSAGE_WRITEONLY : 0;
-    usage |= WINED3DUSAGE_STATICDECL;
-
-    EnterCriticalSection(&ddraw_cs);
-
-    hr = IWineD3DDevice_CreateVertexBuffer(ddraw->wineD3DDevice,
-            get_flexible_vertex_size(desc->dwFVF) * desc->dwNumVertices,
-            usage, desc->dwCaps & D3DVBCAPS_SYSTEMMEMORY ? WINED3DPOOL_SYSTEMMEM : WINED3DPOOL_DEFAULT,
-            &object->wineD3DVertexBuffer, (IUnknown *)object, &ddraw_null_wined3d_parent_ops);
+    hr = d3d_vertex_buffer_init(object, ddraw_from_d3d7(iface), desc);
     if (FAILED(hr))
     {
-        WARN("Failed to create wined3d vertex buffer, hr %#x.\n", hr);
-        HeapFree(GetProcessHeap(), 0, object);
-        LeaveCriticalSection(&ddraw_cs);
-        if (hr == WINED3DERR_INVALIDCALL)
-            return DDERR_INVALIDPARAMS;
-        else
-            return hr;
-    }
-
-    object->wineD3DVertexDeclaration = ddraw_find_decl(ddraw, desc->dwFVF);
-    if (!object->wineD3DVertexDeclaration)
-    {
-        ERR("Failed to find vertex declaration for fvf %#x.\n", desc->dwFVF);
-        IWineD3DBuffer_Release(object->wineD3DVertexBuffer);
+        WARN("Failed to initialize vertex buffer, hr %#x.\n", hr);
         HeapFree(GetProcessHeap(), 0, object);
-        LeaveCriticalSection(&ddraw_cs);
-        return DDERR_INVALIDPARAMS;
+        return hr;
     }
-    IWineD3DVertexDeclaration_AddRef(object->wineD3DVertexDeclaration);
 
     TRACE("Created vertex buffer %p.\n", object);
     *vertex_buffer = (IDirect3DVertexBuffer7 *)object;
 
-    LeaveCriticalSection(&ddraw_cs);
     return D3D_OK;
 }
 
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 6be5016..2b9105b 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -643,9 +643,8 @@ struct IDirect3DVertexBufferImpl
     DWORD                fvf;
 };
 
-/* The Vtables */
-extern const IDirect3DVertexBuffer7Vtbl IDirect3DVertexBuffer7_Vtbl DECLSPEC_HIDDEN;
-extern const IDirect3DVertexBufferVtbl IDirect3DVertexBuffer1_Vtbl DECLSPEC_HIDDEN;
+HRESULT d3d_vertex_buffer_init(IDirect3DVertexBufferImpl *buffer,
+        IDirectDrawImpl *ddraw, D3DVERTEXBUFFERDESC *desc) DECLSPEC_HIDDEN;
 
 static inline IDirect3DVertexBufferImpl *vb_from_vb1(IDirect3DVertexBuffer *iface)
 {
diff --git a/dlls/ddraw/vertexbuffer.c b/dlls/ddraw/vertexbuffer.c
index fc02660..c25aad5 100644
--- a/dlls/ddraw/vertexbuffer.c
+++ b/dlls/ddraw/vertexbuffer.c
@@ -553,7 +553,7 @@ IDirect3DVertexBufferImpl_ProcessVerticesStrided(IDirect3DVertexBuffer7 *iface,
  * The VTables
  *****************************************************************************/
 
-const IDirect3DVertexBuffer7Vtbl IDirect3DVertexBuffer7_Vtbl =
+static const struct IDirect3DVertexBuffer7Vtbl d3d_vertex_buffer7_vtbl =
 {
     /*** IUnknown Methods ***/
     IDirect3DVertexBufferImpl_QueryInterface,
@@ -569,7 +569,7 @@ const IDirect3DVertexBuffer7Vtbl IDirect3DVertexBuffer7_Vtbl =
     IDirect3DVertexBufferImpl_ProcessVerticesStrided
 };
 
-const IDirect3DVertexBufferVtbl IDirect3DVertexBuffer1_Vtbl =
+static const struct IDirect3DVertexBufferVtbl d3d_vertex_buffer1_vtbl =
 {
     /*** IUnknown Methods ***/
     Thunk_IDirect3DVertexBufferImpl_1_QueryInterface,
@@ -582,3 +582,53 @@ const IDirect3DVertexBufferVtbl IDirect3DVertexBuffer1_Vtbl =
     Thunk_IDirect3DVertexBufferImpl_1_GetVertexBufferDesc,
     Thunk_IDirect3DVertexBufferImpl_1_Optimize
 };
+
+HRESULT d3d_vertex_buffer_init(IDirect3DVertexBufferImpl *buffer,
+        IDirectDrawImpl *ddraw, D3DVERTEXBUFFERDESC *desc)
+{
+    DWORD usage;
+    HRESULT hr;
+
+    buffer->lpVtbl = &d3d_vertex_buffer7_vtbl;
+    buffer->IDirect3DVertexBuffer_vtbl = &d3d_vertex_buffer1_vtbl;
+    buffer->ref = 1;
+
+    buffer->ddraw = ddraw;
+    buffer->Caps = desc->dwCaps;
+    buffer->fvf = desc->dwFVF;
+
+    usage = desc->dwCaps & D3DVBCAPS_WRITEONLY ? WINED3DUSAGE_WRITEONLY : 0;
+    usage |= WINED3DUSAGE_STATICDECL;
+
+    EnterCriticalSection(&ddraw_cs);
+
+    hr = IWineD3DDevice_CreateVertexBuffer(ddraw->wineD3DDevice,
+            get_flexible_vertex_size(desc->dwFVF) * desc->dwNumVertices,
+            usage, desc->dwCaps & D3DVBCAPS_SYSTEMMEMORY ? WINED3DPOOL_SYSTEMMEM : WINED3DPOOL_DEFAULT,
+            &buffer->wineD3DVertexBuffer, (IUnknown *)buffer, &ddraw_null_wined3d_parent_ops);
+    if (FAILED(hr))
+    {
+        WARN("Failed to create wined3d vertex buffer, hr %#x.\n", hr);
+        LeaveCriticalSection(&ddraw_cs);
+
+        if (hr == WINED3DERR_INVALIDCALL)
+            return DDERR_INVALIDPARAMS;
+        else
+            return hr;
+    }
+
+    buffer->wineD3DVertexDeclaration = ddraw_find_decl(ddraw, desc->dwFVF);
+    if (!buffer->wineD3DVertexDeclaration)
+    {
+        ERR("Failed to find vertex declaration for fvf %#x.\n", desc->dwFVF);
+        IWineD3DBuffer_Release(buffer->wineD3DVertexBuffer);
+        LeaveCriticalSection(&ddraw_cs);
+
+        return DDERR_INVALIDPARAMS;
+    }
+    IWineD3DVertexDeclaration_AddRef(buffer->wineD3DVertexDeclaration);
+
+    LeaveCriticalSection(&ddraw_cs);
+
+    return D3D_OK;
+}




More information about the wine-cvs mailing list