diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index 097b05f2919..5d1d292d898 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -3455,6 +3455,15 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d9_device_ResetEx(IDirect3DDevice9Ex * return D3DERR_INVALIDCALL; } + if (mode && (mode->Width != present_parameters->BackBufferWidth + || mode->Height != present_parameters->BackBufferHeight)) + { + WARN("Mode and back buffer mismatch (mode %ux%u, backbuffer %ux%u).\n", + mode->Width, mode->Height, + present_parameters->BackBufferWidth, present_parameters->BackBufferHeight); + return D3DERR_INVALIDCALL; + } + return d3d9_device_reset(device, present_parameters, mode); } diff --git a/dlls/d3d9/tests/d3d9ex.c b/dlls/d3d9/tests/d3d9ex.c index 63e9a30b1ef..05f1580a001 100644 --- a/dlls/d3d9/tests/d3d9ex.c +++ b/dlls/d3d9/tests/d3d9ex.c @@ -1563,15 +1563,26 @@ static void test_reset_ex(void) d3dpp.BackBufferWidth = modes[i].Width - 10; d3dpp.BackBufferHeight = modes[i].Height - 10; hr = IDirect3DDevice9Ex_ResetEx(device, &d3dpp, &modes[i]); - todo_wine ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr); + ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr); d3dpp.BackBufferWidth = modes[i].Width - 1; d3dpp.BackBufferHeight = modes[i].Height; hr = IDirect3DDevice9Ex_ResetEx(device, &d3dpp, &modes[i]); - todo_wine ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr); + ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr); d3dpp.BackBufferWidth = modes[i].Width; d3dpp.BackBufferHeight = modes[i].Height - 1; hr = IDirect3DDevice9Ex_ResetEx(device, &d3dpp, &modes[i]); - todo_wine ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr); + ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr); + d3dpp.BackBufferWidth = 0; + d3dpp.BackBufferHeight = 0; + hr = IDirect3DDevice9Ex_ResetEx(device, &d3dpp, &modes[i]); + ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr); + d3dpp.BackBufferWidth = modes[i].Width; + d3dpp.BackBufferHeight = modes[i].Height; + mode2 = modes[i]; + mode2.Width = 0; + mode2.Height = 0; + hr = IDirect3DDevice9Ex_ResetEx(device, &d3dpp, &mode2); + ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x.\n", hr); hr = IDirect3DDevice9Ex_TestCooperativeLevel(device); ok(hr == D3D_OK, "Got unexpected cooperative level %#x.\n", hr);