[PATCH 5/5] ddraw/tests: Add some display mode set / restore tests with multiple ddraw objects.
Henri Verbeet
hverbeet at codeweavers.com
Tue Oct 16 15:43:13 CDT 2012
---
dlls/ddraw/tests/ddraw1.c | 192 +++++++++++++++++++++++++++++++++++++++++++++
dlls/ddraw/tests/ddraw2.c | 192 +++++++++++++++++++++++++++++++++++++++++++++
dlls/ddraw/tests/ddraw4.c | 192 +++++++++++++++++++++++++++++++++++++++++++++
dlls/ddraw/tests/ddraw7.c | 192 +++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 768 insertions(+), 0 deletions(-)
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index 2a84dc1..6a922c9 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -2363,6 +2363,197 @@ done:
UnregisterClassA("ddraw_test_wndproc_wc", GetModuleHandleA(NULL));
}
+static void test_coop_level_mode_set_multi(void)
+{
+ IDirectDraw *ddraw1, *ddraw2;
+ UINT orig_w, orig_h, w, h;
+ HWND window;
+ HRESULT hr;
+ ULONG ref;
+
+ if (!(ddraw1 = create_ddraw()))
+ {
+ skip("Failed to create a ddraw object, skipping test.\n");
+ return;
+ }
+
+ window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
+ 0, 0, 100, 100, 0, 0, 0, 0);
+
+ orig_w = GetSystemMetrics(SM_CXSCREEN);
+ orig_h = GetSystemMetrics(SM_CYSCREEN);
+
+ /* With just a single ddraw object, the display mode is restored on
+ * release. */
+ hr = IDirectDraw_SetDisplayMode(ddraw1, 800, 600, 32);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* When there are multiple ddraw objects, the display mode is restored to
+ * the initial mode, before the first SetDisplayMode() call. */
+ ddraw1 = create_ddraw();
+ hr = IDirectDraw_SetDisplayMode(ddraw1, 800, 600, 32);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw_SetDisplayMode(ddraw2, 640, 480, 32);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* Regardless of release ordering. */
+ ddraw1 = create_ddraw();
+ hr = IDirectDraw_SetDisplayMode(ddraw1, 800, 600, 32);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw_SetDisplayMode(ddraw2, 640, 480, 32);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* But only for ddraw objects that called SetDisplayMode(). */
+ ddraw1 = create_ddraw();
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw_SetDisplayMode(ddraw2, 640, 480, 32);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* If there's a ddraw object that's currently in exclusive mode, it blocks
+ * restoring the display mode. */
+ ddraw1 = create_ddraw();
+ hr = IDirectDraw_SetDisplayMode(ddraw1, 800, 600, 32);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw_SetDisplayMode(ddraw2, 640, 480, 32);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ hr = IDirectDraw_SetCooperativeLevel(ddraw2, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ ref = IDirectDraw_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* Exclusive mode blocks mode setting on other ddraw objects in general. */
+ ddraw1 = create_ddraw();
+ hr = IDirectDraw_SetDisplayMode(ddraw1, 800, 600, 32);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ hr = IDirectDraw_SetCooperativeLevel(ddraw1, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw_SetDisplayMode(ddraw2, 640, 480, 32);
+ ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr);
+
+ ref = IDirectDraw_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ DestroyWindow(window);
+}
+
static void test_initialize(void)
{
IDirectDraw *ddraw;
@@ -2447,6 +2638,7 @@ START_TEST(ddraw1)
test_window_style();
test_redundant_mode_set();
test_coop_level_mode_set();
+ test_coop_level_mode_set_multi();
test_initialize();
test_coop_level_surf_create();
}
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index 6426576..5c343d9 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -2500,6 +2500,197 @@ done:
UnregisterClassA("ddraw_test_wndproc_wc", GetModuleHandleA(NULL));
}
+static void test_coop_level_mode_set_multi(void)
+{
+ IDirectDraw2 *ddraw1, *ddraw2;
+ UINT orig_w, orig_h, w, h;
+ HWND window;
+ HRESULT hr;
+ ULONG ref;
+
+ if (!(ddraw1 = create_ddraw()))
+ {
+ skip("Failed to create a ddraw object, skipping test.\n");
+ return;
+ }
+
+ window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
+ 0, 0, 100, 100, 0, 0, 0, 0);
+
+ orig_w = GetSystemMetrics(SM_CXSCREEN);
+ orig_h = GetSystemMetrics(SM_CYSCREEN);
+
+ /* With just a single ddraw object, the display mode is restored on
+ * release. */
+ hr = IDirectDraw2_SetDisplayMode(ddraw1, 800, 600, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw2_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* When there are multiple ddraw objects, the display mode is restored to
+ * the initial mode, before the first SetDisplayMode() call. */
+ ddraw1 = create_ddraw();
+ hr = IDirectDraw2_SetDisplayMode(ddraw1, 800, 600, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw2_SetDisplayMode(ddraw2, 640, 480, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw2_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw2_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* Regardless of release ordering. */
+ ddraw1 = create_ddraw();
+ hr = IDirectDraw2_SetDisplayMode(ddraw1, 800, 600, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw2_SetDisplayMode(ddraw2, 640, 480, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw2_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw2_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* But only for ddraw objects that called SetDisplayMode(). */
+ ddraw1 = create_ddraw();
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw2_SetDisplayMode(ddraw2, 640, 480, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw2_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw2_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* If there's a ddraw object that's currently in exclusive mode, it blocks
+ * restoring the display mode. */
+ ddraw1 = create_ddraw();
+ hr = IDirectDraw2_SetDisplayMode(ddraw1, 800, 600, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw2_SetDisplayMode(ddraw2, 640, 480, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ hr = IDirectDraw2_SetCooperativeLevel(ddraw2, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ ref = IDirectDraw2_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw2_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* Exclusive mode blocks mode setting on other ddraw objects in general. */
+ ddraw1 = create_ddraw();
+ hr = IDirectDraw2_SetDisplayMode(ddraw1, 800, 600, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ hr = IDirectDraw2_SetCooperativeLevel(ddraw1, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw2_SetDisplayMode(ddraw2, 640, 480, 32, 0, 0);
+ ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr);
+
+ ref = IDirectDraw2_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw2_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ DestroyWindow(window);
+}
+
static void test_initialize(void)
{
IDirectDraw2 *ddraw;
@@ -2568,6 +2759,7 @@ START_TEST(ddraw2)
test_window_style();
test_redundant_mode_set();
test_coop_level_mode_set();
+ test_coop_level_mode_set_multi();
test_initialize();
test_coop_level_surf_create();
}
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index a8332c7..a435b7a 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -2616,6 +2616,197 @@ static void test_coop_level_mode_set(void)
UnregisterClassA("ddraw_test_wndproc_wc", GetModuleHandleA(NULL));
}
+static void test_coop_level_mode_set_multi(void)
+{
+ IDirectDraw4 *ddraw1, *ddraw2;
+ UINT orig_w, orig_h, w, h;
+ HWND window;
+ HRESULT hr;
+ ULONG ref;
+
+ if (!(ddraw1 = create_ddraw()))
+ {
+ skip("Failed to create a ddraw object, skipping test.\n");
+ return;
+ }
+
+ window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
+ 0, 0, 100, 100, 0, 0, 0, 0);
+
+ orig_w = GetSystemMetrics(SM_CXSCREEN);
+ orig_h = GetSystemMetrics(SM_CYSCREEN);
+
+ /* With just a single ddraw object, the display mode is restored on
+ * release. */
+ hr = IDirectDraw4_SetDisplayMode(ddraw1, 800, 600, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw4_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* When there are multiple ddraw objects, the display mode is restored to
+ * the initial mode, before the first SetDisplayMode() call. */
+ ddraw1 = create_ddraw();
+ hr = IDirectDraw4_SetDisplayMode(ddraw1, 800, 600, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw4_SetDisplayMode(ddraw2, 640, 480, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw4_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw4_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* Regardless of release ordering. */
+ ddraw1 = create_ddraw();
+ hr = IDirectDraw4_SetDisplayMode(ddraw1, 800, 600, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw4_SetDisplayMode(ddraw2, 640, 480, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw4_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw4_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* But only for ddraw objects that called SetDisplayMode(). */
+ ddraw1 = create_ddraw();
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw4_SetDisplayMode(ddraw2, 640, 480, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw4_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw4_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* If there's a ddraw object that's currently in exclusive mode, it blocks
+ * restoring the display mode. */
+ ddraw1 = create_ddraw();
+ hr = IDirectDraw4_SetDisplayMode(ddraw1, 800, 600, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw4_SetDisplayMode(ddraw2, 640, 480, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ hr = IDirectDraw4_SetCooperativeLevel(ddraw2, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ ref = IDirectDraw4_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw4_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* Exclusive mode blocks mode setting on other ddraw objects in general. */
+ ddraw1 = create_ddraw();
+ hr = IDirectDraw4_SetDisplayMode(ddraw1, 800, 600, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ hr = IDirectDraw4_SetCooperativeLevel(ddraw1, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw4_SetDisplayMode(ddraw2, 640, 480, 32, 0, 0);
+ ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr);
+
+ ref = IDirectDraw4_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw4_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ DestroyWindow(window);
+}
+
static void test_initialize(void)
{
IDirectDraw4 *ddraw;
@@ -2685,6 +2876,7 @@ START_TEST(ddraw4)
test_window_style();
test_redundant_mode_set();
test_coop_level_mode_set();
+ test_coop_level_mode_set_multi();
test_initialize();
test_coop_level_surf_create();
}
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index 37592f7..7985b06 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -2425,6 +2425,197 @@ static void test_coop_level_mode_set(void)
UnregisterClassA("ddraw_test_wndproc_wc", GetModuleHandleA(NULL));
}
+static void test_coop_level_mode_set_multi(void)
+{
+ IDirectDraw7 *ddraw1, *ddraw2;
+ UINT orig_w, orig_h, w, h;
+ HWND window;
+ HRESULT hr;
+ ULONG ref;
+
+ if (!(ddraw1 = create_ddraw()))
+ {
+ skip("Failed to create a ddraw object, skipping test.\n");
+ return;
+ }
+
+ window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
+ 0, 0, 100, 100, 0, 0, 0, 0);
+
+ orig_w = GetSystemMetrics(SM_CXSCREEN);
+ orig_h = GetSystemMetrics(SM_CYSCREEN);
+
+ /* With just a single ddraw object, the display mode is restored on
+ * release. */
+ hr = IDirectDraw7_SetDisplayMode(ddraw1, 800, 600, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw7_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* When there are multiple ddraw objects, the display mode is restored to
+ * the initial mode, before the first SetDisplayMode() call. */
+ ddraw1 = create_ddraw();
+ hr = IDirectDraw7_SetDisplayMode(ddraw1, 800, 600, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw7_SetDisplayMode(ddraw2, 640, 480, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw7_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw7_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* Regardless of release ordering. */
+ ddraw1 = create_ddraw();
+ hr = IDirectDraw7_SetDisplayMode(ddraw1, 800, 600, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw7_SetDisplayMode(ddraw2, 640, 480, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw7_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw7_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* But only for ddraw objects that called SetDisplayMode(). */
+ ddraw1 = create_ddraw();
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw7_SetDisplayMode(ddraw2, 640, 480, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw7_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw7_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* If there's a ddraw object that's currently in exclusive mode, it blocks
+ * restoring the display mode. */
+ ddraw1 = create_ddraw();
+ hr = IDirectDraw7_SetDisplayMode(ddraw1, 800, 600, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw7_SetDisplayMode(ddraw2, 640, 480, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ hr = IDirectDraw7_SetCooperativeLevel(ddraw2, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ ref = IDirectDraw7_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 640, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 480, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw7_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ /* Exclusive mode blocks mode setting on other ddraw objects in general. */
+ ddraw1 = create_ddraw();
+ hr = IDirectDraw7_SetDisplayMode(ddraw1, 800, 600, 32, 0, 0);
+ ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == 800, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == 600, "Got unexpected screen height %u.\n", h);
+
+ hr = IDirectDraw7_SetCooperativeLevel(ddraw1, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+ ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr);
+
+ ddraw2 = create_ddraw();
+ hr = IDirectDraw7_SetDisplayMode(ddraw2, 640, 480, 32, 0, 0);
+ ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr);
+
+ ref = IDirectDraw7_Release(ddraw1);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ ref = IDirectDraw7_Release(ddraw2);
+ ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref);
+ w = GetSystemMetrics(SM_CXSCREEN);
+ ok(w == orig_w, "Got unexpected screen width %u.\n", w);
+ h = GetSystemMetrics(SM_CYSCREEN);
+ ok(h == orig_h, "Got unexpected screen height %u.\n", h);
+
+ DestroyWindow(window);
+}
+
static void test_initialize(void)
{
IDirectDraw7 *ddraw;
@@ -2501,6 +2692,7 @@ START_TEST(ddraw7)
test_window_style();
test_redundant_mode_set();
test_coop_level_mode_set();
+ test_coop_level_mode_set_multi();
test_initialize();
test_coop_level_surf_create();
}
--
1.7.8.6
More information about the wine-patches
mailing list