[Mesa-dev] [PATCH 3/3] radv: only emit cache flushes when the pool size is large enough

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Wed Feb 28 20:06:08 UTC 2018


On Wed, Feb 28, 2018 at 8:31 PM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
> This is an optimization which reduces the number of flushes for
> small pool buffers.
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
>  src/amd/vulkan/radv_meta_buffer.c |  6 ------
>  src/amd/vulkan/radv_private.h     |  6 ++++++
>  src/amd/vulkan/radv_query.c       | 12 ++++++++----
>  3 files changed, 14 insertions(+), 10 deletions(-)
>
> diff --git a/src/amd/vulkan/radv_meta_buffer.c b/src/amd/vulkan/radv_meta_buffer.c
> index e6ad235e93..2e1ba2c7b2 100644
> --- a/src/amd/vulkan/radv_meta_buffer.c
> +++ b/src/amd/vulkan/radv_meta_buffer.c
> @@ -4,12 +4,6 @@
>  #include "sid.h"
>  #include "radv_cs.h"
>
> -/*
> - * This is the point we switch from using CP to compute shader
> - * for certain buffer operations.
> - */
> -#define RADV_BUFFER_OPS_CS_THRESHOLD 4096
> -
>  static nir_shader *
>  build_buffer_fill_shader(struct radv_device *dev)
>  {
> diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
> index 752b6a7592..0f8ddb2e10 100644
> --- a/src/amd/vulkan/radv_private.h
> +++ b/src/amd/vulkan/radv_private.h
> @@ -95,6 +95,12 @@ typedef uint32_t xcb_window_t;
>
>  #define NUM_DEPTH_CLEAR_PIPELINES 3
>
> +/*
> + * This is the point we switch from using CP to compute shader
> + * for certain buffer operations.
> + */
> +#define RADV_BUFFER_OPS_CS_THRESHOLD 4096
> +
>  enum radv_mem_heap {
>         RADV_MEM_HEAP_VRAM,
>         RADV_MEM_HEAP_VRAM_CPU_ACCESS,
> diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c
> index 82831961ac..da2bcf5212 100644
> --- a/src/amd/vulkan/radv_query.c
> +++ b/src/amd/vulkan/radv_query.c
> @@ -1088,10 +1088,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);
> +               if (pool->size >= RADV_BUFFER_OPS_CS_THRESHOLD) {
> +                       /* Only need to flush caches if the query pool size is
> +                        * large enough to be resetted using the compute shader
> +                        * path. Small pools don't need any cache flushes
> +                        * because we use a CP dma clear.
> +                        */
> +                       si_emit_cache_flush(cmd_buffer);
> +               }
>                 cmd_buffer->pending_reset_query = false;

I think the pending query reset also need to be inside, as otherwise
we possibly forget to flush a larger query behind it?

I think you can do a similar opt by only setting the reset bit if the
fill_buffer command returns non-zero. That way you don't set it for
small pools in the first place (though it does not replace this opt).

Otherwise

Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
>         }
>
> --
> 2.16.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list