diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_eu.h | 2 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_eu_emit.c | 24 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs.cpp | 6 | 
3 files changed, 28 insertions, 4 deletions
| diff --git a/src/mesa/drivers/dri/i965/brw_eu.h b/src/mesa/drivers/dri/i965/brw_eu.h index df5ce56ba6..a4904b7098 100644 --- a/src/mesa/drivers/dri/i965/brw_eu.h +++ b/src/mesa/drivers/dri/i965/brw_eu.h @@ -954,6 +954,8 @@ struct brw_instruction *brw_WHILE(struct brw_compile *p,  	       struct brw_instruction *patch_insn);  struct brw_instruction *brw_BREAK(struct brw_compile *p, int pop_count); +struct brw_instruction *brw_CONT_gen6(struct brw_compile *p, +				      struct brw_instruction *do_insn);  struct brw_instruction *brw_CONT(struct brw_compile *p, int pop_count);  /* Forward jumps:   */ diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c b/src/mesa/drivers/dri/i965/brw_eu_emit.c index 7eb7bdfa1e..945f50d110 100644 --- a/src/mesa/drivers/dri/i965/brw_eu_emit.c +++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c @@ -1050,6 +1050,26 @@ struct brw_instruction *brw_BREAK(struct brw_compile *p, int pop_count)     return insn;  } +struct brw_instruction *brw_CONT_gen6(struct brw_compile *p, +				      struct brw_instruction *do_insn) +{ +   struct brw_instruction *insn; +   int br = 2; + +   insn = next_insn(p, BRW_OPCODE_CONTINUE); +   brw_set_dest(insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D)); +   brw_set_src0(insn, retype(brw_null_reg(), BRW_REGISTER_TYPE_D)); +   brw_set_dest(insn, brw_ip_reg()); +   brw_set_src0(insn, brw_ip_reg()); +   brw_set_src1(insn, brw_imm_d(0x0)); + +   insn->bits3.break_cont.uip = br * (do_insn - insn); + +   insn->header.compression_control = BRW_COMPRESSION_NONE; +   insn->header.execution_size = BRW_EXECUTE_8; +   return insn; +} +  struct brw_instruction *brw_CONT(struct brw_compile *p, int pop_count)  {     struct brw_instruction *insn; @@ -2087,7 +2107,9 @@ brw_set_uip_jip(struct brw_compile *p)  	 /* JIP is set at CONTINUE emit time, since that's when we  	  * know where the start of the loop is.  	  */ -	 insn->bits3.break_cont.uip = br * (brw_find_next_block_end(p, ip) - ip); +	 insn->bits3.break_cont.jip = br * (brw_find_next_block_end(p, ip) - ip); +	 assert(insn->bits3.break_cont.uip != 0); +	 assert(insn->bits3.break_cont.jip != 0);  	 break;        }     } diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 46061c77ed..ee9ae160bd 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -3390,9 +3390,9 @@ fs_visitor::generate_code()        case BRW_OPCODE_CONTINUE:  	 /* FINISHME: We need to write the loop instruction support still. */  	 if (intel->gen >= 6) -	    this->fail = true; - -	 brw_CONT(p, if_depth_in_loop[loop_stack_depth]); +	    brw_CONT_gen6(p, loop_stack[loop_stack_depth - 1]); +	 else +	    brw_CONT(p, if_depth_in_loop[loop_stack_depth]);  	 brw_set_predicate_control(p, BRW_PREDICATE_NONE);  	 break; | 
