Module: wine Branch: master Commit: eba2523ac1de177f6a3fc09111a4a65fad4e63ac URL: https://gitlab.winehq.org/wine/wine/-/commit/eba2523ac1de177f6a3fc09111a4a65...
Author: Stefan Dösinger stefan@codeweavers.com Date: Thu Aug 10 18:57:27 2023 +0300
dxgi: Read back the swapchain size assigned by wined3d.
---
dlls/dxgi/swapchain.c | 9 ++++++--- dlls/wined3d/swapchain.c | 9 +++++++++ dlls/wined3d/wined3d.spec | 1 + include/wine/wined3d.h | 2 ++ 4 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index d567056062e..1bb99ef4233 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -873,6 +873,7 @@ static HRESULT d3d11_swapchain_create_d3d11_textures(struct d3d11_swapchain *swa HRESULT d3d11_swapchain_init(struct d3d11_swapchain *swapchain, struct dxgi_device *device, struct wined3d_swapchain_desc *desc) { + struct wined3d_swapchain_state *state; BOOL fullscreen; HRESULT hr;
@@ -907,6 +908,9 @@ HRESULT d3d11_swapchain_init(struct d3d11_swapchain *swapchain, struct dxgi_devi goto cleanup; }
+ state = wined3d_swapchain_get_state(swapchain->wined3d_swapchain); + wined3d_swapchain_state_get_size(state, &desc->backbuffer_width, &desc->backbuffer_height); + if (FAILED(hr = d3d11_swapchain_create_d3d11_textures(swapchain, &device->IWineDXGIDevice_iface, desc))) { ERR("Failed to create d3d11 textures, hr %#lx.\n", hr); @@ -916,10 +920,7 @@ HRESULT d3d11_swapchain_init(struct d3d11_swapchain *swapchain, struct dxgi_devi swapchain->target = NULL; if (fullscreen) { - struct wined3d_swapchain_state *state; - desc->windowed = FALSE; - state = wined3d_swapchain_get_state(swapchain->wined3d_swapchain);
if (FAILED(hr = IDXGISwapChain1_GetContainingOutput(&swapchain->IDXGISwapChain1_iface, &swapchain->target))) @@ -3130,6 +3131,8 @@ static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IWineDXGI return hr; }
+ wined3d_swapchain_state_get_size(swapchain->state, &swapchain->desc.Width, &swapchain->desc.Height); + if (fullscreen) { wined3d_desc.windowed = FALSE; diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index f8179e2a70d..274f0d40eef 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -2427,6 +2427,15 @@ BOOL CDECL wined3d_swapchain_state_is_windowed(const struct wined3d_swapchain_st return state->desc.windowed; }
+void CDECL wined3d_swapchain_state_get_size(const struct wined3d_swapchain_state *state, + unsigned int *width, unsigned int *height) +{ + TRACE("state %p.\n", state); + + *width = state->desc.backbuffer_width; + *height = state->desc.backbuffer_height; +} + void CDECL wined3d_swapchain_state_destroy(struct wined3d_swapchain_state *state) { wined3d_swapchain_state_cleanup(state); diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 39a0dd3a299..3094fac6f3c 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -292,6 +292,7 @@
@ cdecl wined3d_swapchain_state_create(ptr ptr ptr ptr ptr) @ cdecl wined3d_swapchain_state_destroy(ptr) +@ cdecl wined3d_swapchain_state_get_size(ptr ptr ptr) @ cdecl wined3d_swapchain_state_is_windowed(ptr) @ cdecl wined3d_swapchain_state_resize_target(ptr ptr) @ cdecl wined3d_swapchain_state_set_fullscreen(ptr ptr ptr) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 2317dc17078..230eb1a8744 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2854,6 +2854,8 @@ HRESULT __cdecl wined3d_swapchain_state_create(const struct wined3d_swapchain_de HWND window, struct wined3d *wined3d, struct wined3d_swapchain_state_parent *state_parent, struct wined3d_swapchain_state **state); void __cdecl wined3d_swapchain_state_destroy(struct wined3d_swapchain_state *state); +void __cdecl wined3d_swapchain_state_get_size(const struct wined3d_swapchain_state *state, + unsigned int *width, unsigned int *height); BOOL __cdecl wined3d_swapchain_state_is_windowed(const struct wined3d_swapchain_state *state); HRESULT __cdecl wined3d_swapchain_state_resize_target(struct wined3d_swapchain_state *state, const struct wined3d_display_mode *mode);