[PATCH 2/2] ddraw/tests: Add a test for SetCooperativeLevel() on a window that belongs to another thread.

Henri Verbeet hverbeet at codeweavers.com
Thu Jan 26 16:04:20 CST 2012


---
 dlls/ddraw/tests/ddraw1.c |   84 +++++++++++++++++++++++++++++++++++++++++++++
 dlls/ddraw/tests/ddraw2.c |   84 +++++++++++++++++++++++++++++++++++++++++++++
 dlls/ddraw/tests/ddraw4.c |   84 +++++++++++++++++++++++++++++++++++++++++++++
 dlls/ddraw/tests/ddraw7.c |   84 +++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 336 insertions(+), 0 deletions(-)

diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index 8b11ad9..3542564 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -19,6 +19,14 @@
 #include "wine/test.h"
 #include "d3d.h"
 
+struct create_window_thread_param
+{
+    HWND window;
+    HANDLE window_created;
+    HANDLE destroy_window;
+    HANDLE thread;
+};
+
 static BOOL compare_color(D3DCOLOR c1, D3DCOLOR c2, BYTE max_diff)
 {
     if (abs((c1 & 0xff) - (c2 & 0xff)) > max_diff) return FALSE;
@@ -31,6 +39,61 @@ static BOOL compare_color(D3DCOLOR c1, D3DCOLOR c2, BYTE max_diff)
     return TRUE;
 }
 
+static DWORD WINAPI create_window_thread_proc(void *param)
+{
+    struct create_window_thread_param *p = param;
+    DWORD res;
+    BOOL ret;
+
+    p->window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, 0, 0, 0, 0);
+    ret = SetEvent(p->window_created);
+    ok(ret, "SetEvent failed, last error %#x.\n", GetLastError());
+
+    for (;;)
+    {
+        MSG msg;
+
+        while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
+            DispatchMessage(&msg);
+        res = WaitForSingleObject(p->destroy_window, 100);
+        if (res == WAIT_OBJECT_0)
+            break;
+        if (res != WAIT_TIMEOUT)
+        {
+            ok(0, "Wait failed (%#x), last error %#x.\n", res, GetLastError());
+            break;
+        }
+    }
+
+    DestroyWindow(p->window);
+
+    return 0;
+}
+
+static void create_window_thread(struct create_window_thread_param *p)
+{
+    DWORD res, tid;
+
+    p->window_created = CreateEvent(NULL, FALSE, FALSE, NULL);
+    ok(!!p->window_created, "CreateEvent failed, last error %#x.\n", GetLastError());
+    p->destroy_window = CreateEvent(NULL, FALSE, FALSE, NULL);
+    ok(!!p->destroy_window, "CreateEvent failed, last error %#x.\n", GetLastError());
+    p->thread = CreateThread(NULL, 0, create_window_thread_proc, p, 0, &tid);
+    ok(!!p->thread, "Failed to create thread, last error %#x.\n", GetLastError());
+    res = WaitForSingleObject(p->window_created, INFINITE);
+    ok(res == WAIT_OBJECT_0, "Wait failed (%#x), last error %#x.\n", res, GetLastError());
+}
+
+static void destroy_window_thread(struct create_window_thread_param *p)
+{
+    SetEvent(p->destroy_window);
+    WaitForSingleObject(p->thread, INFINITE);
+    CloseHandle(p->destroy_window);
+    CloseHandle(p->window_created);
+    CloseHandle(p->thread);
+}
+
 static D3DCOLOR get_surface_color(IDirectDrawSurface *surface, UINT x, UINT y)
 {
     RECT rect = {x, y, x + 1, y + 1};
@@ -730,10 +793,31 @@ cleanup:
     DestroyWindow(window);
 }
 
