[PATCH 3/9] dxgi/tests: Add separate window thread for test_resize_target_wndproc().

Józef Kucia joseph.kucia at gmail.com
Thu Nov 29 07:33:41 CST 2018


From: Józef Kucia <jkucia at codeweavers.com>

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45431
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/dxgi/tests/dxgi.c | 80 ++++++++++++++++++++++++++++++++++--------
 1 file changed, 66 insertions(+), 14 deletions(-)

diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c
index bfe98f40bc25..1aaed468cf38 100644
--- a/dlls/dxgi/tests/dxgi.c
+++ b/dlls/dxgi/tests/dxgi.c
@@ -2686,20 +2686,65 @@ static LRESULT CALLBACK resize_target_wndproc(HWND hwnd, unsigned int message, W
     }
 }
 
+struct window_thread_data
+{
+    HWND window;
+    HANDLE window_created;
+    HANDLE finished;
+};
+
+static DWORD WINAPI window_thread(void *data)
+{
+    struct window_thread_data *thread_data = data;
+    unsigned int ret;
+    WNDCLASSA wc;
+    MSG msg;
+
+    memset(&wc, 0, sizeof(wc));
+    wc.lpfnWndProc = resize_target_wndproc;
+    wc.lpszClassName = "dxgi_resize_target_wndproc_wc";
+    ok(RegisterClassA(&wc), "Failed to register window class.\n");
+
+    thread_data->window = CreateWindowA("dxgi_resize_target_wndproc_wc", "dxgi_test", 0, 0, 0, 400, 200, 0, 0, 0, 0);
+    ok(!!thread_data->window, "Failed to create window.\n");
+
+    ret = SetEvent(thread_data->window_created);
+    ok(ret, "Failed to set event, last error %#x.\n", GetLastError());
+
+    for (;;)
+    {
+        while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE))
+            DispatchMessageA(&msg);
+
+        ret = WaitForSingleObject(thread_data->finished, 0);
+        if (ret != WAIT_TIMEOUT)
+            break;
+    }
+    ok(ret == WAIT_OBJECT_0, "Failed to wait for event, ret %#x, last error %#x.\n", ret, GetLastError());
+
+    DestroyWindow(thread_data->window);
+    thread_data->window = NULL;
+
+    UnregisterClassA("dxgi_test_wndproc_wc", GetModuleHandleA(NULL));
+
+    return 0;
+}
+
 static void test_resize_target_wndproc(void)
 {
+    struct window_thread_data thread_data;
     DXGI_SWAP_CHAIN_DESC swapchain_desc;
     IDXGISwapChain *swapchain;
     IDXGIFactory *factory;
     IDXGIAdapter *adapter;
     DXGI_MODE_DESC mode;
     IDXGIDevice *device;
+    unsigned int ret;
     ULONG refcount;
     LONG_PTR data;
-    WNDCLASSA wc;
+    HANDLE thread;
     HRESULT hr;
     RECT rect;
-    BOOL ret;
 
     if (!(device = create_device(0)))
     {
@@ -2707,10 +2752,16 @@ static void test_resize_target_wndproc(void)
         return;
     }
 
-    memset(&wc, 0, sizeof(wc));
-    wc.lpfnWndProc = resize_target_wndproc;
-    wc.lpszClassName = "dxgi_resize_target_wndproc_wc";
-    ok(RegisterClassA(&wc), "Failed to register window class.\n");
+    memset(&thread_data, 0, sizeof(thread_data));
+    thread_data.window_created = CreateEventA(NULL, FALSE, FALSE, NULL);
+    ok(!!thread_data.window_created, "Failed to create event, last error %#x.\n", GetLastError());
+    thread_data.finished = CreateEventA(NULL, FALSE, FALSE, NULL);
+    ok(!!thread_data.finished, "Failed to create event, last error %#x.\n", GetLastError());
+
+    thread = CreateThread(NULL, 0, window_thread, &thread_data, 0, NULL);
+    ok(!!thread, "Failed to create thread, last error %#x.\n", GetLastError());
+    ret = WaitForSingleObject(thread_data.window_created, INFINITE);
+    ok(ret == WAIT_OBJECT_0, "Failed to wait for thread, ret %#x, last error %#x.\n", ret, GetLastError());
 
     hr = IDXGIDevice_GetAdapter(device, &adapter);
     ok(hr == S_OK, "Failed to get adapter, hr %#x.\n", hr);
@@ -2728,18 +2779,14 @@ static void test_resize_target_wndproc(void)
     swapchain_desc.SampleDesc.Quality = 0;
     swapchain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
     swapchain_desc.BufferCount = 1;
+    swapchain_desc.OutputWindow = thread_data.window;
     swapchain_desc.Windowed = TRUE;
     swapchain_desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
     swapchain_desc.Flags = 0;
-
-    swapchain_desc.OutputWindow = CreateWindowA("dxgi_resize_target_wndproc_wc",
-            "dxgi_test", 0, 0, 0, 400, 200, 0, 0, 0, 0);
-    ok(!!swapchain_desc.OutputWindow, "Failed to create window.\n");
-
     hr = IDXGIFactory_CreateSwapChain(factory, (IUnknown *)device, &swapchain_desc, &swapchain);
     ok(hr == S_OK, "Failed to create swapchain, hr %#x.\n", hr);
 
-    data = SetWindowLongPtrA(swapchain_desc.OutputWindow, GWLP_USERDATA, (LONG_PTR)swapchain);
+    data = SetWindowLongPtrA(thread_data.window, GWLP_USERDATA, (LONG_PTR)swapchain);
     ok(!data, "Got unexpected GWLP_USERDATA %p.\n", (void *)data);
 
     memset(&mode, 0, sizeof(mode));
@@ -2762,7 +2809,6 @@ static void test_resize_target_wndproc(void)
 
     refcount = IDXGISwapChain_Release(swapchain);
     ok(!refcount, "IDXGISwapChain has %u references left.\n", refcount);
-    DestroyWindow(swapchain_desc.OutputWindow);
 
     IDXGIAdapter_Release(adapter);
     refcount = IDXGIDevice_Release(device);
@@ -2770,7 +2816,13 @@ static void test_resize_target_wndproc(void)
     refcount = IDXGIFactory_Release(factory);
     ok(!refcount, "Factory has %u references left.\n", refcount);
 
-    UnregisterClassA("dxgi_test_wndproc_wc", GetModuleHandleA(NULL));
+    ret = SetEvent(thread_data.finished);
+    ok(ret, "Failed to set event, last error %#x.\n", GetLastError());
+    ret = WaitForSingleObject(thread, INFINITE);
+    ok(ret == WAIT_OBJECT_0, "Failed to wait for thread, ret %#x, last error %#x.\n", ret, GetLastError());
+    CloseHandle(thread);
+    CloseHandle(thread_data.window_created);
+    CloseHandle(thread_data.finished);
 }
 
 static void test_inexact_modes(void)
-- 
2.18.1




More information about the wine-devel mailing list