anv: Set MI_MATH MOCS field

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 <jose.souza@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22508>
This commit is contained in:
José Roberto de Souza
2023-07-17 14:14:38 -07:00
committed by Marge Bot
parent d0890a0b8b
commit a7ab31b96a
4 changed files with 34 additions and 3 deletions

View File

@@ -1335,6 +1335,13 @@ anv_mocs(const struct anv_device *device,
return isl_mocs(&device->isl_dev, usage, bo && bo->is_external); 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_init_blorp(struct anv_device *device);
void anv_device_finish_blorp(struct anv_device *device); void anv_device_finish_blorp(struct anv_device *device);

View File

@@ -640,12 +640,14 @@ anv_cmd_compute_resolve_predicate(struct anv_cmd_buffer *cmd_buffer,
enum isl_aux_op resolve_op, enum isl_aux_op resolve_op,
enum anv_fast_clear_type fast_clear_supported) 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; struct mi_builder b;
mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch); 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 = const struct mi_value fast_clear_type = mi_mem32(addr);
mi_mem32(anv_image_get_fast_clear_type_addr(cmd_buffer->device,
image, aspect));
if (resolve_op == ISL_AUX_OP_FULL_RESOLVE) { if (resolve_op == ISL_AUX_OP_FULL_RESOLVE) {
/* In this case, we're doing a full resolve which means we want the /* 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; struct mi_builder b;
mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch); 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 = struct mi_value count =
mi_mem32(anv_address_add(counter_buffer->address, mi_mem32(anv_address_add(counter_buffer->address,
counterBufferOffset)); counterBufferOffset));
@@ -4838,6 +4842,8 @@ load_indirect_parameters(struct anv_cmd_buffer *cmd_buffer,
struct mi_builder b; struct mi_builder b;
mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch); 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_store(&b, mi_reg32(GFX7_3DPRIM_VERTEX_COUNT),
mi_mem32(anv_address_add(addr, 0))); 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; struct mi_builder b;
mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch); 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 = struct mi_value max =
prepare_for_draw_count_predicate(cmd_buffer, &b, draw_count_addr); prepare_for_draw_count_predicate(cmd_buffer, &b, draw_count_addr);
@@ -5549,6 +5557,8 @@ genX(CmdDrawMeshTasksIndirectCountEXT)(
struct mi_builder b; struct mi_builder b;
mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch); 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 = struct mi_value max =
prepare_for_draw_count_predicate( 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; struct mi_builder b;
mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch); 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 /* Fill the MissGroupTable, HitGroupTable & CallableGroupTable fields of
* RT_DISPATCH_GLOBALS using the mi_builder. * 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; struct mi_builder b;
mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch); 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] = { struct mi_value launch_size[3] = {
mi_mem32(anv_address_from_u64(params->launch_size_addr + 0)), mi_mem32(anv_address_from_u64(params->launch_size_addr + 0)),
@@ -7930,6 +7944,8 @@ void genX(CmdBeginConditionalRenderingEXT)(
struct mi_builder b; struct mi_builder b;
mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch); 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: /* Section 19.4 of the Vulkan 1.1.85 spec says:
* *

View File

@@ -1011,6 +1011,8 @@ void genX(CmdBeginQueryIndexedEXT)(
struct mi_builder b; struct mi_builder b;
mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch); 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) { switch (pool->vk.query_type) {
case VK_QUERY_TYPE_OCCLUSION: 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++) { for (uint32_t i = 0; i < query_count; i++) {
struct anv_address query_addr = anv_query_address(pool, first_query + 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 */ /* Wait for the availability write to land before we go read the data */
if (flags & VK_QUERY_RESULT_WAIT_BIT) { if (flags & VK_QUERY_RESULT_WAIT_BIT) {

View File

@@ -822,6 +822,9 @@ class MetaKernel(object):
w.write('struct mi_builder b;\n') w.write('struct mi_builder b;\n')
w.write('mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch);\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') w.write('\n')
for r in self.m.regs.values(): for r in self.m.regs.values():