Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com ---
v3: Make sure the surface resides in video memory (thanks Stefan).
dlls/ddraw/tests/ddraw1.c | 97 ++++++++++++++++++++++++++++++++- dlls/ddraw/tests/ddraw2.c | 97 ++++++++++++++++++++++++++++++++- dlls/ddraw/tests/ddraw4.c | 102 ++++++++++++++++++++++++++++++++++- dlls/ddraw/tests/ddraw7.c | 109 +++++++++++++++++++++++++++++++++++++- 4 files changed, 400 insertions(+), 5 deletions(-)
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c index 652e52a..782a3c1 100644 --- a/dlls/ddraw/tests/ddraw1.c +++ b/dlls/ddraw/tests/ddraw1.c @@ -7309,8 +7309,8 @@ static void test_palette_alpha(void)
static void test_lost_device(void) { + IDirectDrawSurface *sysmem_surface, *vidmem_surface; IDirectDrawSurface *surface, *back_buffer; - IDirectDrawSurface *sysmem_surface; DDSURFACEDESC surface_desc; HWND window1, window2; IDirectDraw *ddraw; @@ -7345,12 +7345,36 @@ static void test_lost_device(void) hr = IDirectDraw_CreateSurface(ddraw, &surface_desc, &sysmem_surface, NULL); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
+ memset(&surface_desc, 0, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT; + surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY; + surface_desc.dwWidth = 640; + surface_desc.dwHeight = 480; + surface_desc.ddpfPixelFormat.dwSize = sizeof(surface_desc.ddpfPixelFormat); + surface_desc.ddpfPixelFormat.dwFlags = DDPF_RGB; + U1(surface_desc.ddpfPixelFormat).dwRGBBitCount = 32; + U2(surface_desc.ddpfPixelFormat).dwRBitMask = 0x00ff0000; + U3(surface_desc.ddpfPixelFormat).dwGBitMask = 0x0000ff00; + U4(surface_desc.ddpfPixelFormat).dwBBitMask = 0x000000ff; + hr = IDirectDraw_CreateSurface(ddraw, &surface_desc, &vidmem_surface, NULL); + if (FAILED(hr)) + { + skip("Failed to create video memory surface, skipping related tests.\n"); + vidmem_surface = NULL; + } + hr = IDirectDrawSurface_IsLost(surface); ok(hr == DD_OK, "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_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
ret = SetForegroundWindow(GetDesktopWindow()); ok(ret, "Failed to set foreground window.\n"); @@ -7360,6 +7384,11 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
ret = SetForegroundWindow(window1); ok(ret, "Failed to set foreground window.\n"); @@ -7369,6 +7398,11 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
hr = restore_surfaces(ddraw); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -7378,6 +7412,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw_SetCooperativeLevel(ddraw, window1, DDSCL_NORMAL); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -7388,6 +7427,11 @@ static void test_lost_device(void) "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DD_OK || broken(ddraw_is_warp(ddraw) && hr == DDERR_SURFACELOST), "Got unexpected hr %#x.\n", hr); + }
/* Trying to restore the primary will crash, probably because flippable * surfaces can't exist in DDSCL_NORMAL. */ @@ -7408,6 +7452,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + todo_wine ok(hr == DDERR_SURFACELOST || broken(hr == DD_OK) /* WinXP */, "Got unexpected hr %#x.\n", hr); + }
ret = SetForegroundWindow(window1); ok(ret, "Failed to set foreground window.\n"); @@ -7415,6 +7464,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + todo_wine ok(hr == DDERR_SURFACELOST || broken(hr == DD_OK) /* WinXP */, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw_SetCooperativeLevel(ddraw, window1, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -7422,6 +7476,11 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
hr = restore_surfaces(ddraw); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -7429,6 +7488,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
IDirectDrawSurface_Release(surface); memset(&surface_desc, 0, sizeof(surface_desc)); @@ -7447,6 +7511,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw_SetCooperativeLevel(ddraw, window1, DDSCL_NORMAL | DDSCL_FULLSCREEN); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -7456,6 +7525,11 @@ static void test_lost_device(void) ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw_SetCooperativeLevel(ddraw, window1, DDSCL_NORMAL); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -7465,6 +7539,11 @@ static void test_lost_device(void) ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw_SetCooperativeLevel(ddraw, window2, DDSCL_NORMAL); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -7474,6 +7553,11 @@ static void test_lost_device(void) ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw_SetCooperativeLevel(ddraw, window2, DDSCL_NORMAL | DDSCL_FULLSCREEN); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -7483,6 +7567,11 @@ static void test_lost_device(void) ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw_SetCooperativeLevel(ddraw, window2, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -7492,6 +7581,11 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
memset(&caps, 0, sizeof(caps)); caps.dwCaps = DDSCAPS_FLIP; @@ -7506,6 +7600,7 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); IDirectDrawSurface_Release(back_buffer);
+ if (vidmem_surface) IDirectDrawSurface_Release(vidmem_surface); IDirectDrawSurface_Release(sysmem_surface); IDirectDrawSurface_Release(surface); refcount = IDirectDraw_Release(ddraw); diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c index edaf868..6680171 100644 --- a/dlls/ddraw/tests/ddraw2.c +++ b/dlls/ddraw/tests/ddraw2.c @@ -8262,8 +8262,8 @@ static void test_palette_alpha(void)
static void test_lost_device(void) { + IDirectDrawSurface *sysmem_surface, *vidmem_surface; IDirectDrawSurface *surface, *back_buffer; - IDirectDrawSurface *sysmem_surface; DDSURFACEDESC surface_desc; HWND window1, window2; IDirectDraw2 *ddraw; @@ -8298,12 +8298,36 @@ static void test_lost_device(void) hr = IDirectDraw2_CreateSurface(ddraw, &surface_desc, &sysmem_surface, NULL); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
+ memset(&surface_desc, 0, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT; + surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY; + surface_desc.dwWidth = 640; + surface_desc.dwHeight = 480; + surface_desc.ddpfPixelFormat.dwSize = sizeof(surface_desc.ddpfPixelFormat); + surface_desc.ddpfPixelFormat.dwFlags = DDPF_RGB; + U1(surface_desc.ddpfPixelFormat).dwRGBBitCount = 32; + U2(surface_desc.ddpfPixelFormat).dwRBitMask = 0x00ff0000; + U3(surface_desc.ddpfPixelFormat).dwGBitMask = 0x0000ff00; + U4(surface_desc.ddpfPixelFormat).dwBBitMask = 0x000000ff; + hr = IDirectDraw2_CreateSurface(ddraw, &surface_desc, &vidmem_surface, NULL); + if (FAILED(hr)) + { + skip("Failed to create video memory surface, skipping related tests.\n"); + vidmem_surface = NULL; + } + hr = IDirectDrawSurface_IsLost(surface); ok(hr == DD_OK, "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_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
ret = SetForegroundWindow(GetDesktopWindow()); ok(ret, "Failed to set foreground window.\n"); @@ -8313,6 +8337,11 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
ret = SetForegroundWindow(window1); ok(ret, "Failed to set foreground window.\n"); @@ -8322,6 +8351,11 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
hr = restore_surfaces(ddraw); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -8331,6 +8365,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw2_SetCooperativeLevel(ddraw, window1, DDSCL_NORMAL); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -8340,6 +8379,11 @@ static void test_lost_device(void) todo_wine ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + todo_wine ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
/* Trying to restore the primary will crash, probably because flippable * surfaces can't exist in DDSCL_NORMAL. */ @@ -8360,6 +8404,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + todo_wine ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
ret = SetForegroundWindow(window1); ok(ret, "Failed to set foreground window.\n"); @@ -8367,6 +8416,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + todo_wine ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw2_SetCooperativeLevel(ddraw, window1, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -8374,6 +8428,11 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
hr = restore_surfaces(ddraw); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -8381,6 +8440,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
IDirectDrawSurface_Release(surface); memset(&surface_desc, 0, sizeof(surface_desc)); @@ -8399,6 +8463,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw2_SetCooperativeLevel(ddraw, window1, DDSCL_NORMAL | DDSCL_FULLSCREEN); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -8408,6 +8477,11 @@ static void test_lost_device(void) ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw2_SetCooperativeLevel(ddraw, window1, DDSCL_NORMAL); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -8417,6 +8491,11 @@ static void test_lost_device(void) ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw2_SetCooperativeLevel(ddraw, window2, DDSCL_NORMAL); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -8426,6 +8505,11 @@ static void test_lost_device(void) ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw2_SetCooperativeLevel(ddraw, window2, DDSCL_NORMAL | DDSCL_FULLSCREEN); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -8435,6 +8519,11 @@ static void test_lost_device(void) ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw2_SetCooperativeLevel(ddraw, window2, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -8444,6 +8533,11 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
memset(&caps, 0, sizeof(caps)); caps.dwCaps = DDSCAPS_FLIP; @@ -8458,6 +8552,7 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); IDirectDrawSurface_Release(back_buffer);
+ if (vidmem_surface) IDirectDrawSurface_Release(vidmem_surface); IDirectDrawSurface_Release(sysmem_surface); IDirectDrawSurface_Release(surface); refcount = IDirectDraw2_Release(ddraw); diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index d1abde0..11e5b46 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -9655,8 +9655,8 @@ static void test_vb_writeonly(void)
static void test_lost_device(void) { + IDirectDrawSurface4 *sysmem_surface, *vidmem_surface; IDirectDrawSurface4 *surface, *back_buffer; - IDirectDrawSurface4 *sysmem_surface; DDSURFACEDESC2 surface_desc; HWND window1, window2; IDirectDraw4 *ddraw; @@ -9691,6 +9691,25 @@ static void test_lost_device(void) hr = IDirectDraw4_CreateSurface(ddraw, &surface_desc, &sysmem_surface, NULL); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
+ memset(&surface_desc, 0, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT; + surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY; + surface_desc.dwWidth = 640; + surface_desc.dwHeight = 480; + U4(surface_desc).ddpfPixelFormat.dwSize = sizeof(U4(surface_desc).ddpfPixelFormat); + U4(surface_desc).ddpfPixelFormat.dwFlags = DDPF_RGB; + U1(U4(surface_desc).ddpfPixelFormat).dwRGBBitCount = 32; + U2(U4(surface_desc).ddpfPixelFormat).dwRBitMask = 0x00ff0000; + U3(U4(surface_desc).ddpfPixelFormat).dwGBitMask = 0x0000ff00; + U4(U4(surface_desc).ddpfPixelFormat).dwBBitMask = 0x000000ff; + hr = IDirectDraw4_CreateSurface(ddraw, &surface_desc, &vidmem_surface, NULL); + if (FAILED(hr)) + { + skip("Failed to create video memory surface, skipping related tests.\n"); + vidmem_surface = NULL; + } + hr = IDirectDraw4_TestCooperativeLevel(ddraw); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_IsLost(surface); @@ -9699,6 +9718,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface4_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
ret = SetForegroundWindow(GetDesktopWindow()); ok(ret, "Failed to set foreground window.\n"); @@ -9710,6 +9734,11 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface4_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
ret = SetForegroundWindow(window1); ok(ret, "Failed to set foreground window.\n"); @@ -9721,6 +9750,11 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface4_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw4_RestoreAllSurfaces(ddraw); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9732,6 +9766,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface4_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw4_SetCooperativeLevel(ddraw, window1, DDSCL_NORMAL); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9743,6 +9782,11 @@ static void test_lost_device(void) todo_wine ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface4_IsLost(vidmem_surface); + todo_wine ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
/* Trying to restore the primary will crash, probably because flippable * surfaces can't exist in DDSCL_NORMAL. */ @@ -9760,6 +9804,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface4_IsLost(vidmem_surface); + todo_wine ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
ret = SetForegroundWindow(GetDesktopWindow()); ok(ret, "Failed to set foreground window.\n"); @@ -9769,6 +9818,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface4_IsLost(vidmem_surface); + todo_wine ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
ret = SetForegroundWindow(window1); ok(ret, "Failed to set foreground window.\n"); @@ -9778,6 +9832,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface4_IsLost(vidmem_surface); + todo_wine ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw4_SetCooperativeLevel(ddraw, window1, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9787,6 +9846,11 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface4_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw4_RestoreAllSurfaces(ddraw); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9796,6 +9860,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface4_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
IDirectDrawSurface4_Release(surface); memset(&surface_desc, 0, sizeof(surface_desc)); @@ -9816,6 +9885,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface4_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw4_SetCooperativeLevel(ddraw, window1, DDSCL_NORMAL | DDSCL_FULLSCREEN); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9827,6 +9901,11 @@ static void test_lost_device(void) ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface4_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw4_SetCooperativeLevel(ddraw, window1, DDSCL_NORMAL); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9838,6 +9917,11 @@ static void test_lost_device(void) ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface4_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw4_SetCooperativeLevel(ddraw, window2, DDSCL_NORMAL); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9849,6 +9933,11 @@ static void test_lost_device(void) ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface4_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw4_SetCooperativeLevel(ddraw, window2, DDSCL_NORMAL | DDSCL_FULLSCREEN); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9860,6 +9949,11 @@ static void test_lost_device(void) ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface4_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw4_SetCooperativeLevel(ddraw, window2, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9869,6 +9963,11 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface4_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDrawSurface4_Flip(surface, NULL, DDFLIP_WAIT); ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); @@ -9886,6 +9985,7 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); IDirectDrawSurface4_Release(back_buffer);
+ if (vidmem_surface) IDirectDrawSurface4_Release(vidmem_surface); IDirectDrawSurface4_Release(sysmem_surface); IDirectDrawSurface4_Release(surface); refcount = IDirectDraw4_Release(ddraw); diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c index 13eadfd..996471e 100644 --- a/dlls/ddraw/tests/ddraw7.c +++ b/dlls/ddraw/tests/ddraw7.c @@ -9413,8 +9413,8 @@ static void test_vb_writeonly(void)
static void test_lost_device(void) { + IDirectDrawSurface7 *sysmem_surface, *vidmem_surface; IDirectDrawSurface7 *surface, *back_buffer; - IDirectDrawSurface7 *sysmem_surface; DDSURFACEDESC2 surface_desc; HWND window1, window2; IDirectDraw7 *ddraw; @@ -9440,6 +9440,21 @@ static void test_lost_device(void) hr = IDirectDraw7_CreateSurface(ddraw, &surface_desc, &surface, NULL); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
+ memset(&surface_desc, 0, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT; + surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY; + surface_desc.dwWidth = 640; + surface_desc.dwHeight = 480; + U4(surface_desc).ddpfPixelFormat.dwSize = sizeof(U4(surface_desc).ddpfPixelFormat); + U4(surface_desc).ddpfPixelFormat.dwFlags = DDPF_RGB; + U1(U4(surface_desc).ddpfPixelFormat).dwRGBBitCount = 32; + U2(U4(surface_desc).ddpfPixelFormat).dwRBitMask = 0x00ff0000; + U3(U4(surface_desc).ddpfPixelFormat).dwGBitMask = 0x0000ff00; + U4(U4(surface_desc).ddpfPixelFormat).dwBBitMask = 0x000000ff; + hr = IDirectDraw7_CreateSurface(ddraw, &surface_desc, &vidmem_surface, NULL); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + memset(&surface_desc, 0, sizeof(surface_desc)); surface_desc.dwSize = sizeof(surface_desc); surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; @@ -9447,7 +9462,11 @@ static void test_lost_device(void) surface_desc.dwWidth = 100; surface_desc.dwHeight = 100; hr = IDirectDraw7_CreateSurface(ddraw, &surface_desc, &sysmem_surface, NULL); - ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (FAILED(hr)) + { + skip("Failed to create video memory surface, skipping related tests.\n"); + vidmem_surface = NULL; + }
hr = IDirectDraw7_TestCooperativeLevel(ddraw); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9457,6 +9476,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface7_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface7_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
ret = SetForegroundWindow(GetDesktopWindow()); ok(ret, "Failed to set foreground window.\n"); @@ -9468,6 +9492,11 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface7_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface7_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
ret = SetForegroundWindow(window1); ok(ret, "Failed to set foreground window.\n"); @@ -9479,6 +9508,11 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface7_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface7_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw7_RestoreAllSurfaces(ddraw); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9490,6 +9524,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface7_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface7_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw7_SetCooperativeLevel(ddraw, window1, DDSCL_NORMAL); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9501,6 +9540,11 @@ static void test_lost_device(void) todo_wine ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface7_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface7_IsLost(vidmem_surface); + todo_wine ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
/* Trying to restore the primary will crash, probably because flippable * surfaces can't exist in DDSCL_NORMAL. */ @@ -9513,6 +9557,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface7_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface7_IsLost(vidmem_surface); + todo_wine ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw7_TestCooperativeLevel(ddraw); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9520,6 +9569,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface7_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface7_IsLost(vidmem_surface); + todo_wine ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
ret = SetForegroundWindow(GetDesktopWindow()); ok(ret, "Failed to set foreground window.\n"); @@ -9529,6 +9583,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface7_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface7_IsLost(vidmem_surface); + todo_wine ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
ret = SetForegroundWindow(window1); ok(ret, "Failed to set foreground window.\n"); @@ -9538,6 +9597,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface7_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface7_IsLost(vidmem_surface); + todo_wine ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw7_SetCooperativeLevel(ddraw, window1, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9547,6 +9611,11 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface7_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface7_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw7_RestoreAllSurfaces(ddraw); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9556,6 +9625,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface7_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface7_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
IDirectDrawSurface7_Release(surface); memset(&surface_desc, 0, sizeof(surface_desc)); @@ -9576,6 +9650,11 @@ static void test_lost_device(void) ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface7_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface7_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw7_SetCooperativeLevel(ddraw, window1, DDSCL_NORMAL | DDSCL_FULLSCREEN); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9587,6 +9666,11 @@ static void test_lost_device(void) ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface7_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface7_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw7_SetCooperativeLevel(ddraw, window1, DDSCL_NORMAL); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9598,6 +9682,11 @@ static void test_lost_device(void) ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface7_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface7_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw7_SetCooperativeLevel(ddraw, window2, DDSCL_NORMAL); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9609,6 +9698,11 @@ static void test_lost_device(void) ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface7_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface7_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw7_SetCooperativeLevel(ddraw, window2, DDSCL_NORMAL | DDSCL_FULLSCREEN); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9620,6 +9714,11 @@ static void test_lost_device(void) ok(hr == DDERR_NOEXCLUSIVEMODE, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface7_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface7_IsLost(vidmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + }
hr = IDirectDraw7_SetCooperativeLevel(ddraw, window2, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); @@ -9631,6 +9730,11 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface7_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + if (vidmem_surface) + { + hr = IDirectDrawSurface7_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + }
memset(&caps, 0, sizeof(caps)); caps.dwCaps = DDSCAPS_FLIP; @@ -9646,6 +9750,7 @@ static void test_lost_device(void)
IDirectDrawSurface7_Release(back_buffer);
+ if (vidmem_surface) IDirectDrawSurface7_Release(vidmem_surface); IDirectDrawSurface7_Release(sysmem_surface); IDirectDrawSurface7_Release(surface); refcount = IDirectDraw7_Release(ddraw);
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/ddraw/surface.c | 3 +++ dlls/ddraw/tests/ddraw1.c | 12 ++++++++++++ dlls/ddraw/tests/ddraw2.c | 12 ++++++++++++ dlls/ddraw/tests/ddraw4.c | 12 ++++++++++++ dlls/ddraw/tests/ddraw7.c | 12 ++++++++++++ 5 files changed, 51 insertions(+)
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index 7b7f16e..8805014 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -3785,6 +3785,9 @@ static HRESULT WINAPI ddraw_surface7_Restore(IDirectDrawSurface7 *iface) } }
+ if (surface->ddraw->device_state == DDRAW_DEVICE_STATE_LOST && ddraw_surface_can_be_lost(surface)) + return DDERR_WRONGMODE; + ddraw_update_lost_surfaces(surface->ddraw); surface->is_lost = FALSE;
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c index 782a3c1..bd5fcac 100644 --- a/dlls/ddraw/tests/ddraw1.c +++ b/dlls/ddraw/tests/ddraw1.c @@ -7382,12 +7382,24 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_Flip(surface, NULL, DDFLIP_WAIT); ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface_Restore(surface); + ok(hr == DDERR_WRONGMODE, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface_IsLost(surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface_IsLost(sysmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface_Restore(sysmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); if (vidmem_surface) { hr = IDirectDrawSurface_IsLost(vidmem_surface); ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface_Restore(vidmem_surface); + ok(hr == DDERR_WRONGMODE, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); }
ret = SetForegroundWindow(window1); diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c index 6680171..deff9c2 100644 --- a/dlls/ddraw/tests/ddraw2.c +++ b/dlls/ddraw/tests/ddraw2.c @@ -8335,12 +8335,24 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_Flip(surface, NULL, DDFLIP_WAIT); ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface_Restore(surface); + ok(hr == DDERR_WRONGMODE, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface_IsLost(surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface_IsLost(sysmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface_Restore(sysmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); if (vidmem_surface) { hr = IDirectDrawSurface_IsLost(vidmem_surface); ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface_Restore(vidmem_surface); + ok(hr == DDERR_WRONGMODE, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); }
ret = SetForegroundWindow(window1); diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index 11e5b46..1958a48 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -9732,12 +9732,24 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_Flip(surface, NULL, DDFLIP_WAIT); ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface4_Restore(surface); + ok(hr == DDERR_WRONGMODE, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface4_IsLost(surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface4_IsLost(sysmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface4_Restore(sysmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); if (vidmem_surface) { hr = IDirectDrawSurface4_IsLost(vidmem_surface); ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface4_Restore(vidmem_surface); + ok(hr == DDERR_WRONGMODE, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface4_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); }
ret = SetForegroundWindow(window1); diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c index 996471e..4a6c11b 100644 --- a/dlls/ddraw/tests/ddraw7.c +++ b/dlls/ddraw/tests/ddraw7.c @@ -9490,12 +9490,24 @@ static void test_lost_device(void) ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface7_Flip(surface, NULL, DDFLIP_WAIT); ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface7_Restore(surface); + ok(hr == DDERR_WRONGMODE, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface7_IsLost(surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface7_IsLost(sysmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface7_Restore(sysmem_surface); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface7_IsLost(sysmem_surface); ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); if (vidmem_surface) { hr = IDirectDrawSurface7_IsLost(vidmem_surface); ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface7_Restore(vidmem_surface); + ok(hr == DDERR_WRONGMODE, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface7_IsLost(vidmem_surface); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); }
ret = SetForegroundWindow(window1);
Hi,
While running your changed tests, 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=76177
Your paranoid android.
=== w2008s64 (32 bit report) ===
ddraw: ddraw7.c:9456: Test failed: Got unexpected hr 0x88760233.
=== w2008s64 (64 bit report) ===
ddraw: ddraw7.c:9456: Test failed: Got unexpected hr 0x88760233.
=== debiant (32 bit report) ===
ddraw: ddraw1: Timeout
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com ---
I haven't been able to add a reliable test for this, mostly because WM_QUERYNEWPALETTE is rarely sent on Windows. In fact, for some reason even changing the display mode to 8bpp still didn't send it. But it was sent if the application was forced into "Run in 256 colors" (Windows XP) while having a 32bpp desktop display mode, which sounds like a compatibility shim hack to me.
dlls/ddraw/surface.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index 8805014..f2182d5 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -3786,7 +3786,18 @@ static HRESULT WINAPI ddraw_surface7_Restore(IDirectDrawSurface7 *iface) }
if (surface->ddraw->device_state == DDRAW_DEVICE_STATE_LOST && ddraw_surface_can_be_lost(surface)) - return DDERR_WRONGMODE; + { + HWND window = surface->ddraw->focuswindow ? surface->ddraw->focuswindow : surface->ddraw->dest_window; + + /* Railroad Tycoon 2 tries to restore the surface from within + a WM_QUERYNEWPALETTE message and expects it to succeed. We + haven't received the WM_ACTIVATEAPP message by that point, + so the device state is still LOST, even though we are in + the foreground. */ + if (GetForegroundWindow() != window) return DDERR_WRONGMODE; + + surface->ddraw->device_state = DDRAW_DEVICE_STATE_NOT_RESTORED; + }
ddraw_update_lost_surfaces(surface->ddraw); surface->is_lost = FALSE;
Hi,
While running your changed tests, 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=76178
Your paranoid android.
=== debiant (build log) ===
The task timed out
=== debiant (32 bit WoW report) ===
ddraw: ddraw1: Timeout
=== debiant (build log) ===
The task timed out
Am 27.07.2020 um 20:53 schrieb Gabriel Ivăncescu gabrielopcode@gmail.com:
if (GetForegroundWindow() != window) return DDERR_WRONGMODE;
For the purpose of my understanding: is window != NULL here when Railroad Tycoon 2 hits this codepath?
On 28/07/2020 13:32, Stefan Dösinger wrote:
Am 27.07.2020 um 20:53 schrieb Gabriel Ivăncescu <gabrielopcode@gmail.com mailto:gabrielopcode@gmail.com>:
- if (GetForegroundWindow() != window) return DDERR_WRONGMODE;
For the purpose of my understanding: is window != NULL here when Railroad Tycoon 2 hits this codepath?
When it hits this codepath, window == dest_window, since it never sets focuswindow (so it's NULL).
It's not NULL, though, it's the game's window. dest_window can't be NULL, right?
Am 28.07.2020 um 15:06 schrieb Gabriel Ivăncescu gabrielopcode@gmail.com:
On 28/07/2020 13:32, Stefan Dösinger wrote:
Am 27.07.2020 um 20:53 schrieb Gabriel Ivăncescu <gabrielopcode@gmail.com mailto:gabrielopcode@gmail.com>:
if (GetForegroundWindow() != window) return DDERR_WRONGMODE;
For the purpose of my understanding: is window != NULL here when Railroad Tycoon 2 hits this codepath?
When it hits this codepath, window == dest_window, since it never sets focuswindow (so it's NULL).
It's not NULL, though, it's the game's window. dest_window can't be NULL, right?
It can be NULL in DDSCL_NORMAL, but then you wouldn't hit the focus loss codepath yeah. That's just from the top of my head, I can't rule out that there are more weird cases where it is NULL. ddraw is weird :-)
On 28/07/2020 16:21, Stefan Dösinger wrote:
Am 28.07.2020 um 15:06 schrieb Gabriel Ivăncescu gabrielopcode@gmail.com:
On 28/07/2020 13:32, Stefan Dösinger wrote:
Am 27.07.2020 um 20:53 schrieb Gabriel Ivăncescu <gabrielopcode@gmail.com mailto:gabrielopcode@gmail.com>:
if (GetForegroundWindow() != window) return DDERR_WRONGMODE;
For the purpose of my understanding: is window != NULL here when Railroad Tycoon 2 hits this codepath?
When it hits this codepath, window == dest_window, since it never sets focuswindow (so it's NULL).
It's not NULL, though, it's the game's window. dest_window can't be NULL, right?
It can be NULL in DDSCL_NORMAL, but then you wouldn't hit the focus loss codepath yeah. That's just from the top of my head, I can't rule out that there are more weird cases where it is NULL. ddraw is weird :-)
Yeah, I'll just add a check for NULL just to be safe.
Hi,
While running your changed tests, 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=76176
Your paranoid android.
=== w8 (32 bit report) ===
ddraw: ddraw1.c:3234: Test failed: Got unexpected hr 0x887601c2.
=== w2008s64 (32 bit report) ===
ddraw: ddraw7.c:9456: Test failed: Got unexpected hr 0x88760233.
=== w2008s64 (64 bit report) ===
ddraw: ddraw7.c:9456: Test failed: Got unexpected hr 0x88760233.
=== debiant (build log) ===
The task timed out