Module: wine Branch: master Commit: 312cb81138a3bd947a3e9ec8cf94774e852ad0df URL: http://source.winehq.org/git/wine.git/?a=commit;h=312cb81138a3bd947a3e9ec8cf...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Wed Feb 1 12:02:57 2017 +0100
ddraw: Validate the primary surface format in ddraw_surface7_Restore().
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ddraw/surface.c | 20 +++++++++++++++++--- dlls/ddraw/tests/ddraw1.c | 13 +++++++++++++ dlls/ddraw/tests/ddraw2.c | 13 +++++++++++++ dlls/ddraw/tests/ddraw4.c | 13 +++++++++++++ dlls/ddraw/tests/ddraw7.c | 13 +++++++++++++ 5 files changed, 69 insertions(+), 3 deletions(-)
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index c46472c..710f6cd 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -3625,6 +3625,7 @@ static HRESULT WINAPI ddraw_surface7_Restore(IDirectDrawSurface7 *iface) if (surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) { struct wined3d_swapchain *swapchain = surface->ddraw->wined3d_swapchain; + struct wined3d_sub_resource_desc wined3d_desc; struct wined3d_display_mode mode; HRESULT hr;
@@ -3634,10 +3635,23 @@ static HRESULT WINAPI ddraw_surface7_Restore(IDirectDrawSurface7 *iface) return hr; }
- if (mode.width != surface->surface_desc.dwWidth || mode.height != surface->surface_desc.dwHeight) + if (FAILED(hr = wined3d_texture_get_sub_resource_desc(surface->wined3d_texture, 0, &wined3d_desc))) { - WARN("Display mode %ux%u doesn't match surface dimensions %ux%u.\n", - mode.width, mode.height, surface->surface_desc.dwWidth, surface->surface_desc.dwHeight); + WARN("Failed to get resource desc, hr %#x.\n", hr); + return hr; + } + + if (mode.width != wined3d_desc.width || mode.height != wined3d_desc.height) + { + WARN("Display mode dimensions %ux%u don't match surface dimensions %ux%u.\n", + mode.width, mode.height, wined3d_desc.width, wined3d_desc.height); + return DDERR_WRONGMODE; + } + + if (mode.format_id != wined3d_desc.format) + { + WARN("Display mode format %#x doesn't match surface format %#x.\n", + mode.format_id, wined3d_desc.format); return DDERR_WRONGMODE; } } diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c index 28b67fd..c57fa67 100644 --- a/dlls/ddraw/tests/ddraw1.c +++ b/dlls/ddraw/tests/ddraw1.c @@ -4626,6 +4626,19 @@ static void test_primary_palette(void) hr = IDirectDrawSurface_GetPalette(primary, &tmp); ok(hr == DDERR_NOPALETTEATTACHED, "Got unexpected hr %#x.\n", hr);
+ hr = IDirectDrawSurface_IsLost(primary); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + + hr = set_display_mode(ddraw, 640, 480); + ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); + + hr = IDirectDrawSurface_IsLost(primary); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface_Restore(primary); + ok(hr == DDERR_WRONGMODE, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface_IsLost(primary); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + done: refcount = IDirectDrawSurface_Release(backbuffer); ok(refcount == 1, "Got unexpected refcount %u.\n", refcount); diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c index f27889f..853a0d4 100644 --- a/dlls/ddraw/tests/ddraw2.c +++ b/dlls/ddraw/tests/ddraw2.c @@ -5673,6 +5673,19 @@ static void test_primary_palette(void) hr = IDirectDrawSurface_GetPalette(primary, &tmp); ok(hr == DDERR_NOPALETTEATTACHED, "Got unexpected hr %#x.\n", hr);
+ hr = IDirectDrawSurface_IsLost(primary); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + + hr = set_display_mode(ddraw, 640, 480); + ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); + + hr = IDirectDrawSurface_IsLost(primary); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface_Restore(primary); + ok(hr == DDERR_WRONGMODE, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface_IsLost(primary); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + done: refcount = IDirectDrawSurface_Release(backbuffer); ok(refcount == 1, "Got unexpected refcount %u.\n", refcount); diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index bcbc2f3..93987e9 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -6944,6 +6944,19 @@ static void test_primary_palette(void) hr = IDirectDrawSurface4_GetPalette(primary, &tmp); ok(hr == DDERR_NOPALETTEATTACHED, "Got unexpected hr %#x.\n", hr);
+ hr = IDirectDrawSurface4_IsLost(primary); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + + hr = set_display_mode(ddraw, 640, 480); + ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); + + hr = IDirectDrawSurface4_IsLost(primary); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface4_Restore(primary); + ok(hr == DDERR_WRONGMODE, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface4_IsLost(primary); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + done: refcount = IDirectDrawSurface4_Release(backbuffer); ok(refcount == 1, "Got unexpected refcount %u.\n", refcount); diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c index 3774afb..c29a50d 100644 --- a/dlls/ddraw/tests/ddraw7.c +++ b/dlls/ddraw/tests/ddraw7.c @@ -6867,6 +6867,19 @@ static void test_primary_palette(void) hr = IDirectDrawSurface7_GetPalette(primary, &tmp); ok(hr == DDERR_NOPALETTEATTACHED, "Got unexpected hr %#x.\n", hr);
+ hr = IDirectDrawSurface7_IsLost(primary); + ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr); + + hr = set_display_mode(ddraw, 640, 480); + ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); + + hr = IDirectDrawSurface7_IsLost(primary); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface7_Restore(primary); + ok(hr == DDERR_WRONGMODE, "Got unexpected hr %#x.\n", hr); + hr = IDirectDrawSurface7_IsLost(primary); + ok(hr == DDERR_SURFACELOST, "Got unexpected hr %#x.\n", hr); + done: refcount = IDirectDrawSurface7_Release(backbuffer); ok(refcount == 1, "Got unexpected refcount %u.\n", refcount);