From ee7eee5511ce6badec5b383023b1cb739c829089 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Mon, 30 Jun 2014 11:17:02 +0200 Subject: [PATCH] d3d8: Check the device status in present calls. --- 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 b3aefe12223..fd4cd3c56aa 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 e9f49760acb..067a3e00bd1 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 9100ebfd38d..971ef91aca7 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);