[PATCH 2/2] wined3d/resource: Performance improvements
Patrick Rudolph
siro at das-labor.org
Fri Jul 8 11:15:52 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 | 6 +++---
dlls/wined3d/resource.c | 17 ++++++++---------
2 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c
index 58d8caf..0ce6f1c 100644
--- a/dlls/d3d9/tests/visual.c
+++ b/dlls/d3d9/tests/visual.c
@@ -4351,7 +4351,7 @@ static void test_vb_lock_flags(void)
D3DLOCK_NOOVERWRITE,
FALSE,
TRUE,
- TRUE
+ FALSE
},
{
"D3DLOCK_NOOVERWRITE",
@@ -4379,14 +4379,14 @@ static void test_vb_lock_flags(void)
D3DLOCK_NOOVERWRITE | D3DLOCK_DISCARD,
FALSE,
TRUE,
- TRUE
+ FALSE
},
{
"D3DLOCK_NOOVERWRITE | D3DLOCK_DISCARD",
D3DLOCK_NOOVERWRITE | D3DLOCK_DISCARD,
TRUE,
TRUE,
- TRUE
+ FALSE
}
};
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
index a17203d..751128b 100644
--- a/dlls/wined3d/resource.c
+++ b/dlls/wined3d/resource.c
@@ -359,6 +359,12 @@ 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_DISCARD | WINED3D_MAP_NOOVERWRITE)) ==
+ (WINED3D_MAP_DISCARD | WINED3D_MAP_NOOVERWRITE))
+ {
+ WARN("WINED3D_MAP_DISCARD and WINED3D_MAP_NOOVERWRITE used together, using WINED3D_MAP_NOOVERWRITE.\n");
+ flags &= ~WINED3D_MAP_DISCARD;
+ }
if (flags & WINED3D_MAP_READONLY)
{
if (flags & WINED3D_MAP_DISCARD)
@@ -372,16 +378,9 @@ DWORD wined3d_resource_sanitize_map_flags(const struct wined3d_resource *resourc
return 0;
}
}
- else if ((flags & (WINED3D_MAP_DISCARD | WINED3D_MAP_NOOVERWRITE))
- == (WINED3D_MAP_DISCARD | WINED3D_MAP_NOOVERWRITE))
- {
- WARN("WINED3D_MAP_DISCARD and WINED3D_MAP_NOOVERWRITE used together, ignoring.\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