radv: Support nir_intrinsic_load_global_constant.

SPIR-V parsing can result in some direct constant usage for shader
records. Lower this early to a global based intrinsic so that it
doesn't interfere with the later 32-bit offset based constants
for scratch usage.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12592>
This commit is contained in:
Bas Nieuwenhuizen 2021-07-24 12:12:11 +02:00 committed by Marge Bot
parent 0d8bd8518d
commit 8ca54b4d38
4 changed files with 6 additions and 1 deletions

View file

@ -8187,6 +8187,7 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr)
case nir_intrinsic_image_deref_samples: visit_image_samples(ctx, instr); break;
case nir_intrinsic_load_ssbo: visit_load_ssbo(ctx, instr); break;
case nir_intrinsic_store_ssbo: visit_store_ssbo(ctx, instr); break;
case nir_intrinsic_load_global_constant:
case nir_intrinsic_load_global: visit_load_global(ctx, instr); break;
case nir_intrinsic_load_buffer_amd: visit_load_buffer(ctx, instr); break;
case nir_intrinsic_store_buffer_amd: visit_store_buffer(ctx, instr); break;

View file

@ -805,6 +805,7 @@ init_context(isel_context* ctx, nir_shader* shader)
case nir_intrinsic_load_ubo:
case nir_intrinsic_load_ssbo:
case nir_intrinsic_load_global:
case nir_intrinsic_load_global_constant:
case nir_intrinsic_vulkan_resource_index:
case nir_intrinsic_get_ssbo_size:
type = nir_dest_is_divergent(intrinsic->dest) ? RegType::vgpr : RegType::sgpr;

View file

@ -3703,6 +3703,7 @@ static void visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins
case nir_intrinsic_load_ssbo:
result = visit_load_buffer(ctx, instr);
break;
case nir_intrinsic_load_global_constant:
case nir_intrinsic_load_global:
result = visit_load_global(ctx, instr);
break;

View file

@ -516,6 +516,7 @@ radv_shader_compile_to_nir(struct radv_device *device, struct vk_shader_module *
.phys_ssbo_addr_format = nir_address_format_64bit_global,
.push_const_addr_format = nir_address_format_logical,
.shared_addr_format = nir_address_format_32bit_offset,
.constant_addr_format = nir_address_format_64bit_global,
.frag_coord_is_sysval = true,
.use_deref_buffer_array_length = true,
.debug =
@ -719,7 +720,8 @@ radv_shader_compile_to_nir(struct radv_device *device, struct vk_shader_module *
}
}
nir_lower_explicit_io(nir, nir_var_mem_global, nir_address_format_64bit_global);
nir_lower_explicit_io(nir, nir_var_mem_global | nir_var_mem_constant,
nir_address_format_64bit_global);
/* Lower large variables that are always constant with load_constant
* intrinsics, which get turned into PC-relative loads from a data