From 8b5d41cacb51af551875bdeaa4faed0b61c15992 Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Tue, 31 Jan 2023 16:49:51 +0100 Subject: [PATCH] r600/sfn: Use range_base for atomics and images Signed-off-by: Gert Wollny Part-of: --- src/gallium/drivers/r600/r600_pipe_common.c | 4 +++- src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp | 3 ++- src/gallium/drivers/r600/sfn/sfn_nir.cpp | 3 ++- .../drivers/r600/sfn/sfn_nir_legalize_image_load_store.cpp | 12 +++++++++--- src/gallium/drivers/r600/sfn/sfn_shader.cpp | 4 +++- 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/gallium/drivers/r600/r600_pipe_common.c b/src/gallium/drivers/r600/r600_pipe_common.c index 5b0bd55..de9d2e2 100644 --- a/src/gallium/drivers/r600/r600_pipe_common.c +++ b/src/gallium/drivers/r600/r600_pipe_common.c @@ -1365,7 +1365,8 @@ bool r600_common_screen_init(struct r600_common_screen *rscreen, .lower_fpow = true, .lower_int64_options = ~0, .lower_cs_local_index_to_id = true, - .lower_uniforms_to_ubo = true + .lower_uniforms_to_ubo = true, + .lower_image_offset_to_range_base = 1 }; rscreen->nir_options = nir_options; @@ -1388,6 +1389,7 @@ bool r600_common_screen_init(struct r600_common_screen *rscreen, if (rscreen->info.gfx_level < CAYMAN) { rscreen->nir_options.lower_doubles_options = nir_lower_fp64_full_software; + rscreen->nir_options.lower_atomic_offset_to_range_base = true; } else { rscreen->nir_options.lower_doubles_options = nir_lower_ddiv | diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp index d620a2f..38fe563 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp @@ -26,6 +26,7 @@ #include "sfn_instr_mem.h" +#include "nir_intrinsics_indices.h" #include "sfn_instr_fetch.h" #include "sfn_instr_tex.h" #include "sfn_shader.h" @@ -885,7 +886,7 @@ RatInstr::emit_image_size(nir_intrinsic_instr *intrin, Shader& shader) auto const_offset = nir_src_as_const_value(intrin->src[0]); PRegister dyn_offset = nullptr; - int res_id = R600_IMAGE_REAL_RESOURCE_OFFSET; + int res_id = R600_IMAGE_REAL_RESOURCE_OFFSET + nir_intrinsic_range_base(intrin); if (const_offset) res_id += const_offset[0].u32; else diff --git a/src/gallium/drivers/r600/sfn/sfn_nir.cpp b/src/gallium/drivers/r600/sfn/sfn_nir.cpp index 049445c..5f75a6f 100644 --- a/src/gallium/drivers/r600/sfn/sfn_nir.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_nir.cpp @@ -402,7 +402,7 @@ r600_lower_deref_instr(nir_builder *b, nir_instr *instr_, UNUSED void *cb_data) b->cursor = nir_before_instr(&instr->instr); - nir_ssa_def *offset = nir_imm_int(b, var->data.index); + nir_ssa_def *offset = nir_imm_int(b, 0); for (nir_deref_instr *d = deref; d->deref_type != nir_deref_type_var; d = nir_deref_instr_parent(d)) { assert(d->deref_type == nir_deref_type_array); @@ -423,6 +423,7 @@ r600_lower_deref_instr(nir_builder *b, nir_instr *instr_, UNUSED void *cb_data) instr->intrinsic = op; nir_instr_rewrite_src(&instr->instr, &instr->src[0], nir_src_for_ssa(offset)); nir_intrinsic_set_base(instr, idx); + nir_intrinsic_set_range_base(instr, var->data.index); nir_deref_instr_remove_if_unused(deref); diff --git a/src/gallium/drivers/r600/sfn/sfn_nir_legalize_image_load_store.cpp b/src/gallium/drivers/r600/sfn/sfn_nir_legalize_image_load_store.cpp index ec2146b..db894d3 100644 --- a/src/gallium/drivers/r600/sfn/sfn_nir_legalize_image_load_store.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_nir_legalize_image_load_store.cpp @@ -26,6 +26,8 @@ #include "nir.h" #include "nir_builder.h" +#include "nir_intrinsics.h" +#include "nir_intrinsics_indices.h" #include "sfn_nir.h" static nir_ssa_def * @@ -57,7 +59,9 @@ r600_legalize_image_load_store_impl(nir_builder *b, /* Image exists start */ auto new_index = - nir_umin(b, ir->src[0].ssa, nir_imm_int(b, b->shader->info.num_images - 1)); + nir_umin(b, + ir->src[0].ssa, + nir_imm_int(b, b->shader->info.num_images - 1)); nir_instr_rewrite_src_ssa(instr, &ir->src[0], new_index); enum glsl_sampler_dim dim = nir_intrinsic_image_dim(ir); @@ -92,7 +96,8 @@ r600_legalize_image_load_store_impl(nir_builder *b, dim, nir_intrinsic_image_array(ir), nir_intrinsic_format(ir), - nir_intrinsic_access(ir)); + nir_intrinsic_access(ir), + nir_intrinsic_range_base(ir)); unsigned mask = (1 << num_components) - 1; unsigned num_src1_comp = MIN2(ir->src[1].ssa->num_components, num_components); @@ -187,8 +192,9 @@ r600_legalize_image_load_store_filter(const nir_instr *instr, UNUSED const void bool r600_legalize_image_load_store(nir_shader *shader) { - return nir_shader_lower_instructions(shader, + bool progress = nir_shader_lower_instructions(shader, r600_legalize_image_load_store_filter, r600_legalize_image_load_store_impl, nullptr); + return progress; }; diff --git a/src/gallium/drivers/r600/sfn/sfn_shader.cpp b/src/gallium/drivers/r600/sfn/sfn_shader.cpp index dac6ddc..e206189 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_shader.cpp @@ -29,6 +29,7 @@ #include "gallium/drivers/r600/r600_shader.h" #include "nir.h" #include "nir_intrinsics.h" +#include "nir_intrinsics_indices.h" #include "sfn_debug.h" #include "sfn_instr.h" #include "sfn_instr_alugroup.h" @@ -947,7 +948,8 @@ Shader::evaluate_resource_offset(nir_intrinsic_instr *instr, int src_id) auto& vf = value_factory(); PRegister uav_id{nullptr}; - int offset = 0; + int offset = nir_intrinsic_has_range_base(instr) ? + nir_intrinsic_range_base(instr) : 0; auto uav_id_const = nir_src_as_const_value(instr->src[src_id]); if (uav_id_const) { -- 2.7.4