anv: use new mi-builder write check API to avoid stalls

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: José Roberto de Souza <jose.souza@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29571>
This commit is contained in:
Lionel Landwerlin
2024-06-07 10:06:46 +03:00
committed by Marge Bot
parent 59f11ef774
commit 5b4278ccd8
4 changed files with 21 additions and 8 deletions

View File

@@ -887,20 +887,22 @@ init_fast_clear_color(struct anv_cmd_buffer *cmd_buffer,
const uint32_t plane = anv_image_aspect_to_plane(image, aspect);
if (image->planes[plane].aux_usage == ISL_AUX_USAGE_FCV_CCS_E) {
struct anv_device *device = cmd_buffer->device;
assert(!image->planes[plane].can_non_zero_fast_clear);
assert(cmd_buffer->device->isl_dev.ss.clear_color_state_size == 32);
assert(device->isl_dev.ss.clear_color_state_size == 32);
unsigned num_dwords = 6;
struct anv_address addr =
anv_image_get_clear_color_addr(cmd_buffer->device, image, aspect);
anv_image_get_clear_color_addr(device, image, aspect);
struct mi_builder b;
mi_builder_init(&b, device->info, &cmd_buffer->batch);
mi_builder_set_mocs(&b, anv_mocs_for_address(device, &addr));
for (unsigned i = 0; i < num_dwords; i++) {
anv_batch_emit(&cmd_buffer->batch, GENX(MI_STORE_DATA_IMM), sdi) {
sdi.Address = addr;
sdi.Address.offset += i * 4;
sdi.ImmediateData = 0;
sdi.ForceWriteCompletionCheck = i == (num_dwords - 1);
}
mi_builder_set_write_check(&b, i == (num_dwords - 1));
mi_store(&b, mi_mem32(anv_address_add(addr, i * 4)), mi_imm(0));
}
}
#endif
@@ -932,6 +934,7 @@ genX(load_image_clear_color)(struct anv_cmd_buffer *cmd_buffer,
struct mi_builder b;
mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch);
mi_builder_set_write_check(&b, true);
mi_memcpy(&b, ss_clear_addr, entry_addr, copy_size);
@@ -5858,6 +5861,10 @@ void genX(batch_emit_secondary_call)(struct anv_batch *batch,
struct mi_builder b;
mi_builder_init(&b, device->info, batch);
mi_builder_set_mocs(&b, isl_mocs(&device->isl_dev, 0, false));
/* Make sure the write in the batch buffer lands before we just execute the
* jump.
*/
mi_builder_set_write_check(&b, true);
/* Emit a write to change the return address of the secondary */
struct mi_reloc_imm_token reloc =

View File

@@ -826,6 +826,7 @@ cmd_buffer_emit_rt_dispatch_globals_indirect(struct anv_cmd_buffer *cmd_buffer,
mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch);
const uint32_t mocs = anv_mocs_for_address(cmd_buffer->device, &rtdg_addr);
mi_builder_set_mocs(&b, mocs);
mi_builder_set_write_check(&b, true);
/* Fill the MissGroupTable, HitGroupTable & CallableGroupTable fields of
* RT_DISPATCH_GLOBALS using the mi_builder.
@@ -947,6 +948,7 @@ cmd_buffer_trace_rays(struct anv_cmd_buffer *cmd_buffer,
mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch);
const uint32_t mocs = anv_mocs_for_address(cmd_buffer->device, &rtdg_addr);
mi_builder_set_mocs(&b, mocs);
mi_builder_set_write_check(&b, true);
struct mi_value launch_size[3] = {
mi_mem32(anv_address_from_u64(params->launch_size_addr + 0)),

View File

@@ -580,6 +580,7 @@ genX(cmd_buffer_emit_indirect_generated_draws_inring)(struct anv_cmd_buffer *cmd
const uint32_t mocs = anv_mocs_for_address(cmd_buffer->device,
&draw_base_addr);
mi_builder_set_mocs(&b, mocs);
mi_builder_set_write_check(&b, true);
mi_store(&b, mi_mem32(draw_base_addr),
mi_iadd(&b, mi_mem32(draw_base_addr),

View File

@@ -13,6 +13,9 @@
*/
#define MI_BUILDER_NUM_ALLOC_GPRS 14
#define MI_BUILDER_CAN_WRITE_BATCH true
/* Don't do any write check by default, we manually set it where it matters.
*/
#define MI_BUILDER_DEFAULT_WRITE_CHECK false
#define __gen_get_batch_dwords anv_batch_emit_dwords
#define __gen_address_offset anv_address_add
#define __gen_get_batch_address(b, a) anv_batch_address(b, a)