[PATCH 3/5] d3d8: Check the device status in present calls.

Henri Verbeet hverbeet at codeweavers.com
Mon Jun 30 04:17:02 CDT 2014


---
 dlls/d3d8/device.c       |    3 +++
 dlls/d3d8/swapchain.c    |    4 ++++
 dlls/d3d8/tests/device.c |    4 ++--
 3 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index b3aefe1..fd4cd3c 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -661,6 +661,9 @@ static HRESULT WINAPI d3d8_device_Present(IDirect3DDevice8 *iface, const RECT *s
     TRACE("iface %p, src_rect %s, dst_rect %s, dst_window_override %p, dirty_region %p.\n",
             iface, wine_dbgstr_rect(src_rect), wine_dbgstr_rect(dst_rect), dst_window_override, dirty_region);
 
+    if (device->device_state != D3D8_DEVICE_STATE_OK)
+        return D3DERR_DEVICELOST;
+
     wined3d_mutex_lock();
     hr = wined3d_device_present(device->wined3d_device, src_rect, dst_rect,
             dst_window_override, dirty_region, 0);
diff --git a/dlls/d3d8/swapchain.c b/dlls/d3d8/swapchain.c
index e9f4976..067a3e0 100644
--- a/dlls/d3d8/swapchain.c
+++ b/dlls/d3d8/swapchain.c
@@ -91,11 +91,15 @@ static HRESULT WINAPI d3d8_swapchain_Present(IDirect3DSwapChain8 *iface,
         const RGNDATA *dirty_region)
 {
     struct d3d8_swapchain *swapchain = impl_from_IDirect3DSwapChain8(iface);
+    struct d3d8_device *device = impl_from_IDirect3DDevice8(swapchain->parent_device);
     HRESULT hr;
 
     TRACE("iface %p, src_rect %s, dst_rect %s, dst_window_override %p, dirty_region %p.\n",
             iface, wine_dbgstr_rect(src_rect), wine_dbgstr_rect(dst_rect), dst_window_override, dirty_region);
 
+    if (device->device_state != D3D8_DEVICE_STATE_OK)
+        return D3DERR_DEVICELOST;
+
     wined3d_mutex_lock();
     hr = wined3d_swapchain_present(swapchain->wined3d_swapchain, src_rect,
             dst_rect, dst_window_override, dirty_region, 0);
diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c
index 9100ebf..971ef91 100644
--- a/dlls/d3d8/tests/device.c
+++ b/dlls/d3d8/tests/device.c
@@ -6283,7 +6283,7 @@ static void test_lost_device(void)
     hr = IDirect3DDevice8_TestCooperativeLevel(device);
     ok(hr == D3DERR_DEVICELOST, "Got unexpected hr %#x.\n", hr);
     hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
-    todo_wine ok(hr == D3DERR_DEVICELOST, "Got unexpected hr %#x.\n", hr);
+    ok(hr == D3DERR_DEVICELOST, "Got unexpected hr %#x.\n", hr);
 
     ret = ShowWindow(window, SW_RESTORE);
     ok(ret, "Failed to restore window.\n");
@@ -6292,7 +6292,7 @@ static void test_lost_device(void)
     hr = IDirect3DDevice8_TestCooperativeLevel(device);
     ok(hr == D3DERR_DEVICENOTRESET, "Got unexpected hr %#x.\n", hr);
     hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
-    todo_wine ok(hr == D3DERR_DEVICELOST, "Got unexpected hr %#x.\n", hr);
+    ok(hr == D3DERR_DEVICELOST, "Got unexpected hr %#x.\n", hr);
 
     hr = reset_device(device, window, FALSE);
     ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
-- 
1.7.10.4




More information about the wine-patches mailing list