From c1032e977bb9f850e3aea28dd79e3d7c2244cd6c Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Tue, 4 Mar 2014 10:21:33 +0100 Subject: [PATCH] wined3d: Filter redundant WINED3D_MAP_DISCARD buffer maps. --- dlls/ddraw/ddraw_private.h | 2 -- dlls/ddraw/device.c | 6 ------ dlls/ddraw/vertexbuffer.c | 5 +---- dlls/wined3d/buffer.c | 34 +++++++++++++++------------------- 4 files changed, 16 insertions(+), 31 deletions(-) diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h index fb3755f9e46..0f7f755d620 100644 --- a/dlls/ddraw/ddraw_private.h +++ b/dlls/ddraw/ddraw_private.h @@ -543,8 +543,6 @@ 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 874d78d4a00..e6f40a033e7 100644 --- a/dlls/ddraw/device.c +++ b/dlls/ddraw/device.c @@ -4268,9 +4268,6 @@ static HRESULT d3d_device7_DrawPrimitiveVB(IDirect3DDevice7 *iface, D3DPRIMITIVE 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; @@ -4396,9 +4393,6 @@ 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 5acd2e618a4..5d777902048 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 && buffer->read_since_last_map) + if (flags & DDLOCK_DISCARDCONTENTS) { wined3d_flags |= WINED3D_MAP_DISCARD; @@ -279,9 +279,6 @@ 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; diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c index c53021b9bc4..fbbe3987ffc 100644 --- a/dlls/wined3d/buffer.c +++ b/dlls/wined3d/buffer.c @@ -944,13 +944,20 @@ struct wined3d_resource * CDECL wined3d_buffer_get_resource(struct wined3d_buffe HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UINT size, BYTE **data, DWORD flags) { - BOOL dirty = buffer_is_dirty(buffer); LONG count; BYTE *base; TRACE("buffer %p, offset %u, size %u, data %p, flags %#x\n", buffer, offset, size, data, flags); flags = wined3d_resource_sanitize_map_flags(&buffer->resource, flags); + /* Filter redundant WINED3D_MAP_DISCARD maps. The 3DMark2001 multitexture + * fill rate test seems to depend on this. When we map a buffer with + * GL_MAP_INVALIDATE_BUFFER_BIT, the driver is free to discard the + * previous contents of the buffer. The r600g driver only does this when + * the buffer is currently in use, while the proprietary NVIDIA driver + * appears to do this unconditionally. */ + if (buffer->flags & WINED3D_BUFFER_DISCARD) + flags &= ~WINED3D_MAP_DISCARD; count = ++buffer->resource.map_count; if (buffer->buffer_object) @@ -1026,25 +1033,14 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN context_release(context); } } - else - { - if (dirty) - { - if (buffer->flags & WINED3D_BUFFER_NOSYNC && !(flags & WINED3D_MAP_NOOVERWRITE)) - { - buffer->flags &= ~WINED3D_BUFFER_NOSYNC; - } - } - else if(flags & WINED3D_MAP_NOOVERWRITE) - { - buffer->flags |= WINED3D_BUFFER_NOSYNC; - } - if (flags & WINED3D_MAP_DISCARD) - { - buffer->flags |= WINED3D_BUFFER_DISCARD; - } - } + if (flags & WINED3D_MAP_DISCARD) + buffer->flags |= WINED3D_BUFFER_DISCARD; + + if (!(flags & WINED3D_MAP_NOOVERWRITE)) + buffer->flags &= ~WINED3D_BUFFER_NOSYNC; + else if (!buffer_is_dirty(buffer)) + buffer->flags |= WINED3D_BUFFER_NOSYNC; } base = buffer->map_ptr ? buffer->map_ptr : buffer->resource.heap_memory; -- 2.11.4.GIT