Browse Source

st/nine: NineDevice9_Clear skip fastpath for bigger depth-buffers

This adds an additional check to make sure the bound depth-buffer doesn't
exceed the rendertarget size when clearing depth and color buffer at once.
D3D9 clears only a rectangle with the same dimensions as the viewport, leaving
other parts of the depth-buffer intact.

This fixes failing WINE test visual.c:depth_buffer_test()

Signed-off-by: Patrick Rudolph <siro@das-labor.org>
Signed-off-by: Axel Davy <axel.davy@ens.fr>
tags/10.6-branchpoint
Patrick Rudolph 10 years ago
parent
commit
77a38d2088
1 changed files with 13 additions and 4 deletions
  1. 13
    4
      src/gallium/state_trackers/nine/device9.c

+ 13
- 4
src/gallium/state_trackers/nine/device9.c View File

@@ -1756,12 +1756,21 @@ NineDevice9_Clear( struct NineDevice9 *This,
rt_mask |= 1 << i;
}

/* fast path, clears everything at once */
if (!Count &&
(!(bufs & PIPE_CLEAR_COLOR) || (rt_mask == This->state.rt_mask)) &&
rect.x1 == 0 && rect.x2 >= This->state.fb.width &&
rect.y1 == 0 && rect.y2 >= This->state.fb.height) {
/* fast path, clears everything at once */
DBG("fast path\n");
rect.x1 == 0 && rect.y1 == 0 &&
/* Case we clear only render target. Check clear region vs rt. */
((!(bufs & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)) &&
rect.x2 >= This->state.fb.width &&
rect.y2 >= This->state.fb.height) ||
/* Case we clear depth buffer (and eventually rt too).
* depth buffer size is always >= rt size. Compare to clear region */
((bufs & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)) &&
This->state.fb.zsbuf != NULL &&
rect.x2 >= zsbuf_surf->desc.Width &&
rect.y2 >= zsbuf_surf->desc.Height))) {
DBG("Clear fast path\n");
pipe->clear(pipe, bufs, &rgba, Z, Stencil);
return D3D_OK;
}

Loading…
Cancel
Save