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

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


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

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

ddraw: Add a separate function for execute buffer initialization.

---

 dlls/ddraw/ddraw_private.h |    4 ++--
 dlls/ddraw/device.c        |   44 +++++++-------------------------------------
 dlls/ddraw/executebuffer.c |   37 ++++++++++++++++++++++++++++++++++++-
 3 files changed, 45 insertions(+), 40 deletions(-)

diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 5ed1676..bfca885 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -614,8 +614,8 @@ struct IDirect3DExecuteBufferImpl
     BOOL                 need_free;
 };
 
-/* The VTable */
-extern const IDirect3DExecuteBufferVtbl IDirect3DExecuteBuffer_Vtbl DECLSPEC_HIDDEN;
+HRESULT d3d_execute_buffer_init(IDirect3DExecuteBufferImpl *execute_buffer,
+        IDirect3DDeviceImpl *device, D3DEXECUTEBUFFERDESC *desc) DECLSPEC_HIDDEN;
 
 /* The execute function */
 void IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This,
diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index 931b204..d674e82 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -712,6 +712,8 @@ IDirect3DDeviceImpl_1_CreateExecuteBuffer(IDirect3DDevice *iface,
 {
     IDirect3DDeviceImpl *This = device_from_device1(iface);
     IDirect3DExecuteBufferImpl* object;
+    HRESULT hr;
+
     TRACE("(%p)->(%p,%p,%p)!\n", This, Desc, ExecuteBuffer, UnkOuter);
 
     if(UnkOuter)
@@ -725,46 +727,14 @@ IDirect3DDeviceImpl_1_CreateExecuteBuffer(IDirect3DDevice *iface,
         return DDERR_OUTOFMEMORY;
     }
 
-    object->lpVtbl = &IDirect3DExecuteBuffer_Vtbl;
-    object->ref = 1;
-    object->d3ddev = This;
-
-    /* Initializes memory */
-    memcpy(&object->desc, Desc, Desc->dwSize);
-
-    /* No buffer given */
-    if ((object->desc.dwFlags & D3DDEB_LPDATA) == 0)
-        object->desc.lpData = NULL;
-
-    /* No buffer size given */
-    if ((object->desc.dwFlags & D3DDEB_BUFSIZE) == 0)
-        object->desc.dwBufferSize = 0;
-
-    /* Create buffer if asked */
-    if ((object->desc.lpData == NULL) && (object->desc.dwBufferSize > 0))
-    {
-        object->need_free = TRUE;
-        object->desc.lpData = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,object->desc.dwBufferSize);
-        if(!object->desc.lpData)
-        {
-            ERR("Out of memory when allocating the execute buffer data\n");
-            HeapFree(GetProcessHeap(), 0, object);
-            return DDERR_OUTOFMEMORY;
-        }
-    }
-    else
+    hr = d3d_execute_buffer_init(object, This, Desc);
+    if (FAILED(hr))
     {
-        object->need_free = FALSE;
+        WARN("Failed to initialize execute buffer, hr %#x.\n", hr);
+        HeapFree(GetProcessHeap(), 0, object);
+        return hr;
     }
 
-    /* No vertices for the moment */
-    object->vertex_data = NULL;
-
-    object->desc.dwFlags |= D3DDEB_LPDATA;
-
-    object->indices = NULL;
-    object->nb_indices = 0;
-
     *ExecuteBuffer = (IDirect3DExecuteBuffer *)object;
 
     TRACE(" Returning IDirect3DExecuteBuffer at %p, implementation is at %p\n", *ExecuteBuffer, object);
diff --git a/dlls/ddraw/executebuffer.c b/dlls/ddraw/executebuffer.c
index 9f08976..b637022 100644
--- a/dlls/ddraw/executebuffer.c
+++ b/dlls/ddraw/executebuffer.c
@@ -825,7 +825,7 @@ IDirect3DExecuteBufferImpl_Optimize(IDirect3DExecuteBuffer *iface,
     return DDERR_UNSUPPORTED; /* Unchecked */
 }
 
-const IDirect3DExecuteBufferVtbl IDirect3DExecuteBuffer_Vtbl =
+static const struct IDirect3DExecuteBufferVtbl d3d_execute_buffer_vtbl =
 {
     IDirect3DExecuteBufferImpl_QueryInterface,
     IDirect3DExecuteBufferImpl_AddRef,
@@ -838,3 +838,38 @@ const IDirect3DExecuteBufferVtbl IDirect3DExecuteBuffer_Vtbl =
     IDirect3DExecuteBufferImpl_Validate,
     IDirect3DExecuteBufferImpl_Optimize,
 };
+
+HRESULT d3d_execute_buffer_init(IDirect3DExecuteBufferImpl *execute_buffer,
+        IDirect3DDeviceImpl *device, D3DEXECUTEBUFFERDESC *desc)
+{
+    execute_buffer->lpVtbl = &d3d_execute_buffer_vtbl;
+    execute_buffer->ref = 1;
+    execute_buffer->d3ddev = device;
+
+    /* Initializes memory */
+    memcpy(&execute_buffer->desc, desc, desc->dwSize);
+
+    /* No buffer given */
+    if (!(execute_buffer->desc.dwFlags & D3DDEB_LPDATA))
+        execute_buffer->desc.lpData = NULL;
+
+    /* No buffer size given */
+    if (!(execute_buffer->desc.dwFlags & D3DDEB_BUFSIZE))
+        execute_buffer->desc.dwBufferSize = 0;
+
+    /* Create buffer if asked */
+    if (!execute_buffer->desc.lpData && execute_buffer->desc.dwBufferSize)
+    {
+        execute_buffer->need_free = TRUE;
+        execute_buffer->desc.lpData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, execute_buffer->desc.dwBufferSize);
+        if (!execute_buffer->desc.lpData)
+        {
+            ERR("Failed to allocate execute buffer data.\n");
+            return DDERR_OUTOFMEMORY;
+        }
+    }
+
+    execute_buffer->desc.dwFlags |= D3DDEB_LPDATA;
+
+    return D3D_OK;
+}




More information about the wine-cvs mailing list