ddraw: Do not return unset viewport from GetViewport().
Signed-off-by: Józef Kucia <jkucia@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
b119d3c54b
commit
f4865564ec
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue