diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 4bac9565a93..52eadcea41f 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -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 = diff --git a/src/intel/vulkan/genX_cmd_compute.c b/src/intel/vulkan/genX_cmd_compute.c index e6668228aac..5031ec4be01 100644 --- a/src/intel/vulkan/genX_cmd_compute.c +++ b/src/intel/vulkan/genX_cmd_compute.c @@ -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)), diff --git a/src/intel/vulkan/genX_cmd_draw_generated_indirect.h b/src/intel/vulkan/genX_cmd_draw_generated_indirect.h index fffc25e1fde..9c48ca0809c 100644 --- a/src/intel/vulkan/genX_cmd_draw_generated_indirect.h +++ b/src/intel/vulkan/genX_cmd_draw_generated_indirect.h @@ -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), diff --git a/src/intel/vulkan/genX_mi_builder.h b/src/intel/vulkan/genX_mi_builder.h index 33b4e821344..d225a49c094 100644 --- a/src/intel/vulkan/genX_mi_builder.h +++ b/src/intel/vulkan/genX_mi_builder.h @@ -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)