+static void test_coop_level_threaded(void)
+{
+    struct create_window_thread_param p;
+    IDirectDraw *ddraw;
+    HRESULT hr;
+
+    if (!(ddraw = create_ddraw()))
+    {
+        skip("Failed to create a ddraw object, skipping test.\n");
+        return;
+    }
+    create_window_thread(&p);
+
+    hr = IDirectDraw_SetCooperativeLevel(ddraw, p.window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+
+    IDirectDraw_Release(ddraw);
+    destroy_window_thread(&p);
+}
+
 START_TEST(ddraw1)
 {
     test_coop_level_create_device_window();
     test_clipper_blt();
     test_coop_level_d3d_state();
     test_surface_interface_mismatch();
+    test_coop_level_threaded();
 }
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index a2dab0d..8937c78 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -19,6 +19,14 @@
 #include "wine/test.h"
 #include "d3d.h"
 
+struct create_window_thread_param
+{
+    HWND window;
+    HANDLE window_created;
+    HANDLE destroy_window;
+    HANDLE thread;
+};
+
 static BOOL compare_color(D3DCOLOR c1, D3DCOLOR c2, BYTE max_diff)
 {
     if (abs((c1 & 0xff) - (c2 & 0xff)) > max_diff) return FALSE;
@@ -31,6 +39,61 @@ static BOOL compare_color(D3DCOLOR c1, D3DCOLOR c2, BYTE max_diff)
     return TRUE;
 }
 
+static DWORD WINAPI create_window_thread_proc(void *param)
+{
+    struct create_window_thread_param *p = param;
+    DWORD res;
+    BOOL ret;
+
+    p->window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, 0, 0, 0, 0);
+    ret = SetEvent(p->window_created);
+    ok(ret, "SetEvent failed, last error %#x.\n", GetLastError());
+
+    for (;;)
+    {
+        MSG msg;
+
+        while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
+            DispatchMessage(&msg);
+        res = WaitForSingleObject(p->destroy_window, 100);
+        if (res == WAIT_OBJECT_0)
+            break;
+        if (res != WAIT_TIMEOUT)
+        {
+            ok(0, "Wait failed (%#x), last error %#x.\n", res, GetLastError());
+            break;
+        }
+    }
+
+    DestroyWindow(p->window);
+
+    return 0;
+}
+
+static void create_window_thread(struct create_window_thread_param *p)
+{
+    DWORD res, tid;
+
+    p->window_created = CreateEvent(NULL, FALSE, FALSE, NULL);
+    ok(!!p->window_created, "CreateEvent failed, last error %#x.\n", GetLastError());
+    p->destroy_window = CreateEvent(NULL, FALSE, FALSE, NULL);
+    ok(!!p->destroy_window, "CreateEvent failed, last error %#x.\n", GetLastError());
+    p->thread = CreateThread(NULL, 0, create_window_thread_proc, p, 0, &tid);
+    ok(!!p->thread, "Failed to create thread, last error %#x.\n", GetLastError());
+    res = WaitForSingleObject(p->window_created, INFINITE);
+    ok(res == WAIT_OBJECT_0, "Wait failed (%#x), last error %#x.\n", res, GetLastError());
+}
+
+static void destroy_window_thread(struct create_window_thread_param *p)
+{
+    SetEvent(p->destroy_window);
+    WaitForSingleObject(p->thread, INFINITE);
+    CloseHandle(p->destroy_window);
+    CloseHandle(p->window_created);
+    CloseHandle(p->thread);
+}
+
 static D3DCOLOR get_surface_color(IDirectDrawSurface *surface, UINT x, UINT y)
 {
     RECT rect = {x, y, x + 1, y + 1};
@@ -755,10 +818,31 @@ cleanup:
     DestroyWindow(window);
 }
 
