[PATCH 07/10] d3d8: Forbid setting a viewport larger than the render target.
Matteo Bruni
mbruni at codeweavers.com
Tue Mar 20 17:37:32 CDT 2018
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
---
dlls/d3d8/device.c | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index 4fcad71451e..278024f15f8 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -1638,10 +1638,30 @@ static HRESULT WINAPI d3d8_device_MultiplyTransform(IDirect3DDevice8 *iface,
static HRESULT WINAPI d3d8_device_SetViewport(IDirect3DDevice8 *iface, const D3DVIEWPORT8 *viewport)
{
struct d3d8_device *device = impl_from_IDirect3DDevice8(iface);
+ struct wined3d_sub_resource_desc rt_desc;
+ struct wined3d_rendertarget_view *rtv;
+ struct d3d8_surface *surface;
struct wined3d_viewport vp;
TRACE("iface %p, viewport %p.\n", iface, viewport);
+ wined3d_mutex_lock();
+ if (!(rtv = wined3d_device_get_rendertarget_view(device->wined3d_device, 0)))
+ {
+ wined3d_mutex_unlock();
+ return D3DERR_NOTFOUND;
+ }
+ surface = wined3d_rendertarget_view_get_sub_resource_parent(rtv);
+ wined3d_texture_get_sub_resource_desc(surface->wined3d_texture, surface->sub_resource_idx, &rt_desc);
+
+ if (viewport->Width > rt_desc.width || viewport->X + viewport->Width > rt_desc.width
+ || viewport->Height > rt_desc.height || viewport->Y + viewport->Height > rt_desc.height)
+ {
+ WARN("Invalid viewport, returning D3DERR_INVALIDCALL.\n");
+ wined3d_mutex_unlock();
+ return D3DERR_INVALIDCALL;
+ }
+
vp.x = viewport->X;
vp.y = viewport->Y;
vp.width = viewport->Width;
@@ -1649,7 +1669,6 @@ static HRESULT WINAPI d3d8_device_SetViewport(IDirect3DDevice8 *iface, const D3D
vp.min_z = viewport->MinZ;
vp.max_z = viewport->MaxZ;
- wined3d_mutex_lock();
wined3d_device_set_viewport(device->wined3d_device, &vp);
wined3d_mutex_unlock();
--
2.13.6
More information about the wine-devel
mailing list