Mesa (main): aco: use image_dim and image_array intrinsic indices
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Aug 4 12:27:40 UTC 2021
Module: Mesa
Branch: main
Commit: 566970f273be5e37c6f8e38ec061232efff32155
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=566970f273be5e37c6f8e38ec061232efff32155
Author: Rhys Perry <pendingchaos02 at gmail.com>
Date: Tue Aug 3 19:04:48 2021 +0100
aco: use image_dim and image_array intrinsic indices
Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12190>
---
src/amd/compiler/aco_instruction_selection.cpp | 50 +++++++++++---------------
1 file changed, 20 insertions(+), 30 deletions(-)
diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp
index 396045c60a1..0f1090e13e2 100644
--- a/src/amd/compiler/aco_instruction_selection.cpp
+++ b/src/amd/compiler/aco_instruction_selection.cpp
@@ -6028,12 +6028,12 @@ adjust_sample_index_using_fmask(isel_context* ctx, bool da, std::vector<Temp>& c
}
static std::vector<Temp>
-get_image_coords(isel_context* ctx, const nir_intrinsic_instr* instr, const struct glsl_type* type)
+get_image_coords(isel_context* ctx, const nir_intrinsic_instr* instr)
{
Temp src0 = get_ssa_temp(ctx, instr->src[1].ssa);
- enum glsl_sampler_dim dim = glsl_get_sampler_dim(type);
- bool is_array = glsl_sampler_type_is_array(type);
+ enum glsl_sampler_dim dim = nir_intrinsic_image_dim(instr);
+ bool is_array = nir_intrinsic_image_array(instr);
ASSERTED bool add_frag_pos =
(dim == GLSL_SAMPLER_DIM_SUBPASS || dim == GLSL_SAMPLER_DIM_SUBPASS_MS);
assert(!add_frag_pos && "Input attachments should be lowered.");
@@ -6134,9 +6134,8 @@ visit_image_load(isel_context* ctx, nir_intrinsic_instr* instr)
Builder bld(ctx->program, ctx->block);
const nir_variable* var =
nir_deref_instr_get_variable(nir_instr_as_deref(instr->src[0].ssa->parent_instr));
- const struct glsl_type* type = glsl_without_array(var->type);
- const enum glsl_sampler_dim dim = glsl_get_sampler_dim(type);
- bool is_array = glsl_sampler_type_is_array(type);
+ const enum glsl_sampler_dim dim = nir_intrinsic_image_dim(instr);
+ bool is_array = nir_intrinsic_image_array(instr);
bool is_sparse = instr->intrinsic == nir_intrinsic_image_deref_sparse_load;
Temp dst = get_ssa_temp(ctx, &instr->dest.ssa);
@@ -6195,7 +6194,7 @@ visit_image_load(isel_context* ctx, nir_intrinsic_instr* instr)
load->operands[3] = emit_tfe_init(bld, tmp);
ctx->block->instructions.emplace_back(std::move(load));
} else {
- std::vector<Temp> coords = get_image_coords(ctx, instr, type);
+ std::vector<Temp> coords = get_image_coords(ctx, instr);
bool level_zero = nir_src_is_const(instr->src[3]) && nir_src_as_uint(instr->src[3]) == 0;
aco_opcode opcode = level_zero ? aco_opcode::image_load : aco_opcode::image_load_mip;
@@ -6208,7 +6207,7 @@ visit_image_load(isel_context* ctx, nir_intrinsic_instr* instr)
load->dim = ac_get_image_dim(ctx->options->chip_class, dim, is_array);
load->dmask = dmask;
load->unrm = true;
- load->da = should_declare_array(ctx, dim, glsl_sampler_type_is_array(type));
+ load->da = should_declare_array(ctx, dim, is_array);
load->sync = sync;
load->tfe = is_sparse;
}
@@ -6229,9 +6228,8 @@ visit_image_store(isel_context* ctx, nir_intrinsic_instr* instr)
{
const nir_variable* var =
nir_deref_instr_get_variable(nir_instr_as_deref(instr->src[0].ssa->parent_instr));
- const struct glsl_type* type = glsl_without_array(var->type);
- const enum glsl_sampler_dim dim = glsl_get_sampler_dim(type);
- bool is_array = glsl_sampler_type_is_array(type);
+ const enum glsl_sampler_dim dim = nir_intrinsic_image_dim(instr);
+ bool is_array = nir_intrinsic_image_array(instr);
Temp data = get_ssa_temp(ctx, instr->src[3].ssa);
/* only R64_UINT and R64_SINT supported */
@@ -6275,7 +6273,7 @@ visit_image_store(isel_context* ctx, nir_intrinsic_instr* instr)
}
assert(data.type() == RegType::vgpr);
- std::vector<Temp> coords = get_image_coords(ctx, instr, type);
+ std::vector<Temp> coords = get_image_coords(ctx, instr);
Temp resource = get_sampler_desc(ctx, nir_instr_as_deref(instr->src[0].ssa->parent_instr),
ACO_DESC_IMAGE, nullptr, true);
@@ -6290,7 +6288,7 @@ visit_image_store(isel_context* ctx, nir_intrinsic_instr* instr)
store->dim = ac_get_image_dim(ctx->options->chip_class, dim, is_array);
store->dmask = (1 << data.size()) - 1;
store->unrm = true;
- store->da = should_declare_array(ctx, dim, glsl_sampler_type_is_array(type));
+ store->da = should_declare_array(ctx, dim, is_array);
store->disable_wqm = true;
store->sync = sync;
ctx->program->needs_exact = true;
@@ -6301,11 +6299,8 @@ void
visit_image_atomic(isel_context* ctx, nir_intrinsic_instr* instr)
{
bool return_previous = !nir_ssa_def_is_unused(&instr->dest.ssa);
- const nir_variable* var =
- nir_deref_instr_get_variable(nir_instr_as_deref(instr->src[0].ssa->parent_instr));
- const struct glsl_type* type = glsl_without_array(var->type);
- const enum glsl_sampler_dim dim = glsl_get_sampler_dim(type);
- bool is_array = glsl_sampler_type_is_array(type);
+ const enum glsl_sampler_dim dim = nir_intrinsic_image_dim(instr);
+ bool is_array = nir_intrinsic_image_array(instr);
Builder bld(ctx->program, ctx->block);
Temp data = as_vgpr(ctx, get_ssa_temp(ctx, instr->src[3].ssa));
@@ -6411,7 +6406,7 @@ visit_image_atomic(isel_context* ctx, nir_intrinsic_instr* instr)
return;
}
- std::vector<Temp> coords = get_image_coords(ctx, instr, type);
+ std::vector<Temp> coords = get_image_coords(ctx, instr);
Temp resource = get_sampler_desc(ctx, nir_instr_as_deref(instr->src[0].ssa->parent_instr),
ACO_DESC_IMAGE, nullptr, true);
Definition def = return_previous ? Definition(dst) : Definition();
@@ -6422,7 +6417,7 @@ visit_image_atomic(isel_context* ctx, nir_intrinsic_instr* instr)
mimg->dim = ac_get_image_dim(ctx->options->chip_class, dim, is_array);
mimg->dmask = (1 << data.size()) - 1;
mimg->unrm = true;
- mimg->da = should_declare_array(ctx, dim, glsl_sampler_type_is_array(type));
+ mimg->da = should_declare_array(ctx, dim, is_array);
mimg->disable_wqm = true;
mimg->sync = sync;
ctx->program->needs_exact = true;
@@ -6465,14 +6460,11 @@ get_buffer_size(isel_context* ctx, Temp desc, Temp dst)
void
visit_image_size(isel_context* ctx, nir_intrinsic_instr* instr)
{
- const nir_variable* var =
- nir_deref_instr_get_variable(nir_instr_as_deref(instr->src[0].ssa->parent_instr));
- const struct glsl_type* type = glsl_without_array(var->type);
- const enum glsl_sampler_dim dim = glsl_get_sampler_dim(type);
- bool is_array = glsl_sampler_type_is_array(type);
+ const enum glsl_sampler_dim dim = nir_intrinsic_image_dim(instr);
+ bool is_array = nir_intrinsic_image_array(instr);
Builder bld(ctx->program, ctx->block);
- if (glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_BUF) {
+ if (dim == GLSL_SAMPLER_DIM_BUF) {
Temp desc = get_sampler_desc(ctx, nir_instr_as_deref(instr->src[0].ssa->parent_instr),
ACO_DESC_BUFFER, NULL, false);
return get_buffer_size(ctx, desc, get_ssa_temp(ctx, &instr->dest.ssa));
@@ -6493,11 +6485,9 @@ visit_image_size(isel_context* ctx, nir_intrinsic_instr* instr)
uint8_t& dmask = mimg->dmask;
mimg->dim = ac_get_image_dim(ctx->options->chip_class, dim, is_array);
mimg->dmask = (1 << instr->dest.ssa.num_components) - 1;
- mimg->da = glsl_sampler_type_is_array(type);
+ mimg->da = is_array;
- if (ctx->options->chip_class == GFX9 &&
- glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_1D &&
- glsl_sampler_type_is_array(type)) {
+ if (ctx->options->chip_class == GFX9 && dim == GLSL_SAMPLER_DIM_1D && is_array) {
assert(instr->dest.ssa.num_components == 2);
dmask = 0x5;
}
More information about the mesa-commit
mailing list