[01/02] d3d9: update locked_rect only if wined3d_surface_map succeeds
Lasse Rasinen
lrasinen at iki.fi
Mon Oct 21 03:46:46 CDT 2013
Fixes http://bugs.winehq.org/show_bug.cgi?id=34271
Going back to the "don't touch the locked_rect" approach as advised by
Stefan Dösinger.
---
dlls/d3d9/surface.c | 7 +++++--
dlls/d3d9/tests/device.c | 4 ++++
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/dlls/d3d9/surface.c b/dlls/d3d9/surface.c
index 99f0b0f..d475ae4 100644
--- a/dlls/d3d9/surface.c
+++ b/dlls/d3d9/surface.c
@@ -293,8 +293,11 @@ static HRESULT WINAPI d3d9_surface_LockRect(IDirect3DSurface9 *iface,
hr = wined3d_surface_map(surface->wined3d_surface, &map_desc, rect, flags);
wined3d_mutex_unlock();
- locked_rect->Pitch = map_desc.row_pitch;
- locked_rect->pBits = map_desc.data;
+ if (SUCCEEDED(hr))
+ {
+ locked_rect->Pitch = map_desc.row_pitch;
+ locked_rect->pBits = map_desc.data;
+ }
return hr;
}
diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c
index 02b4174..51835c8 100644
--- a/dlls/d3d9/tests/device.c
+++ b/dlls/d3d9/tests/device.c
@@ -5402,8 +5402,12 @@ static void test_lockrect_invalid(void)
hr = IDirect3DSurface9_LockRect(surface, &locked_rect, NULL, 0);
ok(SUCCEEDED(hr), "Failed to lock surface with rect NULL, hr %#x.\n", hr);
+ locked_rect.pBits = 0xdeadbeef;
+ locked_rect.Pitch = 1;
hr = IDirect3DSurface9_LockRect(surface, &locked_rect, NULL, 0);
ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr);
+ ok(locked_rect.pBits == 0xdeadbeef, "pBits changed on double lock.\n");
+ ok(locked_rect.Pitch == 1, "Pitch changed on double lock.\n");
hr = IDirect3DSurface9_UnlockRect(surface);
ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x.\n", hr);
--
1.7.12.4 (Apple Git-37)
More information about the wine-patches
mailing list