On 17 July 2012 05:50, Paul Berry <span dir="ltr"><<a href="mailto:stereotype441@gmail.com" target="_blank">stereotype441@gmail.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5">On 30 June 2012 11:50, Olivier Galibert <span dir="ltr"><<a href="mailto:galibert@pobox.com" target="_blank">galibert@pobox.com</a>></span> wrote:<br></div></div><div class="gmail_quote">
<div><div class="h5"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
This patch also correct a couple of problems with noperspective<br>
interpolation.<br>
<br>
At that point all the glsl 1.1/1.3 interpolation tests that do not<br>
clip pass (the -none ones).<br>
<br>
The fs code does not use the pre-resolved interpolation modes in order<br>
not to mess with gen6+.  Sharing the resolution would require putting<br>
brw_wm_prog before brw_clip_prog and brw_sf_prog.  This may be a good<br>
thing, but it could have unexpected consequences, so it's better be<br>
done independently in any case.<br>
<br>
Signed-off-by: Olivier Galibert <<a href="mailto:galibert@pobox.com" target="_blank">galibert@pobox.com</a>><br>
---<br>
 src/mesa/drivers/dri/i965/brw_fs.cpp         |    2 +-<br>
 src/mesa/drivers/dri/i965/brw_fs_visitor.cpp |    5 +<br>
 src/mesa/drivers/dri/i965/brw_sf.c           |    9 +-<br>
 src/mesa/drivers/dri/i965/brw_sf.h           |    2 +-<br>
 src/mesa/drivers/dri/i965/brw_sf_emit.c      |  164 +++++++++++++-------------<br>
 5 files changed, 95 insertions(+), 87 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
index 710f2ff..b142f2b 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
@@ -506,7 +506,7 @@ fs_visitor::emit_general_interpolation(ir_variable *ir)<br>
                  struct brw_reg interp = interp_reg(location, k);<br>
                   emit_linterp(attr, fs_reg(interp), interpolation_mode,<br>
                                ir->centroid);<br>
-                 if (intel->gen < 6) {<br>
+                 if (intel->gen < 6 && interpolation_mode == INTERP_QUALIFIER_SMOOTH) {<br>
                     emit(BRW_OPCODE_MUL, attr, attr, this->pixel_w);<br>
                  }<br>
               }<br>
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp<br>
index 9bd1e67..ab83a95 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp<br>
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp<br>
@@ -1924,6 +1924,11 @@ fs_visitor::emit_interpolation_setup_gen4()<br>
    emit(BRW_OPCODE_ADD, this->delta_y[BRW_WM_PERSPECTIVE_PIXEL_BARYCENTRIC],<br>
        this->pixel_y, fs_reg(negate(brw_vec1_grf(1, 1))));<br>
<br>
+   this->delta_x[BRW_WM_NONPERSPECTIVE_PIXEL_BARYCENTRIC] =<br>
+     this->delta_x[BRW_WM_PERSPECTIVE_PIXEL_BARYCENTRIC];<br>
+   this->delta_y[BRW_WM_NONPERSPECTIVE_PIXEL_BARYCENTRIC] =<br>
+     this->delta_y[BRW_WM_PERSPECTIVE_PIXEL_BARYCENTRIC];<br>
+<br></blockquote></div></div><div><br>Can we add a comment explaining why this is correct?  Something like this maybe:<br><br>"On Gen4-5, we accomplish perspective-correct interpolation by dividing the attribute values by w in the vertex shader, interpolating the result linearly in screen space, and then multiplying by w in the fragment shader.  So the interpolation step is always linear in screen space, regardless of whether the attribute is perspective or non-perspective.  Accordingly, we use the same delta_x and delta_y values for both kinds of interpolation."<br>
</div></div></blockquote><div><br>Whoops, my memory was faulty.  This should say "...in the sf thread...", not "...in the vertex shader...".<br> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div class="gmail_quote"><div>
 </div><div><div class="h5"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
    this->current_annotation = "compute pos.w and 1/pos.w";<br>
    /* Compute wpos.w.  It's always in our setup, since it's needed to<br>
     * interpolate the other attributes.<br>
diff --git a/src/mesa/drivers/dri/i965/brw_sf.c b/src/mesa/drivers/dri/i965/brw_sf.c<br>
index 0cc4fc7..85f5f51 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_sf.c<br>
+++ b/src/mesa/drivers/dri/i965/brw_sf.c<br>
@@ -139,6 +139,7 @@ brw_upload_sf_prog(struct brw_context *brw)<br>
    struct brw_sf_prog_key key;<br>
    /* _NEW_BUFFERS */<br>
    bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer);<br>
