i965: Fix issues with number of VS URB entries on Cherryview/Broxton.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 8 Jun 2016 22:55:18 +0000 (15:55 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 14 Jun 2016 02:35:52 +0000 (19:35 -0700)
Cherryview/Broxton annoyingly have a minimum number of VS URB entries
of 34, which is not a multiple of 8.  When the VS size is less than 9,
the number of VS entries has to be a multiple of 8.

Notably, BLORP programmed the minimum number of VS URB entries (34), with
a size of 1 (less than 9), which is invalid.

It seemed like this could be a problem in the regular URB code as well,
so I went ahead and updated that to be safe.

Cc: "12.0" <mesa-stable@lists.freedesktop.org>
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
src/mesa/drivers/dri/i965/gen7_blorp.c
src/mesa/drivers/dri/i965/gen7_urb.c

index 270fe57ccafc865072a7ec7cd1c249ab667b93dc..235f0b504e17a7eaf9e5d724436c32ded8877329 100644 (file)
@@ -67,8 +67,9 @@ gen7_blorp_emit_urb_config(struct brw_context *brw)
       push_constant_bytes / chunk_size_bytes;
    const unsigned vs_size = 1;
    const unsigned vs_start = push_constant_chunks;
+   const unsigned min_vs_entries = ALIGN(brw->urb.min_vs_entries, 8);
    const unsigned vs_chunks =
-      DIV_ROUND_UP(brw->urb.min_vs_entries * vs_size * 64, chunk_size_bytes);
+      DIV_ROUND_UP(min_vs_entries * vs_size * 64, chunk_size_bytes);
 
    if (gen7_blorp_skip_urb_config(brw))
       return;
@@ -83,7 +84,7 @@ gen7_blorp_emit_urb_config(struct brw_context *brw)
                                  urb_size / 2 /* fs_size */);
 
    gen7_emit_urb_state(brw,
-                       brw->urb.min_vs_entries /* num_vs_entries */,
+                       min_vs_entries /* num_vs_entries */,
                        vs_size,
                        vs_start,
                        0 /* num_hs_entries */,
index a412a4263b33f50dd6aeac95bc50c1ac98b48547..387ed2e8923e4e7afb7d95fb7c6af0d009d135d8 100644 (file)
@@ -234,6 +234,8 @@ gen7_upload_urb(struct brw_context *brw)
     */
    unsigned vs_min_entries =
       tess_present && brw->gen == 8 ? 192 : brw->urb.min_vs_entries;
+   /* Min VS Entries isn't a multiple of 8 on Cherryview/Broxton; round up */
+   vs_min_entries = ALIGN(vs_min_entries, vs_granularity);
 
    unsigned vs_chunks =
       DIV_ROUND_UP(vs_min_entries * vs_entry_size_bytes, chunk_size_bytes);