+static void test_coop_level_threaded(void)
+{
+    struct create_window_thread_param p;
+    IDirectDraw2 *ddraw;
+    HRESULT hr;
+
+    if (!(ddraw = create_ddraw()))
+    {
+        skip("Failed to create a ddraw object, skipping test.\n");
+        return;
+    }
+    create_window_thread(&p);
+
+    hr = IDirectDraw2_SetCooperativeLevel(ddraw, p.window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+
+    IDirectDraw2_Release(ddraw);
+    destroy_window_thread(&p);
+}
+
 START_TEST(ddraw2)
 {
     test_coop_level_create_device_window();
     test_clipper_blt();
     test_coop_level_d3d_state();
     test_surface_interface_mismatch();
+    test_coop_level_threaded();
 }
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index aabe168..3471779 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -30,6 +30,14 @@ struct vec4
     float x, y, z, w;
 };
 
+struct create_window_thread_param
+{
+    HWND window;
+    HANDLE window_created;
+    HANDLE destroy_window;
+    HANDLE thread;
+};
+
 static BOOL compare_float(float f, float g, unsigned int ulps)
 {
     int x = *(int *)&f;
@@ -66,6 +74,61 @@ static BOOL compare_color(D3DCOLOR c1, D3DCOLOR c2, BYTE max_diff)
     return TRUE;
 }
 
+static DWORD WINAPI create_window_thread_proc(void *param)
+{
+    struct create_window_thread_param *p = param;
+    DWORD res;
+    BOOL ret;
+
+    p->window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, 0, 0, 0, 0);
+    ret = SetEvent(p->window_created);
+    ok(ret, "SetEvent failed, last error %#x.\n", GetLastError());
+
+    for (;;)
+    {
+        MSG msg;
+
+        while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
+            DispatchMessage(&msg);
+        res = WaitForSingleObject(p->destroy_window, 100);
+        if (res == WAIT_OBJECT_0)
+            break;
+        if (res != WAIT_TIMEOUT)
+        {
+            ok(0, "Wait failed (%#x), last error %#x.\n", res, GetLastError());
+            break;
+        }
+    }
+
+    DestroyWindow(p->window);
+
+    return 0;
+}
+
+static void create_window_thread(struct create_window_thread_param *p)
+{
+    DWORD res, tid;
+
+    p->window_created = CreateEvent(NULL, FALSE, FALSE, NULL);
+    ok(!!p->window_created, "CreateEvent failed, last error %#x.\n", GetLastError());
+    p->destroy_window = CreateEvent(NULL, FALSE, FALSE, NULL);
+    ok(!!p->destroy_window, "CreateEvent failed, last error %#x.\n", GetLastError());
+    p->thread = CreateThread(NULL, 0, create_window_thread_proc, p, 0, &tid);
+    ok(!!p->thread, "Failed to create thread, last error %#x.\n", GetLastError());
+    res = WaitForSingleObject(p->window_created, INFINITE);
+    ok(res == WAIT_OBJECT_0, "Wait failed (%#x), last error %#x.\n", res, GetLastError());
+}
+
+static void destroy_window_thread(struct create_window_thread_param *p)
+{
+    SetEvent(p->destroy_window);
+    WaitForSingleObject(p->thread, INFINITE);
+    CloseHandle(p->destroy_window);
+    CloseHandle(p->window_created);
+    CloseHandle(p->thread);
+}
+
 static D3DCOLOR get_surface_color(IDirectDrawSurface4 *surface, UINT x, UINT y)
 {
     RECT rect = {x, y, x + 1, y + 1};
@@ -921,6 +984,26 @@ cleanup:
     DestroyWindow(window);
 }
 
+static void test_coop_level_threaded(void)
+{
+    struct create_window_thread_param p;
+    IDirectDraw4 *ddraw;
+    HRESULT hr;
+
+    if (!(ddraw = create_ddraw()))
+    {
+        skip("Failed to create a ddraw object, skipping test.\n");
+        return;
+    }
+    create_window_thread(&p);
+
+    hr = IDirectDraw4_SetCooperativeLevel(ddraw, p.window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+
+    IDirectDraw4_Release(ddraw);
+    destroy_window_thread(&p);
+}
+
 START_TEST(ddraw4)
 {
     test_process_vertices();
@@ -928,4 +1011,5 @@ START_TEST(ddraw4)
     test_clipper_blt();
     test_coop_level_d3d_state();
     test_surface_interface_mismatch();
+    test_coop_level_threaded();
 }
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index de2ebbc..7564cb8 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -33,6 +33,14 @@ struct vec4
     float x, y, z, w;
 };
 
