From 6784684abf7eae7d331fb95988ef1e85a97ddb1f Mon Sep 17 00:00:00 2001 From: Matteo Bruni Date: Thu, 17 Feb 2022 00:13:50 -0600 Subject: [PATCH] ddraw: Filter out redundant discard maps. Signed-off-by: Zebediah Figura Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/ddraw/ddraw_private.h | 2 ++ dlls/ddraw/device.c | 4 ++++ dlls/ddraw/vertexbuffer.c | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h index 7929e9e1795..0c2a491d45b 100644 --- a/dlls/ddraw/ddraw_private.h +++ b/dlls/ddraw/ddraw_private.h @@ -22,6 +22,7 @@ #include #include #include +#include #define COBJMACROS #define NONAMELESSSTRUCT #define NONAMELESSUNION @@ -598,6 +599,7 @@ struct d3d_vertex_buffer DWORD fvf; DWORD size; BOOL dynamic; + bool discarded; }; 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 6e8f109173b..860dffc5045 100644 --- a/dlls/ddraw/device.c +++ b/dlls/ddraw/device.c @@ -4293,6 +4293,8 @@ static HRESULT d3d_device7_DrawPrimitiveVB(IDirect3DDevice7 *iface, D3DPRIMITIVE return D3D_OK; } + vb_impl->discarded = false; + stride = get_flexible_vertex_size(vb_impl->fvf); if (vb_impl->Caps & D3DVBCAPS_SYSTEMMEMORY) @@ -4412,6 +4414,8 @@ static HRESULT d3d_device7_DrawIndexedPrimitiveVB(IDirect3DDevice7 *iface, return D3D_OK; } + vb_impl->discarded = false; + if (vb_impl->Caps & D3DVBCAPS_SYSTEMMEMORY) { TRACE("Drawing from D3DVBCAPS_SYSTEMMEMORY vertex buffer, forwarding to DrawIndexedPrimitive().\n"); diff --git a/dlls/ddraw/vertexbuffer.c b/dlls/ddraw/vertexbuffer.c index dd35b445cc5..fa0e4f4c41a 100644 --- a/dlls/ddraw/vertexbuffer.c +++ b/dlls/ddraw/vertexbuffer.c @@ -159,10 +159,14 @@ static HRESULT WINAPI d3d_vertex_buffer7_Lock(IDirect3DVertexBuffer7 *iface, if (buffer->version != 7) flags &= ~(DDLOCK_NOOVERWRITE | DDLOCK_DISCARDCONTENTS); + if (buffer->discarded) + flags &= ~DDLOCK_DISCARDCONTENTS; + if (!(flags & DDLOCK_WAIT)) flags |= DDLOCK_DONOTWAIT; if (flags & DDLOCK_DISCARDCONTENTS) { + buffer->discarded = true; if (!buffer->dynamic) { struct wined3d_buffer *new_buffer;