Henri Verbeet : wined3d: Filter redundant WINED3D_MAP_DISCARD buffer maps.

Alexandre Julliard julliard at winehq.org
Tue Mar 4 14:08:51 CST 2014


Module: wine
Branch: master
Commit: c1032e977bb9f850e3aea28dd79e3d7c2244cd6c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c1032e977bb9f850e3aea28dd79e3d7c2244cd6c

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Mar  4 10:21:33 2014 +0100

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 fb3755f..0f7f755 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 874d78d..e6f40a0 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 5acd2e6..5d77790 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 c53021b..fbbe398 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;




More information about the wine-cvs mailing list