i965/gen7: Skip repeated NULL depth/stencil state emits.
authorEric Anholt <eric@anholt.net>
Sun, 6 Apr 2014 17:49:49 +0000 (10:49 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 11 Apr 2014 20:38:52 +0000 (13:38 -0700)
Improves cairo performance on glamor by 2.87752% +/- 0.966977 (n=57).

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/mesa/drivers/dri/i965/brw_blorp.cpp
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/gen7_misc_state.c
src/mesa/drivers/dri/i965/gen8_depth_state.c

index 252219e856412324b70a3bc2a60657f35046f980..57ff30a7fb005a44358f6ae9f239d59d0f0b825d 100644 (file)
@@ -278,6 +278,7 @@ retry:
     */
    brw->state.dirty.brw = ~0;
    brw->state.dirty.cache = ~0;
+   brw->no_depth_or_stencil = false;
    brw->ib.type = -1;
 
    /* Flush the sampler cache so any texturing from the destination is
index 487142cd300bd5625c163f7f84a617c56578968f..f8ca58fdd5b18ce6206aad50b1054332db742b83 100644 (file)
@@ -1119,6 +1119,9 @@ struct brw_context
    /* Whether a meta-operation is in progress. */
    bool meta_in_progress;
 
+   /* Whether the last depth/stencil packets were both NULL. */
+   bool no_depth_or_stencil;
+
    struct {
       struct brw_vertex_element inputs[VERT_ATTRIB_MAX];
       struct brw_vertex_buffer buffers[VERT_ATTRIB_MAX];
index 8fb0eec7765140166b167f6111511d7f0fc6a4fe..328b01e69df8ad0c2a445924e6cd141787c58f16 100644 (file)
@@ -52,6 +52,12 @@ gen7_emit_depth_stencil_hiz(struct brw_context *brw,
    const struct intel_renderbuffer *irb = NULL;
    const struct gl_renderbuffer *rb = NULL;
 
+   /* Skip repeated NULL depth/stencil emits (think 2D rendering). */
+   if (!mt && brw->no_depth_or_stencil) {
+      assert(brw->hw_ctx);
+      return;
+   }
+
    intel_emit_depth_stall_flushes(brw);
 
    irb = intel_get_renderbuffer(fb, BUFFER_DEPTH);
@@ -190,6 +196,8 @@ gen7_emit_depth_stencil_hiz(struct brw_context *brw,
    OUT_BATCH(depth_mt ? depth_mt->depth_clear_value : 0);
    OUT_BATCH(1);
    ADVANCE_BATCH();
+
+   brw->no_depth_or_stencil = !mt;
 }
 
 /**
index 621951e34fafd8f6b1244a292142f377780f1fc1..8f5718a2f546c45f84ed288766414a3f53f6232f 100644 (file)
@@ -49,6 +49,12 @@ emit_depth_packets(struct brw_context *brw,
                    uint32_t lod,
                    uint32_t min_array_element)
 {
+   /* Skip repeated NULL depth/stencil emits (think 2D rendering). */
+   if (!depth_mt && !stencil_mt && brw->no_depth_or_stencil) {
+      assert(brw->hw_ctx);
+      return;
+   }
+
    intel_emit_depth_stall_flushes(brw);
 
    /* _NEW_BUFFERS, _NEW_DEPTH, _NEW_STENCIL */
@@ -130,6 +136,8 @@ emit_depth_packets(struct brw_context *brw,
    OUT_BATCH(depth_mt ? depth_mt->depth_clear_value : 0);
    OUT_BATCH(1);
    ADVANCE_BATCH();
+
+   brw->no_depth_or_stencil = !depth_mt && !stencil_mt;
 }
 
 /* Awful vtable-compatible function; should be cleaned up in the future. */