From c830b0706b9c727067b4a1258e89d4382818a7ff Mon Sep 17 00:00:00 2001 From: Matteo Bruni Date: Wed, 28 Mar 2018 21:05:15 +0200 Subject: [PATCH] wined3d: Limit clears to the size of the framebuffer. Signed-off-by: Matteo Bruni Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/wined3d/cs.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 8edb74fc74c..2f0c4ed52e4 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -531,7 +531,9 @@ void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT * unsigned int rt_count = cs->device->adapter->gl_info.limits.buffers; const struct wined3d_state *state = &cs->device->state; const struct wined3d_viewport *vp = &state->viewport; + struct wined3d_rendertarget_view *view; struct wined3d_cs_clear *op; + RECT view_rect; unsigned int i; op = cs->ops->require_space(cs, FIELD_OFFSET(struct wined3d_cs_clear, rects[rect_count]), @@ -553,12 +555,21 @@ void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT * { for (i = 0; i < rt_count; ++i) { - if (state->fb->render_targets[i]) - wined3d_resource_acquire(state->fb->render_targets[i]->resource); + if ((view = state->fb->render_targets[i])) + { + SetRect(&view_rect, 0, 0, view->width, view->height); + IntersectRect(&op->draw_rect, &op->draw_rect, &view_rect); + wined3d_resource_acquire(view->resource); + } } } if (flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL)) - wined3d_resource_acquire(state->fb->depth_stencil->resource); + { + view = state->fb->depth_stencil; + SetRect(&view_rect, 0, 0, view->width, view->height); + IntersectRect(&op->draw_rect, &op->draw_rect, &view_rect); + wined3d_resource_acquire(view->resource); + } cs->ops->submit(cs, WINED3D_CS_QUEUE_DEFAULT); }