[PATCH 3/3] wined3d/resource: Performance improvements, try 2

Patrick Rudolph siro at das-labor.org
Mon Jul 11 11:13:03 CDT 2016


Tests showed that D3DLOCK_NOOVERWRITE is prefered over D3DLOCK_DISCARD
and that D3DLOCK_NOOVERWRITE doesn't depend on dynamic buffers.

Unigine Heavon maps a lot of buffers with both flags, but run on about
85% GPU-load, as WINE removes both hints and the game has to wait for
the buffer to be mapped.

Pass only D3DLOCK_NOOVERWRITE as it has less overhead than D3DLOCK_DISCARD.

Unigine Heavon's score increased from 580 to 700, which is an increase of 20%.

Tested on:
OpenGL renderer string: Gallium 0.4 on AMD BARTS (DRM 2.43.0 / 4.5.7-300.fc24.x86_64, LLVM 3.8.0)
OpenGL core profile version string: 3.3 (Core Profile) Mesa 12.1.0-devel (git-60c68c5)

Signed-off-by: Patrick Rudolph <siro at das-labor.org>
---
 dlls/d3d9/tests/visual.c | 10 +++++-----
 dlls/wined3d/resource.c  | 33 ++++++++++++++++-----------------
 2 files changed, 21 insertions(+), 22 deletions(-)

diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c
index 6f59b43..f9cf5a5 100644
--- a/dlls/d3d9/tests/visual.c
+++ b/dlls/d3d9/tests/visual.c
@@ -4352,7 +4352,7 @@ static void test_vb_lock_flags(void)
             D3DLOCK_NOOVERWRITE,
             0,
             TRUE,
-            TRUE
+            FALSE
         },
         {
             "D3DLOCK_NOOVERWRITE",
@@ -4380,28 +4380,28 @@ static void test_vb_lock_flags(void)
             D3DLOCK_NOOVERWRITE | D3DLOCK_DISCARD,
             0,
             TRUE,
-            TRUE
+            FALSE
         },
         {
             "D3DLOCK_NOOVERWRITE | D3DLOCK_DISCARD",
             D3DLOCK_NOOVERWRITE | D3DLOCK_DISCARD,
             D3DUSAGE_DYNAMIC,
             TRUE,
-            TRUE
+            FALSE
         },
         {
             "D3DLOCK_NOOVERWRITE | D3DLOCK_READONLY",
             D3DLOCK_NOOVERWRITE | D3DLOCK_READONLY,
             0,
             TRUE,
-            TRUE
+            FALSE
         },
         {
             "D3DLOCK_NOOVERWRITE | D3DLOCK_READONLY",
             D3DLOCK_NOOVERWRITE | D3DLOCK_READONLY,
             D3DUSAGE_DYNAMIC,
             TRUE,
-            TRUE
+            FALSE
         },
     };
 
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
index a17203d..b682acf 100644
--- a/dlls/wined3d/resource.c
+++ b/dlls/wined3d/resource.c
@@ -359,29 +359,28 @@ DWORD wined3d_resource_sanitize_map_flags(const struct wined3d_resource *resourc
 {
     /* Not all flags make sense together, but Windows never returns an error.
      * Catch the cases that could cause issues. */
-    if (flags & WINED3D_MAP_READONLY)
+    if ((flags & (WINED3D_MAP_DISCARD | WINED3D_MAP_NOOVERWRITE)) ==
+            (WINED3D_MAP_DISCARD | WINED3D_MAP_NOOVERWRITE))
     {
-        if (flags & WINED3D_MAP_DISCARD)
-        {
-            WARN("WINED3D_MAP_READONLY combined with WINED3D_MAP_DISCARD, ignoring flags.\n");
-            return 0;
-        }
-        if (flags & WINED3D_MAP_NOOVERWRITE)
-        {
-            WARN("WINED3D_MAP_READONLY combined with WINED3D_MAP_NOOVERWRITE, ignoring flags.\n");
-            return 0;
-        }
+        WARN("WINED3D_MAP_DISCARD and WINED3D_MAP_NOOVERWRITE used together, using WINED3D_MAP_NOOVERWRITE.\n");
+        flags &= ~WINED3D_MAP_DISCARD;
+    }
+    if ((flags & (WINED3D_MAP_READONLY | WINED3D_MAP_NOOVERWRITE)) ==
+            (WINED3D_MAP_READONLY | WINED3D_MAP_NOOVERWRITE))
+    {
+        WARN("WINED3D_MAP_READONLY and WINED3D_MAP_NOOVERWRITE used together, clearing WINED3D_MAP_READONLY.\n");
+        flags &= ~WINED3D_MAP_READONLY;
     }
-    else if ((flags & (WINED3D_MAP_DISCARD | WINED3D_MAP_NOOVERWRITE))
-            == (WINED3D_MAP_DISCARD | WINED3D_MAP_NOOVERWRITE))
+
+    if ((flags & (WINED3D_MAP_READONLY | WINED3D_MAP_DISCARD)) ==
+            (WINED3D_MAP_READONLY | WINED3D_MAP_DISCARD))
     {
-        WARN("WINED3D_MAP_DISCARD and WINED3D_MAP_NOOVERWRITE used together, ignoring.\n");
+        WARN("WINED3D_MAP_READONLY combined with WINED3D_MAP_DISCARD, ignoring flags.\n");
         return 0;
     }
-    else if (flags & (WINED3D_MAP_DISCARD | WINED3D_MAP_NOOVERWRITE)
-            && !(resource->usage & WINED3DUSAGE_DYNAMIC))
+    else if ((flags & WINED3D_MAP_DISCARD) && !(resource->usage & WINED3DUSAGE_DYNAMIC))
     {
-        WARN("DISCARD or NOOVERWRITE map on non-dynamic buffer, ignoring.\n");
+        WARN("DISCARD on non dynamic buffer, ignoring.\n");
         return 0;
     }
 
-- 
2.7.4




More information about the wine-patches mailing list