From: Zhiyi Zhang <zzhang@codeweavers.com> --- dlls/dxgi/swapchain.c | 77 +++++++++++++++++++++++++++++------------- dlls/dxgi/tests/dxgi.c | 24 ------------- 2 files changed, 53 insertions(+), 48 deletions(-) diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index c33a2daf359..1719cc1a488 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -65,37 +65,40 @@ HRESULT dxgi_validate_swapchain_desc(const DXGI_SWAP_CHAIN_DESC1 *desc, { unsigned int min_buffer_count; - switch (desc->SwapEffect) + if (desc) { - case DXGI_SWAP_EFFECT_DISCARD: - case DXGI_SWAP_EFFECT_SEQUENTIAL: - min_buffer_count = 1; - break; + switch (desc->SwapEffect) + { + case DXGI_SWAP_EFFECT_DISCARD: + case DXGI_SWAP_EFFECT_SEQUENTIAL: + min_buffer_count = 1; + break; - case DXGI_SWAP_EFFECT_FLIP_DISCARD: - case DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL: - min_buffer_count = 2; + case DXGI_SWAP_EFFECT_FLIP_DISCARD: + case DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL: + min_buffer_count = 2; - if (desc->Format && !dxgi_validate_flip_swap_effect_format(desc->Format)) - return DXGI_ERROR_INVALID_CALL; + if (desc->Format && !dxgi_validate_flip_swap_effect_format(desc->Format)) + return DXGI_ERROR_INVALID_CALL; - if (desc->SampleDesc.Count != 1 || desc->SampleDesc.Quality) - { - WARN("Invalid sample desc %u, %u for swap effect %#x.\n", - desc->SampleDesc.Count, desc->SampleDesc.Quality, desc->SwapEffect); + if (desc->SampleDesc.Count != 1 || desc->SampleDesc.Quality) + { + WARN("Invalid sample desc %u, %u for swap effect %#x.\n", + desc->SampleDesc.Count, desc->SampleDesc.Quality, desc->SwapEffect); + return DXGI_ERROR_INVALID_CALL; + } + break; + + default: + WARN("Invalid swap effect %u used.\n", desc->SwapEffect); return DXGI_ERROR_INVALID_CALL; - } - break; + } - default: - WARN("Invalid swap effect %u used.\n", desc->SwapEffect); + if (desc->BufferCount < min_buffer_count || desc->BufferCount > DXGI_MAX_SWAP_CHAIN_BUFFERS) + { + WARN("BufferCount is %u.\n", desc->BufferCount); return DXGI_ERROR_INVALID_CALL; - } - - if (desc->BufferCount < min_buffer_count || desc->BufferCount > DXGI_MAX_SWAP_CHAIN_BUFFERS) - { - WARN("BufferCount is %u.\n", desc->BufferCount); - return DXGI_ERROR_INVALID_CALL; + } } if (fullscreen_desc && !fullscreen_desc->Windowed) @@ -400,6 +403,19 @@ static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d11_swapchain_SetFullscreen return DXGI_ERROR_INVALID_CALL; } + if (fullscreen) + { + IDXGISwapChain4_GetFullscreenState(iface, &old_fs, NULL); + if (!old_fs) + { + DXGI_SWAP_CHAIN_FULLSCREEN_DESC test_fullscreen_desc = swapchain->fullscreen_desc; + + test_fullscreen_desc.Windowed = FALSE; + if (dxgi_validate_swapchain_desc(NULL, &test_fullscreen_desc) == DXGI_STATUS_OCCLUDED) + return DXGI_ERROR_INVALID_CALL; + } + } + if (target) { IDXGIOutput_AddRef(target); @@ -2420,6 +2436,19 @@ static HRESULT STDMETHODCALLTYPE DECLSPEC_HOTPATCH d3d12_swapchain_SetFullscreen return DXGI_ERROR_INVALID_CALL; } + if (fullscreen) + { + IDXGISwapChain4_GetFullscreenState(iface, &old_fs, NULL); + if (!old_fs) + { + DXGI_SWAP_CHAIN_FULLSCREEN_DESC test_fullscreen_desc = *fullscreen_desc; + + test_fullscreen_desc.Windowed = FALSE; + if (dxgi_validate_swapchain_desc(NULL, &test_fullscreen_desc) == DXGI_STATUS_OCCLUDED) + return DXGI_ERROR_INVALID_CALL; + } + } + if (target) { IDXGIOutput_AddRef(target); diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c index 7fa3d7ab18a..f5443f60372 100644 --- a/dlls/dxgi/tests/dxgi.c +++ b/dlls/dxgi/tests/dxgi.c @@ -2265,13 +2265,7 @@ static void test_create_swapchain(IUnknown *device, BOOL is_d3d12) ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); ok(!fullscreen, "Got unexpected fullscreen state.\n"); hr = IDXGISwapChain_SetFullscreenState(swapchain, TRUE, NULL); - todo_wine ok(hr == DXGI_ERROR_INVALID_CALL, "Got unexpected hr %#lx.\n", hr); - if (hr == S_OK) - { - hr = IDXGISwapChain_SetFullscreenState(swapchain, FALSE, NULL); - ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - } IDXGISwapChain_Release(swapchain); /* Try to create a fullscreen swapchain with an invalid scanline order, zero width and height. @@ -2302,13 +2296,7 @@ static void test_create_swapchain(IUnknown *device, BOOL is_d3d12) ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); ok(!fullscreen, "Got unexpected fullscreen state.\n"); hr = IDXGISwapChain_SetFullscreenState(swapchain, TRUE, NULL); - todo_wine ok(hr == DXGI_ERROR_INVALID_CALL, "Got unexpected hr %#lx.\n", hr); - if (hr == S_OK) - { - hr = IDXGISwapChain_SetFullscreenState(swapchain, FALSE, NULL); - ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - } IDXGISwapChain_Release(swapchain); /* Try to create a fullscreen swapchain with an invalid scaling. Expect swapchain creation @@ -2341,13 +2329,7 @@ static void test_create_swapchain(IUnknown *device, BOOL is_d3d12) ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); ok(!fullscreen, "Got unexpected fullscreen state.\n"); hr = IDXGISwapChain_SetFullscreenState(swapchain, TRUE, NULL); - todo_wine ok(hr == DXGI_ERROR_INVALID_CALL, "Got unexpected hr %#lx.\n", hr); - if (hr == S_OK) - { - hr = IDXGISwapChain_SetFullscreenState(swapchain, FALSE, NULL); - ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - } IDXGISwapChain_Release(swapchain); /* Try to create a fullscreen swapchain with an invalid scaling, zero width and height. Expect @@ -2378,13 +2360,7 @@ static void test_create_swapchain(IUnknown *device, BOOL is_d3d12) ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); ok(!fullscreen, "Got unexpected fullscreen state.\n"); hr = IDXGISwapChain_SetFullscreenState(swapchain, TRUE, NULL); - todo_wine ok(hr == DXGI_ERROR_INVALID_CALL, "Got unexpected hr %#lx.\n", hr); - if (hr == S_OK) - { - hr = IDXGISwapChain_SetFullscreenState(swapchain, FALSE, NULL); - ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - } IDXGISwapChain_Release(swapchain); done: -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11231