ddraw/tests: Add tests for cross-device blits.

Signed-off-by: Józef Kucia <jkucia@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Józef Kucia 2018-08-09 14:38:36 +02:00 committed by Alexandre Julliard
parent db6f95880c
commit 4195e612d0
4 changed files with 528 additions and 0 deletions

View File

@ -9046,6 +9046,133 @@ static void test_blt_z_alpha(void)
DestroyWindow(window); 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, DDBLT_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, DDBLT_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, DDBLT_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, DDBLT_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, DDBLT_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) static void test_getdc(void)
{ {
IDirectDrawSurface *surface, *surface2, *tmp; IDirectDrawSurface *surface, *surface2, *tmp;
@ -11677,6 +11804,7 @@ START_TEST(ddraw1)
test_overlay_rect(); test_overlay_rect();
test_blt(); test_blt();
test_blt_z_alpha(); test_blt_z_alpha();
test_cross_device_blt();
test_getdc(); test_getdc();
test_transform_vertices(); test_transform_vertices();
test_display_mode_surface_pixel_format(); test_display_mode_surface_pixel_format();

View File

@ -10159,6 +10159,133 @@ static void test_blt_z_alpha(void)
DestroyWindow(window); 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, DDBLT_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, DDBLT_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, DDBLT_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, DDBLT_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, DDBLT_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) static void test_getdc(void)
{ {
IDirectDrawSurface *surface, *surface2, *tmp; IDirectDrawSurface *surface, *surface2, *tmp;
@ -12966,6 +13093,7 @@ START_TEST(ddraw2)
test_overlay_rect(); test_overlay_rect();
test_blt(); test_blt();
test_blt_z_alpha(); test_blt_z_alpha();
test_cross_device_blt();
test_getdc(); test_getdc();
test_draw_primitive(); test_draw_primitive();
test_edge_antialiasing_blending(); test_edge_antialiasing_blending();

View File

@ -11615,6 +11615,141 @@ static void test_blt_z_alpha(void)
DestroyWindow(window); 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, DDBLT_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, DDBLT_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, DDBLT_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, DDBLT_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, DDBLT_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 void test_color_clamping(void)
{ {
static D3DRECT clear_rect = {{0}, {0}, {640}, {480}}; static D3DRECT clear_rect = {{0}, {0}, {640}, {480}};
@ -15060,6 +15195,7 @@ START_TEST(ddraw4)
test_overlay_rect(); test_overlay_rect();
test_blt(); test_blt();
test_blt_z_alpha(); test_blt_z_alpha();
test_cross_device_blt();
test_color_clamping(); test_color_clamping();
test_getdc(); test_getdc();
test_draw_primitive(); test_draw_primitive();

View File

@ -11581,6 +11581,141 @@ static void test_blt_z_alpha(void)
DestroyWindow(window); 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, DDBLT_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, DDBLT_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, DDBLT_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, DDBLT_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, DDBLT_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 void test_color_clamping(void)
{ {
static D3DMATRIX mat = static D3DMATRIX mat =
@ -14998,6 +15133,7 @@ START_TEST(ddraw7)
test_overlay_rect(); test_overlay_rect();
test_blt(); test_blt();
test_blt_z_alpha(); test_blt_z_alpha();
test_cross_device_blt();
test_color_clamping(); test_color_clamping();
test_getdc(); test_getdc();
test_draw_primitive(); test_draw_primitive();