=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: ddraw: Do not return unset viewport from GetViewport().
Alexandre Julliard
julliard at winehq.org
Mon Nov 12 16:26:56 CST 2018
Module: wine
Branch: master
Commit: f4865564ec7c2b15e93ed2221e272ee36379e09d
URL: https://source.winehq.org/git/wine.git/?a=commit;h=f4865564ec7c2b15e93ed2221e272ee36379e09d
Author: Józef Kucia <jkucia at codeweavers.com>
Date: Mon Nov 12 15:13:05 2018 +0100
ddraw: Do not return unset viewport from GetViewport().
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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 495cb8b..b035a7e 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 7d8ccec..59d07b7 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 1ae7ffe..8b9b249 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 28d7240..443c78b 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 6f8f33b..8cc60f1 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);
}
More information about the wine-cvs
mailing list