Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/ddraw/tests/ddraw1.c | 128 +++++++++++++++++++++++++++++++++++++++++++
dlls/ddraw/tests/ddraw2.c | 128 +++++++++++++++++++++++++++++++++++++++++++
dlls/ddraw/tests/ddraw4.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++
dlls/ddraw/tests/ddraw7.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 528 insertions(+)
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index c767d3a38d3e..39e7d109438b 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -9046,6 +9046,133 @@ static void test_blt_z_alpha(void)
DestroyWindow(window);
}
+static void test_cross_device_blt(void)
+{
+ IDirectDrawSurface *surface, *surface2, *sysmem_surface;
+ IDirect3DDevice *device, *device2;
+ IDirectDraw *ddraw, *ddraw2;
+ DDSURFACEDESC surface_desc;
+ HWND window, window2;
+ ULONG refcount;
+ D3DCOLOR color;
+ DDBLTFX fx;
+ HRESULT hr;
+
+ window = create_window();
+ ddraw = create_ddraw();
+ if (!(device = create_device(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN)))
+ {
+ skip("Failed to create a 3D device.\n");
+ IDirectDraw_Release(ddraw);
+ DestroyWindow(window);
+ return;
+ }
+
+ window2 = create_window();
+ ddraw2 = create_ddraw();
+ if (!(device2 = create_device(ddraw2, window2, DDSCL_NORMAL)))
+ {
+ skip("Failed to create a 3D device.\n");
+ IDirectDraw_Release(ddraw2);
+ IDirect3DDevice_Release(device);
+ IDirectDraw_Release(ddraw);
+ DestroyWindow(window);
+ DestroyWindow(window2);
+ return;
+ }
+
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
+ surface_desc.dwWidth = 640;
+ surface_desc.dwHeight = 480;
+ surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
+ hr = IDirectDraw_CreateSurface(ddraw, &surface_desc, &sysmem_surface, NULL);
+ ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
+ surface_desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP | DDSCAPS_VIDEOMEMORY;
+ U5(surface_desc).dwBackBufferCount = 2;
+ hr = IDirectDraw_CreateSurface(ddraw, &surface_desc, &surface, NULL);
+ ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT;
+ surface_desc.dwWidth = 640;
+ surface_desc.dwHeight = 480;
+ surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
+ surface_desc.ddpfPixelFormat.dwSize = sizeof(surface_desc.ddpfPixelFormat);
+ surface_desc.ddpfPixelFormat.dwFlags = DDPF_RGB;
+ U1(surface_desc.ddpfPixelFormat).dwRGBBitCount = 16;
+ U2(surface_desc.ddpfPixelFormat).dwRBitMask = 0x00007c00;
+ U3(surface_desc.ddpfPixelFormat).dwGBitMask = 0x000003e0;
+ U4(surface_desc.ddpfPixelFormat).dwBBitMask = 0x0000001f;
+ hr = IDirectDraw_CreateSurface(ddraw2, &surface_desc, &surface2, NULL);
+ ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+
+ memset(&fx, 0, sizeof(fx));
+ fx.dwSize = sizeof(fx);
+ U5(fx).dwFillColor = 0xff0000ff;
+ hr = IDirectDrawSurface_Blt(surface2, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
+ ok(SUCCEEDED(hr), "Failed to fill surface, hr %#x.\n", hr);
+
+ hr = IDirectDrawSurface_Blt(surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ ok(hr == E_NOTIMPL, "Got unexpected hr %#x.\n", hr);
+ hr = IDirectDrawSurface_Flip(surface, NULL, DDFLIP_WAIT);
+ ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
+ hr = IDirectDrawSurface_Blt(surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ ok(hr == E_NOTIMPL, "Got unexpected hr %#x.\n", hr);
+ color = get_surface_color(surface, 320, 240);
+ ok(color == 0x00000000, "Got unexpected color 0x%08x.\n", color);
+
+ hr = IDirectDrawSurface_Blt(sysmem_surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ ok(hr == E_NOTIMPL, "Got unexpected hr %#x.\n", hr);
+ color = get_surface_color(sysmem_surface, 320, 240);
+ ok(color == 0x00000000, "Got unexpected color 0x%08x.\n", color);
+
+ hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
+ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+ hr = IDirectDrawSurface_IsLost(sysmem_surface);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+
+ hr = IDirectDrawSurface_Blt(sysmem_surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ ok(hr == E_NOTIMPL, "Got unexpected hr %#x.\n", hr);
+ color = get_surface_color(sysmem_surface, 320, 240);
+ ok(color == 0x00000000, "Got unexpected color 0x%08x.\n", color);
+
+ IDirectDrawSurface_Release(surface2);
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
+ surface_desc.dwWidth = 640;
+ surface_desc.dwHeight = 480;
+ surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
+ hr = IDirectDraw_CreateSurface(ddraw2, &surface_desc, &surface2, NULL);
+ ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+ hr = IDirectDrawSurface_Blt(surface2, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
+ ok(SUCCEEDED(hr), "Failed to fill surface, hr %#x.\n", hr);
+
+ hr = IDirectDrawSurface_Blt(sysmem_surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ todo_wine ok(hr == D3D_OK, "Failed to blit, hr %#x.\n", hr);
+ color = get_surface_color(sysmem_surface, 320, 240);
+ todo_wine ok(compare_color(color, 0x000000ff, 1), "Got unexpected color 0x%08x.\n", color);
+
+ IDirectDrawSurface_Release(surface);
+ IDirectDrawSurface_Release(surface2);
+ IDirectDrawSurface_Release(sysmem_surface);
+ refcount = IDirect3DDevice_Release(device);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+ refcount = IDirect3DDevice_Release(device2);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+ IDirectDraw_Release(ddraw);
+ IDirectDraw_Release(ddraw2);
+ DestroyWindow(window);
+ DestroyWindow(window2);
+}
+
static void test_getdc(void)
{
IDirectDrawSurface *surface, *surface2, *tmp;
@@ -11677,6 +11804,7 @@ START_TEST(ddraw1)
test_overlay_rect();
test_blt();
test_blt_z_alpha();
+ test_cross_device_blt();
test_getdc();
test_transform_vertices();
test_display_mode_surface_pixel_format();
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index 794f90b94005..9e2107cda43c 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -10159,6 +10159,133 @@ static void test_blt_z_alpha(void)
DestroyWindow(window);
}
+static void test_cross_device_blt(void)
+{
+ IDirectDrawSurface *surface, *surface2, *sysmem_surface;
+ IDirect3DDevice2 *device, *device2;
+ IDirectDraw2 *ddraw, *ddraw2;
+ DDSURFACEDESC surface_desc;
+ HWND window, window2;
+ ULONG refcount;
+ D3DCOLOR color;
+ DDBLTFX fx;
+ HRESULT hr;
+
+ window = create_window();
+ ddraw = create_ddraw();
+ if (!(device = create_device(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN)))
+ {
+ skip("Failed to create a 3D device.\n");
+ IDirectDraw2_Release(ddraw);
+ DestroyWindow(window);
+ return;
+ }
+
+ window2 = create_window();
+ ddraw2 = create_ddraw();
+ if (!(device2 = create_device(ddraw2, window2, DDSCL_NORMAL)))
+ {
+ skip("Failed to create a 3D device.\n");
+ IDirectDraw2_Release(ddraw2);
+ IDirect3DDevice2_Release(device);
+ IDirectDraw2_Release(ddraw);
+ DestroyWindow(window);
+ DestroyWindow(window2);
+ return;
+ }
+
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
+ surface_desc.dwWidth = 640;
+ surface_desc.dwHeight = 480;
+ surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
+ hr = IDirectDraw2_CreateSurface(ddraw, &surface_desc, &sysmem_surface, NULL);
+ ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
+ surface_desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP | DDSCAPS_VIDEOMEMORY;
+ U5(surface_desc).dwBackBufferCount = 2;
+ hr = IDirectDraw2_CreateSurface(ddraw, &surface_desc, &surface, NULL);
+ ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT;
+ surface_desc.dwWidth = 640;
+ surface_desc.dwHeight = 480;
+ surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
+ surface_desc.ddpfPixelFormat.dwSize = sizeof(surface_desc.ddpfPixelFormat);
+ surface_desc.ddpfPixelFormat.dwFlags = DDPF_RGB;
+ U1(surface_desc.ddpfPixelFormat).dwRGBBitCount = 16;
+ U2(surface_desc.ddpfPixelFormat).dwRBitMask = 0x00007c00;
+ U3(surface_desc.ddpfPixelFormat).dwGBitMask = 0x000003e0;
+ U4(surface_desc.ddpfPixelFormat).dwBBitMask = 0x0000001f;
+ hr = IDirectDraw2_CreateSurface(ddraw2, &surface_desc, &surface2, NULL);
+ ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+
+ memset(&fx, 0, sizeof(fx));
+ fx.dwSize = sizeof(fx);
+ U5(fx).dwFillColor = 0xff0000ff;
+ hr = IDirectDrawSurface_Blt(surface2, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
+ ok(SUCCEEDED(hr), "Failed to fill surface, hr %#x.\n", hr);
+
+ hr = IDirectDrawSurface_Blt(surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ ok(hr == E_NOTIMPL, "Got unexpected hr %#x.\n", hr);
+ hr = IDirectDrawSurface_Flip(surface, NULL, DDFLIP_WAIT);
+ ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
+ hr = IDirectDrawSurface_Blt(surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ ok(hr == E_NOTIMPL, "Got unexpected hr %#x.\n", hr);
+ color = get_surface_color(surface, 320, 240);
+ ok(color == 0x00000000, "Got unexpected color 0x%08x.\n", color);
+
+ hr = IDirectDrawSurface_Blt(sysmem_surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ ok(hr == E_NOTIMPL, "Got unexpected hr %#x.\n", hr);
+ color = get_surface_color(sysmem_surface, 320, 240);
+ ok(color == 0x00000000, "Got unexpected color 0x%08x.\n", color);
+
+ hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
+ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+ hr = IDirectDrawSurface_IsLost(sysmem_surface);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+
+ hr = IDirectDrawSurface_Blt(sysmem_surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ ok(hr == E_NOTIMPL, "Got unexpected hr %#x.\n", hr);
+ color = get_surface_color(sysmem_surface, 320, 240);
+ ok(color == 0x00000000, "Got unexpected color 0x%08x.\n", color);
+
+ IDirectDrawSurface_Release(surface2);
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
+ surface_desc.dwWidth = 640;
+ surface_desc.dwHeight = 480;
+ surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
+ hr = IDirectDraw2_CreateSurface(ddraw2, &surface_desc, &surface2, NULL);
+ ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+ hr = IDirectDrawSurface_Blt(surface2, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
+ ok(SUCCEEDED(hr), "Failed to fill surface, hr %#x.\n", hr);
+
+ hr = IDirectDrawSurface_Blt(sysmem_surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ todo_wine ok(hr == D3D_OK, "Failed to blit, hr %#x.\n", hr);
+ color = get_surface_color(sysmem_surface, 320, 240);
+ todo_wine ok(compare_color(color, 0x000000ff, 1), "Got unexpected color 0x%08x.\n", color);
+
+ IDirectDrawSurface_Release(surface);
+ IDirectDrawSurface_Release(surface2);
+ IDirectDrawSurface_Release(sysmem_surface);
+ refcount = IDirect3DDevice2_Release(device);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+ refcount = IDirect3DDevice2_Release(device2);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+ IDirectDraw2_Release(ddraw);
+ IDirectDraw2_Release(ddraw2);
+ DestroyWindow(window);
+ DestroyWindow(window2);
+}
+
static void test_getdc(void)
{
IDirectDrawSurface *surface, *surface2, *tmp;
@@ -12966,6 +13093,7 @@ START_TEST(ddraw2)
test_overlay_rect();
test_blt();
test_blt_z_alpha();
+ test_cross_device_blt();
test_getdc();
test_draw_primitive();
test_edge_antialiasing_blending();
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index 172d99d16707..cc77eea4a99f 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -11615,6 +11615,141 @@ static void test_blt_z_alpha(void)
DestroyWindow(window);
}
+static void test_cross_device_blt(void)
+{
+ IDirectDrawSurface4 *surface, *surface2, *sysmem_surface;
+ IDirect3DDevice3 *device, *device2;
+ IDirectDraw4 *ddraw, *ddraw2;
+ DDSURFACEDESC2 surface_desc;
+ HWND window, window2;
+ IDirect3D3 *d3d;
+ ULONG refcount;
+ D3DCOLOR color;
+ DDBLTFX fx;
+ HRESULT hr;
+
+ window = create_window();
+ if (!(device = create_device(window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN)))
+ {
+ skip("Failed to create a 3D device.\n");
+ DestroyWindow(window);
+ return;
+ }
+
+ window2 = create_window();
+ if (!(device2 = create_device(window2, DDSCL_NORMAL)))
+ {
+ skip("Failed to create a 3D device.\n");
+ IDirect3DDevice3_Release(device);
+ DestroyWindow(window);
+ DestroyWindow(window2);
+ return;
+ }
+
+ hr = IDirect3DDevice3_GetDirect3D(device, &d3d);
+ ok(SUCCEEDED(hr), "Failed to get Direct3D3 interface, hr %#x.\n", hr);
+ hr = IDirect3D3_QueryInterface(d3d, &IID_IDirectDraw4, (void **)&ddraw);
+ ok(SUCCEEDED(hr), "Failed to get DirectDraw4 interface, hr %#x.\n", hr);
+ IDirect3D3_Release(d3d);
+
+ hr = IDirect3DDevice3_GetDirect3D(device2, &d3d);
+ ok(SUCCEEDED(hr), "Failed to get Direct3D3 interface, hr %#x.\n", hr);
+ hr = IDirect3D3_QueryInterface(d3d, &IID_IDirectDraw4, (void **)&ddraw2);
+ ok(SUCCEEDED(hr), "Failed to get DirectDraw4 interface, hr %#x.\n", hr);
+ IDirect3D3_Release(d3d);
+
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
+ surface_desc.dwWidth = 640;
+ surface_desc.dwHeight = 480;
+ surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
+ hr = IDirectDraw4_CreateSurface(ddraw, &surface_desc, &sysmem_surface, NULL);
+ ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
+ surface_desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP | DDSCAPS_VIDEOMEMORY;
+ U5(surface_desc).dwBackBufferCount = 2;
+ hr = IDirectDraw4_CreateSurface(ddraw, &surface_desc, &surface, NULL);
+ ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT;
+ surface_desc.dwWidth = 640;
+ surface_desc.dwHeight = 480;
+ surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
+ surface_desc.ddpfPixelFormat.dwSize = sizeof(surface_desc.ddpfPixelFormat);
+ surface_desc.ddpfPixelFormat.dwFlags = DDPF_RGB;
+ U1(surface_desc.ddpfPixelFormat).dwRGBBitCount = 16;
+ U2(surface_desc.ddpfPixelFormat).dwRBitMask = 0x00007c00;
+ U3(surface_desc.ddpfPixelFormat).dwGBitMask = 0x000003e0;
+ U4(surface_desc.ddpfPixelFormat).dwBBitMask = 0x0000001f;
+ hr = IDirectDraw4_CreateSurface(ddraw2, &surface_desc, &surface2, NULL);
+ ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+
+ memset(&fx, 0, sizeof(fx));
+ fx.dwSize = sizeof(fx);
+ U5(fx).dwFillColor = 0xff0000ff;
+ hr = IDirectDrawSurface4_Blt(surface2, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
+ ok(SUCCEEDED(hr), "Failed to fill surface, hr %#x.\n", hr);
+
+ hr = IDirectDrawSurface4_Blt(surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ ok(hr == E_NOTIMPL, "Got unexpected hr %#x.\n", hr);
+ hr = IDirectDrawSurface4_Flip(surface, NULL, DDFLIP_WAIT);
+ ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
+ hr = IDirectDrawSurface4_Blt(surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ ok(hr == E_NOTIMPL, "Got unexpected hr %#x.\n", hr);
+ color = get_surface_color(surface, 320, 240);
+ ok(color == 0x00000000, "Got unexpected color 0x%08x.\n", color);
+
+ hr = IDirectDrawSurface4_Blt(sysmem_surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ ok(hr == E_NOTIMPL, "Got unexpected hr %#x.\n", hr);
+ color = get_surface_color(sysmem_surface, 320, 240);
+ ok(color == 0x00000000, "Got unexpected color 0x%08x.\n", color);
+
+ hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
+ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+ hr = IDirectDrawSurface4_IsLost(sysmem_surface);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+
+ hr = IDirectDrawSurface4_Blt(sysmem_surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ ok(hr == E_NOTIMPL, "Got unexpected hr %#x.\n", hr);
+ color = get_surface_color(sysmem_surface, 320, 240);
+ ok(color == 0x00000000, "Got unexpected color 0x%08x.\n", color);
+
+ IDirectDrawSurface4_Release(surface2);
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
+ surface_desc.dwWidth = 640;
+ surface_desc.dwHeight = 480;
+ surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
+ hr = IDirectDraw4_CreateSurface(ddraw2, &surface_desc, &surface2, NULL);
+ ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+ hr = IDirectDrawSurface4_Blt(surface2, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
+ ok(SUCCEEDED(hr), "Failed to fill surface, hr %#x.\n", hr);
+
+ hr = IDirectDrawSurface4_Blt(sysmem_surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ todo_wine ok(hr == D3D_OK, "Failed to blit, hr %#x.\n", hr);
+ color = get_surface_color(sysmem_surface, 320, 240);
+ todo_wine ok(compare_color(color, 0x000000ff, 1), "Got unexpected color 0x%08x.\n", color);
+
+ IDirectDrawSurface4_Release(surface);
+ IDirectDrawSurface4_Release(surface2);
+ IDirectDrawSurface4_Release(sysmem_surface);
+ IDirectDraw4_Release(ddraw);
+ IDirectDraw4_Release(ddraw2);
+ refcount = IDirect3DDevice3_Release(device);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+ refcount = IDirect3DDevice3_Release(device2);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+ DestroyWindow(window);
+ DestroyWindow(window2);
+}
+
static void test_color_clamping(void)
{
static D3DRECT clear_rect = {{0}, {0}, {640}, {480}};
@@ -15060,6 +15195,7 @@ START_TEST(ddraw4)
test_overlay_rect();
test_blt();
test_blt_z_alpha();
+ test_cross_device_blt();
test_color_clamping();
test_getdc();
test_draw_primitive();
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index 35a45c034566..501c9a184e28 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -11581,6 +11581,141 @@ static void test_blt_z_alpha(void)
DestroyWindow(window);
}
+static void test_cross_device_blt(void)
+{
+ IDirectDrawSurface7 *surface, *surface2, *sysmem_surface;
+ IDirect3DDevice7 *device, *device2;
+ IDirectDraw7 *ddraw, *ddraw2;
+ DDSURFACEDESC2 surface_desc;
+ HWND window, window2;
+ IDirect3D7 *d3d;
+ ULONG refcount;
+ D3DCOLOR color;
+ DDBLTFX fx;
+ HRESULT hr;
+
+ window = create_window();
+ if (!(device = create_device(window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN)))
+ {
+ skip("Failed to create a 3D device.\n");
+ DestroyWindow(window);
+ return;
+ }
+
+ window2 = create_window();
+ if (!(device2 = create_device(window2, DDSCL_NORMAL)))
+ {
+ skip("Failed to create a 3D device.\n");
+ IDirect3DDevice7_Release(device);
+ DestroyWindow(window);
+ DestroyWindow(window2);
+ return;
+ }
+
+ hr = IDirect3DDevice7_GetDirect3D(device, &d3d);
+ ok(SUCCEEDED(hr), "Failed to get Direct3D7 interface, hr %#x.\n", hr);
+ hr = IDirect3D7_QueryInterface(d3d, &IID_IDirectDraw7, (void **)&ddraw);
+ ok(SUCCEEDED(hr), "Failed to get DirectDraw7 interface, hr %#x.\n", hr);
+ IDirect3D7_Release(d3d);
+
+ hr = IDirect3DDevice7_GetDirect3D(device2, &d3d);
+ ok(SUCCEEDED(hr), "Failed to get Direct3D7 interface, hr %#x.\n", hr);
+ hr = IDirect3D7_QueryInterface(d3d, &IID_IDirectDraw7, (void **)&ddraw2);
+ ok(SUCCEEDED(hr), "Failed to get DirectDraw7 interface, hr %#x.\n", hr);
+ IDirect3D7_Release(d3d);
+
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
+ surface_desc.dwWidth = 640;
+ surface_desc.dwHeight = 480;
+ surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
+ hr = IDirectDraw7_CreateSurface(ddraw, &surface_desc, &sysmem_surface, NULL);
+ ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
+ surface_desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP | DDSCAPS_VIDEOMEMORY;
+ U5(surface_desc).dwBackBufferCount = 2;
+ hr = IDirectDraw7_CreateSurface(ddraw, &surface_desc, &surface, NULL);
+ ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT;
+ surface_desc.dwWidth = 640;
+ surface_desc.dwHeight = 480;
+ surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
+ surface_desc.ddpfPixelFormat.dwSize = sizeof(surface_desc.ddpfPixelFormat);
+ surface_desc.ddpfPixelFormat.dwFlags = DDPF_RGB;
+ U1(surface_desc.ddpfPixelFormat).dwRGBBitCount = 16;
+ U2(surface_desc.ddpfPixelFormat).dwRBitMask = 0x00007c00;
+ U3(surface_desc.ddpfPixelFormat).dwGBitMask = 0x000003e0;
+ U4(surface_desc.ddpfPixelFormat).dwBBitMask = 0x0000001f;
+ hr = IDirectDraw7_CreateSurface(ddraw2, &surface_desc, &surface2, NULL);
+ ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+
+ memset(&fx, 0, sizeof(fx));
+ fx.dwSize = sizeof(fx);
+ U5(fx).dwFillColor = 0xff0000ff;
+ hr = IDirectDrawSurface7_Blt(surface2, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
+ ok(SUCCEEDED(hr), "Failed to fill surface, hr %#x.\n", hr);
+
+ hr = IDirectDrawSurface7_Blt(surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ ok(hr == E_NOTIMPL, "Got unexpected hr %#x.\n", hr);
+ hr = IDirectDrawSurface7_Flip(surface, NULL, DDFLIP_WAIT);
+ ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
+ hr = IDirectDrawSurface7_Blt(surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ ok(hr == E_NOTIMPL, "Got unexpected hr %#x.\n", hr);
+ color = get_surface_color(surface, 320, 240);
+ ok(color == 0x00000000, "Got unexpected color 0x%08x.\n", color);
+
+ hr = IDirectDrawSurface7_Blt(sysmem_surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ ok(hr == E_NOTIMPL, "Got unexpected hr %#x.\n", hr);
+ color = get_surface_color(sysmem_surface, 320, 240);
+ ok(color == 0x00000000, "Got unexpected color 0x%08x.\n", color);
+
+ hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
+ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+ hr = IDirectDrawSurface7_IsLost(sysmem_surface);
+ ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
+
+ hr = IDirectDrawSurface7_Blt(sysmem_surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ ok(hr == E_NOTIMPL, "Got unexpected hr %#x.\n", hr);
+ color = get_surface_color(sysmem_surface, 320, 240);
+ ok(color == 0x00000000, "Got unexpected color 0x%08x.\n", color);
+
+ IDirectDrawSurface7_Release(surface2);
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
+ surface_desc.dwWidth = 640;
+ surface_desc.dwHeight = 480;
+ surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
+ hr = IDirectDraw7_CreateSurface(ddraw2, &surface_desc, &surface2, NULL);
+ ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+ hr = IDirectDrawSurface7_Blt(surface2, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
+ ok(SUCCEEDED(hr), "Failed to fill surface, hr %#x.\n", hr);
+
+ hr = IDirectDrawSurface7_Blt(sysmem_surface, NULL, surface2, NULL, DDFLIP_WAIT, NULL);
+ todo_wine ok(hr == D3D_OK, "Failed to blit, hr %#x.\n", hr);
+ color = get_surface_color(sysmem_surface, 320, 240);
+ todo_wine ok(compare_color(color, 0x000000ff, 1), "Got unexpected color 0x%08x.\n", color);
+
+ IDirectDrawSurface7_Release(surface);
+ IDirectDrawSurface7_Release(surface2);
+ IDirectDrawSurface7_Release(sysmem_surface);
+ IDirectDraw7_Release(ddraw);
+ IDirectDraw7_Release(ddraw2);
+ refcount = IDirect3DDevice7_Release(device);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+ refcount = IDirect3DDevice7_Release(device2);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+ DestroyWindow(window);
+ DestroyWindow(window2);
+}
+
static void test_color_clamping(void)
{
static D3DMATRIX mat =
@@ -14384,6 +14519,7 @@ START_TEST(ddraw7)
test_overlay_rect();
test_blt();
test_blt_z_alpha();
+ test_cross_device_blt();
test_color_clamping();
test_getdc();
test_draw_primitive();
--
2.16.4