[PATCH v4 2/3] ddraw: Return DDERR_WRONGMODE when restoring a lost device's surface that can be lost.
Gabriel Ivăncescu
gabrielopcode at gmail.com
Tue Jul 28 09:53:56 CDT 2020
Signed-off-by: Gabriel Ivăncescu <gabrielopcode at 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 a6b978e..7717012 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 41b9ed1..eca48d9 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 10f39ae..1e151d7 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 9d579fa..bc3d022 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);
--
2.21.0
More information about the wine-devel
mailing list