i965/vs: Add a function for how many MRFs get written as part of a SEND.
[mesa.git] / src / mesa / drivers / dri / i965 / brw_clip_unfilled.c
index e761980284c7cf30ce2ab04f6617cd4b0d754242..6ddb2d57890f4ba69da34ecd9ac84084e57c49af 100644 (file)
@@ -52,9 +52,11 @@ static void compute_tri_direction( struct brw_clip_compile *c )
    struct brw_compile *p = &c->func;
    struct brw_reg e = c->reg.tmp0;
    struct brw_reg f = c->reg.tmp1;
-   struct brw_reg v0 = byte_offset(c->reg.vertex[0], c->offset[VERT_RESULT_HPOS]); 
-   struct brw_reg v1 = byte_offset(c->reg.vertex[1], c->offset[VERT_RESULT_HPOS]); 
-   struct brw_reg v2 = byte_offset(c->reg.vertex[2], c->offset[VERT_RESULT_HPOS]); 
+   GLuint hpos_offset = brw_vert_result_to_offset(&c->vue_map,
+                                                  VERT_RESULT_HPOS);
+   struct brw_reg v0 = byte_offset(c->reg.vertex[0], hpos_offset);
+   struct brw_reg v1 = byte_offset(c->reg.vertex[1], hpos_offset);
+   struct brw_reg v2 = byte_offset(c->reg.vertex[2], hpos_offset);
 
 
    struct brw_reg v0n = get_tmp(c);
@@ -128,8 +130,10 @@ static void copy_bfc( struct brw_clip_compile *c )
 
    /* Do we have any colors to copy? 
     */
