[PATCH 3/5] wined3d: Limit clears to the size of the framebuffer.
Matteo Bruni
mbruni at codeweavers.com
Wed Mar 28 14:05:15 CDT 2018
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
---
It turns out that we already have some ddraw tests demonstrating that
handling this in ddraw is wrong...
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);
}
--
2.13.6
More information about the wine-devel
mailing list