diff options
author | Patrick Rudolph <[email protected]> | 2015-02-20 15:48:57 +0100 |
---|---|---|
committer | Axel Davy <[email protected]> | 2015-04-29 08:28:10 +0200 |
commit | 77a38d2088678fa756aca61592777f12e245ac0c (patch) | |
tree | 3320dbf7f2a2464cbc78132848a4954b1c6fb22e /src/gallium/state_trackers/nine | |
parent | 716bef2643367d3696aa20ab7178cbe19bf78abc (diff) |
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 <[email protected]>
Signed-off-by: Axel Davy <[email protected]>
Diffstat (limited to 'src/gallium/state_trackers/nine')
-rw-r--r-- | src/gallium/state_trackers/nine/device9.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/gallium/state_trackers/nine/device9.c b/src/gallium/state_trackers/nine/device9.c index 78e148bca77..1430ca57c7c 100644 --- a/src/gallium/state_trackers/nine/device9.c +++ b/src/gallium/state_trackers/nine/device9.c @@ -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; } |