[PATCH 5/5] wined3d: Invalidate the entire buffer on maps with WINED3DLOCK_DISCARD.
Henri Verbeet
hverbeet at codeweavers.com
Tue Jun 12 10:03:50 CDT 2012
---
dlls/wined3d/buffer.c | 15 ++++++++++++++-
1 files changed, 14 insertions(+), 1 deletions(-)
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index f11edf4..4735595 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -1011,7 +1011,20 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN
flags = buffer_sanitize_flags(buffer, flags);
if (!(flags & WINED3DLOCK_READONLY))
{
- if (!buffer_add_dirty_area(buffer, offset, size)) return E_OUTOFMEMORY;
+ if (flags & WINED3DLOCK_DISCARD)
+ {
+ /* DISCARD invalidates the entire buffer, regardless of the
+ * specified offset and size. Some applications also depend on the
+ * entire buffer being uploaded in that case. Two such
+ * applications are Port Royale and Darkstar One. */
+ if (!buffer_add_dirty_area(buffer, 0, 0))
+ return E_OUTOFMEMORY;
+ }
+ else
+ {
+ if (!buffer_add_dirty_area(buffer, offset, size))
+ return E_OUTOFMEMORY;
+ }
}
count = ++buffer->resource.map_count;
--
1.7.3.4
More information about the wine-patches
mailing list