anv: Add a mi_memset and use it for zeroing queries
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
This commit is contained in:
@@ -80,5 +80,9 @@ void genX(cmd_buffer_mi_memcpy)(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
struct anv_address dst, struct anv_address src,
|
struct anv_address dst, struct anv_address src,
|
||||||
uint32_t size);
|
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,
|
void genX(blorp_exec)(struct blorp_batch *batch,
|
||||||
const struct blorp_params *params);
|
const struct blorp_params *params);
|
||||||
|
@@ -108,6 +108,23 @@ genX(cmd_buffer_mi_memcpy)(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
return;
|
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
|
void
|
||||||
genX(cmd_buffer_so_memcpy)(struct anv_cmd_buffer *cmd_buffer,
|
genX(cmd_buffer_so_memcpy)(struct anv_cmd_buffer *cmd_buffer,
|
||||||
struct anv_address dst, struct anv_address src,
|
struct anv_address dst, struct anv_address src,
|
||||||
|
@@ -346,21 +346,11 @@ emit_zero_queries(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
struct anv_query_pool *pool,
|
struct anv_query_pool *pool,
|
||||||
uint32_t first_index, uint32_t num_queries)
|
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++) {
|
for (uint32_t i = 0; i < num_queries; i++) {
|
||||||
struct anv_address slot_addr =
|
struct anv_address slot_addr =
|
||||||
anv_query_address(pool, first_index + i);
|
anv_query_address(pool, first_index + i);
|
||||||
for (uint32_t j = 1; j < num_elements; j++) {
|
genX(cmd_buffer_mi_memset)(cmd_buffer, anv_address_add(slot_addr, 8),
|
||||||
anv_batch_emit(&cmd_buffer->batch, GENX(MI_STORE_DATA_IMM), sdi) {
|
0, pool->stride - 8);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
emit_query_availability(cmd_buffer, slot_addr);
|
emit_query_availability(cmd_buffer, slot_addr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user