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:

committed by
Marge Bot

parent
d0890a0b8b
commit
a7ab31b96a
@@ -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);
|
||||||
|
|
||||||
|
@@ -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:
|
||||||
*
|
*
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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():
|
||||||
|
Reference in New Issue
Block a user