[PATCH] ddraw: Don't discard buffers that haven't been used in draws

Stefan Dösinger stefan at codeweavers.com
Wed Jan 2 05:26:35 CST 2013


Fixes bug 32485.
---
 dlls/ddraw/ddraw_private.h |    2 ++
 dlls/ddraw/device.c        |    7 +++++++
 dlls/ddraw/vertexbuffer.c  |    6 +++++-
 3 files changed, 14 insertions(+), 1 deletions(-)

diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index ab190ef..e458e7b 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -535,6 +535,8 @@ struct d3d_vertex_buffer
     DWORD                fvf;
     DWORD                size;
     BOOL                 dynamic;
+
+    BOOL                 read_since_last_map;
 };
 
 HRESULT d3d_vertex_buffer_create(struct d3d_vertex_buffer **buffer, struct ddraw *ddraw,
diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index 601c96e..8201d75 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -4113,6 +4113,10 @@ static HRESULT d3d_device7_DrawPrimitiveVB(IDirect3DDevice7 *iface, D3DPRIMITIVE
     /* Now draw the primitives */
     wined3d_device_set_primitive_type(device->wined3d_device, PrimitiveType);
     hr = wined3d_device_draw_primitive(device->wined3d_device, StartVertex, NumVertices);
+
+    if (SUCCEEDED(hr))
+        vb->read_since_last_map = TRUE;
+
     wined3d_mutex_unlock();
 
     return hr;
@@ -4236,6 +4240,9 @@ static HRESULT d3d_device7_DrawIndexedPrimitiveVB(IDirect3DDevice7 *iface,
     wined3d_device_set_primitive_type(This->wined3d_device, PrimitiveType);
     hr = wined3d_device_draw_indexed_primitive(This->wined3d_device, ib_pos / sizeof(WORD), IndexCount);
 
+    if (SUCCEEDED(hr))
+        vb->read_since_last_map = TRUE;
+
     wined3d_mutex_unlock();
 
     return hr;
diff --git a/dlls/ddraw/vertexbuffer.c b/dlls/ddraw/vertexbuffer.c
index 1b5d7af..5acd2e6 100644
--- a/dlls/ddraw/vertexbuffer.c
+++ b/dlls/ddraw/vertexbuffer.c
@@ -245,7 +245,7 @@ static HRESULT WINAPI d3d_vertex_buffer7_Lock(IDirect3DVertexBuffer7 *iface,
         wined3d_flags |= WINED3D_MAP_READONLY;
     if (flags & DDLOCK_NOOVERWRITE)
         wined3d_flags |= WINED3D_MAP_NOOVERWRITE;
-    if (flags & DDLOCK_DISCARDCONTENTS)
+    if (flags & DDLOCK_DISCARDCONTENTS && buffer->read_since_last_map)
     {
         wined3d_flags |= WINED3D_MAP_DISCARD;
 
@@ -278,6 +278,10 @@ static HRESULT WINAPI d3d_vertex_buffer7_Lock(IDirect3DVertexBuffer7 *iface,
     }
 
     hr = wined3d_buffer_map(buffer->wineD3DVertexBuffer, 0, 0, (BYTE **)data, wined3d_flags);
+
+    if (SUCCEEDED(hr))
+        buffer->read_since_last_map = FALSE;
+
     wined3d_mutex_unlock();
 
     return hr;
-- 
1.7.8.6




More information about the wine-patches mailing list