r600/sfn: Use range_base for atomics and images

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21357>
This commit is contained in:
Gert Wollny 2023-01-31 16:49:51 +01:00 committed by Marge Bot
parent ee7953ab97
commit 8b5d41cacb
5 changed files with 19 additions and 7 deletions

View file

@ -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 |

View file

@ -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

View file

@ -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);

View file

@ -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;
};

View file

@ -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) {