summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2016-10-06 14:50:04 -0700
committerEric Anholt <[email protected]>2016-10-06 18:29:16 -0700
commit20d91e5ce9b2da46c703b6af16c5e7ac0e13150f (patch)
treee92ccb83017e7d88d8765876d5fbfbf5ac17547f /src
parentcb328123fe2fda48add8a754b84b22e54f9c5912 (diff)
vc4: Don't worry about partial Z/S clear if the other is already cleared.
We have to be careful to not smash the value they're clearing to, but other than that we're fine. Avoids quad clears in Processing, which likes to do glClear(Z|S); glClear(Z). Improves performance of Processing's QuadRendering demo at 5000 quads by 5.46507% +/- 1.35576% (n=15 before, 32 after)
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/vc4/vc4_draw.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/gallium/drivers/vc4/vc4_draw.c b/src/gallium/drivers/vc4/vc4_draw.c
index 87c8a5f99c6..f44831f1e43 100644
--- a/src/gallium/drivers/vc4/vc4_draw.c
+++ b/src/gallium/drivers/vc4/vc4_draw.c
@@ -514,7 +514,7 @@ vc4_clear(struct pipe_context *pctx, unsigned buffers,
*/
if ((zsclear == PIPE_CLEAR_DEPTH ||
zsclear == PIPE_CLEAR_STENCIL) &&
- (rsc->initialized_buffers & ~zsclear) &&
+ (rsc->initialized_buffers & ~(zsclear | job->cleared)) &&
util_format_is_depth_and_stencil(vc4->framebuffer.zsbuf->format)) {
perf_debug("Partial clear of Z+stencil buffer, "
"drawing a quad instead of fast clearing\n");
@@ -533,8 +533,12 @@ vc4_clear(struct pipe_context *pctx, unsigned buffers,
/* Though the depth buffer is stored with Z in the high 24,
* for this field we just need to store it in the low 24.
*/
- job->clear_depth = util_pack_z(PIPE_FORMAT_Z24X8_UNORM, depth);
- job->clear_stencil = stencil;
+ if (buffers & PIPE_CLEAR_DEPTH) {
+ job->clear_depth = util_pack_z(PIPE_FORMAT_Z24X8_UNORM,
+ depth);
+ }
+ if (buffers & PIPE_CLEAR_STENCIL)
+ job->clear_stencil = stencil;
rsc->initialized_buffers |= zsclear;
}