From: Zhiyi Zhang <zzhang@codeweavers.com> --- dlls/dxgi/swapchain.c | 13 +++++++++++-- dlls/dxgi/tests/dxgi.c | 14 ++++++-------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index a5811b9b4cc..1186527d899 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -2611,13 +2611,18 @@ static HRESULT d3d12_swapchain_op_resize_buffers_execute(struct d3d12_swapchain static HRESULT d3d12_swapchain_resize_buffers(struct d3d12_swapchain *swapchain, UINT buffer_count, UINT width, UINT height, DXGI_FORMAT format, UINT flags) { + static const UINT supported_flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH + | DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT; DXGI_SWAP_CHAIN_DESC1 *desc, new_desc; struct d3d12_swapchain_op *op; unsigned int i; ULONG refcount; - if (flags) - FIXME("Ignoring flags %#x.\n", flags); + if (flags & ~supported_flags) + FIXME("Ignoring flags %#x.\n", flags & ~supported_flags); + + if ((swapchain->desc.Flags ^ flags) & DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT) + return E_INVALIDARG; for (i = 0; i < swapchain->desc.BufferCount; ++i) { @@ -2631,6 +2636,7 @@ static HRESULT d3d12_swapchain_resize_buffers(struct d3d12_swapchain *swapchain, desc = &swapchain->desc; new_desc = swapchain->desc; + new_desc.Flags = flags; if (buffer_count) new_desc.BufferCount = buffer_count; @@ -2662,6 +2668,9 @@ static HRESULT d3d12_swapchain_resize_buffers(struct d3d12_swapchain *swapchain, && desc->Format == new_desc.Format && desc->BufferCount == new_desc.BufferCount) { swapchain->current_buffer_index = 0; + /* DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE is not applicable on D3D12. So there is no need to + * recreate buffers when the flag gets toggled */ + swapchain->desc.Flags = flags; return S_OK; } diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c index d8c560b89c4..8470ee0ea92 100644 --- a/dlls/dxgi/tests/dxgi.c +++ b/dlls/dxgi/tests/dxgi.c @@ -4758,7 +4758,7 @@ static void test_swapchain_resize(IUnknown *device, BOOL is_d3d12) || flag == DXGI_SWAP_CHAIN_FLAG_YUV_VIDEO || flag == DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING) { - todo_wine_if(is_d3d12 || flag != DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT) + todo_wine_if(flag != DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT) ok(hr == E_INVALIDARG, "Got unexpected hr %#lx.\n", hr); } else @@ -4766,7 +4766,7 @@ static void test_swapchain_resize(IUnknown *device, BOOL is_d3d12) ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); hr = IDXGISwapChain_GetDesc(swapchain, &swapchain_desc); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - todo_wine_if(is_d3d12 || !(flag == DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH + todo_wine_if(!is_d3d12 && !(flag == DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH || flag == DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE)) ok(swapchain_desc.Flags == flag, "Got unexpected Flags %#x.\n", swapchain_desc.Flags); } @@ -4820,7 +4820,7 @@ static void test_swapchain_resize(IUnknown *device, BOOL is_d3d12) || flag == DXGI_SWAP_CHAIN_FLAG_RESTRICTED_TO_ALL_HOLOGRAPHIC_DISPLAYS) ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); else - todo_wine_if(is_d3d12 || flag != DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT) + todo_wine_if(flag != DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT) ok(hr == DXGI_ERROR_INVALID_CALL || hr == E_INVALIDARG, "Got unexpected hr %#lx.\n", hr); IDXGISwapChain_Release(tmp_swapchain); DestroyWindow(swapchain_desc.OutputWindow); @@ -4871,7 +4871,7 @@ static void test_swapchain_resize(IUnknown *device, BOOL is_d3d12) || flag == DXGI_SWAP_CHAIN_FLAG_YUV_VIDEO || flag == DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING) { - todo_wine + todo_wine_if(flag != DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT) ok(hr == E_INVALIDARG, "Got unexpected hr %#lx.\n", hr); } else @@ -4879,7 +4879,6 @@ static void test_swapchain_resize(IUnknown *device, BOOL is_d3d12) ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); hr = IDXGISwapChain_GetDesc(swapchain, &swapchain_desc); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - todo_wine ok(swapchain_desc.Flags == flag, "Got unexpected Flags %#x.\n", swapchain_desc.Flags); } } @@ -4947,7 +4946,7 @@ static void test_swapchain_resize(IUnknown *device, BOOL is_d3d12) || flag == DXGI_SWAP_CHAIN_FLAG_RESTRICTED_TO_ALL_HOLOGRAPHIC_DISPLAYS)) ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); else - todo_wine + todo_wine_if(!(is_d3d12 && flag == DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT)) ok(hr == DXGI_ERROR_INVALID_CALL || hr == E_INVALIDARG, "Got unexpected hr %#lx.\n", hr); IDXGISwapChain3_Release(tmp_swapchain3); IDXGISwapChain_Release(tmp_swapchain); @@ -4977,7 +4976,6 @@ static void test_swapchain_resize(IUnknown *device, BOOL is_d3d12) ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); hr = IDXGISwapChain_GetDesc(swapchain, &swapchain_desc); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - todo_wine_if(is_d3d12) ok(swapchain_desc.Flags == DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE, "Got unexpected Flags %#x.\n", swapchain_desc.Flags); hr = IDXGISwapChain_GetBuffer(swapchain, 0, &IID_IDXGISurface1, (void **)&surface1); @@ -5015,7 +5013,7 @@ static void test_swapchain_resize(IUnknown *device, BOOL is_d3d12) ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); hr = IDXGISwapChain_GetDesc(swapchain, &swapchain_desc); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - todo_wine + todo_wine_if(!is_d3d12) ok(swapchain_desc.Flags == DXGI_SWAP_CHAIN_FLAG_HW_PROTECTED, "Got unexpected Flags %#x.\n", swapchain_desc.Flags); /* Note that MSDN says that DXGI_SWAP_CHAIN_FLAG_HW_PROTECTED can only be used with -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11391