mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 04:58:05 +02:00
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@whitecape.org> Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
parent
08fe5799e6
commit
d6a41b5f70
1 changed files with 15 additions and 0 deletions
|
|
@ -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));
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue