diff options
Diffstat (limited to 'src/mesa/drivers/dri/r300')
-rw-r--r-- | src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c b/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c index 8c3177f1f2..e9fb49e7c1 100644 --- a/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c +++ b/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c @@ -475,18 +475,20 @@ static void translate_vertex_program(struct radeon_compiler *c, void *user) compiler->code->pos_end = 0; /* Not supported yet */ compiler->code->length = 0; + compiler->code->num_temporaries = 0; compiler->SetHwInputOutput(compiler); for(rci = compiler->Base.Program.Instructions.Next; rci != &compiler->Base.Program.Instructions; rci = rci->Next) { struct rc_sub_instruction *vpi = &rci->U.I; unsigned int *inst = compiler->code->body.d + compiler->code->length; + const struct rc_opcode_info *info = rc_get_opcode_info(vpi->Opcode); /* Skip instructions writing to non-existing destination */ if (!valid_dst(compiler->code, &vpi->DstReg)) continue; - if (rc_get_opcode_info(vpi->Opcode)->HasDstReg) { + if (info->HasDstReg) { /* Relative addressing of destination operands is not supported yet. */ if (vpi->DstReg.RelAddr) { rc_error(&compiler->Base, "Vertex program does not support relative " @@ -608,7 +610,7 @@ static void translate_vertex_program(struct radeon_compiler *c, void *user) } default: - rc_error(&compiler->Base, "Unknown opcode %s\n", rc_get_opcode_info(vpi->Opcode)->Name); + rc_error(&compiler->Base, "Unknown opcode %s\n", info->Name); return; } @@ -625,6 +627,25 @@ static void translate_vertex_program(struct radeon_compiler *c, void *user) << PVS_DST_PRED_SENSE_SHIFT); } + /* Update the number of temporaries. */ + if (info->HasDstReg && vpi->DstReg.File == RC_FILE_TEMPORARY && + vpi->DstReg.Index >= compiler->code->num_temporaries) + compiler->code->num_temporaries = vpi->DstReg.Index + 1; + + for (unsigned i = 0; i < info->NumSrcRegs; i++) + if (vpi->SrcReg[i].File == RC_FILE_TEMPORARY && + vpi->SrcReg[i].Index >= compiler->code->num_temporaries) + compiler->code->num_temporaries = vpi->SrcReg[i].Index + 1; + + if (compiler->PredicateMask) + if (compiler->PredicateIndex >= compiler->code->num_temporaries) + compiler->code->num_temporaries = compiler->PredicateIndex + 1; + + if (compiler->code->num_temporaries > compiler->Base.max_temp_regs) { + rc_error(&compiler->Base, "Too many temporaries.\n"); + return; + } + compiler->code->length += 4; if (compiler->Base.Error) @@ -668,7 +689,6 @@ static void allocate_temporary_registers(struct radeon_compiler *c, void *user) } } } - compiler->code->num_temporaries = num_orig_temps; /* Pass 2: If there is relative addressing of temporaries, we cannot change register indices. Give up. */ for (inst = compiler->Base.Program.Instructions.Next; inst != &compiler->Base.Program.Instructions; inst = inst->Next) { @@ -686,7 +706,6 @@ static void allocate_temporary_registers(struct radeon_compiler *c, void *user) } } - compiler->code->num_temporaries = 0; ta = (struct temporary_allocation*)memory_pool_malloc(&compiler->Base.Pool, sizeof(struct temporary_allocation) * num_orig_temps); memset(ta, 0, sizeof(struct temporary_allocation) * num_orig_temps); @@ -755,9 +774,6 @@ static void allocate_temporary_registers(struct radeon_compiler *c, void *user) ta[orig].Allocated = 1; ta[orig].HwTemp = j; hwtemps[j] = 1; - - if (j >= compiler->code->num_temporaries) - compiler->code->num_temporaries = j + 1; } } |