From 40149441b8e2c9b806fc0f6a387a7653d97a3b59 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 14 Sep 2018 17:06:48 -0500 Subject: [PATCH] anv: Add a mi_memset and use it for zeroing queries Reviewed-by: Lionel Landwerlin --- src/intel/vulkan/anv_genX.h | 4 ++++ src/intel/vulkan/genX_gpu_memcpy.c | 17 +++++++++++++++++ src/intel/vulkan/genX_query.c | 14 ++------------ 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/intel/vulkan/anv_genX.h b/src/intel/vulkan/anv_genX.h index bef9b5bde4e..7921e0674a0 100644 --- a/src/intel/vulkan/anv_genX.h +++ b/src/intel/vulkan/anv_genX.h @@ -80,5 +80,9 @@ void genX(cmd_buffer_mi_memcpy)(struct anv_cmd_buffer *cmd_buffer, struct anv_address dst, struct anv_address src, uint32_t size); +void genX(cmd_buffer_mi_memset)(struct anv_cmd_buffer *cmd_buffer, + struct anv_address dst, uint32_t value, + uint32_t size); + void genX(blorp_exec)(struct blorp_batch *batch, const struct blorp_params *params); diff --git a/src/intel/vulkan/genX_gpu_memcpy.c b/src/intel/vulkan/genX_gpu_memcpy.c index bbf3d4b63ae..11ffd6fb436 100644 --- a/src/intel/vulkan/genX_gpu_memcpy.c +++ b/src/intel/vulkan/genX_gpu_memcpy.c @@ -108,6 +108,23 @@ genX(cmd_buffer_mi_memcpy)(struct anv_cmd_buffer *cmd_buffer, return; } +void +genX(cmd_buffer_mi_memset)(struct anv_cmd_buffer *cmd_buffer, + struct anv_address dst, uint32_t value, + uint32_t size) +{ + /* This memset operates in units of dwords. */ + assert(size % 4 == 0); + assert(dst.offset % 4 == 0); + + for (uint32_t i = 0; i < size; i += 4) { + anv_batch_emit(&cmd_buffer->batch, GENX(MI_STORE_DATA_IMM), sdi) { + sdi.Address = anv_address_add(dst, i); + sdi.ImmediateData = value; + } + } +} + void genX(cmd_buffer_so_memcpy)(struct anv_cmd_buffer *cmd_buffer, struct anv_address dst, struct anv_address src, diff --git a/src/intel/vulkan/genX_query.c b/src/intel/vulkan/genX_query.c index 56d18e021e4..4ccbe2975de 100644 --- a/src/intel/vulkan/genX_query.c +++ b/src/intel/vulkan/genX_query.c @@ -346,21 +346,11 @@ emit_zero_queries(struct anv_cmd_buffer *cmd_buffer, struct anv_query_pool *pool, uint32_t first_index, uint32_t num_queries) { - const uint32_t num_elements = pool->stride / sizeof(uint64_t); - for (uint32_t i = 0; i < num_queries; i++) { struct anv_address slot_addr = anv_query_address(pool, first_index + i); - for (uint32_t j = 1; j < num_elements; j++) { - anv_batch_emit(&cmd_buffer->batch, GENX(MI_STORE_DATA_IMM), sdi) { - sdi.Address = anv_address_add(slot_addr, j * sizeof(uint64_t)); - sdi.ImmediateData = 0ull; - } - anv_batch_emit(&cmd_buffer->batch, GENX(MI_STORE_DATA_IMM), sdi) { - sdi.Address = anv_address_add(slot_addr, j * sizeof(uint64_t) + 4); - sdi.ImmediateData = 0ull; - } - } + genX(cmd_buffer_mi_memset)(cmd_buffer, anv_address_add(slot_addr, 8), + 0, pool->stride - 8); emit_query_availability(cmd_buffer, slot_addr); } } -- 2.30.2