Dynamically allocate instruction store for tnl programs according to

requirements.
This commit is contained in:
Keith Whitwell 2006-09-05 10:01:24 +00:00
parent 74b2166ff8
commit d5cbb49c22
1 changed files with 21 additions and 15 deletions

View File

@ -242,7 +242,6 @@ static void make_state_key( GLcontext *ctx, struct state_key *key )
*/ */
#define PREFER_DP4 1 #define PREFER_DP4 1
#define BRW_TNL_MAX_INSN 256
/* Use uregs to represent registers internally, translate to Mesa's /* Use uregs to represent registers internally, translate to Mesa's
* expected formats on emit. * expected formats on emit.
@ -269,6 +268,7 @@ struct tnl_program {
const struct state_key *state; const struct state_key *state;
struct gl_vertex_program *program; struct gl_vertex_program *program;
GLuint nr_instructions;
GLuint temp_in_use; GLuint temp_in_use;
GLuint temp_reserved; GLuint temp_reserved;
@ -517,24 +517,28 @@ static void emit_op3fn(struct tnl_program *p,
GLuint line) GLuint line)
{ {
GLuint nr = p->program->Base.NumInstructions++; GLuint nr = p->program->Base.NumInstructions++;
struct prog_instruction *inst = &p->program->Base.Instructions[nr];
if (p->program->Base.NumInstructions > BRW_TNL_MAX_INSN) { if (nr >= p->nr_instructions) {
_mesa_problem(0, "Out of instructions in emit_op3fn\n"); p->program->Base.Instructions =
return; _mesa_realloc(p->program->Base.Instructions,
sizeof(struct prog_instruction) * p->nr_instructions,
sizeof(struct prog_instruction) * (p->nr_instructions *= 2));
} }
inst->Opcode = op; {
inst->StringPos = 0; struct prog_instruction *inst = &p->program->Base.Instructions[nr];
inst->Data = 0; inst->Opcode = op;
inst->StringPos = 0;
inst->Data = 0;
emit_arg( &inst->SrcReg[0], src0 ); emit_arg( &inst->SrcReg[0], src0 );
emit_arg( &inst->SrcReg[1], src1 ); emit_arg( &inst->SrcReg[1], src1 );
emit_arg( &inst->SrcReg[2], src2 ); emit_arg( &inst->SrcReg[2], src2 );
emit_dst( &inst->DstReg, dest, mask ); emit_dst( &inst->DstReg, dest, mask );
debug_insn(inst, fn, line); debug_insn(inst, fn, line);
}
} }
@ -1454,13 +1458,15 @@ static void build_new_tnl_program( const struct state_key *key,
p.eye_normal = undef; p.eye_normal = undef;
p.identity = undef; p.identity = undef;
p.temp_in_use = 0; p.temp_in_use = 0;
p.nr_instructions = 16;
if (max_temps >= sizeof(int) * 8) if (max_temps >= sizeof(int) * 8)
p.temp_reserved = 0; p.temp_reserved = 0;
else else
p.temp_reserved = ~((1<<max_temps)-1); p.temp_reserved = ~((1<<max_temps)-1);
p.program->Base.Instructions = MALLOC(sizeof(struct prog_instruction) * BRW_TNL_MAX_INSN); p.program->Base.Instructions =
_mesa_malloc(sizeof(struct prog_instruction) * p.nr_instructions);
p.program->Base.String = 0; p.program->Base.String = 0;
p.program->Base.NumInstructions = p.program->Base.NumInstructions =
p.program->Base.NumTemporaries = p.program->Base.NumTemporaries =