i965: allocate GRF registers before building subroutines,
it ensures there are sufficient registers for all subroutines.
This commit is contained in:
parent
e3a1ae0fcb
commit
4cca760a9b
|
@ -87,18 +87,18 @@ 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;
|
||||
if (key->do_point_sprite)
|
||||
brw_emit_point_sprite_setup( &c );
|
||||
brw_emit_point_sprite_setup( &c, GL_TRUE );
|
||||
else
|
||||
brw_emit_point_setup( &c );
|
||||
brw_emit_point_setup( &c, GL_TRUE );
|
||||
break;
|
||||
case SF_UNFILLED_TRIS:
|
||||
c.nr_verts = 3;
|
||||
|
|
|
@ -103,10 +103,10 @@ 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_point_sprite_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_point_sprite_setup( struct brw_sf_compile *c, GLboolean allocate );
|
||||
void brw_emit_anyprim_setup( struct brw_sf_compile *c );
|
||||
|
||||
#endif
|
||||
|
|
|
@ -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,13 +503,16 @@ void brw_emit_line_setup( struct brw_sf_compile *c )
|
|||
}
|
||||
}
|
||||
|
||||
void brw_emit_point_sprite_setup( struct brw_sf_compile *c )
|
||||
void brw_emit_point_sprite_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);
|
||||
for (i = 0; i < c->nr_setup_regs; i++)
|
||||
{
|
||||
|
@ -581,13 +590,16 @@ void brw_emit_point_sprite_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 */
|
||||
|
@ -648,6 +660,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);
|
||||
|
@ -667,7 +680,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
|
||||
|
@ -688,7 +701,7 @@ 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 */
|
||||
|
@ -701,13 +714,13 @@ void brw_emit_anyprim_setup( struct brw_sf_compile *c )
|
|||
{
|
||||
saveflag = p->flag_value;
|
||||
brw_push_insn_state(p);
|
||||
brw_emit_point_sprite_setup( c );
|
||||
brw_emit_point_sprite_setup( c, GL_FALSE );
|
||||
brw_pop_insn_state(p);
|
||||
p->flag_value = saveflag;
|
||||
}
|
||||
brw_land_fwd_jump(p, jmp);
|
||||
|
||||
brw_emit_point_setup( c );
|
||||
brw_emit_point_setup( c, GL_FALSE );
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue