Mesa (master): i965/gs: Optimize away the EOT write on Gen8+ with static vertex count.

Kenneth Graunke kwg at kemper.freedesktop.org
Sat Sep 26 19:08:42 UTC 2015


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

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Fri Sep 25 08:21:57 2015 -0700

i965/gs: Optimize away the EOT write on Gen8+ with static vertex count.

With static vertex counts, the final EOT write doesn't actually write
any data - it's just there to end the thread.  Typically, the last
thing before ending the thread will be an EmitVertex() call, resulting
in a URB write.  We can just set EOT on that.

Note that this isn't always possible - there might be an intervening
SSBO write/image store, or the URB write may have been in a loop.

shader-db statistics for geometry shaders only:

total instructions in shared programs: 3173 -> 3149 (-0.76%)
instructions in affected programs:     176 -> 152 (-13.64%)
helped:                                8

Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
Reviewed-by: Matt Turner <mattst88 at gmail.com>

---

 src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp |   15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp
index acf0501..d2edc57 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp
@@ -236,6 +236,21 @@ vec4_gs_visitor::emit_thread_end()
 
    bool static_vertex_count = c->prog_data.static_vertex_count != -1;
 
+   /* If the previous instruction was a URB write, we don't need to issue
+    * a second one - we can just set the EOT bit on the previous write.
+    *
+    * Skip this on Gen8+ unless there's a static vertex count, as we also
+    * need to write the vertex count out, and combining the two may not be
+    * possible (or at least not straightforward).
+    */
+   vec4_instruction *last = (vec4_instruction *) instructions.get_tail();
+   if (last && last->opcode == GS_OPCODE_URB_WRITE &&
+       !(INTEL_DEBUG & DEBUG_SHADER_TIME) &&
+       devinfo->gen >= 8 && static_vertex_count) {
+      last->urb_write_flags = BRW_URB_WRITE_EOT | last->urb_write_flags;
+      return;
+   }
+
    current_annotation = "thread end";
    dst_reg mrf_reg(MRF, base_mrf);
    src_reg r0(retype(brw_vec8_grf(0, 0), BRW_REGISTER_TYPE_UD));




More information about the mesa-commit mailing list