summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2012-12-12 18:01:00 -0800
committerKenneth Graunke <[email protected]>2014-06-10 16:38:26 -0700
commit000f4a33c0359ed6b3c11aafa5f0cba1d6d91fea (patch)
tree01a476583e5e148d18b17b737c8396708098b5f3 /src/mesa
parent3a439534de6d5331c1ec436d23a1a909f87c4660 (diff)
i965: Don't set the "switch" flag on control flow instructions on Gen6+.
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 <[email protected]> Reviewed-by: Matt Turner <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/drivers/dri/i965/brw_eu_emit.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c b/src/mesa/drivers/dri/i965/brw_eu_emit.c
index 06baebf606b..6b2117d2600 100644
--- a/src/mesa/drivers/dri/i965/brw_eu_emit.c
+++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c
@@ -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) {