i965/blorp: Skip re-emitting urb config whenever possible
authorTopi Pohjolainen <topi.pohjolainen@intel.com>
Fri, 15 Apr 2016 10:39:48 +0000 (13:39 +0300)
committerTopi Pohjolainen <topi.pohjolainen@intel.com>
Thu, 21 Apr 2016 07:20:03 +0000 (10:20 +0300)
Otherwise clearing with blorp will regress performance in some
synthetic test cases.

v2: Used vsize >= 2 instead of vsize > 0, and updated the comment.
    Review by Ken in one of the earlier patches revealed this.

Signed-off-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/gen7_blorp.cpp

index 712291d1999ceb1cdb207a147e40d61a47306926..c6f95492de2df79e19d1ed939371d00044482714 100644 (file)
 
 #include "brw_blorp.h"
 
+static bool
+gen7_blorp_skip_urb_config(const struct brw_context *brw)
+{
+   if (brw->ctx.NewDriverState & (BRW_NEW_CONTEXT | BRW_NEW_URB_SIZE))
+      return false;
+
+   /* Vertex elements along with full VUE header take 96 bytes. As the size
+    * is expressed in 64 bytes, one needs at least two times that, otherwise
+    * the setup can be any valid configuration.
+    */
+   return brw->urb.vsize >= 2;
+}
 
 /* 3DSTATE_URB_VS
  * 3DSTATE_URB_HS
@@ -59,6 +71,9 @@ gen7_blorp_emit_urb_config(struct brw_context *brw)
    const unsigned vs_chunks =
       DIV_ROUND_UP(brw->urb.min_vs_entries * vs_size * 64, chunk_size_bytes);
 
+   if (gen7_blorp_skip_urb_config(brw))
+      return;
+
    gen7_emit_push_constant_state(brw,
                                  urb_size / 2 /* vs_size */,
                                  0 /* hs_size */,