Soon the dp4 is only going to be used for fixed clip planes. Signed-off-by: Chris Forbes <chr...@ijw.co.nz> --- src/mesa/drivers/dri/i965/brw_clip_tri.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_clip_tri.c b/src/mesa/drivers/dri/i965/brw_clip_tri.c index daa7a5f..bd3ffb3 100644 --- a/src/mesa/drivers/dri/i965/brw_clip_tri.c +++ b/src/mesa/drivers/dri/i965/brw_clip_tri.c @@ -224,17 +224,19 @@ void brw_clip_tri_flat_shade( struct brw_clip_compile *c ) static inline void -load_vertex_pos(struct brw_clip_compile *c, struct brw_indirect vtx, - struct brw_reg dst, - GLuint hpos_offset, GLuint clip_offset) +load_clip_distance(struct brw_clip_compile *c, struct brw_indirect vtx, + struct brw_reg dst, GLuint hpos_offset, GLuint clip_offset, + int cond) { struct brw_compile *p = &c->func; /* * Roughly: * dst = (vertex_src_mask & 1) ? src.hpos : src.clipvertex; + * dst = dp4(dst, plane) + set f0 based on `cond` */ + dst = vec4(dst); brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ); brw_AND(p, vec1(brw_null_reg()), c->reg.vertex_src_mask, brw_imm_ud(1)); brw_IF(p, BRW_EXECUTE_1); @@ -246,6 +248,9 @@ load_vertex_pos(struct brw_clip_compile *c, struct brw_indirect vtx, brw_MOV(p, dst, deref_4f(vtx, hpos_offset)); } brw_ENDIF(p); + + brw_set_conditionalmod(p, cond); + brw_DP4(p, dst, dst, c->reg.plane_equation); } @@ -313,17 +318,15 @@ void brw_clip_tri( struct brw_clip_compile *c ) */ brw_MOV(p, get_addr_reg(vtx), deref_1uw(inlist_ptr, 0)); - load_vertex_pos(c, vtxPrev, vec4(c->reg.dpPrev), hpos_offset, clipvert_offset); + load_clip_distance(c, vtxPrev, c->reg.dpPrev, hpos_offset, clipvert_offset, + BRW_CONDITIONAL_L); /* IS_NEGATIVE(prev) */ - brw_set_conditionalmod(p, BRW_CONDITIONAL_L); - brw_DP4(p, vec4(c->reg.dpPrev), vec4(c->reg.dpPrev), c->reg.plane_equation); brw_IF(p, BRW_EXECUTE_1); { - load_vertex_pos(c, vtx, vec4(c->reg.dp), hpos_offset, clipvert_offset); + load_clip_distance(c, vtx, c->reg.dp, hpos_offset, clipvert_offset, + BRW_CONDITIONAL_GE); /* IS_POSITIVE(next) */ - brw_set_conditionalmod(p, BRW_CONDITIONAL_GE); - brw_DP4(p, vec4(c->reg.dp), vec4(c->reg.dp), c->reg.plane_equation); brw_IF(p, BRW_EXECUTE_1); { @@ -362,11 +365,10 @@ void brw_clip_tri( struct brw_clip_compile *c ) brw_ADD(p, get_addr_reg(outlist_ptr), get_addr_reg(outlist_ptr), brw_imm_uw(sizeof(short))); brw_ADD(p, c->reg.nr_verts, c->reg.nr_verts, brw_imm_ud(1)); - load_vertex_pos(c, vtx, vec4(c->reg.dp), hpos_offset, clipvert_offset); + load_clip_distance(c, vtx, c->reg.dp, hpos_offset, clipvert_offset, + BRW_CONDITIONAL_L); /* IS_NEGATIVE(next) */ - brw_set_conditionalmod(p, BRW_CONDITIONAL_L); - brw_DP4(p, vec4(c->reg.dp), vec4(c->reg.dp), c->reg.plane_equation); brw_IF(p, BRW_EXECUTE_1); { /* Going out of bounds. Avoid division by zero as we -- 1.8.3.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev