Reviewed-by: Marek Olšák <marek.ol...@amd.com> Marek
On Mon, Feb 20, 2017 at 12:21 PM, Nicolai Hähnle <nhaeh...@gmail.com> wrote: > From: Nicolai Hähnle <nicolai.haeh...@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-sta...@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-sta...@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-stable _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev