From 2c46fd0807ea251fe206401d83c2790b378415f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zef=20Kucia?= Date: Tue, 17 Jan 2017 12:26:36 +0100 Subject: [PATCH] ddraw/tests: Rewrite StructSizeTest(). MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Józef Kucia Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/ddraw/tests/ddraw1.c | 161 +++++++++++++++++++++++++++ dlls/ddraw/tests/ddraw2.c | 198 +++++++++++++++++++++++++++++++++ dlls/ddraw/tests/ddraw4.c | 204 +++++++++++++++++++++++++++++++++- dlls/ddraw/tests/ddraw7.c | 216 +++++++++++++++++++++++++++++++++++- dlls/ddraw/tests/dsurface.c | 107 ------------------ 5 files changed, 775 insertions(+), 111 deletions(-) diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c index 9e05913627e..5acbee61e00 100644 --- a/dlls/ddraw/tests/ddraw1.c +++ b/dlls/ddraw/tests/ddraw1.c @@ -4121,6 +4121,10 @@ static void test_surface_lock(void) ok(SUCCEEDED(hr), "Failed to unlock surface, type %s, hr %#x.\n", tests[i].name, hr); } + memset(&ddsd, 0, sizeof(ddsd)); + hr = IDirectDrawSurface_Lock(surface, NULL, &ddsd, DDLOCK_WAIT, NULL); + ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x, type %s.\n", hr, tests[i].name); + IDirectDrawSurface_Release(surface); } @@ -9793,6 +9797,162 @@ static void test_display_mode_surface_pixel_format(void) DestroyWindow(window); } +static void test_surface_desc_size(void) +{ + union + { + DWORD dwSize; + DDSURFACEDESC desc1; + DDSURFACEDESC2 desc2; + BYTE blob[1024]; + } desc; + IDirectDrawSurface7 *surface7; + IDirectDrawSurface *surface; + DDSURFACEDESC surface_desc; + HRESULT expected_hr, hr; + IDirectDraw *ddraw; + unsigned int i, j; + ULONG refcount; + + static const struct + { + unsigned int caps; + const char *name; + } + surface_caps[] = + { + {DDSCAPS_OFFSCREENPLAIN, "offscreenplain"}, + {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, "systemmemory texture"}, + {DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY, "videomemory texture"}, + }; + static const unsigned int desc_sizes[] = + { + sizeof(DDSURFACEDESC), + sizeof(DDSURFACEDESC2), + sizeof(DDSURFACEDESC) + 1, + sizeof(DDSURFACEDESC2) + 1, + 2 * sizeof(DDSURFACEDESC), + 2 * sizeof(DDSURFACEDESC2), + sizeof(DDSURFACEDESC) - 1, + sizeof(DDSURFACEDESC2) - 1, + sizeof(DDSURFACEDESC) / 2, + sizeof(DDSURFACEDESC2) / 2, + 0, + 1, + 12, + sizeof(desc) / 2, + sizeof(desc) - 100, + }; + + if (!(ddraw = create_ddraw())) + { + skip("Failed to create ddraw.\n"); + return; + } + hr = IDirectDraw_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL); + ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); + + for (i = 0; i < sizeof(surface_caps) / sizeof(*surface_caps); ++i) + { + memset(&surface_desc, 0, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + surface_desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; + surface_desc.ddsCaps.dwCaps = surface_caps[i].caps; + surface_desc.dwHeight = 128; + surface_desc.dwWidth = 128; + if (FAILED(IDirectDraw_CreateSurface(ddraw, &surface_desc, &surface, NULL))) + { + skip("Failed to create surface, type %s.\n", surface_caps[i].name); + continue; + } + hr = IDirectDrawSurface_QueryInterface(surface, &IID_IDirectDrawSurface7, (void **)&surface7); + ok(hr == DD_OK, "Failed to query IDirectDrawSurface7, hr %#x, type %s.\n", hr, surface_caps[i].name); + + /* GetSurfaceDesc() */ + for (j = 0; j < sizeof(desc_sizes) / sizeof(*desc_sizes); ++j) + { + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + expected_hr = desc.dwSize == sizeof(DDSURFACEDESC) ? DD_OK : DDERR_INVALIDPARAMS; + hr = IDirectDrawSurface_GetSurfaceDesc(surface, &desc.desc1); + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + expected_hr = desc.dwSize == sizeof(DDSURFACEDESC2) ? DD_OK : DDERR_INVALIDPARAMS; + hr = IDirectDrawSurface7_GetSurfaceDesc(surface7, &desc.desc2); + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + } + + /* Lock() */ + for (j = 0; j < sizeof(desc_sizes) / sizeof(*desc_sizes); ++j) + { + const BOOL valid_size = desc_sizes[j] == sizeof(DDSURFACEDESC) + || desc_sizes[j] == sizeof(DDSURFACEDESC2); + DWORD expected_texture_stage; + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + desc.desc2.dwTextureStage = 0xdeadbeef; + desc.blob[sizeof(DDSURFACEDESC2)] = 0xef; + hr = IDirectDrawSurface_Lock(surface, NULL, &desc.desc1, 0, 0); + expected_hr = valid_size ? DD_OK : DDERR_INVALIDPARAMS; + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + ok(desc.dwSize == desc_sizes[j], "dwSize was changed from %u to %u, type %s.\n", + desc_sizes[j], desc.dwSize, surface_caps[i].name); + ok(desc.blob[sizeof(DDSURFACEDESC2)] == 0xef, "Got unexpected byte %02x, dwSize %u, type %s.\n", + desc.blob[sizeof(DDSURFACEDESC2)], desc_sizes[j], surface_caps[i].name); + if (SUCCEEDED(hr)) + { + ok(desc.desc1.dwWidth == 128, "Got unexpected width %u, dwSize %u, type %s.\n", + desc.desc1.dwWidth, desc_sizes[j], surface_caps[i].name); + ok(desc.desc1.dwHeight == 128, "Got unexpected height %u, dwSize %u, type %s.\n", + desc.desc1.dwHeight, desc_sizes[j], surface_caps[i].name); + expected_texture_stage = desc_sizes[j] >= sizeof(DDSURFACEDESC2) ? 0 : 0xdeadbeef; + todo_wine_if(!expected_texture_stage) + ok(desc.desc2.dwTextureStage == expected_texture_stage, + "Got unexpected texture stage %#x, dwSize %u, type %s.\n", + desc.desc2.dwTextureStage, desc_sizes[j], surface_caps[i].name); + IDirectDrawSurface_Unlock(surface, NULL); + } + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + desc.desc2.dwTextureStage = 0xdeadbeef; + desc.blob[sizeof(DDSURFACEDESC2)] = 0xef; + hr = IDirectDrawSurface7_Lock(surface7, NULL, &desc.desc2, 0, 0); + expected_hr = valid_size ? DD_OK : DDERR_INVALIDPARAMS; + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + ok(desc.dwSize == desc_sizes[j], "dwSize was changed from %u to %u, type %s.\n", + desc_sizes[j], desc.dwSize, surface_caps[i].name); + ok(desc.blob[sizeof(DDSURFACEDESC2)] == 0xef, "Got unexpected byte %02x, dwSize %u, type %s.\n", + desc.blob[sizeof(DDSURFACEDESC2)], desc_sizes[j], surface_caps[i].name); + if (SUCCEEDED(hr)) + { + ok(desc.desc2.dwWidth == 128, "Got unexpected width %u, dwSize %u, type %s.\n", + desc.desc2.dwWidth, desc_sizes[j], surface_caps[i].name); + ok(desc.desc2.dwHeight == 128, "Got unexpected height %u, dwSize %u, type %s.\n", + desc.desc2.dwHeight, desc_sizes[j], surface_caps[i].name); + expected_texture_stage = desc_sizes[j] >= sizeof(DDSURFACEDESC2) ? 0 : 0xdeadbeef; + ok(desc.desc2.dwTextureStage == expected_texture_stage, + "Got unexpected texture stage %#x, dwSize %u, type %s.\n", + desc.desc2.dwTextureStage, desc_sizes[j], surface_caps[i].name); + IDirectDrawSurface7_Unlock(surface7, NULL); + } + } + + IDirectDrawSurface7_Release(surface7); + IDirectDrawSurface_Release(surface); + } + + refcount = IDirectDraw7_Release(ddraw); + ok(!refcount, "DirectDraw has %u references left.\n", refcount); +} + START_TEST(ddraw1) { IDirectDraw *ddraw; @@ -9877,4 +10037,5 @@ START_TEST(ddraw1) test_getdc(); test_transform_vertices(); test_display_mode_surface_pixel_format(); + test_surface_desc_size(); } diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c index 19c69752906..dc8801c3e12 100644 --- a/dlls/ddraw/tests/ddraw2.c +++ b/dlls/ddraw/tests/ddraw2.c @@ -4751,6 +4751,10 @@ static void test_surface_lock(void) ok(SUCCEEDED(hr), "Failed to unlock surface, type %s, hr %#x.\n", tests[i].name, hr); } + memset(&ddsd, 0, sizeof(ddsd)); + hr = IDirectDrawSurface_Lock(surface, NULL, &ddsd, DDLOCK_WAIT, NULL); + ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x, type %s.\n", hr, tests[i].name); + IDirectDrawSurface_Release(surface); } @@ -11247,6 +11251,199 @@ static void test_display_mode_surface_pixel_format(void) DestroyWindow(window); } +static void test_surface_desc_size(void) +{ + union + { + DWORD dwSize; + DDSURFACEDESC desc1; + DDSURFACEDESC2 desc2; + BYTE blob[1024]; + } desc; + IDirectDrawSurface7 *surface7; + IDirectDrawSurface2 *surface2; + IDirectDrawSurface *surface; + DDSURFACEDESC surface_desc; + HRESULT expected_hr, hr; + IDirectDraw2 *ddraw; + unsigned int i, j; + ULONG refcount; + + static const struct + { + unsigned int caps; + const char *name; + } + surface_caps[] = + { + {DDSCAPS_OFFSCREENPLAIN, "offscreenplain"}, + {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, "systemmemory texture"}, + {DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY, "videomemory texture"}, + }; + static const unsigned int desc_sizes[] = + { + sizeof(DDSURFACEDESC), + sizeof(DDSURFACEDESC2), + sizeof(DDSURFACEDESC) + 1, + sizeof(DDSURFACEDESC2) + 1, + 2 * sizeof(DDSURFACEDESC), + 2 * sizeof(DDSURFACEDESC2), + sizeof(DDSURFACEDESC) - 1, + sizeof(DDSURFACEDESC2) - 1, + sizeof(DDSURFACEDESC) / 2, + sizeof(DDSURFACEDESC2) / 2, + 0, + 1, + 12, + sizeof(desc) / 2, + sizeof(desc) - 100, + }; + + if (!(ddraw = create_ddraw())) + { + skip("Failed to create ddraw.\n"); + return; + } + hr = IDirectDraw2_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL); + ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); + + for (i = 0; i < sizeof(surface_caps) / sizeof(*surface_caps); ++i) + { + memset(&surface_desc, 0, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + surface_desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; + surface_desc.ddsCaps.dwCaps = surface_caps[i].caps; + surface_desc.dwHeight = 128; + surface_desc.dwWidth = 128; + if (FAILED(IDirectDraw2_CreateSurface(ddraw, &surface_desc, &surface, NULL))) + { + skip("Failed to create surface, type %s.\n", surface_caps[i].name); + continue; + } + hr = IDirectDrawSurface_QueryInterface(surface, &IID_IDirectDrawSurface2, (void **)&surface2); + ok(hr == DD_OK, "Failed to query IDirectDrawSurface2, hr %#x, type %s.\n", hr, surface_caps[i].name); + hr = IDirectDrawSurface_QueryInterface(surface, &IID_IDirectDrawSurface7, (void **)&surface7); + ok(hr == DD_OK, "Failed to query IDirectDrawSurface7, hr %#x, type %s.\n", hr, surface_caps[i].name); + + /* GetSurfaceDesc() */ + for (j = 0; j < sizeof(desc_sizes) / sizeof(*desc_sizes); ++j) + { + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + expected_hr = desc.dwSize == sizeof(DDSURFACEDESC) ? DD_OK : DDERR_INVALIDPARAMS; + hr = IDirectDrawSurface_GetSurfaceDesc(surface, &desc.desc1); + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + expected_hr = desc.dwSize == sizeof(DDSURFACEDESC) ? DD_OK : DDERR_INVALIDPARAMS; + hr = IDirectDrawSurface2_GetSurfaceDesc(surface2, &desc.desc1); + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + expected_hr = desc.dwSize == sizeof(DDSURFACEDESC2) ? DD_OK : DDERR_INVALIDPARAMS; + hr = IDirectDrawSurface7_GetSurfaceDesc(surface7, &desc.desc2); + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + } + + /* Lock() */ + for (j = 0; j < sizeof(desc_sizes) / sizeof(*desc_sizes); ++j) + { + const BOOL valid_size = desc_sizes[j] == sizeof(DDSURFACEDESC) + || desc_sizes[j] == sizeof(DDSURFACEDESC2); + DWORD expected_texture_stage; + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + desc.desc2.dwTextureStage = 0xdeadbeef; + desc.blob[sizeof(DDSURFACEDESC2)] = 0xef; + hr = IDirectDrawSurface_Lock(surface, NULL, &desc.desc1, 0, 0); + expected_hr = valid_size ? DD_OK : DDERR_INVALIDPARAMS; + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + ok(desc.dwSize == desc_sizes[j], "dwSize was changed from %u to %u, type %s.\n", + desc_sizes[j], desc.dwSize, surface_caps[i].name); + ok(desc.blob[sizeof(DDSURFACEDESC2)] == 0xef, "Got unexpected byte %02x, dwSize %u, type %s.\n", + desc.blob[sizeof(DDSURFACEDESC2)], desc_sizes[j], surface_caps[i].name); + if (SUCCEEDED(hr)) + { + ok(desc.desc1.dwWidth == 128, "Got unexpected width %u, dwSize %u, type %s.\n", + desc.desc1.dwWidth, desc_sizes[j], surface_caps[i].name); + ok(desc.desc1.dwHeight == 128, "Got unexpected height %u, dwSize %u, type %s.\n", + desc.desc1.dwHeight, desc_sizes[j], surface_caps[i].name); + expected_texture_stage = desc_sizes[j] >= sizeof(DDSURFACEDESC2) ? 0 : 0xdeadbeef; + todo_wine_if(!expected_texture_stage) + ok(desc.desc2.dwTextureStage == expected_texture_stage, + "Got unexpected texture stage %#x, dwSize %u, type %s.\n", + desc.desc2.dwTextureStage, desc_sizes[j], surface_caps[i].name); + IDirectDrawSurface_Unlock(surface, NULL); + } + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + desc.desc2.dwTextureStage = 0xdeadbeef; + desc.blob[sizeof(DDSURFACEDESC2)] = 0xef; + hr = IDirectDrawSurface2_Lock(surface2, NULL, &desc.desc1, 0, 0); + expected_hr = valid_size ? DD_OK : DDERR_INVALIDPARAMS; + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + ok(desc.dwSize == desc_sizes[j], "dwSize was changed from %u to %u, type %s.\n", + desc_sizes[j], desc.dwSize, surface_caps[i].name); + ok(desc.blob[sizeof(DDSURFACEDESC2)] == 0xef, "Got unexpected byte %02x, dwSize %u, type %s.\n", + desc.blob[sizeof(DDSURFACEDESC2)], desc_sizes[j], surface_caps[i].name); + if (SUCCEEDED(hr)) + { + ok(desc.desc2.dwWidth == 128, "Got unexpected width %u, dwSize %u, type %s.\n", + desc.desc2.dwWidth, desc_sizes[j], surface_caps[i].name); + ok(desc.desc2.dwHeight == 128, "Got unexpected height %u, dwSize %u, type %s.\n", + desc.desc2.dwHeight, desc_sizes[j], surface_caps[i].name); + expected_texture_stage = desc_sizes[j] >= sizeof(DDSURFACEDESC2) ? 0 : 0xdeadbeef; + todo_wine_if(!expected_texture_stage) + ok(desc.desc2.dwTextureStage == expected_texture_stage, + "Got unexpected texture stage %#x, dwSize %u, type %s.\n", + desc.desc2.dwTextureStage, desc_sizes[j], surface_caps[i].name); + IDirectDrawSurface2_Unlock(surface2, NULL); + } + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + desc.desc2.dwTextureStage = 0xdeadbeef; + desc.blob[sizeof(DDSURFACEDESC2)] = 0xef; + hr = IDirectDrawSurface7_Lock(surface7, NULL, &desc.desc2, 0, 0); + expected_hr = valid_size ? DD_OK : DDERR_INVALIDPARAMS; + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + ok(desc.dwSize == desc_sizes[j], "dwSize was changed from %u to %u, type %s.\n", + desc_sizes[j], desc.dwSize, surface_caps[i].name); + ok(desc.blob[sizeof(DDSURFACEDESC2)] == 0xef, "Got unexpected byte %02x, dwSize %u, type %s.\n", + desc.blob[sizeof(DDSURFACEDESC2)], desc_sizes[j], surface_caps[i].name); + if (SUCCEEDED(hr)) + { + ok(desc.desc2.dwWidth == 128, "Got unexpected width %u, dwSize %u, type %s.\n", + desc.desc2.dwWidth, desc_sizes[j], surface_caps[i].name); + ok(desc.desc2.dwHeight == 128, "Got unexpected height %u, dwSize %u, type %s.\n", + desc.desc2.dwHeight, desc_sizes[j], surface_caps[i].name); + expected_texture_stage = desc_sizes[j] >= sizeof(DDSURFACEDESC2) ? 0 : 0xdeadbeef; + ok(desc.desc2.dwTextureStage == expected_texture_stage, + "Got unexpected texture stage %#x, dwSize %u, type %s.\n", + desc.desc2.dwTextureStage, desc_sizes[j], surface_caps[i].name); + IDirectDrawSurface7_Unlock(surface7, NULL); + } + } + + IDirectDrawSurface7_Release(surface7); + IDirectDrawSurface2_Release(surface2); + IDirectDrawSurface_Release(surface); + } + + refcount = IDirectDraw2_Release(ddraw); + ok(!refcount, "DirectDraw has %u references left.\n", refcount); +} + START_TEST(ddraw2) { IDirectDraw2 *ddraw; @@ -11340,4 +11537,5 @@ START_TEST(ddraw2) test_edge_antialiasing_blending(); test_transform_vertices(); test_display_mode_surface_pixel_format(); + test_surface_desc_size(); } diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index 000a0b3d6e1..f2b3e0cf63b 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -6022,6 +6022,10 @@ static void test_surface_lock(void) ok(SUCCEEDED(hr), "Failed to unlock surface, type %s, hr %#x.\n", tests[i].name, hr); } + memset(&ddsd, 0, sizeof(ddsd)); + hr = IDirectDrawSurface4_Lock(surface, NULL, &ddsd, DDLOCK_WAIT, NULL); + ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x, type %s.\n", hr, tests[i].name); + IDirectDrawSurface4_Release(surface); } @@ -7260,12 +7264,12 @@ static void test_private_data(void) ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr); /* NULL pointers are not valid, but don't cause a crash. */ - hr = IDirectDrawSurface7_SetPrivateData(surface, &ddraw_private_data_test_guid, NULL, + hr = IDirectDrawSurface4_SetPrivateData(surface, &ddraw_private_data_test_guid, NULL, sizeof(IUnknown *), DDSPD_IUNKNOWNPOINTER); ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); - hr = IDirectDrawSurface7_SetPrivateData(surface, &ddraw_private_data_test_guid, NULL, 0, 0); + hr = IDirectDrawSurface4_SetPrivateData(surface, &ddraw_private_data_test_guid, NULL, 0, 0); ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); - hr = IDirectDrawSurface7_SetPrivateData(surface, &ddraw_private_data_test_guid, NULL, 1, 0); + hr = IDirectDrawSurface4_SetPrivateData(surface, &ddraw_private_data_test_guid, NULL, 1, 0); ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); /* DDSPD_IUNKNOWNPOINTER needs sizeof(IUnknown *) bytes of data. */ @@ -12532,6 +12536,199 @@ static void test_display_mode_surface_pixel_format(void) DestroyWindow(window); } +static void test_surface_desc_size(void) +{ + union + { + DWORD dwSize; + DDSURFACEDESC desc1; + DDSURFACEDESC2 desc2; + BYTE blob[1024]; + } desc; + IDirectDrawSurface4 *surface4; + IDirectDrawSurface3 *surface3; + IDirectDrawSurface *surface; + DDSURFACEDESC2 surface_desc; + HRESULT expected_hr, hr; + IDirectDraw4 *ddraw; + unsigned int i, j; + ULONG refcount; + + static const struct + { + unsigned int caps; + const char *name; + } + surface_caps[] = + { + {DDSCAPS_OFFSCREENPLAIN, "offscreenplain"}, + {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, "systemmemory texture"}, + {DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY, "videomemory texture"}, + }; + static const unsigned int desc_sizes[] = + { + sizeof(DDSURFACEDESC), + sizeof(DDSURFACEDESC2), + sizeof(DDSURFACEDESC) + 1, + sizeof(DDSURFACEDESC2) + 1, + 2 * sizeof(DDSURFACEDESC), + 2 * sizeof(DDSURFACEDESC2), + sizeof(DDSURFACEDESC) - 1, + sizeof(DDSURFACEDESC2) - 1, + sizeof(DDSURFACEDESC) / 2, + sizeof(DDSURFACEDESC2) / 2, + 0, + 1, + 12, + sizeof(desc) / 2, + sizeof(desc) - 100, + }; + + if (!(ddraw = create_ddraw())) + { + skip("Failed to create ddraw.\n"); + return; + } + hr = IDirectDraw4_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL); + ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); + + for (i = 0; i < sizeof(surface_caps) / sizeof(*surface_caps); ++i) + { + memset(&surface_desc, 0, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + surface_desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; + surface_desc.ddsCaps.dwCaps = surface_caps[i].caps; + surface_desc.dwHeight = 128; + surface_desc.dwWidth = 128; + if (FAILED(IDirectDraw4_CreateSurface(ddraw, &surface_desc, &surface4, NULL))) + { + skip("Failed to create surface, type %s.\n", surface_caps[i].name); + continue; + } + hr = IDirectDrawSurface_QueryInterface(surface4, &IID_IDirectDrawSurface, (void **)&surface); + ok(hr == DD_OK, "Failed to query IDirectDrawSurface, hr %#x, type %s.\n", hr, surface_caps[i].name); + hr = IDirectDrawSurface_QueryInterface(surface4, &IID_IDirectDrawSurface3, (void **)&surface3); + ok(hr == DD_OK, "Failed to query IDirectDrawSurface3, hr %#x, type %s.\n", hr, surface_caps[i].name); + + /* GetSurfaceDesc() */ + for (j = 0; j < sizeof(desc_sizes) / sizeof(*desc_sizes); ++j) + { + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + expected_hr = desc.dwSize == sizeof(DDSURFACEDESC) ? DD_OK : DDERR_INVALIDPARAMS; + hr = IDirectDrawSurface_GetSurfaceDesc(surface, &desc.desc1); + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + expected_hr = desc.dwSize == sizeof(DDSURFACEDESC) ? DD_OK : DDERR_INVALIDPARAMS; + hr = IDirectDrawSurface3_GetSurfaceDesc(surface3, &desc.desc1); + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + expected_hr = desc.dwSize == sizeof(DDSURFACEDESC2) ? DD_OK : DDERR_INVALIDPARAMS; + hr = IDirectDrawSurface4_GetSurfaceDesc(surface4, &desc.desc2); + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + } + + /* Lock() */ + for (j = 0; j < sizeof(desc_sizes) / sizeof(*desc_sizes); ++j) + { + const BOOL valid_size = desc_sizes[j] == sizeof(DDSURFACEDESC) + || desc_sizes[j] == sizeof(DDSURFACEDESC2); + DWORD expected_texture_stage; + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + desc.desc2.dwTextureStage = 0xdeadbeef; + desc.blob[sizeof(DDSURFACEDESC2)] = 0xef; + hr = IDirectDrawSurface_Lock(surface, NULL, &desc.desc1, 0, 0); + expected_hr = valid_size ? DD_OK : DDERR_INVALIDPARAMS; + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + ok(desc.dwSize == desc_sizes[j], "dwSize was changed from %u to %u, type %s.\n", + desc_sizes[j], desc.dwSize, surface_caps[i].name); + ok(desc.blob[sizeof(DDSURFACEDESC2)] == 0xef, "Got unexpected byte %02x, dwSize %u, type %s.\n", + desc.blob[sizeof(DDSURFACEDESC2)], desc_sizes[j], surface_caps[i].name); + if (SUCCEEDED(hr)) + { + ok(desc.desc1.dwWidth == 128, "Got unexpected width %u, dwSize %u, type %s.\n", + desc.desc1.dwWidth, desc_sizes[j], surface_caps[i].name); + ok(desc.desc1.dwHeight == 128, "Got unexpected height %u, dwSize %u, type %s.\n", + desc.desc1.dwHeight, desc_sizes[j], surface_caps[i].name); + expected_texture_stage = desc_sizes[j] >= sizeof(DDSURFACEDESC2) ? 0 : 0xdeadbeef; + todo_wine_if(!expected_texture_stage) + ok(desc.desc2.dwTextureStage == expected_texture_stage, + "Got unexpected texture stage %#x, dwSize %u, type %s.\n", + desc.desc2.dwTextureStage, desc_sizes[j], surface_caps[i].name); + IDirectDrawSurface_Unlock(surface, NULL); + } + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + desc.desc2.dwTextureStage = 0xdeadbeef; + desc.blob[sizeof(DDSURFACEDESC2)] = 0xef; + hr = IDirectDrawSurface3_Lock(surface3, NULL, &desc.desc1, 0, 0); + expected_hr = valid_size ? DD_OK : DDERR_INVALIDPARAMS; + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + ok(desc.dwSize == desc_sizes[j], "dwSize was changed from %u to %u, type %s.\n", + desc_sizes[j], desc.dwSize, surface_caps[i].name); + ok(desc.blob[sizeof(DDSURFACEDESC2)] == 0xef, "Got unexpected byte %02x, dwSize %u, type %s.\n", + desc.blob[sizeof(DDSURFACEDESC2)], desc_sizes[j], surface_caps[i].name); + if (SUCCEEDED(hr)) + { + ok(desc.desc1.dwWidth == 128, "Got unexpected width %u, dwSize %u, type %s.\n", + desc.desc1.dwWidth, desc_sizes[j], surface_caps[i].name); + ok(desc.desc1.dwHeight == 128, "Got unexpected height %u, dwSize %u, type %s.\n", + desc.desc1.dwHeight, desc_sizes[j], surface_caps[i].name); + expected_texture_stage = desc_sizes[j] >= sizeof(DDSURFACEDESC2) ? 0 : 0xdeadbeef; + todo_wine_if(!expected_texture_stage) + ok(desc.desc2.dwTextureStage == expected_texture_stage, + "Got unexpected texture stage %#x, dwSize %u, type %s.\n", + desc.desc2.dwTextureStage, desc_sizes[j], surface_caps[i].name); + IDirectDrawSurface3_Unlock(surface3, NULL); + } + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + desc.desc2.dwTextureStage = 0xdeadbeef; + desc.blob[sizeof(DDSURFACEDESC2)] = 0xef; + hr = IDirectDrawSurface4_Lock(surface4, NULL, &desc.desc2, 0, 0); + expected_hr = valid_size ? DD_OK : DDERR_INVALIDPARAMS; + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + ok(desc.dwSize == desc_sizes[j], "dwSize was changed from %u to %u, type %s.\n", + desc_sizes[j], desc.dwSize, surface_caps[i].name); + ok(desc.blob[sizeof(DDSURFACEDESC2)] == 0xef, "Got unexpected byte %02x, dwSize %u, type %s.\n", + desc.blob[sizeof(DDSURFACEDESC2)], desc_sizes[j], surface_caps[i].name); + if (SUCCEEDED(hr)) + { + ok(desc.desc2.dwWidth == 128, "Got unexpected width %u, dwSize %u, type %s.\n", + desc.desc2.dwWidth, desc_sizes[j], surface_caps[i].name); + ok(desc.desc2.dwHeight == 128, "Got unexpected height %u, dwSize %u, type %s.\n", + desc.desc2.dwHeight, desc_sizes[j], surface_caps[i].name); + expected_texture_stage = desc_sizes[j] >= sizeof(DDSURFACEDESC2) ? 0 : 0xdeadbeef; + ok(desc.desc2.dwTextureStage == expected_texture_stage, + "Got unexpected texture stage %#x, dwSize %u, type %s.\n", + desc.desc2.dwTextureStage, desc_sizes[j], surface_caps[i].name); + IDirectDrawSurface4_Unlock(surface4, NULL); + } + } + + IDirectDrawSurface4_Release(surface4); + IDirectDrawSurface3_Release(surface3); + IDirectDrawSurface_Release(surface); + } + + refcount = IDirectDraw4_Release(ddraw); + ok(!refcount, "DirectDraw has %u references left.\n", refcount); +} + START_TEST(ddraw4) { IDirectDraw4 *ddraw; @@ -12633,4 +12830,5 @@ START_TEST(ddraw4) test_edge_antialiasing_blending(); test_transform_vertices(); test_display_mode_surface_pixel_format(); + test_surface_desc_size(); } diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c index ed2f1b62717..633ea9fe5b2 100644 --- a/dlls/ddraw/tests/ddraw7.c +++ b/dlls/ddraw/tests/ddraw7.c @@ -5692,7 +5692,7 @@ static void test_surface_lock(void) IDirect3D7 *d3d = NULL; IDirectDrawSurface7 *surface; IDirect3DDevice7 *device; - HRESULT hr; + HRESULT hr, expected_hr; HWND window; unsigned int i; DDSURFACEDESC2 ddsd; @@ -5882,6 +5882,21 @@ static void test_surface_lock(void) ok(SUCCEEDED(hr), "Failed to lock surface, type %s, hr %#x.\n", tests[i].name, hr); if (SUCCEEDED(hr)) { + ok(ddsd.dwSize == sizeof(ddsd), "Got unexpected dwSize %u, type %s.\n", ddsd.dwSize, tests[i].name); + hr = IDirectDrawSurface7_Unlock(surface, NULL); + ok(SUCCEEDED(hr), "Failed to unlock surface, type %s, hr %#x.\n", tests[i].name, hr); + } + + memset(&ddsd, 0, sizeof(ddsd)); + expected_hr = tests[i].caps & DDSCAPS_TEXTURE && !(tests[i].caps & DDSCAPS_VIDEOMEMORY) + ? DD_OK : DDERR_INVALIDPARAMS; + hr = IDirectDrawSurface7_Lock(surface, NULL, &ddsd, DDLOCK_WAIT, NULL); + todo_wine_if(expected_hr == D3D_OK) + ok(hr == expected_hr, "Got hr %#x, expected %#x, type %s.\n", hr, expected_hr, tests[i].name); + if (SUCCEEDED(hr)) + { + ok(!ddsd.dwSize, "Got unexpected dwSize %u, type %s.\n", ddsd.dwSize, tests[i].name); + ok(!!ddsd.lpSurface, "Got NULL lpSurface, type %s.\n", tests[i].name); hr = IDirectDrawSurface7_Unlock(surface, NULL); ok(SUCCEEDED(hr), "Failed to unlock surface, type %s, hr %#x.\n", tests[i].name, hr); } @@ -12193,6 +12208,204 @@ static void test_display_mode_surface_pixel_format(void) DestroyWindow(window); } +static void test_surface_desc_size(void) +{ + union + { + DWORD dwSize; + DDSURFACEDESC desc1; + DDSURFACEDESC2 desc2; + BYTE blob[1024]; + } desc; + IDirectDrawSurface7 *surface7; + IDirectDrawSurface3 *surface3; + IDirectDrawSurface *surface; + DDSURFACEDESC2 surface_desc; + HRESULT expected_hr, hr; + IDirectDraw7 *ddraw; + unsigned int i, j; + ULONG refcount; + + static const struct + { + unsigned int caps; + const char *name; + } + surface_caps[] = + { + {DDSCAPS_OFFSCREENPLAIN, "offscreenplain"}, + {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, "systemmemory texture"}, + {DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY, "videomemory texture"}, + }; + static const unsigned int desc_sizes[] = + { + sizeof(DDSURFACEDESC), + sizeof(DDSURFACEDESC2), + sizeof(DDSURFACEDESC) + 1, + sizeof(DDSURFACEDESC2) + 1, + 2 * sizeof(DDSURFACEDESC), + 2 * sizeof(DDSURFACEDESC2), + sizeof(DDSURFACEDESC) - 1, + sizeof(DDSURFACEDESC2) - 1, + sizeof(DDSURFACEDESC) / 2, + sizeof(DDSURFACEDESC2) / 2, + 0, + 1, + 12, + sizeof(desc) / 2, + sizeof(desc) - 100, + }; + + if (!(ddraw = create_ddraw())) + { + skip("Failed to create ddraw.\n"); + return; + } + hr = IDirectDraw7_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL); + ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); + + for (i = 0; i < sizeof(surface_caps) / sizeof(*surface_caps); ++i) + { + memset(&surface_desc, 0, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + surface_desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; + surface_desc.ddsCaps.dwCaps = surface_caps[i].caps; + surface_desc.dwHeight = 128; + surface_desc.dwWidth = 128; + if (FAILED(IDirectDraw7_CreateSurface(ddraw, &surface_desc, &surface7, NULL))) + { + skip("Failed to create surface, type %s.\n", surface_caps[i].name); + continue; + } + hr = IDirectDrawSurface_QueryInterface(surface7, &IID_IDirectDrawSurface, (void **)&surface); + ok(hr == DD_OK, "Failed to query IDirectDrawSurface, hr %#x, type %s.\n", hr, surface_caps[i].name); + hr = IDirectDrawSurface_QueryInterface(surface7, &IID_IDirectDrawSurface3, (void **)&surface3); + ok(hr == DD_OK, "Failed to query IDirectDrawSurface3, hr %#x, type %s.\n", hr, surface_caps[i].name); + + /* GetSurfaceDesc() */ + for (j = 0; j < sizeof(desc_sizes) / sizeof(*desc_sizes); ++j) + { + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + expected_hr = desc.dwSize == sizeof(DDSURFACEDESC) ? DD_OK : DDERR_INVALIDPARAMS; + hr = IDirectDrawSurface_GetSurfaceDesc(surface, &desc.desc1); + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + expected_hr = desc.dwSize == sizeof(DDSURFACEDESC) ? DD_OK : DDERR_INVALIDPARAMS; + hr = IDirectDrawSurface3_GetSurfaceDesc(surface3, &desc.desc1); + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + expected_hr = desc.dwSize == sizeof(DDSURFACEDESC2) ? DD_OK : DDERR_INVALIDPARAMS; + hr = IDirectDrawSurface7_GetSurfaceDesc(surface7, &desc.desc2); + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + } + + /* Lock() */ + for (j = 0; j < sizeof(desc_sizes) / sizeof(*desc_sizes); ++j) + { + const BOOL ignore_size = surface_caps[i].caps & DDSCAPS_TEXTURE + && !(surface_caps[i].caps & DDSCAPS_VIDEOMEMORY); + const BOOL valid_size = desc_sizes[j] == sizeof(DDSURFACEDESC) + || desc_sizes[j] == sizeof(DDSURFACEDESC2); + DWORD expected_texture_stage; + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + desc.desc2.dwTextureStage = 0xdeadbeef; + desc.blob[sizeof(DDSURFACEDESC2)] = 0xef; + hr = IDirectDrawSurface_Lock(surface, NULL, &desc.desc1, 0, 0); + expected_hr = ignore_size || valid_size ? DD_OK : DDERR_INVALIDPARAMS; + todo_wine_if(ignore_size && !valid_size) + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + ok(desc.dwSize == desc_sizes[j], "dwSize was changed from %u to %u, type %s.\n", + desc_sizes[j], desc.dwSize, surface_caps[i].name); + ok(desc.blob[sizeof(DDSURFACEDESC2)] == 0xef, "Got unexpected byte %02x, dwSize %u, type %s.\n", + desc.blob[sizeof(DDSURFACEDESC2)], desc_sizes[j], surface_caps[i].name); + if (SUCCEEDED(hr)) + { + ok(desc.desc1.dwWidth == 128, "Got unexpected width %u, dwSize %u, type %s.\n", + desc.desc1.dwWidth, desc_sizes[j], surface_caps[i].name); + ok(desc.desc1.dwHeight == 128, "Got unexpected height %u, dwSize %u, type %s.\n", + desc.desc1.dwHeight, desc_sizes[j], surface_caps[i].name); + expected_texture_stage = desc_sizes[j] >= sizeof(DDSURFACEDESC2) ? 0 : 0xdeadbeef; + todo_wine_if(!expected_texture_stage) + ok(desc.desc2.dwTextureStage == expected_texture_stage, + "Got unexpected texture stage %#x, dwSize %u, type %s.\n", + desc.desc2.dwTextureStage, desc_sizes[j], surface_caps[i].name); + IDirectDrawSurface_Unlock(surface, NULL); + } + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + desc.desc2.dwTextureStage = 0xdeadbeef; + desc.blob[sizeof(DDSURFACEDESC2)] = 0xef; + hr = IDirectDrawSurface3_Lock(surface3, NULL, &desc.desc1, 0, 0); + expected_hr = ignore_size || valid_size ? DD_OK : DDERR_INVALIDPARAMS; + todo_wine_if(ignore_size && !valid_size) + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + ok(desc.dwSize == desc_sizes[j], "dwSize was changed from %u to %u, type %s.\n", + desc_sizes[j], desc.dwSize, surface_caps[i].name); + ok(desc.blob[sizeof(DDSURFACEDESC2)] == 0xef, "Got unexpected byte %02x, dwSize %u, type %s.\n", + desc.blob[sizeof(DDSURFACEDESC2)], desc_sizes[j], surface_caps[i].name); + if (SUCCEEDED(hr)) + { + ok(desc.desc1.dwWidth == 128, "Got unexpected width %u, dwSize %u, type %s.\n", + desc.desc1.dwWidth, desc_sizes[j], surface_caps[i].name); + ok(desc.desc1.dwHeight == 128, "Got unexpected height %u, dwSize %u, type %s.\n", + desc.desc1.dwHeight, desc_sizes[j], surface_caps[i].name); + expected_texture_stage = desc_sizes[j] >= sizeof(DDSURFACEDESC2) ? 0 : 0xdeadbeef; + todo_wine_if(!expected_texture_stage) + ok(desc.desc2.dwTextureStage == expected_texture_stage, + "Got unexpected texture stage %#x, dwSize %u, type %s.\n", + desc.desc2.dwTextureStage, desc_sizes[j], surface_caps[i].name); + IDirectDrawSurface3_Unlock(surface3, NULL); + } + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = desc_sizes[j]; + desc.desc2.dwTextureStage = 0xdeadbeef; + desc.blob[sizeof(DDSURFACEDESC2)] = 0xef; + hr = IDirectDrawSurface7_Lock(surface7, NULL, &desc.desc2, 0, 0); + expected_hr = ignore_size || valid_size ? DD_OK : DDERR_INVALIDPARAMS; + todo_wine_if(ignore_size && !valid_size) + ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n", + hr, expected_hr, desc_sizes[j], surface_caps[i].name); + ok(desc.dwSize == desc_sizes[j], "dwSize was changed from %u to %u, type %s.\n", + desc_sizes[j], desc.dwSize, surface_caps[i].name); + ok(desc.blob[sizeof(DDSURFACEDESC2)] == 0xef, "Got unexpected byte %02x, dwSize %u, type %s.\n", + desc.blob[sizeof(DDSURFACEDESC2)], desc_sizes[j], surface_caps[i].name); + if (SUCCEEDED(hr)) + { + ok(desc.desc2.dwWidth == 128, "Got unexpected width %u, dwSize %u, type %s.\n", + desc.desc2.dwWidth, desc_sizes[j], surface_caps[i].name); + ok(desc.desc2.dwHeight == 128, "Got unexpected height %u, dwSize %u, type %s.\n", + desc.desc2.dwHeight, desc_sizes[j], surface_caps[i].name); + expected_texture_stage = desc_sizes[j] >= sizeof(DDSURFACEDESC2) ? 0 : 0xdeadbeef; + ok(desc.desc2.dwTextureStage == expected_texture_stage, + "Got unexpected texture stage %#x, dwSize %u, type %s.\n", + desc.desc2.dwTextureStage, desc_sizes[j], surface_caps[i].name); + IDirectDrawSurface7_Unlock(surface7, NULL); + } + } + + IDirectDrawSurface7_Release(surface7); + IDirectDrawSurface3_Release(surface3); + IDirectDrawSurface_Release(surface); + } + + refcount = IDirectDraw7_Release(ddraw); + ok(!refcount, "DirectDraw has %u references left.\n", refcount); +} + START_TEST(ddraw7) { HMODULE module = GetModuleHandleA("ddraw.dll"); @@ -12304,4 +12517,5 @@ START_TEST(ddraw7) test_draw_primitive(); test_edge_antialiasing_blending(); test_display_mode_surface_pixel_format(); + test_surface_desc_size(); } diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c index 2efb23aa7eb..9492ee4b242 100644 --- a/dlls/ddraw/tests/dsurface.c +++ b/dlls/ddraw/tests/dsurface.c @@ -1997,112 +1997,6 @@ static void PaletteTest(void) IDirectDrawSurface_Release(lpSurf); } -static void StructSizeTest(void) -{ - IDirectDrawSurface *surface1; - IDirectDrawSurface7 *surface7; - union { - DDSURFACEDESC desc1; - DDSURFACEDESC2 desc2; - char blob[1024]; /* To get a bunch of writable memory */ - } desc; - DDSURFACEDESC create; - HRESULT hr; - - memset(&desc, 0, sizeof(desc)); - memset(&create, 0, sizeof(create)); - - memset(&create, 0, sizeof(create)); - create.dwSize = sizeof(create); - create.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - create.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN; - create.dwHeight = 128; - create.dwWidth = 128; - hr = IDirectDraw_CreateSurface(lpDD, &create, &surface1, NULL); - ok(hr == DD_OK, "Creating an offscreen plain surface failed with %08x\n", hr); - hr = IDirectDrawSurface_QueryInterface(surface1, &IID_IDirectDrawSurface7, (void **) &surface7); - ok(hr == DD_OK, "IDirectDrawSurface_QueryInterface failed with %08x\n", hr); - - desc.desc1.dwSize = sizeof(DDSURFACEDESC); - hr = IDirectDrawSurface_GetSurfaceDesc(surface1, &desc.desc1); - ok(hr == DD_OK, "IDirectDrawSurface_GetSurfaceDesc with desc size sizeof(DDSURFACEDESC) returned %08x\n", hr); - hr = IDirectDrawSurface7_GetSurfaceDesc(surface7, &desc.desc2); - ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface7_GetSurfaceDesc with desc size sizeof(DDSURFACEDESC) returned %08x\n", hr); - - desc.desc2.dwSize = sizeof(DDSURFACEDESC2); - hr = IDirectDrawSurface_GetSurfaceDesc(surface1, &desc.desc1); - ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface_GetSurfaceDesc with desc size sizeof(DDSURFACEDESC2) returned %08x\n", hr); - hr = IDirectDrawSurface7_GetSurfaceDesc(surface7, &desc.desc2); - ok(hr == DD_OK, "IDirectDrawSurface7_GetSurfaceDesc with desc size sizeof(DDSURFACEDESC2) returned %08x\n", hr); - - desc.desc2.dwSize = 0; - hr = IDirectDrawSurface_GetSurfaceDesc(surface1, &desc.desc1); - ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface_GetSurfaceDesc with desc size 0 returned %08x\n", hr); - hr = IDirectDrawSurface7_GetSurfaceDesc(surface7, &desc.desc2); - ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface7_GetSurfaceDesc with desc size 0 returned %08x\n", hr); - - desc.desc1.dwSize = sizeof(DDSURFACEDESC) + 1; - hr = IDirectDrawSurface_GetSurfaceDesc(surface1, &desc.desc1); - ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface_GetSurfaceDesc with desc size sizeof(DDSURFACEDESC) + 1 returned %08x\n", hr); - hr = IDirectDrawSurface7_GetSurfaceDesc(surface7, &desc.desc2); - ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface7_GetSurfaceDesc with desc size sizeof(DDSURFACEDESC) + 1 returned %08x\n", hr); - - desc.desc2.dwSize = sizeof(DDSURFACEDESC2) + 1; - hr = IDirectDrawSurface_GetSurfaceDesc(surface1, &desc.desc1); - ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface_GetSurfaceDesc with desc size sizeof(DDSURFACEDESC2) + 1returned %08x\n", hr); - hr = IDirectDrawSurface7_GetSurfaceDesc(surface7, &desc.desc2); - ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface7_GetSurfaceDesc with desc size sizeof(DDSURFACEDESC2) + 1returned %08x\n", hr); - - /* Tests for Lock() */ - - desc.desc1.dwSize = sizeof(DDSURFACEDESC); - hr = IDirectDrawSurface_Lock(surface1, NULL, &desc.desc1, 0, 0); - ok(hr == DD_OK, "IDirectDrawSurface_Lock with desc size sizeof(DDSURFACEDESC) returned %08x\n", hr); - if(SUCCEEDED(hr)) IDirectDrawSurface_Unlock(surface1, NULL); - ok(desc.desc1.dwSize == sizeof(DDSURFACEDESC), "Destination size was changed to %d\n", desc.desc1.dwSize); - hr = IDirectDrawSurface7_Lock(surface7, NULL, &desc.desc2, 0, 0); - ok(hr == DD_OK, "IDirectDrawSurface7_Lock with desc size sizeof(DDSURFACEDESC) returned %08x\n", hr); - if(SUCCEEDED(hr)) IDirectDrawSurface7_Unlock(surface7, NULL); - ok(desc.desc2.dwSize == sizeof(DDSURFACEDESC), "Destination size was changed to %d\n", desc.desc1.dwSize); - - desc.desc2.dwSize = sizeof(DDSURFACEDESC2); - hr = IDirectDrawSurface_Lock(surface1, NULL, &desc.desc1, 0, 0); - ok(hr == DD_OK, "IDirectDrawSurface_Lock with desc size sizeof(DDSURFACEDESC2) returned %08x\n", hr); - ok(desc.desc1.dwSize == sizeof(DDSURFACEDESC2), "Destination size was changed to %d\n", desc.desc1.dwSize); - if(SUCCEEDED(hr)) IDirectDrawSurface_Unlock(surface1, NULL); - hr = IDirectDrawSurface7_Lock(surface7, NULL, &desc.desc2, 0, 0); - ok(hr == DD_OK, "IDirectDrawSurface7_Lock with desc size sizeof(DDSURFACEDESC2) returned %08x\n", hr); - if(SUCCEEDED(hr)) IDirectDrawSurface7_Unlock(surface7, NULL); - ok(desc.desc2.dwSize == sizeof(DDSURFACEDESC2), "Destination size was changed to %d\n", desc.desc1.dwSize); - - desc.desc2.dwSize = 0; - hr = IDirectDrawSurface_Lock(surface1, NULL, &desc.desc1, 0, 0); - ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface_Lock with desc size 0 returned %08x\n", hr); - if(SUCCEEDED(hr)) IDirectDrawSurface_Unlock(surface1, NULL); - hr = IDirectDrawSurface7_Lock(surface7, NULL, &desc.desc2, 0, 0); - ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface7_Lock with desc size 0 returned %08x\n", hr); - if(SUCCEEDED(hr)) IDirectDrawSurface7_Unlock(surface7, NULL); - - desc.desc1.dwSize = sizeof(DDSURFACEDESC) + 1; - hr = IDirectDrawSurface_Lock(surface1, NULL, &desc.desc1, 0, 0); - ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface_Lock with desc size sizeof(DDSURFACEDESC) + 1 returned %08x\n", hr); - if(SUCCEEDED(hr)) IDirectDrawSurface_Unlock(surface1, NULL); - hr = IDirectDrawSurface7_Lock(surface7, NULL, &desc.desc2, 0, 0); - ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface7_Lock with desc size sizeof(DDSURFACEDESC) + 1 returned %08x\n", hr); - if(SUCCEEDED(hr)) IDirectDrawSurface7_Unlock(surface7, NULL); - - desc.desc2.dwSize = sizeof(DDSURFACEDESC2) + 1; - hr = IDirectDrawSurface_Lock(surface1, NULL, &desc.desc1, 0, 0); - ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface_Lock with desc size sizeof(DDSURFACEDESC2) + 1returned %08x\n", hr); - if(SUCCEEDED(hr)) IDirectDrawSurface_Unlock(surface1, NULL); - hr = IDirectDrawSurface7_Lock(surface7, NULL, &desc.desc2, 0, 0); - ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface7_Lock with desc size sizeof(DDSURFACEDESC2) + 1returned %08x\n", hr); - if(SUCCEEDED(hr)) IDirectDrawSurface7_Unlock(surface7, NULL); - - IDirectDrawSurface7_Release(surface7); - IDirectDrawSurface_Release(surface1); -} - static void SurfaceCapsTest(void) { DDSURFACEDESC create; @@ -3381,7 +3275,6 @@ START_TEST(dsurface) CompressedTest(); SizeTest(); BltParamTest(); - StructSizeTest(); PaletteTest(); SurfaceCapsTest(); GetDCTest();