[Mesa-stable] [Mesa-dev] [PATCH v3] radv: make sure to emit cache flushes before starting a query

Samuel Pitoiset samuel.pitoiset at gmail.com
Thu Mar 1 09:51:13 UTC 2018



On 03/01/2018 10:21 AM, Alex Smith wrote:
> Hi Samuel,
> 
> On 28 February 2018 at 20:47, Samuel Pitoiset <samuel.pitoiset at gmail.com 
> <mailto:samuel.pitoiset at gmail.com>> wrote:
> 
>     If the query pool has been previously resetted using the compute
>     shader path.
> 
>     v3: set pending_reset_query only for the compute shader path
>     v2: handle multiple commands buffers with same pool
> 
>     Fixes: a41e2e9cf5 ("radv: allow to use a compute shader for
>     resetting the query pool")
>     Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105292
>     <https://bugs.freedesktop.org/show_bug.cgi?id=105292>
>     Cc: "18.0" <mesa-stable at lists.freedesktop.org
>     <mailto:mesa-stable at lists.freedesktop.org>>
>     Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com
>     <mailto:samuel.pitoiset at gmail.com>>
>     ---
>       src/amd/vulkan/radv_cmd_buffer.c |  7 +++++++
>       src/amd/vulkan/radv_private.h    |  5 +++++
>       src/amd/vulkan/radv_query.c      | 28 +++++++++++++++++++++-------
>       3 files changed, 33 insertions(+), 7 deletions(-)
> 
>     diff --git a/src/amd/vulkan/radv_cmd_buffer.c
>     b/src/amd/vulkan/radv_cmd_buffer.c
>     index 2b41baea3d..cfdc531acd 100644
>     --- a/src/amd/vulkan/radv_cmd_buffer.c
>     +++ b/src/amd/vulkan/radv_cmd_buffer.c
>     @@ -1930,6 +1930,13 @@ VkResult radv_BeginCommandBuffer(
> 
>              cmd_buffer->status = RADV_CMD_BUFFER_STATUS_RECORDING;
> 
>     +       /* Force cache flushes before starting a new query in case the
>     +        * corresponding pool has been resetted from a different command
>     +        * buffer. This is because we have to flush caches between
>     reset and
>     +        * begin if the compute shader path has been used.
>     +        */
>     +       cmd_buffer->pending_reset_query = true;
> 
> 
> Since this just ends up calling si_emit_cache_flush, doesn't flush_bits 
> need to be set accordingly for it to actually do anything? If the reset 
> is done in a previous command buffer, I think the flush would already 
> have been done in EndCommandBuffer on that?

You are right, this is just useless because we always flushes caches in 
EndCommandBuffer(). Thanks for pointing this out. Will remove that hunk.

> 
> Thanks,
> Alex
> 
>     +
>              return result;
>       }
> 
>     diff --git a/src/amd/vulkan/radv_private.h
>     b/src/amd/vulkan/radv_private.h
>     index c72df5a737..b76d2eb5cb 100644
>     --- a/src/amd/vulkan/radv_private.h
>     +++ b/src/amd/vulkan/radv_private.h
>     @@ -1003,6 +1003,11 @@ struct radv_cmd_buffer {
>              uint32_t gfx9_fence_offset;
>              struct radeon_winsys_bo *gfx9_fence_bo;
>              uint32_t gfx9_fence_idx;
>     +
>     +       /**
>     +        * Whether a query pool has been resetted and we have to
>     flush caches.
>     +        */
>     +       bool pending_reset_query;
>       };
> 
>       struct radv_image;
>     diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c
>     index ace745e4e6..b1393a2ec7 100644
>     --- a/src/amd/vulkan/radv_query.c
>     +++ b/src/amd/vulkan/radv_query.c
>     @@ -1058,17 +1058,23 @@ void radv_CmdResetQueryPool(
>       {
>              RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
>              RADV_FROM_HANDLE(radv_query_pool, pool, queryPool);
>     -       struct radv_cmd_state *state = &cmd_buffer->state;
>     +       uint32_t flush_bits = 0;
> 
>     -       state->flush_bits |= radv_fill_buffer(cmd_buffer, pool->bo,
>     -                                             firstQuery * pool->stride,
>     -                                             queryCount *
>     pool->stride, 0);
>     +       flush_bits |= radv_fill_buffer(cmd_buffer, pool->bo,
>     +                                      firstQuery * pool->stride,
>     +                                      queryCount * pool->stride, 0);
> 
>              if (pool->type == VK_QUERY_TYPE_TIMESTAMP ||
>                  pool->type == VK_QUERY_TYPE_PIPELINE_STATISTICS) {
>     -               state->flush_bits |= radv_fill_buffer(cmd_buffer,
>     pool->bo,
>     -                                                   
>       pool->availability_offset + firstQuery * 4,
>     -                                                     queryCount *
>     4, 0);
>     +               flush_bits |= radv_fill_buffer(cmd_buffer, pool->bo,
>     +                                             
>     pool->availability_offset + firstQuery * 4,
>     +                                              queryCount * 4, 0);
>     +       }
>     +
>     +       if (flush_bits) {
>     +               /* Only need to flush caches for the compute shader
>     path. */
>     +               cmd_buffer->pending_reset_query = true;
>     +               cmd_buffer->state.flush_bits |= flush_bits;
>              }
>       }
> 
>     @@ -1086,6 +1092,14 @@ void radv_CmdBeginQuery(
> 
>              radv_cs_add_buffer(cmd_buffer->device->ws, cs, pool->bo, 8);
> 
>     +       if (cmd_buffer->pending_reset_query) {
>     +               /* Make sure to flush caches if the query pool has been
>     +                * previously resetted using the compute shader path.
>     +                */
>     +               si_emit_cache_flush(cmd_buffer);
>     +               cmd_buffer->pending_reset_query = false;
>     +       }
>     +
>              switch (pool->type) {
>              case VK_QUERY_TYPE_OCCLUSION:
>                      radeon_check_space(cmd_buffer->device->ws, cs, 7);
>     --
>     2.16.2
> 
>     _______________________________________________
>     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
>     <https://lists.freedesktop.org/mailman/listinfo/mesa-dev>
> 
> 


More information about the mesa-stable mailing list