[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