+   int i;<br>
<br>
    memset(&key, 0, sizeof(key));<br>
<br>
@@ -191,7 +192,13 @@ brw_upload_sf_prog(struct brw_context *brw)<br>
       key.sprite_origin_lower_left = true;<br>
<br>
    /* _NEW_LIGHT */<br>
-   key.do_flat_shading = (ctx->Light.ShadeModel == GL_FLAT);<br>
+   key.has_flat_shading = 0;<br>
+   for (i = 0; i < BRW_VERT_RESULT_MAX; i++) {<br>
+      if (brw_get_interpolation_mode(brw, i) == INTERP_QUALIFIER_FLAT) {<br>
+         key.has_flat_shading = 1;<br>
+         break;<br>
+      }<br>
+   }<br>
    key.do_twoside_color = (ctx->Light.Enabled && ctx->Light.Model.TwoSide) ||<br>
      ctx->VertexProgram._TwoSideEnabled;<br>
    brw_copy_interpolation_modes(brw, key.interpolation_mode);<br>
diff --git a/src/mesa/drivers/dri/i965/brw_sf.h b/src/mesa/drivers/dri/i965/brw_sf.h<br>
index 0a8135c..c718072 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_sf.h<br>
+++ b/src/mesa/drivers/dri/i965/brw_sf.h<br>
@@ -50,7 +50,7 @@ struct brw_sf_prog_key {<br>
    uint8_t point_sprite_coord_replace;<br>
    GLuint primitive:2;<br>
    GLuint do_twoside_color:1;<br>
-   GLuint do_flat_shading:1;<br>
+   GLuint has_flat_shading:1;<br>
    GLuint frontface_ccw:1;<br>
    GLuint do_point_sprite:1;<br>
    GLuint do_point_coord:1;<br>
diff --git a/src/mesa/drivers/dri/i965/brw_sf_emit.c b/src/mesa/drivers/dri/i965/brw_sf_emit.c<br>
index 9d8aa38..387685a 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_sf_emit.c<br>
+++ b/src/mesa/drivers/dri/i965/brw_sf_emit.c<br>
@@ -44,6 +44,17 @@<br>
<br>
<br>
 /**<br>
+ * Determine the vue slot corresponding to the given half of the given<br>
+ * register.  half=0 means the first half of a register, half=1 means the<br>
+ * second half.<br>
+ */<br>
+static inline int vert_reg_to_vue_slot(struct brw_sf_compile *c, GLuint reg,<br>
+                                       int half)<br>
+{<br>
+   return (reg + c->urb_entry_read_offset) * 2 + half;<br>
+}<br>
+<br>
+/**<br>
  * Determine the vert_result corresponding to the given half of the given<br>
  * register.  half=0 means the first half of a register, half=1 means the<br>
  * second half.<br>
@@ -51,11 +62,24 @@<br>
 static inline int vert_reg_to_vert_result(struct brw_sf_compile *c, GLuint reg,<br>
                                           int half)<br>
 {<br>
-   int vue_slot = (reg + c->urb_entry_read_offset) * 2 + half;<br>
+   int vue_slot = vert_reg_to_vue_slot(c, reg, half);<br>
    return c->vue_map.slot_to_vert_result[vue_slot];<br>
 }<br>
<br>
 /**<br>
+ * Determine the register corresponding to the given vue slot.<br>
+ */<br>
+static struct brw_reg get_vue_slot(struct brw_sf_compile *c,<br>
+                                   struct brw_reg vert,<br>
+                                   int vue_slot)<br>
+{<br>
+   GLuint off = vue_slot / 2 - c->urb_entry_read_offset;<br>
+   GLuint sub = vue_slot % 2;<br>
+<br>
+   return brw_vec4_grf(<a href="http://vert.nr" target="_blank">vert.nr</a> + off, sub * 4);<br></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">


+}<br>
+<br>
+/**<br>
  * Determine the register corresponding to the given vert_result.<br>
  */<br>
 static struct brw_reg get_vert_result(struct brw_sf_compile *c,<br>
@@ -64,10 +88,7 @@ static struct brw_reg get_vert_result(struct brw_sf_compile *c,<br>
 {<br>
    int vue_slot = c->vue_map.vert_result_to_slot[vert_result];<br>
    assert (vue_slot >= c->urb_entry_read_offset);<br>
-   GLuint off = vue_slot / 2 - c->urb_entry_read_offset;<br>
-   GLuint sub = vue_slot % 2;<br>
-<br>
-   return brw_vec4_grf(<a href="http://vert.nr" target="_blank">vert.nr</a> + off, sub * 4);<br>
+   return get_vue_slot(c, vert, vue_slot);<br>
 }<br>
<br>
 static bool<br>
@@ -128,31 +149,37 @@ static void do_twoside_color( struct brw_sf_compile *c )<br>
  * Flat shading<br>
  */<br>
<br>
-#define VERT_RESULT_COLOR_BITS (BITFIELD64_BIT(VERT_RESULT_COL0) | \<br>
-                                BITFIELD64_BIT(VERT_RESULT_COL1))<br>
-<br>
-static void copy_colors( struct brw_sf_compile *c,<br>
-                    struct brw_reg dst,<br>
-                     struct brw_reg src,<br>
-                     int allow_twoside)<br>
+static void copy_flatshaded_attributes( struct brw_sf_compile *c,<br>
+                                        struct brw_reg dst,<br>
+                                        struct brw_reg src)<br>
 {<br>
    struct brw_compile *p = &c->func;<br>
+   struct brw_context *brw = p->brw;<br>
    GLuint i;<br>
<br>
-   for (i = VERT_RESULT_COL0; i <= VERT_RESULT_COL1; i++) {<br>
-      if (have_attr(c,i)) {<br>
+   for (i = 0; i < BRW_VERT_RESULT_MAX; i++) {<br>
+      if (brw_get_interpolation_mode(brw, i) == INTERP_QUALIFIER_FLAT) {<br>
         brw_MOV(p,<br>
-                get_vert_result(c, dst, i),<br>
-                get_vert_result(c, src, i));<br>
+                get_vue_slot(c, dst, i),<br>
+                get_vue_slot(c, src, i));<br>
<br>
-      } else if(allow_twoside && have_attr(c, i - VERT_RESULT_COL0 + VERT_RESULT_BFC0)) {<br>
-        brw_MOV(p,<br>
-                get_vert_result(c, dst, i - VERT_RESULT_COL0 + VERT_RESULT_BFC0),<br>
-                get_vert_result(c, src, i - VERT_RESULT_COL0 + VERT_RESULT_BFC0));<br>
       }<br>
    }<br>
 }<br>
<br>
+static GLuint count_flatshaded_attributes(struct brw_sf_compile *c )<br>
+{<br>
+   struct brw_compile *p = &c->func;<br>
+   struct brw_context *brw = p->brw;<br>
+   GLuint count = 0;<br>
+   GLuint i;<br>
+   for (i = 0; i < BRW_VERT_RESULT_MAX; i++) {<br>
+      if (brw_get_interpolation_mode(brw, i) == INTERP_QUALIFIER_FLAT)<br>
+         count++;<br>
+   }<br>
+   return count;<br>
+}<br>
+<br>
<br>
<br>
 /* Need to use a computed jump to copy flatshaded attributes as the<br>
@@ -168,18 +195,6 @@ static void do_flatshade_triangle( struct brw_sf_compile *c )<br>
<br>
    GLuint nr;<br>
<br>
-   if (c->key.do_twoside_color) {<br>
-      nr = ((c->key.attrs & (BITFIELD64_BIT(VERT_RESULT_COL0) | BITFIELD64_BIT(VERT_RESULT_BFC0))) != 0) +<br>
-         ((c->key.attrs & (BITFIELD64_BIT(VERT_RESULT_COL1) | BITFIELD64_BIT(VERT_RESULT_BFC1))) != 0);<br>
-<br>
-   } else {<br>
-      nr = ((c->key.attrs & BITFIELD64_BIT(VERT_RESULT_COL0)) != 0) +<br>
-         ((c->key.attrs & BITFIELD64_BIT(VERT_RESULT_COL1)) != 0);<br>
-   }<br>
-<br>
-   if (!nr)<br>
-      return;<br>
-<br>
    /* Already done in clip program:<br>
     */<br>
    if (c->key.primitive == SF_UNFILLED_TRIS)<br>
@@ -188,21 +203,23 @@ static void do_flatshade_triangle( struct brw_sf_compile *c )<br>
    if (intel->gen == 5)<br>
        jmpi = 2;<br>
<br>
+   nr = count_flatshaded_attributes(c);<br>
+<br></blockquote></div></div><div><br>We used to have this optimization:<br><br>if (!nr)<br>   return;<br><br>I understand why you removed it: because now this code should only be called if c->key.has_flat_shading is true.  However, for the sake of safety (and documentation), can we add something like this:<br>

<br>   /* This code should only be called if c->key.has_flat_shading is true,<br>    * meaning there is at least one flatshaded attribute.<br>    */<br>   assert(nr != 0);<br><br>If you would prefer to put this assertion inside count_flatshaded_attributes(), I would be happy with that too.<br>

 </div><div><div class="h5"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
    brw_push_insn_state(p);<br>
<br>
    brw_MUL(p, c->pv, c->pv, brw_imm_d(jmpi*(nr*2+1)));<br>
    brw_JMPI(p, ip, ip, c->pv);<br>
<br>
-   copy_colors(c, c->vert[1], c->vert[0], c->key.do_twoside_color);<br>
-   copy_colors(c, c->vert[2], c->vert[0], c->key.do_twoside_color);<br>
+   copy_flatshaded_attributes(c, c->vert[1], c->vert[0]);<br>
+   copy_flatshaded_attributes(c, c->vert[2], c->vert[0]);<br>
    brw_JMPI(p, ip, ip, brw_imm_d(jmpi*(nr*4+1)));<br>
<br>
-   copy_colors(c, c->vert[0], c->vert[1], c->key.do_twoside_color);<br>
-   copy_colors(c, c->vert[2], c->vert[1], c->key.do_twoside_color);<br>
+   copy_flatshaded_attributes(c, c->vert[0], c->vert[1]);<br>
+   copy_flatshaded_attributes(c, c->vert[2], c->vert[1]);<br>
    brw_JMPI(p, ip, ip, brw_imm_d(jmpi*nr*2));<br>
<br>
-   copy_colors(c, c->vert[0], c->vert[2], c->key.do_twoside_color);<br>
-   copy_colors(c, c->vert[1], c->vert[2], c->key.do_twoside_color);<br>
+   copy_flatshaded_attributes(c, c->vert[0], c->vert[2]);<br>
+   copy_flatshaded_attributes(c, c->vert[1], c->vert[2]);<br>
<br>
    brw_pop_insn_state(p);<br>
 }<br>
@@ -213,12 +230,9 @@ static void do_flatshade_line( struct brw_sf_compile *c )<br>
    struct brw_compile *p = &c->func;<br>
    struct intel_context *intel = &p->brw->intel;<br>
    struct brw_reg ip = brw_ip_reg();<br>
-   GLuint nr = _mesa_bitcount_64(c->key.attrs & VERT_RESULT_COLOR_BITS);<br>
+   GLuint nr;<br>
    GLuint jmpi = 1;<br>
<br>
-   if (!nr)<br>
-      return;<br>
-<br>
    /* Already done in clip program:<br>
     */<br>
    if (c->key.primitive == SF_UNFILLED_TRIS)<br>
@@ -227,14 +241,16 @@ static void do_flatshade_line( struct brw_sf_compile *c )<br>
    if (intel->gen == 5)<br>
        jmpi = 2;<br>
<br>
+   nr = count_flatshaded_attributes(c);<br>
+<br></blockquote></div></div><div><br>A similar assertion should go here.<br> </div><div class="im"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

    brw_push_insn_state(p);<br>
<br>
    brw_MUL(p, c->pv, c->pv, brw_imm_d(jmpi*(nr+1)));<br>
    brw_JMPI(p, ip, ip, c->pv);<br>
-   copy_colors(c, c->vert[1], c->vert[0], 0);<br>
+   copy_flatshaded_attributes(c, c->vert[1], c->vert[0]);<br>
<br>
    brw_JMPI(p, ip, ip, brw_imm_ud(jmpi*nr));<br>
-   copy_colors(c, c->vert[0], c->vert[1], 0);<br>
+   copy_flatshaded_attributes(c, c->vert[0], c->vert[1]);<br>
<br>
    brw_pop_insn_state(p);<br>
 }<br>
@@ -332,40 +348,25 @@ static void invert_det( struct brw_sf_compile *c)<br>
<br>
 static bool<br>
 calculate_masks(struct brw_sf_compile *c,<br>
-               GLuint reg,<br>
-               GLushort *pc,<br>
-               GLushort *pc_persp,<br>
-               GLushort *pc_linear)<br>
+                GLuint reg,<br>
+                GLushort *pc,<br>
+                GLushort *pc_persp,<br>
+                GLushort *pc_linear)<br></blockquote></div><div><br>I like the way you've rewritten this function.  Nicely done.<br> </div><div><div class="h5"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">


 {<br>
+   struct brw_compile *p = &c->func;<br>
+   struct brw_context *brw = p->brw;<br>
+   enum glsl_interp_qualifier interp;<br>
    bool is_last_attr = (reg == c->nr_setup_regs - 1);<br>
-   GLbitfield64 persp_mask;<br>
-   GLbitfield64 linear_mask;<br>
-<br>
-   if (c->key.do_flat_shading)<br>
-      persp_mask = c->key.attrs & ~(BITFIELD64_BIT(VERT_RESULT_HPOS) |<br>
-                                    BITFIELD64_BIT(VERT_RESULT_COL0) |<br>
-                                    BITFIELD64_BIT(VERT_RESULT_COL1) |<br>
-                                    BITFIELD64_BIT(VERT_RESULT_BFC0) |<br>
-                                    BITFIELD64_BIT(VERT_RESULT_BFC1));<br>
-   else<br>
-      persp_mask = c->key.attrs & ~(BITFIELD64_BIT(VERT_RESULT_HPOS));<br>
-<br>
-   if (c->key.do_flat_shading)<br>
-      linear_mask = c->key.attrs & ~(BITFIELD64_BIT(VERT_RESULT_COL0) |<br>
-                                     BITFIELD64_BIT(VERT_RESULT_COL1) |<br>
-                                     BITFIELD64_BIT(VERT_RESULT_BFC0) |<br>
-                                     BITFIELD64_BIT(VERT_RESULT_BFC1));<br>
-   else<br>
-      linear_mask = c->key.attrs;<br>
<br>
    *pc_persp = 0;<br>
    *pc_linear = 0;<br>
    *pc = 0xf;<br>
-<br>
-   if (persp_mask & BITFIELD64_BIT(vert_reg_to_vert_result(c, reg, 0)))<br>
-      *pc_persp = 0xf;<br>
<br>
-   if (linear_mask & BITFIELD64_BIT(vert_reg_to_vert_result(c, reg, 0)))<br>
+   interp = brw_get_interpolation_mode(brw, vert_reg_to_vue_slot(c, reg, 0));<br>
+   if (interp == INTERP_QUALIFIER_SMOOTH) {<br>
+      *pc_linear = 0xf;<br>
+      *pc_persp = 0xf;<br>
+   } else if(interp == INTERP_QUALIFIER_NOPERSPECTIVE)<br>
       *pc_linear = 0xf;<br>
<br>
    /* Maybe only processs one attribute on the final round:<br>
@@ -373,11 +374,12 @@ calculate_masks(struct brw_sf_compile *c,<br>
    if (vert_reg_to_vert_result(c, reg, 1) != BRW_VERT_RESULT_MAX) {<br>
       *pc |= 0xf0;<br>
<br>
-      if (persp_mask & BITFIELD64_BIT(vert_reg_to_vert_result(c, reg, 1)))<br>
-        *pc_persp |= 0xf0;<br>
-<br>
-      if (linear_mask & BITFIELD64_BIT(vert_reg_to_vert_result(c, reg, 1)))<br>
-        *pc_linear |= 0xf0;<br>
+      interp = brw_get_interpolation_mode(brw, vert_reg_to_vue_slot(c, reg, 1));<br>
+      if (interp == INTERP_QUALIFIER_SMOOTH) {<br>
+         *pc_linear |= 0xf0;<br>
+         *pc_persp |= 0xf0;<br>
+      } else if(interp == INTERP_QUALIFIER_NOPERSPECTIVE)<br>
+         *pc_linear |= 0xf0;<br>
    }<br>
<br>
    return is_last_attr;<br>
@@ -430,7 +432,7 @@ void brw_emit_tri_setup(struct brw_sf_compile *c, bool allocate)<br>
    if (c->key.do_twoside_color)<br>
       do_twoside_color(c);<br>
<br>
-   if (c->key.do_flat_shading)<br>
+   if (c->key.has_flat_shading)<br>
       do_flatshade_triangle(c);<br>
<br>
<br>
@@ -443,7 +445,6 @@ void brw_emit_tri_setup(struct brw_sf_compile *c, bool allocate)<br>
       struct brw_reg a2 = offset(c->vert[2], i);<br>
       GLushort pc, pc_persp, pc_linear;<br>
       bool last = calculate_masks(c, i, &pc, &pc_persp, &pc_linear);<br>
-<br>
       if (pc_persp)<br>
       {<br>
         brw_set_predicate_control_flag_value(p, pc_persp);<br>
@@ -507,7 +508,6 @@ void brw_emit_line_setup(struct brw_sf_compile *c, bool allocate)<br>
    struct brw_compile *p = &c->func;<br>
    GLuint i;<br>
<br>
-<br>
    c->nr_verts = 2;<br>
<br>
    if (allocate)<br>
@@ -516,7 +516,7 @@ void brw_emit_line_setup(struct brw_sf_compile *c, bool allocate)<br>
    invert_det(c);<br>
    copy_z_inv_w(c);<br>
<br>
-   if (c->key.do_flat_shading)<br>
+   if (c->key.has_flat_shading)<br>
       do_flatshade_line(c);<br>
<br>
    for (i = 0; i < c->nr_setup_regs; i++)<br>
@@ -799,7 +799,3 @@ void brw_emit_anyprim_setup( struct brw_sf_compile *c )<br>
<br>
    brw_emit_point_setup( c, false );<br>
 }<br>
-<br>
-<br>
-<br>
-<br>
<span><font color="#888888">--<br>
1.7.10.rc3.1.gb306<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div></div></div><br>With the minor changes noted above, this patch is:<br><br>Reviewed-by: Paul Berry <<a href="mailto:stereotype441@gmail.com" target="_blank">stereotype441@gmail.com</a>><br>

</blockquote></div><br>