From 8ca54b4d383bf6675bbc16986c5880c1b2fa3072 Mon Sep 17 00:00:00 2001 From: Bas Nieuwenhuizen Date: Sat, 24 Jul 2021 12:12:11 +0200 Subject: [PATCH] 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 Part-of: --- src/amd/compiler/aco_instruction_selection.cpp | 1 + src/amd/compiler/aco_instruction_selection_setup.cpp | 1 + src/amd/llvm/ac_nir_to_llvm.c | 1 + src/amd/vulkan/radv_shader.c | 4 +++- 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index fff0609539d..6639d715f31 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -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; diff --git a/src/amd/compiler/aco_instruction_selection_setup.cpp b/src/amd/compiler/aco_instruction_selection_setup.cpp index bb2e930684e..767e6fbf124 100644 --- a/src/amd/compiler/aco_instruction_selection_setup.cpp +++ b/src/amd/compiler/aco_instruction_selection_setup.cpp @@ -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; diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c index 0f3524177b1..aae8fd77c78 100644 --- a/src/amd/llvm/ac_nir_to_llvm.c +++ b/src/amd/llvm/ac_nir_to_llvm.c @@ -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; diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 034f4503a3d..37d3b3be5b2 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -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