<div dir="ltr">On 2 February 2013 13:52, Kenneth Graunke <span dir="ltr"><<a href="mailto:kenneth@whitecape.org" target="_blank">kenneth@whitecape.org</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Ivybridge doesn't appear to have the same errata as Sandybridge; no<br>
corruption was observed by setting it to more than the minimal correct<br>
value.  It's possible that we were simply lucky, since the URB entries<br>
are 1024-bit on Ivybridge vs. 512-bit Sandybridge.  Or perhaps the<br>
underlying hardware issue is fixed.<br>
<br>
Either way, we may as well program the minimum value since it's now<br>
readily available, likely to be more efficient, and possibly more<br>
correct.<br>
<br>
NOTE: This is a candidate for all stable branches.<br>
Signed-off-by: Kenneth Graunke <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>><br>
---<br>
 src/mesa/drivers/dri/i965/gen7_sf_state.c | 32 +++++++++++++++----------------<br>
 1 file changed, 16 insertions(+), 16 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/gen7_sf_state.c b/src/mesa/drivers/dri/i965/gen7_sf_state.c<br>
index b801b96..f7ad473 100644<br>
--- a/src/mesa/drivers/dri/i965/gen7_sf_state.c<br>
+++ b/src/mesa/drivers/dri/i965/gen7_sf_state.c<br>
@@ -34,7 +34,6 @@ upload_sbe_state(struct brw_context *brw)<br>
 {<br>
    struct intel_context *intel = &brw->intel;<br>
    struct gl_context *ctx = &intel->ctx;<br>
-   uint32_t urb_entry_read_length;<br>
    /* BRW_NEW_FRAGMENT_PROGRAM */<br>
    uint32_t num_outputs = _mesa_bitcount_64(brw->fragment_program->Base.InputsRead);<br>
    /* _NEW_LIGHT */<br>
@@ -48,22 +47,8 @@ upload_sbe_state(struct brw_context *brw)<br>
    bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer);<br>
    uint32_t point_sprite_origin;<br>
<br>
-   /* CACHE_NEW_VS_PROG */<br>
-   urb_entry_read_length = ((brw->vs.prog_data->vue_map.num_slots + 1) / 2 -<br>
-                           urb_entry_read_offset);<br>
-   if (urb_entry_read_length == 0) {<br>
-      /* Setting the URB entry read length to 0 causes undefined behavior, so<br>
-       * if we have no URB data to read, set it to 1.<br>
-       */<br>
-      urb_entry_read_length = 1;<br>
-   }<br>
-<br>
    /* FINISHME: Attribute Swizzle Control Mode? */<br>
-   dw1 =<br>
-      GEN7_SBE_SWIZZLE_ENABLE |<br>
-      num_outputs << GEN7_SBE_NUM_OUTPUTS_SHIFT |<br>
-      urb_entry_read_length << GEN7_SBE_URB_ENTRY_READ_LENGTH_SHIFT |<br>
-      urb_entry_read_offset << GEN7_SBE_URB_ENTRY_READ_OFFSET_SHIFT;<br>
+   dw1 = GEN7_SBE_SWIZZLE_ENABLE | num_outputs << GEN7_SBE_NUM_OUTPUTS_SHIFT;<br>
<br>
    /* _NEW_POINT<br>
     *<br>
@@ -123,6 +108,21 @@ upload_sbe_state(struct brw_context *brw)<br>
                            &max_source_attr);<br>
    }<br>
<br>
+   /* From the Ivy Bridge PRM, Volume 2, Part 1, documentation for<br>
+    * 3DSTATE_SBE DWord 1 bits 15:11, "Vertex URB Entry Read Length":<br>
+    *<br>
+    * "This field should be set to the minimum length required to read the<br>
+    *  maximum source attribute.  The maximum source attribute is indicated<br>
+    *  by the maximum value of the enabled Attribute # Source Attribute if<br>
+    *  Attribute Swizzle Enable is set, Number of Output Attributes-1 if<br>
+    *  enable is not set.<br>
+    *<br>
+    *  read_length = ceiling((max_source_attr + 1) / 2)"<br>
+    */<br>
+   uint32_t urb_entry_read_length = ALIGN(max_source_attr + 1, 2) / 2;<br>
+   dw1 |= urb_entry_read_length << GEN6_SF_URB_ENTRY_READ_LENGTH_SHIFT |<br>
+          urb_entry_read_offset << GEN6_SF_URB_ENTRY_READ_OFFSET_SHIFT;<br>
+<br></blockquote><div><br></div><div>s/GEN6_SF/GEN7_SBE/ above.<br><br></div><div>(Fortunately these #defines are the same for GEN6 and GEN7 but it would be nice to use the right ones :))<br><br></div><div>With that fixed, this series is:<br>
<br>Reviewed-by: Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

    for (; input_index < FRAG_ATTRIB_MAX; input_index++)<br>
       attr_overrides[input_index] = 0;<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
1.8.1.2<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">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><br></div></div>