i965: Even if no VS inputs are set, still load some amount of URB as required.
authorEric Anholt <eric@anholt.net>
Tue, 4 Aug 2009 00:12:43 +0000 (17:12 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 4 Sep 2009 21:12:35 +0000 (14:12 -0700)
See comment on Vertex URB Entry Read Length for VS_STATE.

This, combined with the previous three commits, fixes #22945.
(cherry picked from commit e340d4f9866db4bae391288e83a630a310b0dd2b)

src/mesa/drivers/dri/i965/brw_vs_emit.c

index 6792c3a34e0951ea6e2cf47715c0c8746f32a9ac..b95079a5d13a19dc0628822292f7ed612cad6ff6 100644 (file)
@@ -124,6 +124,11 @@ static void brw_vs_alloc_regs( struct brw_vs_compile *c )
         reg++;
       }
    }
+   /* If there are no inputs, we'll still be reading one attribute's worth
+    * because it's required -- see urb_read_length setting.
+    */
+   if (c->nr_inputs == 0)
+      reg++;
 
    /* Allocate outputs: TODO: could organize the non-position outputs
     * to go straight into message regs.
@@ -201,6 +206,12 @@ static void brw_vs_alloc_regs( struct brw_vs_compile *c )
     * vertex urb, so is half the amount:
     */
    c->prog_data.urb_read_length = (c->nr_inputs + 1) / 2;
+   /* Setting this field to 0 leads to undefined behavior according to the
+    * the VS_STATE docs.  Our VUEs will always have at least one attribute
+    * sitting in them, even if it's padding.
+    */
+   if (c->prog_data.urb_read_length == 0)
+      c->prog_data.urb_read_length = 1;
 
    /* The VS VUEs are shared by VF (outputting our inputs) and VS, so size
     * them to fit the biggest thing they need to.