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 <tarc...@itsqueeze.com <mailto:tarc...@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@lists.freedesktop.org <mailto:mesa-dev@lists.freedesktop.org>
    https://lists.freedesktop.org/mailman/listinfo/mesa-dev

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to