PICO park depends on that.
From: Paul Gofman pgofman@codeweavers.com
--- dlls/d3d8/tests/device.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c index 4f362ad5ea5..12d8aeb89f6 100644 --- a/dlls/d3d8/tests/device.c +++ b/dlls/d3d8/tests/device.c @@ -413,9 +413,10 @@ static void test_swapchain(void) ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); ok(d3dpp.BackBufferCount == 1, "The back buffer count in the presentparams struct is %d\n", d3dpp.BackBufferCount);
+ d3dpp.hDeviceWindow = NULL; d3dpp.BackBufferCount = 1; hr = IDirect3DDevice8_CreateAdditionalSwapChain(device, &d3dpp, &swapchain2); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr);
d3dpp.BackBufferCount = 2; hr = IDirect3DDevice8_CreateAdditionalSwapChain(device, &d3dpp, &swapchain3); @@ -8714,6 +8715,7 @@ static void test_swapchain_parameters(void) present_parameters_windowed.Windowed = TRUE; present_parameters_windowed.BackBufferCount = 1;
+ for (i = 0; i < ARRAY_SIZE(tests); ++i) { UINT bb_count = tests[i].backbuffer_count ? tests[i].backbuffer_count : 1; @@ -8721,7 +8723,7 @@ static void test_swapchain_parameters(void) memset(&present_parameters, 0, sizeof(present_parameters)); present_parameters.BackBufferWidth = registry_mode.dmPelsWidth; present_parameters.BackBufferHeight = registry_mode.dmPelsHeight; - present_parameters.hDeviceWindow = window; + present_parameters.hDeviceWindow = NULL; present_parameters.BackBufferFormat = D3DFMT_X8R8G8B8;
present_parameters.SwapEffect = tests[i].swap_effect; @@ -8752,7 +8754,7 @@ static void test_swapchain_parameters(void) memset(&present_parameters, 0, sizeof(present_parameters)); present_parameters.BackBufferWidth = registry_mode.dmPelsWidth; present_parameters.BackBufferHeight = registry_mode.dmPelsHeight; - present_parameters.hDeviceWindow = window; + present_parameters.hDeviceWindow = NULL; present_parameters.BackBufferFormat = D3DFMT_X8R8G8B8;
present_parameters.SwapEffect = tests[i].swap_effect;
From: Paul Gofman pgofman@codeweavers.com
--- dlls/d3d9/tests/device.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-)
diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c index dbdce1e5871..a58a91555f1 100644 --- a/dlls/d3d9/tests/device.c +++ b/dlls/d3d9/tests/device.c @@ -1348,9 +1348,13 @@ static void test_swapchain(void) ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); ok(d3dpp.BackBufferCount == 1, "The back buffer count in the presentparams struct is %d\n", d3dpp.BackBufferCount);
+ d3dpp.hDeviceWindow = NULL; d3dpp.BackBufferCount = 1; hr = IDirect3DDevice9_CreateAdditionalSwapChain(device, &d3dpp, &swapchain2); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DSwapChain9_GetPresentParameters(swapchain2, &d3dpp); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + todo_wine ok(d3dpp.hDeviceWindow == window, "Got window %p, expected %p.\n", d3dpp.hDeviceWindow, window);
d3dpp.BackBufferCount = 2; hr = IDirect3DDevice9_CreateAdditionalSwapChain(device, &d3dpp, &swapchain3); @@ -12206,7 +12210,7 @@ static void test_swapchain_parameters(void)
present_parameters_windowed.BackBufferWidth = registry_mode.dmPelsWidth; present_parameters_windowed.BackBufferHeight = registry_mode.dmPelsHeight; - present_parameters_windowed.hDeviceWindow = window; + present_parameters_windowed.hDeviceWindow = NULL; present_parameters_windowed.BackBufferFormat = D3DFMT_X8R8G8B8; present_parameters_windowed.SwapEffect = D3DSWAPEFFECT_COPY; present_parameters_windowed.Windowed = TRUE; @@ -12217,7 +12221,7 @@ static void test_swapchain_parameters(void) memset(&present_parameters, 0, sizeof(present_parameters)); present_parameters.BackBufferWidth = registry_mode.dmPelsWidth; present_parameters.BackBufferHeight = registry_mode.dmPelsHeight; - present_parameters.hDeviceWindow = window; + present_parameters.hDeviceWindow = NULL; present_parameters.BackBufferFormat = D3DFMT_X8R8G8B8;
present_parameters.SwapEffect = tests[i].swap_effect; @@ -12235,7 +12239,9 @@ static void test_swapchain_parameters(void) ok(SUCCEEDED(hr), "Failed to get swapchain, hr %#lx, test %u.\n", hr, i);
hr = IDirect3DSwapChain9_GetPresentParameters(swapchain, &present_parameters2); - ok(SUCCEEDED(hr), "Failed to get present parameters, hr %#lx, test %u.\n", hr, i); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + todo_wine ok(present_parameters2.hDeviceWindow == window, "Got window %p, expected %p.\n", + present_parameters2.hDeviceWindow, window); ok(present_parameters2.SwapEffect == tests[i].swap_effect, "Swap effect changed from %u to %u, test %u.\n", tests[i].swap_effect, present_parameters2.SwapEffect, i); ok(present_parameters2.BackBufferCount == bb_count, "Backbuffer count changed from %u to %u, test %u.\n", @@ -12254,7 +12260,7 @@ static void test_swapchain_parameters(void) memset(&present_parameters, 0, sizeof(present_parameters)); present_parameters.BackBufferWidth = registry_mode.dmPelsWidth; present_parameters.BackBufferHeight = registry_mode.dmPelsHeight; - present_parameters.hDeviceWindow = window; + present_parameters.hDeviceWindow = NULL; present_parameters.BackBufferFormat = D3DFMT_X8R8G8B8;
present_parameters.SwapEffect = tests[i].swap_effect; @@ -12266,9 +12272,18 @@ static void test_swapchain_parameters(void)
if (FAILED(hr)) { + present_parameters_windowed.hDeviceWindow = NULL; hr = IDirect3DDevice9_Reset(device, &present_parameters_windowed); ok(SUCCEEDED(hr), "Failed to reset device, hr %#lx, test %u.\n", hr, i); } + + hr = IDirect3DDevice9_GetSwapChain(device, 0, &swapchain); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DSwapChain9_GetPresentParameters(swapchain, &present_parameters2); + ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + todo_wine ok(present_parameters2.hDeviceWindow == window, "Got window %p, expected %p.\n", + present_parameters2.hDeviceWindow, window); + IDirect3DSwapChain9_Release(swapchain); IDirect3DDevice9_Release(device); }
From: Paul Gofman pgofman@codeweavers.com
--- dlls/d3d9/tests/device.c | 6 +++--- dlls/wined3d/device.c | 10 ++++++---- dlls/wined3d/swapchain.c | 8 +++++++- 3 files changed, 16 insertions(+), 8 deletions(-)
diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c index a58a91555f1..cd4d30eadb6 100644 --- a/dlls/d3d9/tests/device.c +++ b/dlls/d3d9/tests/device.c @@ -1354,7 +1354,7 @@ static void test_swapchain(void) ok(hr == D3D_OK, "Got hr %#lx.\n", hr); hr = IDirect3DSwapChain9_GetPresentParameters(swapchain2, &d3dpp); ok(hr == D3D_OK, "Got hr %#lx.\n", hr); - todo_wine ok(d3dpp.hDeviceWindow == window, "Got window %p, expected %p.\n", d3dpp.hDeviceWindow, window); + ok(d3dpp.hDeviceWindow == window, "Got window %p, expected %p.\n", d3dpp.hDeviceWindow, window);
d3dpp.BackBufferCount = 2; hr = IDirect3DDevice9_CreateAdditionalSwapChain(device, &d3dpp, &swapchain3); @@ -12240,7 +12240,7 @@ static void test_swapchain_parameters(void)
hr = IDirect3DSwapChain9_GetPresentParameters(swapchain, &present_parameters2); ok(hr == D3D_OK, "Got hr %#lx.\n", hr); - todo_wine ok(present_parameters2.hDeviceWindow == window, "Got window %p, expected %p.\n", + ok(present_parameters2.hDeviceWindow == window, "Got window %p, expected %p.\n", present_parameters2.hDeviceWindow, window); ok(present_parameters2.SwapEffect == tests[i].swap_effect, "Swap effect changed from %u to %u, test %u.\n", tests[i].swap_effect, present_parameters2.SwapEffect, i); @@ -12281,7 +12281,7 @@ static void test_swapchain_parameters(void) ok(hr == D3D_OK, "Got hr %#lx.\n", hr); hr = IDirect3DSwapChain9_GetPresentParameters(swapchain, &present_parameters2); ok(hr == D3D_OK, "Got hr %#lx.\n", hr); - todo_wine ok(present_parameters2.hDeviceWindow == window, "Got window %p, expected %p.\n", + ok(present_parameters2.hDeviceWindow == window, "Got window %p, expected %p.\n", present_parameters2.hDeviceWindow, window); IDirect3DSwapChain9_Release(swapchain); IDirect3DDevice9_Release(device); diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index e214c47f071..6629211d6dc 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -5582,6 +5582,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, struct wined3d_view_desc view_desc; BOOL backbuffer_resized, windowed; HRESULT hr = WINED3D_OK; + HWND device_window; unsigned int i;
TRACE("device %p, swapchain_desc %p, mode %p, callback %p, reset_state %#x.\n", @@ -5658,12 +5659,13 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, current_desc->refresh_rate = swapchain_desc->refresh_rate; current_desc->auto_restore_display_mode = swapchain_desc->auto_restore_display_mode;
- if (swapchain_desc->device_window && swapchain_desc->device_window != current_desc->device_window) + device_window = swapchain_desc->device_window ? swapchain_desc->device_window : device->create_parms.focus_window; + if (device_window && device_window != current_desc->device_window) { TRACE("Changing the device window from %p to %p.\n", - current_desc->device_window, swapchain_desc->device_window); - current_desc->device_window = swapchain_desc->device_window; - swapchain_state->device_window = swapchain_desc->device_window; + current_desc->device_window, device_window); + current_desc->device_window = device_window; + swapchain_state->device_window = device_window; wined3d_swapchain_set_window(swapchain, NULL); }
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index 80e630fd41e..e40707c0e54 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -1459,7 +1459,13 @@ static HRESULT wined3d_swapchain_init(struct wined3d_swapchain *swapchain, struc && desc->swap_effect != WINED3D_SWAP_EFFECT_COPY) FIXME("Unimplemented swap effect %#x.\n", desc->swap_effect);
- window = desc->device_window ? desc->device_window : device->create_parms.focus_window; + if (!desc->device_window) + { + TRACE("Updating device_window to %p.\n", device->create_parms.focus_window); + desc->device_window = device->create_parms.focus_window; + } + window = desc->device_window; + if (FAILED(hr = wined3d_swapchain_state_init(&swapchain->state, desc, window, device->wined3d, state_parent))) { ERR("Failed to initialise swapchain state, hr %#x.\n", hr);
That looks fine, although modifying the passed descriptor is a little surprising. I'm less familiar with d3d9 conventions, so if @zfigura approves, I'm not objecting, but maybe we could only change the descriptor stored in `struct wined3d_swapchain_state`, and if it needs to be updated up the stack, call `wined3d_swapchain_get_desc`?
That looks fine, although modifying the passed descriptor is a little surprising. I'm less familiar with d3d9 conventions, so if @zfigura approves, I'm not objecting, but maybe we could only change the descriptor stored in `struct wined3d_swapchain_state`, and if it needs to be updated up the stack, call `wined3d_swapchain_get_desc`?
It mostly follows the (public) d3d8/d3d9 convention. See also e.g. `d3d9_device_CreateAdditionalSwapChain()`. It would probably make sense to not do that in wined3d though.
This merge request was approved by Zebediah Figura.