<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Fri, Nov 18, 2016 at 11:54 AM Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net" class="gmail_msg" target="_blank">jason@jlekstrand.net</a>><br class="gmail_msg">
<br class="gmail_msg">
The original aubinator that Kristian wrote had a bug in the handling of<br class="gmail_msg">
MI_BATCH_BUFFER_START that propagated into the version in upstream mesa.<br class="gmail_msg">
In particular, it ignored the "2nd level" bit which tells you whether this<br class="gmail_msg">
MI_BATCH_BUFFER_START is a subroutine call (2nd level) or a goto.  Since<br class="gmail_msg">
the Vulkan driver uses batch chaining, this can lead to a very confusing<br class="gmail_msg">
interpretation of the batches.  In some cases, depending on how things are<br class="gmail_msg">
laid out in the virtual GTT, you can even end up with infinite loops in<br class="gmail_msg">
batch processing.<br class="gmail_msg">
<br class="gmail_msg"></blockquote><div><br></div><div>All four:</div><div><br></div><div>Reviewed-by: Kristian H. Kristensen <<a href="mailto:hoegsberg@google.com">hoegsberg@google.com</a>></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Signed-off-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net" class="gmail_msg" target="_blank">jason@jlekstrand.net</a>><br class="gmail_msg">
---<br class="gmail_msg">
 src/intel/tools/aubinator.c | 20 +++++++++++++++++++-<br class="gmail_msg">
 1 file changed, 19 insertions(+), 1 deletion(-)<br class="gmail_msg">
<br class="gmail_msg">
diff --git a/src/intel/tools/aubinator.c b/src/intel/tools/aubinator.c<br class="gmail_msg">
index 0d4b3f9..78682c5 100644<br class="gmail_msg">
--- a/src/intel/tools/aubinator.c<br class="gmail_msg">
+++ b/src/intel/tools/aubinator.c<br class="gmail_msg">
@@ -790,7 +790,25 @@ parse_commands(struct gen_spec *spec, uint32_t *cmds, int size, int engine)<br class="gmail_msg">
          else<br class="gmail_msg">
             start = p[1];<br class="gmail_msg">
<br class="gmail_msg">
-         parse_commands(spec, gtt + start, 1 << 20, engine);<br class="gmail_msg">
+         if (p[0] & (1 << 22)) {<br class="gmail_msg">
+            /* MI_BATCH_BUFFER_START with "2nd Level Batch Buffer" set acts<br class="gmail_msg">
+             * like a subroutine call.  Commands that come afterwards get<br class="gmail_msg">
+             * processed once the 2nd level batch buffer returns with<br class="gmail_msg">
+             * MI_BATCH_BUFFER_END.<br class="gmail_msg">
+             */<br class="gmail_msg">
+            parse_commands(spec, gtt + start, gtt_end - start, engine);<br class="gmail_msg">
+         } else {<br class="gmail_msg">
+            /* MI_BATCH_BUFFER_START with "2nd Level Batch Buffer" unset acts<br class="gmail_msg">
+             * like a goto.  Nothing after it will ever get processed.  In<br class="gmail_msg">
+             * order to prevent the recursion from growing, we just reset the<br class="gmail_msg">
+             * loop and continue;<br class="gmail_msg">
+             */<br class="gmail_msg">
+            p = gtt + start;<br class="gmail_msg">
+            /* We don't know where secondaries end so use the GTT end */<br class="gmail_msg">
+            end = gtt + gtt_end;<br class="gmail_msg">
+            length = 0;<br class="gmail_msg">
+            continue;<br class="gmail_msg">
+         }<br class="gmail_msg">
       } else if ((p[0] & 0xffff0000) == AUB_MI_BATCH_BUFFER_END) {<br class="gmail_msg">
          break;<br class="gmail_msg">
       }<br class="gmail_msg">
--<br class="gmail_msg">
2.5.0.400.gff86faf<br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
mesa-dev mailing list<br class="gmail_msg">
<a href="mailto:mesa-dev@lists.freedesktop.org" class="gmail_msg" target="_blank">mesa-dev@lists.freedesktop.org</a><br class="gmail_msg">
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br class="gmail_msg">
</blockquote></div></div>