i965: Allow fast depth clears if scissoring doesn't do anything.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 19 Sep 2012 20:27:55 +0000 (13:27 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 25 Sep 2012 14:03:59 +0000 (07:03 -0700)
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@whitecape.org>
Signed-off-by: Chad Versace <chad.versace@linux.intel.com>
Reviewed-and-tested-by: Oliver McFadden <oliver.mcfadden@linux.intel.com>
src/mesa/drivers/dri/i965/brw_clear.c

index ce40e52d461d412a4a96595d4534599fcb2a2097..53d8e5400ef0d8e0f81c9e233771543e9caf3474 100644 (file)
@@ -76,6 +76,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+.
  *
@@ -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;