=?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: ddraw: Create a dynamic buffer if DDLOCK_DISCARDCONTENTS is used.

Alexandre Julliard julliard at winehq.org
Tue Dec 4 13:48:54 CST 2012


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

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Tue Dec  4 09:36:16 2012 +0100

ddraw: Create a dynamic buffer if DDLOCK_DISCARDCONTENTS is used.

---

 dlls/ddraw/ddraw_private.h |    2 +
 dlls/ddraw/vertexbuffer.c  |   51 +++++++++++++++++++++++++++++++++++++-------
 2 files changed, 45 insertions(+), 8 deletions(-)

diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 3a35c47..85f6ca3 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -527,6 +527,8 @@ struct d3d_vertex_buffer
     /*** Storage for D3D7 specific things ***/
     DWORD                Caps;
     DWORD                fvf;
+    DWORD                size;
+    BOOL                 dynamic;
 };
 
 HRESULT d3d_vertex_buffer_create(struct d3d_vertex_buffer **buffer, struct ddraw *ddraw,
diff --git a/dlls/ddraw/vertexbuffer.c b/dlls/ddraw/vertexbuffer.c
index 39a977f..1b5d7af 100644
--- a/dlls/ddraw/vertexbuffer.c
+++ b/dlls/ddraw/vertexbuffer.c
@@ -185,6 +185,27 @@ static ULONG WINAPI d3d_vertex_buffer1_Release(IDirect3DVertexBuffer *iface)
  * IDirect3DVertexBuffer Methods
  *****************************************************************************/
 
+static HRESULT d3d_vertex_buffer_create_wined3d_buffer(struct d3d_vertex_buffer *buffer, BOOL dynamic,
+        struct wined3d_buffer **wined3d_buffer)
+{
+    DWORD usage = WINED3DUSAGE_STATICDECL;
+    enum wined3d_pool pool;
+
+    if (buffer->Caps & D3DVBCAPS_SYSTEMMEMORY)
+        pool = WINED3D_POOL_SYSTEM_MEM;
+    else
+        pool = WINED3D_POOL_DEFAULT;
+
+    if (buffer->Caps & D3DVBCAPS_WRITEONLY)
+        usage |= WINED3DUSAGE_WRITEONLY;
+    if (dynamic)
+        usage |= WINED3DUSAGE_DYNAMIC;
+
+    return wined3d_buffer_create_vb(buffer->ddraw->wined3d_device,
+        buffer->size, usage, pool, buffer, &ddraw_null_wined3d_parent_ops,
+        wined3d_buffer);
+}
+
 /*****************************************************************************
  * IDirect3DVertexBuffer7::Lock
  *
@@ -225,8 +246,28 @@ static HRESULT WINAPI d3d_vertex_buffer7_Lock(IDirect3DVertexBuffer7 *iface,
     if (flags & DDLOCK_NOOVERWRITE)
         wined3d_flags |= WINED3D_MAP_NOOVERWRITE;
     if (flags & DDLOCK_DISCARDCONTENTS)
+    {
         wined3d_flags |= WINED3D_MAP_DISCARD;
 
+        if (!buffer->dynamic)
+        {
+            struct wined3d_buffer *new_buffer;
+            wined3d_mutex_lock();
+            hr = d3d_vertex_buffer_create_wined3d_buffer(buffer, TRUE, &new_buffer);
+            if (SUCCEEDED(hr))
+            {
+                buffer->dynamic = TRUE;
+                wined3d_buffer_decref(buffer->wineD3DVertexBuffer);
+                buffer->wineD3DVertexBuffer = new_buffer;
+            }
+            else
+            {
+                WARN("Failed to create a dynamic buffer\n");
+            }
+            wined3d_mutex_unlock();
+        }
+    }
+
     wined3d_mutex_lock();
     if (data_size)
     {
@@ -534,7 +575,6 @@ HRESULT d3d_vertex_buffer_create(struct d3d_vertex_buffer **vertex_buf,
         struct ddraw *ddraw, D3DVERTEXBUFFERDESC *desc)
 {
     struct d3d_vertex_buffer *buffer;
-    DWORD usage;
     HRESULT hr = D3D_OK;
 
     TRACE("Vertex buffer description:\n");
@@ -554,16 +594,11 @@ HRESULT d3d_vertex_buffer_create(struct d3d_vertex_buffer **vertex_buf,
     buffer->ddraw = ddraw;
     buffer->Caps = desc->dwCaps;
     buffer->fvf = desc->dwFVF;
-
-    usage = desc->dwCaps & D3DVBCAPS_WRITEONLY ? WINED3DUSAGE_WRITEONLY : 0;
-    usage |= WINED3DUSAGE_STATICDECL;
+    buffer->size = get_flexible_vertex_size(desc->dwFVF) * desc->dwNumVertices;
 
     wined3d_mutex_lock();
 
-    hr = wined3d_buffer_create_vb(ddraw->wined3d_device,
-            get_flexible_vertex_size(desc->dwFVF) * desc->dwNumVertices,
-            usage, desc->dwCaps & D3DVBCAPS_SYSTEMMEMORY ? WINED3D_POOL_SYSTEM_MEM : WINED3D_POOL_DEFAULT,
-            buffer, &ddraw_null_wined3d_parent_ops, &buffer->wineD3DVertexBuffer);
+    hr = d3d_vertex_buffer_create_wined3d_buffer(buffer, FALSE, &buffer->wineD3DVertexBuffer);
     if (FAILED(hr))
     {
         WARN("Failed to create wined3d vertex buffer, hr %#x.\n", hr);




More information about the wine-cvs mailing list