From: Conor McCarthy Subject: [PATCH 2/6] wined3d: Refactor swapchain creation and cleanup. Message-Id: <20191008041354.61092-2-cmccarthy@codeweavers.com> Date: Tue, 8 Oct 2019 14:13:50 +1000 In-Reply-To: <20191008041354.61092-1-cmccarthy@codeweavers.com> References: <20191008041354.61092-1-cmccarthy@codeweavers.com> For D3D12 use in dxgi. Signed-off-by: Conor McCarthy --- dlls/wined3d/swapchain.c | 84 ++++++++++++++++++++++------------ dlls/wined3d/wined3d.spec | 4 ++ dlls/wined3d/wined3d_private.h | 2 - include/wine/wined3d.h | 7 +++ 4 files changed, 65 insertions(+), 32 deletions(-) diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index 62bab65f..29e63d0e 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -29,7 +29,6 @@ WINE_DECLARE_DEBUG_CHANNEL(fps); void wined3d_swapchain_cleanup(struct wined3d_swapchain *swapchain) { - HRESULT hr; UINT i; TRACE("Destroying swapchain %p.\n", swapchain); @@ -61,30 +60,39 @@ void wined3d_swapchain_cleanup(struct wined3d_swapchain *swapchain) swapchain->back_buffers = NULL; } + wined3d_swapchain_state_cleanup_fullscreen(&swapchain->state, swapchain->device->wined3d, + swapchain->device->adapter->ordinal, swapchain->device); +} + +void CDECL wined3d_swapchain_state_cleanup_fullscreen(struct wined3d_swapchain_state *state, + struct wined3d *wined3d, unsigned int adapter_idx, struct wined3d_device *device) +{ + HRESULT hr; + /* Restore the screen resolution if we rendered in fullscreen. * This will restore the screen resolution to what it was before creating * the swapchain. In case of d3d8 and d3d9 this will be the original * desktop resolution. In case of d3d7 this will be a NOP because ddraw * sets the resolution before starting up Direct3D, thus orig_width and * orig_height will be equal to the modes in the presentation params. */ - if (!swapchain->state.desc.windowed) + if (!state->desc.windowed) { - if (swapchain->state.desc.auto_restore_display_mode) + if (state->desc.auto_restore_display_mode) { - if (FAILED(hr = wined3d_set_adapter_display_mode(swapchain->device->wined3d, - swapchain->device->adapter->ordinal, &swapchain->state.original_mode))) + if (FAILED(hr = wined3d_set_adapter_display_mode(wined3d, adapter_idx, &state->original_mode))) ERR("Failed to restore display mode, hr %#x.\n", hr); - if (swapchain->state.desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT) + if (state->desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT) { - wined3d_swapchain_state_restore_from_fullscreen(&swapchain->state, - swapchain->state.device_window, &swapchain->state.original_window_rect); - wined3d_device_release_focus_window(swapchain->device); + wined3d_swapchain_state_restore_from_fullscreen(state, + state->device_window, &state->original_window_rect); + if (device) + wined3d_device_release_focus_window(device); } } else { - wined3d_swapchain_state_restore_from_fullscreen(&swapchain->state, swapchain->state.device_window, NULL); + wined3d_swapchain_state_restore_from_fullscreen(state, state->device_window, NULL); } } } @@ -809,7 +817,6 @@ static HRESULT wined3d_swapchain_init(struct wined3d_swapchain *swapchain, struc struct wined3d_resource_desc texture_desc; BOOL displaymode_set = FALSE; DWORD texture_flags = 0; - RECT client_rect; unsigned int i; HWND window; HRESULT hr; @@ -840,27 +847,9 @@ static HRESULT wined3d_swapchain_init(struct wined3d_swapchain *swapchain, struc swapchain->swap_interval = WINED3D_SWAP_INTERVAL_DEFAULT; swapchain_set_max_frame_latency(swapchain, device); - GetClientRect(window, &client_rect); if (desc->windowed) { - TRACE("Client rect %s.\n", wine_dbgstr_rect(&client_rect)); - - if (!desc->backbuffer_width) - { - desc->backbuffer_width = client_rect.right ? client_rect.right : 8; - TRACE("Updating width to %u.\n", desc->backbuffer_width); - } - if (!desc->backbuffer_height) - { - desc->backbuffer_height = client_rect.bottom ? client_rect.bottom : 8; - TRACE("Updating height to %u.\n", desc->backbuffer_height); - } - - if (desc->backbuffer_format == WINED3DFMT_UNKNOWN) - { - desc->backbuffer_format = swapchain->state.original_mode.format_id; - TRACE("Updating format to %s.\n", debug_d3dformat(swapchain->state.original_mode.format_id)); - } + wined3d_swapchain_desc_set_backbuffer_defaults(desc, window, device->wined3d, adapter->ordinal); } else { @@ -1378,6 +1367,41 @@ HRESULT CDECL wined3d_swapchain_resize_buffers(struct wined3d_swapchain *swapcha return WINED3D_OK; } +void CDECL wined3d_swapchain_desc_set_backbuffer_defaults(struct wined3d_swapchain_desc *desc, + HWND window, const struct wined3d *wined3d, unsigned int adapter_idx) +{ + struct wined3d_display_mode mode; + RECT client_rect; + HRESULT hr; + + GetClientRect(window, &client_rect); + TRACE("Client rect %s.\n", wine_dbgstr_rect(&client_rect)); + + if (!desc->backbuffer_width) + { + desc->backbuffer_width = client_rect.right ? client_rect.right : 8; + TRACE("Updating width to %u.\n", desc->backbuffer_width); + } + if (!desc->backbuffer_height) + { + desc->backbuffer_height = client_rect.bottom ? client_rect.bottom : 8; + TRACE("Updating height to %u.\n", desc->backbuffer_height); + } + + if (desc->backbuffer_format == WINED3DFMT_UNKNOWN) + { + if (FAILED(hr = wined3d_get_adapter_display_mode(wined3d, adapter_idx, &mode, NULL))) + { + WARN("Failed to get current display mode, hr %#x.\n", hr); + } + else + { + desc->backbuffer_format = mode.format_id; + TRACE("Updating format to %s.\n", debug_d3dformat(mode.format_id)); + } + } +} + static HRESULT wined3d_swapchain_state_set_display_mode(struct wined3d_swapchain_state *state, struct wined3d *wined3d, unsigned int adapter_idx, struct wined3d_display_mode *mode) { diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index b65681f2..2fbf21b7 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -286,10 +286,14 @@ @ cdecl wined3d_swapchain_set_palette(ptr ptr) @ cdecl wined3d_swapchain_set_window(ptr ptr) +@ cdecl wined3d_swapchain_desc_set_backbuffer_defaults(ptr ptr) + +@ cdecl wined3d_swapchain_state_cleanup_fullscreen(ptr ptr long ptr) @ cdecl wined3d_swapchain_state_create(ptr ptr ptr long ptr) @ cdecl wined3d_swapchain_state_destroy(ptr) @ cdecl wined3d_swapchain_state_resize_target(ptr ptr long ptr) @ cdecl wined3d_swapchain_state_set_fullscreen(ptr ptr ptr long ptr) +@ cdecl wined3d_swapchain_state_setup_fullscreen(ptr ptr long long) @ cdecl wined3d_texture_add_dirty_region(ptr long ptr) @ cdecl wined3d_texture_blt(ptr long ptr ptr long ptr long ptr long) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 307f7a42..bc853875 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -4439,8 +4439,6 @@ struct wined3d_swapchain_state void wined3d_swapchain_state_restore_from_fullscreen(struct wined3d_swapchain_state *state, HWND window, const RECT *window_rect) DECLSPEC_HIDDEN; -HRESULT wined3d_swapchain_state_setup_fullscreen(struct wined3d_swapchain_state *state, - HWND window, unsigned int w, unsigned int h) DECLSPEC_HIDDEN; struct wined3d_swapchain_ops { diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index f79cd212..69000fe4 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2706,11 +2706,18 @@ HRESULT __cdecl wined3d_swapchain_set_gamma_ramp(const struct wined3d_swapchain void __cdecl wined3d_swapchain_set_palette(struct wined3d_swapchain *swapchain, struct wined3d_palette *palette); void __cdecl wined3d_swapchain_set_window(struct wined3d_swapchain *swapchain, HWND window); +void __cdecl wined3d_swapchain_desc_set_backbuffer_defaults(struct wined3d_swapchain_desc *desc, + HWND window, const struct wined3d *wined3d, unsigned int adapter_idx); + +void __cdecl wined3d_swapchain_state_cleanup_fullscreen(struct wined3d_swapchain_state *state, + struct wined3d *wined3d, unsigned int adapter_idx, struct wined3d_device *device); HRESULT __cdecl wined3d_swapchain_state_create(const struct wined3d_swapchain_desc *desc, HWND window, struct wined3d *wined3d, unsigned int adapter_idx, struct wined3d_swapchain_state **state); void __cdecl wined3d_swapchain_state_destroy(struct wined3d_swapchain_state *state); HRESULT __cdecl wined3d_swapchain_state_resize_target(struct wined3d_swapchain_state *state, struct wined3d *wined3d, unsigned int adapter_idx, const struct wined3d_display_mode *mode); +HRESULT wined3d_swapchain_state_setup_fullscreen(struct wined3d_swapchain_state *state, + HWND window, unsigned int w, unsigned int h); HRESULT __cdecl wined3d_swapchain_state_set_fullscreen(struct wined3d_swapchain_state *state, const struct wined3d_swapchain_desc *desc, struct wined3d *wined3d, unsigned int adapter_idx, const struct wined3d_display_mode *mode); -- 2.23.0