diff options
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vs_emit.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_vs_emit.c b/src/mesa/drivers/dri/i965/brw_vs_emit.c index fa94d5b1a8..7dc6f9bf93 100644 --- a/src/mesa/drivers/dri/i965/brw_vs_emit.c +++ b/src/mesa/drivers/dri/i965/brw_vs_emit.c @@ -137,7 +137,7 @@ static void brw_vs_alloc_regs( struct brw_vs_compile *c ) for (i = 0; i < 128; i++) { if (c->output_regs[i].used_in_src) { - c->regs[PROGRAM_OUTPUT][i] = brw_vec8_grf(reg, 0); + c->output_regs[i].reg = brw_vec8_grf(reg, 0); reg++; } } @@ -958,6 +958,9 @@ void brw_vs_emit(struct brw_vs_compile *c ) struct brw_instruction *if_inst[MAX_IFSN]; struct brw_indirect stack_index = brw_indirect(0, 0); + GLuint index; + GLuint file; + if (INTEL_DEBUG & DEBUG_VS) { _mesa_printf("\n\n\nvs-emit:\n"); _mesa_print_program(&c->vp->program.Base); @@ -998,8 +1001,8 @@ void brw_vs_emit(struct brw_vs_compile *c ) if (inst->Opcode != OPCODE_SWZ) for (i = 0; i < 3; i++) { struct prog_src_register *src = &inst->SrcReg[i]; - GLuint index = src->Index; - GLuint file = src->File; + index = src->Index; + file = src->File; if (file == PROGRAM_OUTPUT&&c->output_regs[index].used_in_src) args[i] = c->output_regs[index].reg; else @@ -1009,8 +1012,13 @@ void brw_vs_emit(struct brw_vs_compile *c ) /* Get dest regs. Note that it is possible for a reg to be both * dst and arg, given the static allocation of registers. So * care needs to be taken emitting multi-operation instructions. - */ - dst = get_dst(c, inst->DstReg); + */ + index = inst->DstReg.Index; + file = inst->DstReg.File; + if (file == PROGRAM_OUTPUT && c->output_regs[index].used_in_src) + dst = c->output_regs[index].reg; + else + dst = get_dst(c, inst->DstReg); switch (inst->Opcode) { case OPCODE_ABS: @@ -1157,7 +1165,7 @@ void brw_vs_emit(struct brw_vs_compile *c ) if (inst->DstReg.File == PROGRAM_OUTPUT &&inst->DstReg.Index != VERT_RESULT_HPOS &&c->output_regs[inst->DstReg.Index].used_in_src) - brw_MOV(p, get_dst(c, inst->DstReg), dst); + brw_MOV(p, dst, c->output_regs[inst->DstReg.Index].reg); release_tmps(c); } |