So there are a number of CreateSurface() calls that fail and these are causing the tests to crash. For instance for ddraw2: http://test.winehq.org/data/tests/ddraw:ddraw2.html
Is there a way to check what surface types are supported? create_device() calls EnumDevices() but finding a match clearly does not guarantee we'll be able to create a surface given the error we get there (but presumably that check was more for the following CreateDevice() call). I tried using EnumSurfaces() but without much luck. I'm also a bit worried that DDENUMSURFACES_MATCH is not used anywhere in Wine (*).
Alternatively we can just react to failing CreateSurface() calls and clean up + abort a bit like is done in the following patch.
(*) Also the DDENUMSURFACES_{SEARCH,MATCH}TYPE macros found in dlls/ddraw/ddraw.c are not used anymore since c8901d6f.
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c index 5a3bd77..2a5a9c4 100644 --- a/dlls/ddraw/tests/ddraw2.c +++ b/dlls/ddraw/tests/ddraw2.c @@ -227,7 +227,7 @@ static IDirect3DDevice2 *create_device(IDirectDraw2 *ddraw, HWND window, DWORD c surface_desc.dwWidth = 640; surface_desc.dwHeight = 480; hr = IDirectDraw2_CreateSurface(ddraw, &surface_desc, &ds, NULL); - ok(SUCCEEDED(hr), "Failed to create depth buffer, hr %#x.\n", hr); + ok(SUCCEEDED(hr) || broken(hr == DDERR_INVALIDPIXELFORMAT), "Failed to create depth buffer, hr %#x.\n", hr); if (FAILED(hr)) { IDirect3D2_Release(d3d); @@ -4451,6 +4451,8 @@ static void test_surface_lock(void)
hr = IDirectDraw2_CreateSurface(ddraw, &ddsd, &surface, NULL); ok(SUCCEEDED(hr), "Failed to create surface, type %s, hr %#x.\n", tests[i].name, hr); + if (FAILED(hr)) + continue;
memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); @@ -4817,6 +4819,8 @@ static void test_set_surface_desc(void)
hr = IDirectDraw2_CreateSurface(ddraw, &ddsd, &surface, NULL); ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr); + if (FAILED(hr)) + goto done;
hr = IDirectDrawSurface_QueryInterface(surface, &IID_IDirectDrawSurface3, (void **)&surface3); ok(SUCCEEDED(hr), "Failed to get IDirectDrawSurface3 interface, hr %#x.\n", hr); @@ -5113,6 +5117,12 @@ static void test_user_memory_getdc(void) ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY; hr = IDirectDraw2_CreateSurface(ddraw, &ddsd, &surface, NULL); ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr); + if (FAILED(hr)) + { + IDirectDraw2_Release(ddraw); + DestroyWindow(window); + return; + }
hr = IDirectDrawSurface_QueryInterface(surface, &IID_IDirectDrawSurface3, (void **)&surface3); ok(SUCCEEDED(hr), "Failed to get IDirectDrawSurface3 interface, hr %#x.\n", hr); diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index 81c043c..5da4a71 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -5423,6 +5423,12 @@ static void test_set_surface_desc(void)
hr = IDirectDraw4_CreateSurface(ddraw, &ddsd, &surface, NULL); ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr); + if (FAILED(hr)) + { + IDirectDraw4_Release(ddraw); + DestroyWindow(window); + return; + }
reset_ddsd(&ddsd); ddsd.dwFlags = DDSD_LPSURFACE; @@ -5715,6 +5721,12 @@ static void test_user_memory_getdc(void) ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY; hr = IDirectDraw4_CreateSurface(ddraw, &ddsd, &surface, NULL); ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr); + if (FAILED(hr)) + { + IDirectDraw4_Release(ddraw); + DestroyWindow(window); + return; + }
memset(data, 0xaa, sizeof(data)); reset_ddsd(&ddsd); diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c index 8e01238..4735fca 100644 --- a/dlls/ddraw/tests/ddraw7.c +++ b/dlls/ddraw/tests/ddraw7.c @@ -5301,6 +5301,12 @@ static void test_set_surface_desc(void)
hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &surface, NULL); ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr); + if (FAILED(hr)) + { + IDirectDraw7_Release(ddraw); + DestroyWindow(window); + return; + }
reset_ddsd(&ddsd); ddsd.dwFlags = DDSD_LPSURFACE; @@ -5594,6 +5600,12 @@ static void test_user_memory_getdc(void) ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY; hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &surface, NULL); ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr); + if (FAILED(hr)) + { + IDirectDraw7_Release(ddraw); + DestroyWindow(window); + return; + }
memset(data, 0xaa, sizeof(data)); reset_ddsd(&ddsd);