From a7ab31b96a069dc3fd6cdf034b1973b36f8513bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Roberto=20de=20Souza?= Date: Mon, 17 Jul 2023 14:14:38 -0700 Subject: [PATCH] anv: Set MI_MATH MOCS field MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MOCS = 0 is a invalid MOCS index, so it is necessary get a valid value and set to MI_MATH instructions. So here the mocs index is set with mi_builder_set_mocs(), it can be always set but it is required when mi_build will emit MI_MATH instructions. The mocs index will only be stored and used in gfx12.5+ platforms so no changes were are required in crocus or hasvk. Signed-off-by: José Roberto de Souza Reviewed-by: Kenneth Graunke Part-of: --- src/intel/vulkan/anv_private.h | 7 +++++++ src/intel/vulkan/genX_cmd_buffer.c | 22 +++++++++++++++++++--- src/intel/vulkan/genX_query.c | 5 +++++ src/intel/vulkan/grl/grl_metakernel_gen.py | 3 +++ 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index b2727e856f7..f659b3030e4 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1335,6 +1335,13 @@ anv_mocs(const struct anv_device *device, return isl_mocs(&device->isl_dev, usage, bo && bo->is_external); } +static inline uint32_t +anv_mocs_for_address(const struct anv_device *device, + struct anv_address *addr) +{ + return anv_mocs(device, addr->bo, 0); +} + void anv_device_init_blorp(struct anv_device *device); void anv_device_finish_blorp(struct anv_device *device); diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index d922c652ea4..24893775472 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -640,12 +640,14 @@ anv_cmd_compute_resolve_predicate(struct anv_cmd_buffer *cmd_buffer, enum isl_aux_op resolve_op, enum anv_fast_clear_type fast_clear_supported) { + struct anv_address addr = anv_image_get_fast_clear_type_addr(cmd_buffer->device, + image, aspect); struct mi_builder b; mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch); + const uint32_t mocs = anv_mocs_for_address(cmd_buffer->device, &addr); + mi_builder_set_mocs(&b, mocs); - const struct mi_value fast_clear_type = - mi_mem32(anv_image_get_fast_clear_type_addr(cmd_buffer->device, - image, aspect)); + const struct mi_value fast_clear_type = mi_mem32(addr); if (resolve_op == ISL_AUX_OP_FULL_RESOLVE) { /* In this case, we're doing a full resolve which means we want the @@ -4782,6 +4784,8 @@ void genX(CmdDrawIndirectByteCountEXT)( struct mi_builder b; mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch); + const uint32_t mocs = anv_mocs_for_address(cmd_buffer->device, &counter_buffer->address); + mi_builder_set_mocs(&b, mocs); struct mi_value count = mi_mem32(anv_address_add(counter_buffer->address, counterBufferOffset)); @@ -4838,6 +4842,8 @@ load_indirect_parameters(struct anv_cmd_buffer *cmd_buffer, struct mi_builder b; mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch); + const uint32_t mocs = anv_mocs_for_address(cmd_buffer->device, &addr); + mi_builder_set_mocs(&b, mocs); mi_store(&b, mi_reg32(GFX7_3DPRIM_VERTEX_COUNT), mi_mem32(anv_address_add(addr, 0))); @@ -5127,6 +5133,8 @@ emit_indirect_count_draws(struct anv_cmd_buffer *cmd_buffer, struct mi_builder b; mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch); + const uint32_t mocs = anv_mocs_for_address(cmd_buffer->device, &draw_count_addr); + mi_builder_set_mocs(&b, mocs); struct mi_value max = prepare_for_draw_count_predicate(cmd_buffer, &b, draw_count_addr); @@ -5549,6 +5557,8 @@ genX(CmdDrawMeshTasksIndirectCountEXT)( struct mi_builder b; mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch); + const uint32_t mocs = anv_mocs_for_address(cmd_buffer->device, &count_buffer->address); + mi_builder_set_mocs(&b, mocs); struct mi_value max = prepare_for_draw_count_predicate( @@ -6250,6 +6260,8 @@ cmd_buffer_emit_rt_dispatch_globals_indirect(struct anv_cmd_buffer *cmd_buffer, struct mi_builder b; 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); /* Fill the MissGroupTable, HitGroupTable & CallableGroupTable fields of * RT_DISPATCH_GLOBALS using the mi_builder. @@ -6362,6 +6374,8 @@ cmd_buffer_trace_rays(struct anv_cmd_buffer *cmd_buffer, struct mi_builder b; 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); struct mi_value launch_size[3] = { mi_mem32(anv_address_from_u64(params->launch_size_addr + 0)), @@ -7930,6 +7944,8 @@ void genX(CmdBeginConditionalRenderingEXT)( struct mi_builder b; mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch); + const uint32_t mocs = anv_mocs_for_address(cmd_buffer->device, &value_address); + mi_builder_set_mocs(&b, mocs); /* Section 19.4 of the Vulkan 1.1.85 spec says: * diff --git a/src/intel/vulkan/genX_query.c b/src/intel/vulkan/genX_query.c index 5ed693db5b5..5eedad512a1 100644 --- a/src/intel/vulkan/genX_query.c +++ b/src/intel/vulkan/genX_query.c @@ -1011,6 +1011,8 @@ void genX(CmdBeginQueryIndexedEXT)( struct mi_builder b; mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch); + const uint32_t mocs = anv_mocs_for_address(cmd_buffer->device, &query_addr); + mi_builder_set_mocs(&b, mocs); switch (pool->vk.query_type) { case VK_QUERY_TYPE_OCCLUSION: @@ -1539,6 +1541,9 @@ copy_query_results_with_cs(struct anv_cmd_buffer *cmd_buffer, for (uint32_t i = 0; i < query_count; i++) { struct anv_address query_addr = anv_query_address(pool, first_query + i); + const uint32_t mocs = anv_mocs_for_address(cmd_buffer->device, &query_addr); + + mi_builder_set_mocs(&b, mocs); /* Wait for the availability write to land before we go read the data */ if (flags & VK_QUERY_RESULT_WAIT_BIT) { diff --git a/src/intel/vulkan/grl/grl_metakernel_gen.py b/src/intel/vulkan/grl/grl_metakernel_gen.py index 0a14113a33e..6c416bd3d5d 100644 --- a/src/intel/vulkan/grl/grl_metakernel_gen.py +++ b/src/intel/vulkan/grl/grl_metakernel_gen.py @@ -822,6 +822,9 @@ class MetaKernel(object): w.write('struct mi_builder b;\n') w.write('mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch);\n') + w.write('/* TODO: use anv_mocs? */\n'); + w.write('const uint32_t mocs = isl_mocs(&cmd_buffer->device->isl_dev, 0, false);\n'); + w.write('mi_builder_set_mocs(&b, mocs);\n'); w.write('\n') for r in self.m.regs.values():