Mesa (master): i965: Allow fast depth clears if scissoring doesn' t do anything.

Kenneth Graunke kwg at kemper.freedesktop.org
Tue Sep 25 14:15:33 UTC 2012


Module: Mesa
Branch: master
Commit: 097b4a3b28ecab81b356b86f04a939d24b94ae77
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=097b4a3b28ecab81b356b86f04a939d24b94ae77

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Wed Sep 19 13:27:55 2012 -0700

i965: Allow fast depth clears if scissoring doesn't do anything.

A game we're working with leaves scissoring enabled, but frequently sets
the scissor rectangle to the size of the whole screen.  In that case,
scissoring has no effect, so it's safe to go ahead with a fast clear.

Chad believe this should help with Oliver McFadden's "Dante" as well.

v2/Chad: Use the drawbuffer dimensions rather than the miptree slice
dimensions.  The miptree slice may be slightly larger due to alignment
restrictions.

Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
Signed-off-by: Chad Versace <chad.versace at linux.intel.com>
Reviewed-and-tested-by: Oliver McFadden <oliver.mcfadden at linux.intel.com>

---

 src/mesa/drivers/dri/i965/brw_clear.c |   14 +++++++++++++-
 1 files changed, 13 insertions(+), 1 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_clear.c b/src/mesa/drivers/dri/i965/brw_clear.c
index ce40e52..53d8e54 100644
--- a/src/mesa/drivers/dri/i965/brw_clear.c
+++ b/src/mesa/drivers/dri/i965/brw_clear.c
@@ -77,6 +77,18 @@ debug_mask(const char *name, GLbitfield mask)
 }
 
 /**
+ * Returns true if the scissor is a noop (cuts out nothing).
+ */
+static bool
+noop_scissor(struct gl_context *ctx, struct gl_framebuffer *fb)
+{
+   return ctx->Scissor.X <= 0 &&
+          ctx->Scissor.Y <= 0 &&
+          ctx->Scissor.Width >= fb->Width &&
+          ctx->Scissor.Height >= fb->Height;
+}
+
+/**
  * Implements fast depth clears on gen6+.
  *
  * Fast clears basically work by setting a flag in each of the subspans
@@ -107,7 +119,7 @@ brw_fast_clear_depth(struct gl_context *ctx)
     * a previous clear had happened at a different clear value and resolve it
     * first.
     */
-   if (ctx->Scissor.Enabled) {
+   if (ctx->Scissor.Enabled && !noop_scissor(ctx, fb)) {
       perf_debug("Failed to fast clear depth due to scissor being enabled.  "
                  "Possible 5%% performance win if avoided.\n");
       return false;




More information about the mesa-commit mailing list