+struct create_window_thread_param
+{
+    HWND window;
+    HANDLE window_created;
+    HANDLE destroy_window;
+    HANDLE thread;
+};
+
 static BOOL compare_float(float f, float g, unsigned int ulps)
 {
     int x = *(int *)&f;
@@ -76,6 +84,61 @@ static BOOL compare_color(D3DCOLOR c1, D3DCOLOR c2, BYTE max_diff)
     return TRUE;
 }
 
+static DWORD WINAPI create_window_thread_proc(void *param)
+{
+    struct create_window_thread_param *p = param;
+    DWORD res;
+    BOOL ret;
+
+    p->window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, 0, 0, 0, 0);
+    ret = SetEvent(p->window_created);
+    ok(ret, "SetEvent failed, last error %#x.\n", GetLastError());
+
+    for (;;)
+    {
+        MSG msg;
+
+        while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
+            DispatchMessage(&msg);
+        res = WaitForSingleObject(p->destroy_window, 100);
+        if (res == WAIT_OBJECT_0)
+            break;
+        if (res != WAIT_TIMEOUT)
+        {
+            ok(0, "Wait failed (%#x), last error %#x.\n", res, GetLastError());
+            break;
+        }
+    }
+
+    DestroyWindow(p->window);
+
+    return 0;
+}
+
+static void create_window_thread(struct create_window_thread_param *p)
+{
+    DWORD res, tid;
+
+    p->window_created = CreateEvent(NULL, FALSE, FALSE, NULL);
+    ok(!!p->window_created, "CreateEvent failed, last error %#x.\n", GetLastError());
+    p->destroy_window = CreateEvent(NULL, FALSE, FALSE, NULL);
+    ok(!!p->destroy_window, "CreateEvent failed, last error %#x.\n", GetLastError());
+    p->thread = CreateThread(NULL, 0, create_window_thread_proc, p, 0, &tid);
+    ok(!!p->thread, "Failed to create thread, last error %#x.\n", GetLastError());
+    res = WaitForSingleObject(p->window_created, INFINITE);
+    ok(res == WAIT_OBJECT_0, "Wait failed (%#x), last error %#x.\n", res, GetLastError());
+}
+
+static void destroy_window_thread(struct create_window_thread_param *p)
+{
+    SetEvent(p->destroy_window);
+    WaitForSingleObject(p->thread, INFINITE);
+    CloseHandle(p->destroy_window);
+    CloseHandle(p->window_created);
+    CloseHandle(p->thread);
+}
+
 static D3DCOLOR get_surface_color(IDirectDrawSurface7 *surface, UINT x, UINT y)
 {
     RECT rect = {x, y, x + 1, y + 1};
@@ -861,6 +924,26 @@ cleanup:
     DestroyWindow(window);
 }
 
+static void test_coop_level_threaded(void)
+{
+    struct create_window_thread_param p;
+    IDirectDraw7 *ddraw;
+    HRESULT hr;
+
+    if (!(ddraw = create_ddraw()))
+    {
+        skip("Failed to create a ddraw object, skipping test.\n");
+        return;
+    }
+    create_window_thread(&p);
+
+    hr = IDirectDraw7_SetCooperativeLevel(ddraw, p.window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+
+    IDirectDraw7_Release(ddraw);
+    destroy_window_thread(&p);
+}
+
 START_TEST(ddraw7)
 {
     HMODULE module = GetModuleHandleA("ddraw.dll");
@@ -876,4 +959,5 @@ START_TEST(ddraw7)
     test_clipper_blt();
     test_coop_level_d3d_state();
     test_surface_interface_mismatch();
+    test_coop_level_threaded();
 }
-- 
1.7.3.4




More information about the wine-patches mailing list