=?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, &current_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