From: Stefan Dösinger Subject: [PATCH 2/5] d3d8: Refuse to reset a lost device. Message-Id: <1417169803-30971-2-git-send-email-stefan@codeweavers.com> Date: Fri, 28 Nov 2014 11:16:40 +0100 --- dlls/d3d8/device.c | 7 +++++++ dlls/d3d8/tests/device.c | 11 +++++++++++ 2 files changed, 18 insertions(+) diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index 4c17e7c..a9dc8ec 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -647,6 +647,13 @@ static HRESULT WINAPI d3d8_device_Reset(IDirect3DDevice8 *iface, TRACE("iface %p, present_parameters %p.\n", iface, present_parameters); + if (InterlockedCompareExchange(&device->device_state, D3D8_DEVICE_STATE_LOST, + D3D8_DEVICE_STATE_LOST) == D3D8_DEVICE_STATE_LOST) + { + WARN("App not active, returning D3DERR_DEVICELOST.\n"); + return D3DERR_DEVICELOST; + } + wined3d_mutex_lock(); if (device->vertex_buffer) diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c index 6a4dcc2..33d3cd5 100644 --- a/dlls/d3d8/tests/device.c +++ b/dlls/d3d8/tests/device.c @@ -6863,6 +6863,17 @@ static void test_lost_device(void) hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL); todo_wine ok(hr == D3DERR_DEVICELOST, "Got unexpected hr %#x.\n", hr); + ret = SetForegroundWindow(GetDesktopWindow()); + ok(ret, "Failed to set foreground window.\n"); + hr = reset_device(device, &device_desc); + ok(hr == D3DERR_DEVICELOST, "Got unexpected hr %#x.\n", hr); + ret = ShowWindow(window, SW_RESTORE); + ok(ret, "Failed to restore window.\n"); + ret = SetForegroundWindow(window); + ok(ret, "Failed to set foreground window.\n"); + hr = reset_device(device, &device_desc); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + refcount = IDirect3DDevice8_Release(device); ok(!refcount, "Device has %u references left.\n", refcount); done: -- 2.0.4