-   if (!(c->offset[VERT_RESULT_COL0] && c->offset[VERT_RESULT_BFC0]) &&
-       !(c->offset[VERT_RESULT_COL1] && c->offset[VERT_RESULT_BFC1]))
+   if (!(brw_clip_have_vert_result(c, VERT_RESULT_COL0) &&
+         brw_clip_have_vert_result(c, VERT_RESULT_BFC0)) &&
+       !(brw_clip_have_vert_result(c, VERT_RESULT_COL1) &&
+         brw_clip_have_vert_result(c, VERT_RESULT_BFC1)))
       return;
 
    /* In some wierd degnerate cases we can end up testing the
@@ -152,15 +156,25 @@ static void copy_bfc( struct brw_clip_compile *c )
       GLuint i;
 
       for (i = 0; i < 3; i++) {
-        if (c->offset[VERT_RESULT_COL0] && c->offset[VERT_RESULT_BFC0])
+        if (brw_clip_have_vert_result(c, VERT_RESULT_COL0) &&
+             brw_clip_have_vert_result(c, VERT_RESULT_BFC0))
            brw_MOV(p, 
-                   byte_offset(c->reg.vertex[i], c->offset[VERT_RESULT_COL0]),
-                   byte_offset(c->reg.vertex[i], c->offset[VERT_RESULT_BFC0]));
-
-        if (c->offset[VERT_RESULT_COL1] && c->offset[VERT_RESULT_BFC1])
+                   byte_offset(c->reg.vertex[i],
+                                brw_vert_result_to_offset(&c->vue_map,
+                                                          VERT_RESULT_COL0)),
+                   byte_offset(c->reg.vertex[i],
+                                brw_vert_result_to_offset(&c->vue_map,
+                                                          VERT_RESULT_BFC0)));
+
+        if (brw_clip_have_vert_result(c, VERT_RESULT_COL1) &&
+             brw_clip_have_vert_result(c, VERT_RESULT_BFC1))
            brw_MOV(p, 
-                   byte_offset(c->reg.vertex[i], c->offset[VERT_RESULT_COL1]),
-                   byte_offset(c->reg.vertex[i], c->offset[VERT_RESULT_BFC1]));
+                   byte_offset(c->reg.vertex[i],
+                                brw_vert_result_to_offset(&c->vue_map,
+                                                          VERT_RESULT_COL1)),
+                   byte_offset(c->reg.vertex[i],
+                                brw_vert_result_to_offset(&c->vue_map,
+                                                          VERT_RESULT_BFC1)));
       }
    }
    brw_ENDIF(p);
@@ -219,12 +233,18 @@ static void merge_edgeflags( struct brw_clip_compile *c )
    {   
       brw_set_conditionalmod(p, BRW_CONDITIONAL_EQ);
       brw_AND(p, vec1(brw_null_reg()), get_element_ud(c->reg.R0, 2), brw_imm_ud(1<<8));
-      brw_MOV(p, byte_offset(c->reg.vertex[0], c->offset[VERT_RESULT_EDGE]), brw_imm_f(0));
+      brw_MOV(p, byte_offset(c->reg.vertex[0],
+                             brw_vert_result_to_offset(&c->vue_map,
+                                                       VERT_RESULT_EDGE)),
+              brw_imm_f(0));
       brw_set_predicate_control(p, BRW_PREDICATE_NONE);
 
       brw_set_conditionalmod(p, BRW_CONDITIONAL_EQ);
       brw_AND(p, vec1(brw_null_reg()), get_element_ud(c->reg.R0, 2), brw_imm_ud(1<<9));
-      brw_MOV(p, byte_offset(c->reg.vertex[2], c->offset[VERT_RESULT_EDGE]), brw_imm_f(0));
+      brw_MOV(p, byte_offset(c->reg.vertex[2],
+                             brw_vert_result_to_offset(&c->vue_map,
+                                                       VERT_RESULT_EDGE)),
+              brw_imm_f(0));
       brw_set_predicate_control(p, BRW_PREDICATE_NONE);
    }
    brw_ENDIF(p);
@@ -236,7 +256,9 @@ static void apply_one_offset( struct brw_clip_compile *c,
                          struct brw_indirect vert )
 {
    struct brw_compile *p = &c->func;
-   struct brw_reg z = deref_1f(vert, c->header_position_offset +
+   GLuint ndc_offset = brw_vert_result_to_offset(&c->vue_map,
+                                                 BRW_VERT_RESULT_NDC);
+   struct brw_reg z = deref_1f(vert, ndc_offset +
                               2 * type_sz(BRW_REGISTER_TYPE_F));
 
    brw_ADD(p, z, z, vec1(c->reg.offset));
@@ -294,7 +316,8 @@ static void emit_lines(struct brw_clip_compile *c,
       /* draw edge if edgeflag != 0 */
       brw_CMP(p, 
              vec1(brw_null_reg()), BRW_CONDITIONAL_NZ, 
-             deref_1f(v0, c->offset[VERT_RESULT_EDGE]),
+             deref_1f(v0, brw_vert_result_to_offset(&c->vue_map,
+                                                     VERT_RESULT_EDGE)),
              brw_imm_f(0));
       brw_IF(p, BRW_EXECUTE_1);
       {
@@ -332,7 +355,8 @@ static void emit_points(struct brw_clip_compile *c,
        */
       brw_CMP(p, 
              vec1(brw_null_reg()), BRW_CONDITIONAL_NZ, 
-             deref_1f(v0, c->offset[VERT_RESULT_EDGE]),
+             deref_1f(v0, brw_vert_result_to_offset(&c->vue_map,
+                                                     VERT_RESULT_EDGE)),
              brw_imm_f(0));
       brw_IF(p, BRW_EXECUTE_1);
       {
@@ -445,7 +469,7 @@ void brw_emit_unfilled_clip( struct brw_clip_compile *c )
    brw_clip_tri_init_vertices(c);
    brw_clip_init_ff_sync(c);
 
-   assert(c->offset[VERT_RESULT_EDGE]);
+   assert(brw_clip_have_vert_result(c, VERT_RESULT_EDGE));
 
    if (c->key.fill_ccw == CLIP_CULL &&
        c->key.fill_cw == CLIP_CULL) {