[Mesa-dev] [PATCH] radeonsi: fix query buffer allocation
Timothy Arceri
tarceri at itsqueeze.com
Sat Feb 23 01:29:42 UTC 2019
On 23/2/19 11:31 am, Marek Olšák wrote:
> Nicolai also has a change in si_query_buffer_reset. Is there a reason
> the change is not here?
duh ... no reason other than I forgot that bit.
>
> Thanks,
> Marek
>
> On Thu, Feb 21, 2019 at 10:09 PM Timothy Arceri <tarceri at itsqueeze.com
> <mailto:tarceri at itsqueeze.com>> wrote:
>
> Fix the logic for buffer full check on alloc.
>
> This patch just takes the fix Nicolai attached to the bug report
> and updates it to work on master.
>
> Fixes: e0f0d3675d4 ("radeonsi: factor si_query_buffer logic out of
> si_query_hw")
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=109561
> ---
> src/gallium/drivers/radeonsi/si_query.c | 42 +++++++++++++------------
> src/gallium/drivers/radeonsi/si_query.h | 5 +--
> 2 files changed, 25 insertions(+), 22 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_query.c
> b/src/gallium/drivers/radeonsi/si_query.c
> index 266b9d3ce84..04685b8bb3f 100644
> --- a/src/gallium/drivers/radeonsi/si_query.c
> +++ b/src/gallium/drivers/radeonsi/si_query.c
> @@ -561,29 +561,31 @@ bool si_query_buffer_alloc(struct si_context
> *sctx, struct si_query_buffer *buff
> bool (*prepare_buffer)(struct si_context
> *, struct si_query_buffer*),
> unsigned size)
> {
> - if (buffer->buf && buffer->results_end + size >=
> buffer->buf->b.b.width0)
> - return true;
> + bool unprepared = buffer->unprepared;
> + buffer->unprepared = false;
> +
> + if (!buffer->buf || buffer->results_end + size >
> buffer->buf->b.b.width0) {
> + if (buffer->buf) {
> + struct si_query_buffer *qbuf =
> MALLOC_STRUCT(si_query_buffer);
> + memcpy(qbuf, buffer, sizeof(*qbuf));
> + buffer->previous = qbuf;
> + }
> + buffer->results_end = 0;
>
> - if (buffer->buf) {
> - struct si_query_buffer *qbuf =
> MALLOC_STRUCT(si_query_buffer);
> - memcpy(qbuf, buffer, sizeof(*qbuf));
> - buffer->previous = qbuf;
> + /* Queries are normally read by the CPU after
> + * being written by the gpu, hence staging is
> probably a good
> + * usage pattern.
> + */
> + struct si_screen *screen = sctx->screen;
> + unsigned buf_size = MAX2(size,
> screen->info.min_alloc_size);
> + buffer->buf = si_resource(
> + pipe_buffer_create(&screen->b, 0,
> PIPE_USAGE_STAGING, buf_size));
> + if (unlikely(!buffer->buf))
> + return false;
> + unprepared = true;
> }
>
> - buffer->results_end = 0;
> -
> - /* Queries are normally read by the CPU after
> - * being written by the gpu, hence staging is probably a good
> - * usage pattern.
> - */
> - struct si_screen *screen = sctx->screen;
> - unsigned buf_size = MAX2(size, screen->info.min_alloc_size);
> - buffer->buf = si_resource(
> - pipe_buffer_create(&screen->b, 0,
> PIPE_USAGE_STAGING, buf_size));
> - if (unlikely(!buffer->buf))
> - return false;
> -
> - if (prepare_buffer) {
> + if (unprepared && prepare_buffer) {
> if (unlikely(!prepare_buffer(sctx, buffer))) {
> si_resource_reference(&buffer->buf, NULL);
> return false;
> diff --git a/src/gallium/drivers/radeonsi/si_query.h
> b/src/gallium/drivers/radeonsi/si_query.h
> index aaf0bd03aca..c61af51d57c 100644
> --- a/src/gallium/drivers/radeonsi/si_query.h
> +++ b/src/gallium/drivers/radeonsi/si_query.h
> @@ -177,12 +177,13 @@ struct si_query_hw_ops {
> struct si_query_buffer {
> /* The buffer where query results are stored. */
> struct si_resource *buf;
> - /* Offset of the next free result after current query data */
> - unsigned results_end;
> /* If a query buffer is full, a new buffer is created and
> the old one
> * is put in here. When we calculate the result, we sum up
> the samples
> * from all buffers. */
> struct si_query_buffer *previous;
> + /* Offset of the next free result after current query data */
> + unsigned results_end;
> + bool unprepared;
> };
>
> void si_query_buffer_destroy(struct si_screen *sctx, struct
> si_query_buffer *buffer);
> --
> 2.20.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org <mailto:mesa-dev at lists.freedesktop.org>
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
More information about the mesa-dev
mailing list