i965/fs: Add support for "if" statements in 16-wide mode on gen6+.
authorEric Anholt <eric@anholt.net>
Tue, 10 May 2011 19:55:12 +0000 (12:55 -0700)
committerEric Anholt <eric@anholt.net>
Wed, 18 May 2011 20:57:17 +0000 (13:57 -0700)
It turns out there's nothing in the hardware preventing this.  It
appears that it ought to work on pre-gen6 as well, but just produces
GPU hangs.

Improves glbenchmark Egypt framerate 4.4% +/- 0.3% (n=3), and Pro by
2.6% +/- 0.6% (n=3).

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_eu_emit.c
src/mesa/drivers/dri/i965/brw_fs.cpp

index 007f58c341c670bc9e37c71f59c5095f74401619..2d41302d15aa13ee409b2a2511d2e513d747dffa 100644 (file)
@@ -1003,7 +1003,11 @@ gen6_IF(struct brw_compile *p, uint32_t conditional,
    insn = next_insn(p, BRW_OPCODE_IF);
 
    brw_set_dest(p, insn, brw_imm_w(0));
-   insn->header.execution_size = BRW_EXECUTE_8;
+   if (p->compressed) {
+      insn->header.execution_size = BRW_EXECUTE_16;
+   } else {
+      insn->header.execution_size = BRW_EXECUTE_8;
+   }
    insn->bits1.branch_gen6.jump_count = 0;
    brw_set_src0(p, insn, src0);
    brw_set_src1(p, insn, src1);
index 018a16e432275930abf7367dcc0faca183b50a9e..5232a7f77afecda898f4742454b1e6da25d65a0f 100644 (file)
@@ -1859,7 +1859,7 @@ fs_visitor::visit(ir_if *ir)
 {
    fs_inst *inst;
 
-   if (c->dispatch_width == 16) {
+   if (intel->gen != 6 && c->dispatch_width == 16) {
       fail("Can't support (non-uniform) control flow on 16-wide\n");
    }
 
@@ -3872,7 +3872,7 @@ fs_visitor::generate_code()
            assert(intel->gen == 6);
            gen6_IF(p, inst->conditional_mod, src[0], src[1]);
         } else {
-           brw_IF(p, BRW_EXECUTE_8);
+           brw_IF(p, c->dispatch_width == 16 ? BRW_EXECUTE_16 : BRW_EXECUTE_8);
         }
         if_depth_in_loop[loop_stack_depth]++;
         break;