Module: wine Branch: master Commit: d50350886a3e15da29f29f7b3fb539e19a80d6d2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d50350886a3e15da29f29f7b3f...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Fri Jun 27 08:27:00 2014 +0200
d3d9: Check the device status in present calls.
---
dlls/d3d9/device.c | 6 ++++++ dlls/d3d9/swapchain.c | 4 ++++ dlls/d3d9/tests/d3d9ex.c | 4 ++-- dlls/d3d9/tests/device.c | 4 ++-- 4 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index 57ad1e7..2d9a192 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -646,6 +646,9 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d9_device_Present(IDirect3DDevice9Ex * TRACE("iface %p, src_rect %p, dst_rect %p, dst_window_override %p, dirty_region %p.\n", iface, src_rect, dst_rect, dst_window_override, dirty_region);
+ if (device->device_state != D3D9_DEVICE_STATE_OK) + return device->d3d_parent->extended ? S_PRESENT_OCCLUDED : D3DERR_DEVICELOST; + wined3d_mutex_lock(); hr = wined3d_device_present(device->wined3d_device, src_rect, dst_rect, dst_window_override, dirty_region, 0); @@ -3085,6 +3088,9 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d9_device_PresentEx(IDirect3DDevice9Ex iface, wine_dbgstr_rect(src_rect), wine_dbgstr_rect(dst_rect), dst_window_override, dirty_region, flags);
+ if (device->device_state != D3D9_DEVICE_STATE_OK) + return S_PRESENT_OCCLUDED; + wined3d_mutex_lock(); hr = wined3d_device_present(device->wined3d_device, src_rect, dst_rect, dst_window_override, dirty_region, flags); diff --git a/dlls/d3d9/swapchain.c b/dlls/d3d9/swapchain.c index d44b449..5cf56d2 100644 --- a/dlls/d3d9/swapchain.c +++ b/dlls/d3d9/swapchain.c @@ -115,12 +115,16 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d9_swapchain_Present(IDirect3DSwapChai const RGNDATA *dirty_region, DWORD flags) { struct d3d9_swapchain *swapchain = impl_from_IDirect3DSwapChain9Ex(iface); + struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(swapchain->parent_device); HRESULT hr;
TRACE("iface %p, src_rect %s, dst_rect %s, dst_window_override %p, dirty_region %p, flags %#x.\n", iface, wine_dbgstr_rect(src_rect), wine_dbgstr_rect(dst_rect), dst_window_override, dirty_region, flags);
+ if (device->device_state != D3D9_DEVICE_STATE_OK) + return device->d3d_parent->extended ? S_PRESENT_OCCLUDED : D3DERR_DEVICELOST; + wined3d_mutex_lock(); hr = wined3d_swapchain_present(swapchain->wined3d_swapchain, src_rect, dst_rect, dst_window_override, dirty_region, flags); diff --git a/dlls/d3d9/tests/d3d9ex.c b/dlls/d3d9/tests/d3d9ex.c index 07d1c06..89238c8 100644 --- a/dlls/d3d9/tests/d3d9ex.c +++ b/dlls/d3d9/tests/d3d9ex.c @@ -1226,9 +1226,9 @@ static void test_lost_device(void) hr = IDirect3DDevice9Ex_TestCooperativeLevel(device); ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); hr = IDirect3DDevice9Ex_Present(device, NULL, NULL, NULL, NULL); - todo_wine ok(hr == S_PRESENT_OCCLUDED, "Got unexpected hr %#x.\n", hr); + ok(hr == S_PRESENT_OCCLUDED, "Got unexpected hr %#x.\n", hr); hr = IDirect3DDevice9Ex_PresentEx(device, NULL, NULL, NULL, NULL, 0); - todo_wine ok(hr == S_PRESENT_OCCLUDED, "Got unexpected hr %#x.\n", hr); + ok(hr == S_PRESENT_OCCLUDED, "Got unexpected hr %#x.\n", hr); hr = IDirect3DDevice9Ex_CheckDeviceState(device, window); todo_wine ok(hr == S_PRESENT_OCCLUDED, "Got unexpected hr %#x.\n", hr); hr = IDirect3DDevice9Ex_CheckDeviceState(device, NULL); diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c index edf3fa8..b11771f 100644 --- a/dlls/d3d9/tests/device.c +++ b/dlls/d3d9/tests/device.c @@ -8932,7 +8932,7 @@ static void test_lost_device(void) hr = IDirect3DDevice9_TestCooperativeLevel(device); ok(hr == D3DERR_DEVICELOST, "Got unexpected hr %#x.\n", hr); hr = IDirect3DDevice9_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"); @@ -8941,7 +8941,7 @@ static void test_lost_device(void) hr = IDirect3DDevice9_TestCooperativeLevel(device); ok(hr == D3DERR_DEVICENOTRESET, "Got unexpected hr %#x.\n", hr); hr = IDirect3DDevice9_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);