From f4865564ec7c2b15e93ed2221e272ee36379e09d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zef=20Kucia?= Date: Mon, 12 Nov 2018 15:13:05 +0100 Subject: [PATCH] ddraw: Do not return unset viewport from GetViewport(). 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/ddraw_private.h | 9 +++++++- dlls/ddraw/tests/ddraw1.c | 2 +- dlls/ddraw/tests/ddraw2.c | 6 +++--- dlls/ddraw/tests/ddraw4.c | 6 +++--- dlls/ddraw/viewport.c | 42 +++++++++++++++++++++++++------------- 5 files changed, 43 insertions(+), 22 deletions(-) diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h index 495cb8be68b..b035a7e0509 100644 --- a/dlls/ddraw/ddraw_private.h +++ b/dlls/ddraw/ddraw_private.h @@ -474,6 +474,13 @@ struct d3d_material void material_activate(struct d3d_material *material) DECLSPEC_HIDDEN; struct d3d_material *d3d_material_create(struct ddraw *ddraw) DECLSPEC_HIDDEN; +enum ddraw_viewport_version +{ + DDRAW_VIEWPORT_VERSION_NONE, + DDRAW_VIEWPORT_VERSION_1, + DDRAW_VIEWPORT_VERSION_2, +}; + /***************************************************************************** * IDirect3DViewport - Wraps to D3D7 *****************************************************************************/ @@ -491,7 +498,7 @@ struct d3d_viewport DWORD num_lights; DWORD map_lights; - int use_vp2; + enum ddraw_viewport_version version; union { diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c index 7d8ccec7bbc..59d07b7d76f 100644 --- a/dlls/ddraw/tests/ddraw1.c +++ b/dlls/ddraw/tests/ddraw1.c @@ -1260,7 +1260,7 @@ static void test_viewport_object(void) todo_wine ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); desc.vp1.dwSize = sizeof(desc.vp1); hr = IDirect3DViewport_GetViewport(viewport, &desc.vp1); - todo_wine ok(hr == D3DERR_VIEWPORTDATANOTSET, "Got unexpected hr %#x.\n", hr); + ok(hr == D3DERR_VIEWPORTDATANOTSET, "Got unexpected hr %#x.\n", hr); ok(desc.vp1.dwSize == sizeof(desc.vp1), "Got unexpected dwSize %u.\n", desc.vp1.dwSize); /* E_FAIL return values are returned by Winetestbot Windows NT machines. While not supporting diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c index 1ae7ffe3fae..8b9b249a3a4 100644 --- a/dlls/ddraw/tests/ddraw2.c +++ b/dlls/ddraw/tests/ddraw2.c @@ -1435,11 +1435,11 @@ static void test_viewport_object(void) todo_wine ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); desc.vp1.dwSize = sizeof(desc.vp1); hr = IDirect3DViewport2_GetViewport(viewport2, &desc.vp1); - todo_wine ok(hr == D3DERR_VIEWPORTDATANOTSET, "Got unexpected hr %#x.\n", hr); + ok(hr == D3DERR_VIEWPORTDATANOTSET, "Got unexpected hr %#x.\n", hr); ok(desc.vp1.dwSize == sizeof(desc.vp1), "Got unexpected dwSize %u.\n", desc.vp1.dwSize); hr = IDirect3DViewport2_GetViewport2(viewport2, &desc.vp2); - todo_wine ok(hr == D3DERR_VIEWPORTDATANOTSET, "Got unexpected hr %#x.\n", hr); - todo_wine ok(desc.vp2.dwSize == sizeof(desc.vp2), "Got unexpected dwSize %u.\n", desc.vp2.dwSize); + ok(hr == D3DERR_VIEWPORTDATANOTSET, "Got unexpected hr %#x.\n", hr); + ok(desc.vp2.dwSize == sizeof(desc.vp2), "Got unexpected dwSize %u.\n", desc.vp2.dwSize); desc.vp2.dwSize = sizeof(desc.vp2) + 1; hr = IDirect3DViewport2_GetViewport2(viewport2, &desc.vp2); todo_wine ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index 28d724062fd..443c78b6439 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -1591,11 +1591,11 @@ static void test_viewport_object(void) todo_wine ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); desc.vp1.dwSize = sizeof(desc.vp1); hr = IDirect3DViewport3_GetViewport(viewport3, &desc.vp1); - todo_wine ok(hr == D3DERR_VIEWPORTDATANOTSET, "Got unexpected hr %#x.\n", hr); + ok(hr == D3DERR_VIEWPORTDATANOTSET, "Got unexpected hr %#x.\n", hr); ok(desc.vp1.dwSize == sizeof(desc.vp1), "Got unexpected dwSize %u.\n", desc.vp1.dwSize); hr = IDirect3DViewport3_GetViewport2(viewport3, &desc.vp2); - todo_wine ok(hr == D3DERR_VIEWPORTDATANOTSET, "Got unexpected hr %#x.\n", hr); - todo_wine ok(desc.vp2.dwSize == sizeof(desc.vp2), "Got unexpected dwSize %u.\n", desc.vp2.dwSize); + ok(hr == D3DERR_VIEWPORTDATANOTSET, "Got unexpected hr %#x.\n", hr); + ok(desc.vp2.dwSize == sizeof(desc.vp2), "Got unexpected dwSize %u.\n", desc.vp2.dwSize); desc.vp2.dwSize = sizeof(desc.vp2) + 1; hr = IDirect3DViewport3_GetViewport2(viewport3, &desc.vp2); todo_wine ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr); diff --git a/dlls/ddraw/viewport.c b/dlls/ddraw/viewport.c index 6f8f33b3508..8cc60f1eb15 100644 --- a/dlls/ddraw/viewport.c +++ b/dlls/ddraw/viewport.c @@ -69,7 +69,7 @@ void viewport_activate(struct d3d_viewport *This, BOOL ignore_lights) } /* And copy the values in the structure used by the device */ - if (This->use_vp2) + if (This->version == DDRAW_VIEWPORT_VERSION_2) { vp.dwX = This->viewports.vp2.dwX; vp.dwY = This->viewports.vp2.dwY; @@ -259,10 +259,17 @@ static HRESULT WINAPI d3d_viewport_GetViewport(IDirect3DViewport3 *iface, D3DVIE if (!vp) return DDERR_INVALIDPARAMS; + if (viewport->version == DDRAW_VIEWPORT_VERSION_NONE) + { + WARN("Viewport data was not set.\n"); + return D3DERR_VIEWPORTDATANOTSET; + } + wined3d_mutex_lock(); size = vp->dwSize; - if (!viewport->use_vp2) + memset(vp, 0, size); + if (viewport->version == DDRAW_VIEWPORT_VERSION_1) { memcpy(vp, &viewport->viewports.vp1, size); } @@ -275,10 +282,10 @@ static HRESULT WINAPI d3d_viewport_GetViewport(IDirect3DViewport3 *iface, D3DVIE vp1.dwY = viewport->viewports.vp2.dwY; vp1.dwWidth = viewport->viewports.vp2.dwWidth; vp1.dwHeight = viewport->viewports.vp2.dwHeight; - vp1.dvMaxX = 0.0; - vp1.dvMaxY = 0.0; - vp1.dvScaleX = 0.0; - vp1.dvScaleY = 0.0; + vp1.dvMaxX = 0.0f; + vp1.dvMaxY = 0.0f; + vp1.dvScaleX = 0.0f; + vp1.dvScaleY = 0.0f; vp1.dvMinZ = viewport->viewports.vp2.dvMinZ; vp1.dvMaxZ = viewport->viewports.vp2.dvMaxZ; memcpy(vp, &vp1, size); @@ -348,7 +355,7 @@ static HRESULT WINAPI d3d_viewport_SetViewport(IDirect3DViewport3 *iface, D3DVIE } } - viewport->use_vp2 = 0; + viewport->version = DDRAW_VIEWPORT_VERSION_1; viewport->viewports.vp1 = *vp; /* Empirical testing on a couple of d3d1 games showed that these values @@ -906,9 +913,16 @@ static HRESULT WINAPI d3d_viewport_GetViewport2(IDirect3DViewport3 *iface, D3DVI if (!vp) return DDERR_INVALIDPARAMS; + if (viewport->version == DDRAW_VIEWPORT_VERSION_NONE) + { + WARN("Viewport data was not set.\n"); + return D3DERR_VIEWPORTDATANOTSET; + } + wined3d_mutex_lock(); size = vp->dwSize; - if (viewport->use_vp2) + memset(vp, 0, size); + if (viewport->version == DDRAW_VIEWPORT_VERSION_2) { memcpy(vp, &viewport->viewports.vp2, size); } @@ -921,10 +935,10 @@ static HRESULT WINAPI d3d_viewport_GetViewport2(IDirect3DViewport3 *iface, D3DVI vp2.dwY = viewport->viewports.vp1.dwY; vp2.dwWidth = viewport->viewports.vp1.dwWidth; vp2.dwHeight = viewport->viewports.vp1.dwHeight; - vp2.dvClipX = 0.0; - vp2.dvClipY = 0.0; - vp2.dvClipWidth = 0.0; - vp2.dvClipHeight = 0.0; + vp2.dvClipX = 0.0f; + vp2.dvClipY = 0.0f; + vp2.dvClipWidth = 0.0f; + vp2.dvClipHeight = 0.0f; vp2.dvMinZ = viewport->viewports.vp1.dvMinZ; vp2.dvMaxZ = viewport->viewports.vp1.dvMaxZ; memcpy(vp, &vp2, size); @@ -994,7 +1008,7 @@ static HRESULT WINAPI d3d_viewport_SetViewport2(IDirect3DViewport3 *iface, D3DVI } } - viewport->use_vp2 = 1; + viewport->version = DDRAW_VIEWPORT_VERSION_2; viewport->viewports.vp2 = *vp; if (SUCCEEDED(IDirect3DDevice3_GetCurrentViewport(&device->IDirect3DDevice3_iface, ¤t_viewport))) @@ -1175,6 +1189,6 @@ void d3d_viewport_init(struct d3d_viewport *viewport, struct ddraw *ddraw) viewport->IDirect3DViewport3_iface.lpVtbl = &d3d_viewport_vtbl; viewport->ref = 1; viewport->ddraw = ddraw; - viewport->use_vp2 = 0xff; + viewport->version = DDRAW_VIEWPORT_VERSION_NONE; list_init(&viewport->light_list); }