From: Bernhard Übelacker <bernhardu@mailbox.org> DXGI_SWAP_EFFECT_FLIP_DISCARD fails without DXGI 1.4. --- dlls/dxgi/tests/dxgi.c | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c index ecd0661ab25..8949af69142 100644 --- a/dlls/dxgi/tests/dxgi.c +++ b/dlls/dxgi/tests/dxgi.c @@ -7107,7 +7107,10 @@ static void test_cursor_clipping(IUnknown *device, BOOL is_d3d12) } ok(mode_idx < mode_count, "Failed to find a different mode than %ux%u.\n", width, height); if (mode_idx >= mode_count) + { + winetest_pop_context(); continue; + } ret = ClipCursor(NULL); ok(ret, "ClipCursor failed, error %#lx.\n", GetLastError()); @@ -7240,8 +7243,9 @@ static void test_frame_latency_event(IUnknown *device, BOOL is_d3d12) IDXGISwapChain1 *swapchain1; ID3D12Device *d3d12_device; ID3D12CommandQueue *queue; - IDXGIFactory2 *factory2; IDXGIFactory *factory; + IDXGIFactory2 *factory2; + IDXGIFactory4 *factory4; ID3D12Fence *fence; UINT frame_latency; DWORD wait_result; @@ -7254,12 +7258,21 @@ static void test_frame_latency_event(IUnknown *device, BOOL is_d3d12) get_factory(device, is_d3d12, &factory); hr = IDXGIFactory_QueryInterface(factory, &IID_IDXGIFactory2, (void**)&factory2); - IDXGIFactory_Release(factory); if (FAILED(hr)) { win_skip("IDXGIFactory2 not available.\n"); + IDXGIFactory_Release(factory); + return; + } + hr = IDXGIFactory_QueryInterface(factory, &IID_IDXGIFactory4, (void**)&factory4); + if (FAILED(hr)) + { + win_skip("IDXGIFactory4 not available.\n"); + IDXGIFactory_Release(factory); return; } + IDXGIFactory4_Release(factory4); + IDXGIFactory_Release(factory); window = create_window(); @@ -7983,12 +7996,25 @@ static void test_swapchain_present_count(IUnknown *device, BOOL is_d3d12) ID3D12CommandQueue *queue; IDXGISwapChain *swapchain; ID3D12Fence *fence; + IDXGIFactory *factory = NULL; + IDXGIFactory4 *factory4; + BOOL supports_dxgi14 = FALSE; unsigned int i; HWND window; HRESULT hr; window = create_window(); + /* Query if factory supports DXGI 1.4 */ + get_factory(device, is_d3d12, &factory); + ok(!!factory, "Failed to get factory.\n"); + if (SUCCEEDED(hr = IDXGIFactory_QueryInterface(factory, &IID_IDXGIFactory4, (void **)&factory4))) + { + IDXGIFactory4_Release(factory4); + supports_dxgi14 = TRUE; + } + IDXGIFactory_Release(factory); + for (i = 0; i < ARRAY_SIZE(tests); ++i) { DXGI_SWAP_EFFECT swap_effect = tests[i].swap_effect; @@ -7998,6 +8024,13 @@ static void test_swapchain_present_count(IUnknown *device, BOOL is_d3d12) if (is_d3d12 && (swap_effect == DXGI_SWAP_EFFECT_DISCARD)) continue; + /* DXGI_SWAP_EFFECT_FLIP_DISCARD needs DXGI 1.4 */ + if (!supports_dxgi14 && swap_effect == DXGI_SWAP_EFFECT_FLIP_DISCARD) + { + win_skip("Skip test with DXGI_SWAP_EFFECT_FLIP_DISCARD.\n"); + continue; + } + winetest_push_context("test %u", i); swapchain = create_swapchain(device, is_d3d12, window, flags, swap_effect); @@ -8248,6 +8281,7 @@ static void run_on_d3d12(void (*test_func)(IUnknown *device, BOOL is_d3d12)) if (!(device = create_d3d12_device())) { skip("Failed to create Direct3D 12 device.\n"); + winetest_pop_context(); return; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11110