i965: Don't set the "switch" flag on control flow instructions on Gen6+.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 13 Dec 2012 02:01:00 +0000 (18:01 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 10 Jun 2014 23:38:26 +0000 (16:38 -0700)
Thread switching on control flow instructions is a documented workaround
for Gen4-5 errata.  As far as I can tell, it hasn't been needed since
Sandybridge.  Thread switching is not free, so in theory this may help
performance slightly.

Flow control instructions with the "switch" flag cannot be compacted, so
removing it will make these instructions compactable.  (Of course, we
still have to implement compaction for flow control instructions...)

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/mesa/drivers/dri/i965/brw_eu_emit.c

index 06baebf606b621c252bc2611eebade33c9b3e8c6..6b2117d260003d04e03b8b59b0ca46eed84b8e03 100644 (file)
@@ -1267,7 +1267,7 @@ brw_IF(struct brw_compile *p, unsigned execute_size)
    insn->header.compression_control = BRW_COMPRESSION_NONE;
    insn->header.predicate_control = BRW_PREDICATE_NORMAL;
    insn->header.mask_control = BRW_MASK_ENABLE;
-   if (!p->single_program_flow)
+   if (!p->single_program_flow && brw->gen < 6)
       insn->header.thread_control = BRW_THREAD_SWITCH;
 
    push_if_stack(p, insn);
@@ -1300,9 +1300,6 @@ gen6_IF(struct brw_compile *p, uint32_t conditional,
    assert(insn->header.predicate_control == BRW_PREDICATE_NONE);
    insn->header.destreg__conditionalmod = conditional;
 
-   if (!p->single_program_flow)
-      insn->header.thread_control = BRW_THREAD_SWITCH;
-
    push_if_stack(p, insn);
    return insn;
 }
@@ -1464,7 +1461,7 @@ brw_ELSE(struct brw_compile *p)
 
    insn->header.compression_control = BRW_COMPRESSION_NONE;
    insn->header.mask_control = BRW_MASK_ENABLE;
-   if (!p->single_program_flow)
+   if (!p->single_program_flow && brw->gen < 6)
       insn->header.thread_control = BRW_THREAD_SWITCH;
 
    push_if_stack(p, insn);
@@ -1534,7 +1531,8 @@ brw_ENDIF(struct brw_compile *p)
 
    insn->header.compression_control = BRW_COMPRESSION_NONE;
    insn->header.mask_control = BRW_MASK_ENABLE;
-   insn->header.thread_control = BRW_THREAD_SWITCH;
+   if (brw->gen < 6)
+      insn->header.thread_control = BRW_THREAD_SWITCH;
 
    /* Also pop item off the stack in the endif instruction: */
    if (brw->gen < 6) {