[Mesa-dev] [PATCH 1/2] intel/batch_decoder: Recurse for all 2nd level batches

Lionel Landwerlin lionel.g.landwerlin at intel.com
Mon Jul 9 23:33:42 UTC 2018


Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>

On 10/07/18 00:01, Jason Ekstrand wrote:
> Our attempt to restart the loop with the second level batch worked at
> one point but got broken at some point.  It was too fragile anyway and
> we're not likely to have enough secondaries to actually overflow the
> stack so we may as well recurse in both cases.
> ---
>   src/intel/common/gen_batch_decoder.c | 19 +++++--------------
>   1 file changed, 5 insertions(+), 14 deletions(-)
>
> diff --git a/src/intel/common/gen_batch_decoder.c b/src/intel/common/gen_batch_decoder.c
> index fc0ff95a476..fe7536da9ec 100644
> --- a/src/intel/common/gen_batch_decoder.c
> +++ b/src/intel/common/gen_batch_decoder.c
> @@ -856,33 +856,24 @@ gen_print_batch(struct gen_batch_decode_ctx *ctx,
>            if (next_batch.map == NULL) {
>               fprintf(ctx->fp, "Secondary batch at 0x%08"PRIx64" unavailable\n",
>                       next_batch.addr);
> +         } else {
> +            gen_print_batch(ctx, next_batch.map, next_batch.size,
> +                            next_batch.addr);
>            }
> -
>            if (second_level) {
>               /* 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.
>                */
> -            if (next_batch.map) {
> -               gen_print_batch(ctx, next_batch.map, next_batch.size,
> -                               next_batch.addr);
> -            }
> +            continue;
>            } 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;
>                */
> -            if (next_batch.map) {
> -               p = next_batch.map;
> -               end = next_batch.map + next_batch.size;
> -               length = 0;
> -               continue;
> -            } else {
> -               /* Nothing we can do */
> -               break;
> -            }
> +            break;
>            }
>         } else if (strcmp(inst_name, "MI_BATCH_BUFFER_END") == 0) {
>            break;




More information about the mesa-dev mailing list