i965/clip: Track offset into the vertex for clipdistance
authorChris Forbes <chrisf@ijw.co.nz>
Sat, 3 Aug 2013 17:20:17 +0000 (05:20 +1200)
committerChris Forbes <chrisf@ijw.co.nz>
Thu, 15 Aug 2013 19:24:55 +0000 (07:24 +1200)
Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Paul Berry <stereotype441@gmail.com>
src/mesa/drivers/dri/i965/brw_clip.h
src/mesa/drivers/dri/i965/brw_clip_tri.c

index 2b02f85f6b0ee78693a23f64c57157ae30903846..1f6ef391d117f2e012b1465b3d93eb9287c8b385 100644 (file)
@@ -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 */
index 19179c1fc9d7b51f7d800c0eb4a0ebbbde457cfa..dd750f5f90d7a33ed9d8301a9fd3b02b7a883176 100644 (file)
@@ -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);
 }