diff options
author | Chris Forbes <[email protected]> | 2013-08-04 05:20:17 +1200 |
---|---|---|
committer | Chris Forbes <[email protected]> | 2013-08-16 07:24:55 +1200 |
commit | 265336e75a12e03be456b1a672532c7724c8d144 (patch) | |
tree | 2a239f6a802ff45f3f8124d5a16a67f6a464261d | |
parent | 3b738f5f85abc5dd0d1f735dc1a56fcf24308323 (diff) |
i965/clip: Track offset into the vertex for clipdistance
Signed-off-by: Chris Forbes <[email protected]>
Reviewed-by: Paul Berry <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_clip.h | 3 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_clip_tri.c | 9 |
2 files changed, 12 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_clip.h b/src/mesa/drivers/dri/i965/brw_clip.h index 2b02f85f6b0..1f6ef391d11 100644 --- a/src/mesa/drivers/dri/i965/brw_clip.h +++ b/src/mesa/drivers/dri/i965/brw_clip.h @@ -109,6 +109,9 @@ struct brw_clip_compile { * defined clipping plane. */ struct brw_reg vertex_src_mask; + + /* Offset into the vertex of the current plane's clipdistance value */ + struct brw_reg clipdistance_offset; } reg; /* Number of registers storing VUE data */ diff --git a/src/mesa/drivers/dri/i965/brw_clip_tri.c b/src/mesa/drivers/dri/i965/brw_clip_tri.c index 19179c1fc9d..dd750f5f90d 100644 --- a/src/mesa/drivers/dri/i965/brw_clip_tri.c +++ b/src/mesa/drivers/dri/i965/brw_clip_tri.c @@ -120,6 +120,7 @@ void brw_clip_tri_alloc_regs( struct brw_clip_compile *c, } c->reg.vertex_src_mask = retype(brw_vec1_grf(i, 0), BRW_REGISTER_TYPE_UD); + c->reg.clipdistance_offset = retype(brw_vec1_grf(i, 1), BRW_REGISTER_TYPE_W); i++; if (brw->gen == 5) { @@ -264,6 +265,9 @@ void brw_clip_tri( struct brw_clip_compile *c ) GLuint clipvert_offset = brw_clip_have_varying(c, VARYING_SLOT_CLIP_VERTEX) ? brw_varying_to_offset(&c->vue_map, VARYING_SLOT_CLIP_VERTEX) : hpos_offset; + GLint clipdist0_offset = c->key.nr_userclip + ? brw_varying_to_offset(&c->vue_map, VARYING_SLOT_CLIP_DIST0) + : 0; brw_MOV(p, get_addr_reg(vtxPrev), brw_address(c->reg.vertex[2]) ); brw_MOV(p, get_addr_reg(plane_ptr), brw_clip_plane0_address(c)); @@ -277,6 +281,10 @@ void brw_clip_tri( struct brw_clip_compile *c ) */ brw_MOV(p, c->reg.vertex_src_mask, brw_imm_ud(0xfc0)); + /* Set the initial clipdistance offset to be 6 floats before gl_ClipDistance[0]. + * We'll increment 6 times before we start hitting actual user clipping. */ + brw_MOV(p, c->reg.clipdistance_offset, brw_imm_d(clipdist0_offset - 6*sizeof(float))); + brw_DO(p, BRW_EXECUTE_1); { /* if (planemask & 1) @@ -432,6 +440,7 @@ void brw_clip_tri( struct brw_clip_compile *c ) brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ); brw_SHR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud(1)); brw_SHR(p, c->reg.vertex_src_mask, c->reg.vertex_src_mask, brw_imm_ud(1)); + brw_ADD(p, c->reg.clipdistance_offset, c->reg.clipdistance_offset, brw_imm_w(sizeof(float))); } brw_WHILE(p); } |