From: Matteo Bruni mbruni@codeweavers.com
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- 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 <assert.h> #include <limits.h> #include <math.h> +#include <stdbool.h> #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;