i965: allocate GRF registers before building subroutines,

it ensures there are sufficient registers for all subroutines.
This commit is contained in:
Xiang, Haihao 2007-12-19 10:44:00 +08:00
parent 41ed6be1da
commit f9e70d951a
3 changed files with 25 additions and 16 deletions

View file

@ -82,15 +82,15 @@ static void compile_sf_prog( struct brw_context *brw,
switch (key->primitive) {
case SF_TRIANGLES:
c.nr_verts = 3;
brw_emit_tri_setup( &c );
brw_emit_tri_setup( &c, GL_TRUE );
break;
case SF_LINES:
c.nr_verts = 2;
brw_emit_line_setup( &c );
brw_emit_line_setup( &c, GL_TRUE );
break;
case SF_POINTS:
c.nr_verts = 1;
brw_emit_point_setup( &c );
brw_emit_point_setup( &c, GL_TRUE );
break;
case SF_UNFILLED_TRIS:
c.nr_verts = 3;

View file

@ -97,9 +97,9 @@ struct brw_sf_compile {
};
void brw_emit_tri_setup( struct brw_sf_compile *c );
void brw_emit_line_setup( struct brw_sf_compile *c );
void brw_emit_point_setup( struct brw_sf_compile *c );
void brw_emit_tri_setup( struct brw_sf_compile *c, GLboolean allocate );
void brw_emit_line_setup( struct brw_sf_compile *c, GLboolean allocate );
void brw_emit_point_setup( struct brw_sf_compile *c, GLboolean allocate );
void brw_emit_anyprim_setup( struct brw_sf_compile *c );
#endif

View file

@ -343,13 +343,16 @@ static GLboolean calculate_masks( struct brw_sf_compile *c,
void brw_emit_tri_setup( struct brw_sf_compile *c )
void brw_emit_tri_setup( struct brw_sf_compile *c, GLboolean allocate)
{
struct brw_compile *p = &c->func;
GLuint i;
c->nr_verts = 3;
alloc_regs(c);
if (allocate)
alloc_regs(c);
invert_det(c);
copy_z_inv_w(c);
@ -428,14 +431,17 @@ void brw_emit_tri_setup( struct brw_sf_compile *c )
void brw_emit_line_setup( struct brw_sf_compile *c )
void brw_emit_line_setup( struct brw_sf_compile *c, GLboolean allocate)
{
struct brw_compile *p = &c->func;
GLuint i;
c->nr_verts = 2;
alloc_regs(c);
if (allocate)
alloc_regs(c);
invert_det(c);
copy_z_inv_w(c);
@ -497,17 +503,19 @@ void brw_emit_line_setup( struct brw_sf_compile *c )
}
}
/* Points setup - several simplifications as all attributes are
* constant across the face of the point (point sprites excluded!)
*/
void brw_emit_point_setup( struct brw_sf_compile *c )
void brw_emit_point_setup( struct brw_sf_compile *c, GLboolean allocate)
{
struct brw_compile *p = &c->func;
GLuint i;
c->nr_verts = 1;
alloc_regs(c);
if (allocate)
alloc_regs(c);
copy_z_inv_w(c);
brw_MOV(p, c->m1Cx, brw_imm_ud(0)); /* zero - move out of loop */
@ -567,6 +575,7 @@ void brw_emit_anyprim_setup( struct brw_sf_compile *c )
GLuint saveflag;
c->nr_verts = 3;
alloc_regs(c);
primmask = retype(get_element(c->tmp, 0), BRW_REGISTER_TYPE_UD);
@ -586,7 +595,7 @@ void brw_emit_anyprim_setup( struct brw_sf_compile *c )
{
saveflag = p->flag_value;
brw_push_insn_state(p);
brw_emit_tri_setup( c );
brw_emit_tri_setup( c, GL_FALSE );
brw_pop_insn_state(p);
p->flag_value = saveflag;
/* note - thread killed in subroutine, so must
@ -607,14 +616,14 @@ void brw_emit_anyprim_setup( struct brw_sf_compile *c )
{
saveflag = p->flag_value;
brw_push_insn_state(p);
brw_emit_line_setup( c );
brw_emit_line_setup( c, GL_FALSE );
brw_pop_insn_state(p);
p->flag_value = saveflag;
/* note - thread killed in subroutine */
}
brw_land_fwd_jump(p, jmp);
brw_emit_point_setup( c );
brw_emit_point_setup( c, GL_FALSE );
}