[Mesa-dev] [PATCH 1/4] intel/aubinator: Properly handle batch buffer chaining
Kristian Høgsberg
hoegsberg at gmail.com
Fri Nov 18 20:56:05 UTC 2016
On Fri, Nov 18, 2016 at 11:54 AM Jason Ekstrand <jason at jlekstrand.net>
wrote:
> From: Jason Ekstrand <jason at jlekstrand.net>
>
> The original aubinator that Kristian wrote had a bug in the handling of
> MI_BATCH_BUFFER_START that propagated into the version in upstream mesa.
> In particular, it ignored the "2nd level" bit which tells you whether this
> MI_BATCH_BUFFER_START is a subroutine call (2nd level) or a goto. Since
> the Vulkan driver uses batch chaining, this can lead to a very confusing
> interpretation of the batches. In some cases, depending on how things are
> laid out in the virtual GTT, you can even end up with infinite loops in
> batch processing.
>
>
All four:
Reviewed-by: Kristian H. Kristensen <hoegsberg at google.com>
> Signed-off-by: Jason Ekstrand <jason at jlekstrand.net>
> ---
> src/intel/tools/aubinator.c | 20 +++++++++++++++++++-
> 1 file changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/src/intel/tools/aubinator.c b/src/intel/tools/aubinator.c
> index 0d4b3f9..78682c5 100644
> --- a/src/intel/tools/aubinator.c
> +++ b/src/intel/tools/aubinator.c
> @@ -790,7 +790,25 @@ parse_commands(struct gen_spec *spec, uint32_t *cmds,
> int size, int engine)
> else
> start = p[1];
>
> - parse_commands(spec, gtt + start, 1 << 20, engine);
> + if (p[0] & (1 << 22)) {
> + /* MI_BATCH_BUFFER_START with "2nd Level Batch Buffer" set
> acts
> + * like a subroutine call. Commands that come afterwards get
> + * processed once the 2nd level batch buffer returns with
> + * MI_BATCH_BUFFER_END.
> + */
> + parse_commands(spec, gtt + start, gtt_end - start, engine);
> + } else {
> + /* MI_BATCH_BUFFER_START with "2nd Level Batch Buffer" unset
> acts
> + * like a goto. Nothing after it will ever get processed. In
> + * order to prevent the recursion from growing, we just reset
> the
> + * loop and continue;
> + */
> + p = gtt + start;
> + /* We don't know where secondaries end so use the GTT end */
> + end = gtt + gtt_end;
> + length = 0;
> + continue;
> + }
> } else if ((p[0] & 0xffff0000) == AUB_MI_BATCH_BUFFER_END) {
> break;
> }
> --
> 2.5.0.400.gff86faf
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20161118/45dc30a4/attachment.html>
More information about the mesa-dev
mailing list