[Mesa-dev] [Mesa-stable] [PATCH 1/2] radeonsi: handle MultiDrawIndirect in si_get_draw_start_count

Marek Olšák maraeo at gmail.com
Mon Feb 20 23:26:02 UTC 2017


Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Mon, Feb 20, 2017 at 12:21 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> Also handle the GL_ARB_indirect_parameters case where the count itself
> is in a buffer.
>
> Use transfers rather than mapping the buffers directly. This anticipates
> the possibility that the buffers are sparse (once ARB_sparse_buffer is
> implemented), in which case they cannot be mapped directly.
>
> Fixes GL45-CTS.gtf43.GL3Tests.multi_draw_indirect.multi_draw_indirect_type
> on <= CIK.
>
> Cc: mesa-stable at lists.freedesktop.org
> ---
>  src/gallium/drivers/radeonsi/si_state_draw.c | 54 ++++++++++++++++++++++++----
>  1 file changed, 47 insertions(+), 7 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c
> index 141dd8f..e022d5c 100644
> --- a/src/gallium/drivers/radeonsi/si_state_draw.c
> +++ b/src/gallium/drivers/radeonsi/si_state_draw.c
> @@ -914,13 +914,53 @@ static void si_get_draw_start_count(struct si_context *sctx,
>                                     unsigned *start, unsigned *count)
>  {
>         if (info->indirect) {
> -               struct r600_resource *indirect =
> -                       (struct r600_resource*)info->indirect;
> -               int *data = r600_buffer_map_sync_with_rings(&sctx->b,
> -                                       indirect, PIPE_TRANSFER_READ);
> -                data += info->indirect_offset/sizeof(int);
> -               *start = data[2];
> -               *count = data[0];
> +               unsigned indirect_count;
> +               struct pipe_transfer *transfer;
> +               unsigned begin, end;
> +               unsigned map_size;
> +               unsigned *data;
> +
> +               if (info->indirect_params) {
> +                       data = pipe_buffer_map_range(&sctx->b.b,
> +                                       info->indirect_params,
> +                                       info->indirect_params_offset,
> +                                       sizeof(unsigned),
> +                                       PIPE_TRANSFER_READ, &transfer);
> +
> +                       indirect_count = *data;
> +
> +                       pipe_buffer_unmap(&sctx->b.b, transfer);
> +               } else {
> +                       indirect_count = info->indirect_count;
> +               }
> +
> +               if (!indirect_count) {
> +                       *start = *count = 0;
> +                       return;
> +               }
> +
> +               map_size = (indirect_count - 1) * info->indirect_stride + 3 * sizeof(unsigned);
> +               data = pipe_buffer_map_range(&sctx->b.b, info->indirect,
> +                                            info->indirect_offset, map_size,
> +                                            PIPE_TRANSFER_READ, &transfer);
> +
> +               begin = UINT_MAX;
> +               end = 0;
> +
> +               for (unsigned i = 0; i < indirect_count; ++i) {
> +                       unsigned count = data[0];
> +                       unsigned start = data[2];
> +
> +                       if (count > 0) {
> +                               begin = MIN2(begin, start);
> +                               end = MAX2(end, start + count);
> +                       }
> +
> +                       data += info->indirect_stride / sizeof(unsigned);
> +               }
> +
> +               *start = begin;
> +               *count = end - begin;
>         } else {
>                 *start = info->start;
>                 *count = info->count;
> --
> 2.9.3
>
> _______________________________________________
> mesa-stable mailing list
> mesa-stable at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-stable


More information about the mesa-dev mailing list