Signed-off-by: Józef Kucia jkucia@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();
Hi,
While running your changed tests on Windows, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=40590
Your paranoid android.
=== wvistau64 (32 bit ddraw2) === ddraw2.c:2830: Test failed: Expected message 0x46, but didn't receive it. ddraw2.c:2832: Test failed: Expected screen size 1024x768, got 0x0. ddraw2.c:2838: Test failed: Expected (0,0)-(1024,768), got (-8,-8)-(1032,746). ddraw2.c:2868: Test failed: Expected (0,0)-(1024,768), got (-8,-8)-(1032,746). ddraw2.c:2875: Test failed: Expected (0,0)-(1024,768), got (-8,-8)-(1032,746). ddraw2.c:2901: Test failed: Expected (0,0)-(1024,768), got (-8,-8)-(1032,746). ddraw2.c:2924: Test failed: Expected (0,0)-(1024,768), got (-8,-8)-(1032,746). ddraw2.c:2953: Test failed: Expected (0,0)-(1024,768), got (-8,-8)-(1032,746). ddraw2.c:2979: Test failed: Expected (0,0)-(1024,768), got (-8,-8)-(1032,746). ddraw2.c:2999: Test failed: Expected (0,0)-(1024,768), got (-8,-8)-(1032,746). ddraw2.c:3035: Test failed: Expected (0,0)-(1024,768), got (-8,-8)-(1032,746). ddraw2.c:3045: Test failed: Expected (0,0)-(1024,768), got (-8,-8)-(1032,746). ddraw2.c:3071: Test failed: Expected (0,0)-(1024,768), got (-8,-8)-(1032,746). ddraw2.c:3094: Test failed: Expected (0,0)-(1024,768), got (-8,-8)-(1032,746). ddraw2.c:3116: Test failed: Expected (0,0)-(1024,768), got (-8,-8)-(1032,746). ddraw2.c:3142: Test failed: Expected (0,0)-(1024,768), got (-8,-8)-(1032,746). ddraw2.c:3162: Test failed: Expected (0,0)-(1024,768), got (-8,-8)-(1032,746). ddraw2.c:3199: Test failed: Expected (0,0)-(1024,768), got (-8,-8)-(1032,746).
Signed-off-by: Józef Kucia jkucia@codeweavers.com ---
Version 2: Use DDBLT_WAIT.
--- 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..7afc2ec4cb51 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, 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) { 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..84ffa77169c2 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, 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) { 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..9b72faa0ec0a 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, 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 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..544a4326287c 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, 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 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();
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com