Mesa (master): aco: use binding chasing helpers
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Nov 27 13:30:58 UTC 2020
Module: Mesa
Branch: master
Commit: 5cf41814cd52f7de23e527518d1d90b8d346c78a
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=5cf41814cd52f7de23e527518d1d90b8d346c78a
Author: Rhys Perry <pendingchaos02 at gmail.com>
Date: Fri Oct 23 11:54:08 2020 +0100
aco: use binding chasing helpers
Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
Reviewed-by: Daniel Schürmann <daniel at schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7291>
---
src/amd/compiler/aco_instruction_selection.cpp | 10 +++---
src/amd/compiler/aco_instruction_selection.h | 46 +++++++++-----------------
2 files changed, 20 insertions(+), 36 deletions(-)
diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp
index 6cbb7949463..b5e49c266e2 100644
--- a/src/amd/compiler/aco_instruction_selection.cpp
+++ b/src/amd/compiler/aco_instruction_selection.cpp
@@ -5215,13 +5215,11 @@ void visit_load_ubo(isel_context *ctx, nir_intrinsic_instr *instr)
Builder bld(ctx->program, ctx->block);
- nir_alu_instr* mov_instr = nir_instr_as_alu(instr->src[0].ssa->parent_instr);
- nir_intrinsic_instr* idx_instr = nir_instr_as_intrinsic(mov_instr->src[0].src.ssa->parent_instr);
- unsigned desc_set = nir_intrinsic_desc_set(idx_instr);
- unsigned binding = nir_intrinsic_binding(idx_instr);
- radv_descriptor_set_layout *layout = ctx->options->layout->set[desc_set].layout;
+ nir_binding binding = nir_chase_binding(instr->src[0]);
+ assert(binding.success);
+ radv_descriptor_set_layout *layout = ctx->options->layout->set[binding.desc_set].layout;
- if (layout->binding[binding].type == VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT) {
+ if (layout->binding[binding.binding].type == VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT) {
uint32_t desc_type = S_008F0C_DST_SEL_X(V_008F0C_SQ_SEL_X) |
S_008F0C_DST_SEL_Y(V_008F0C_SQ_SEL_Y) |
S_008F0C_DST_SEL_Z(V_008F0C_SQ_SEL_Z) |
diff --git a/src/amd/compiler/aco_instruction_selection.h b/src/amd/compiler/aco_instruction_selection.h
index 49352c12688..d5200456bcc 100644
--- a/src/amd/compiler/aco_instruction_selection.h
+++ b/src/amd/compiler/aco_instruction_selection.h
@@ -133,48 +133,34 @@ inline Temp get_arg(isel_context *ctx, struct ac_arg arg)
}
inline void get_buffer_resource_flags(isel_context *ctx, nir_ssa_def *def, unsigned access,
- uint8_t **flags, uint32_t *count)
+ uint8_t **flags, uint32_t *count)
{
- int desc_set = -1;
- unsigned binding = 0;
-
- if (!def) {
- /* global resources are considered aliasing with all other buffers and
- * buffer images */
- // TODO: only merge flags of resources which can really alias.
- } else if (def->parent_instr->type == nir_instr_type_alu) {
- nir_alu_instr* mov_instr = nir_instr_as_alu(def->parent_instr);
- if (mov_instr->op == nir_op_mov && mov_instr->src[0].swizzle[0] == 0 &&
- mov_instr->src[0].src.ssa->parent_instr->type == nir_instr_type_intrinsic) {
- nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(mov_instr->src[0].src.ssa->parent_instr);
- if (intrin->intrinsic == nir_intrinsic_vulkan_resource_index) {
- desc_set = nir_intrinsic_desc_set(intrin);
- binding = nir_intrinsic_binding(intrin);
- }
- }
- } else if (def->parent_instr->type == nir_instr_type_deref) {
- nir_deref_instr *deref = nir_instr_as_deref(def->parent_instr);
- assert(deref->type->is_image());
- if (deref->type->sampler_dimensionality != GLSL_SAMPLER_DIM_BUF) {
+ nir_binding binding = {0};
+ /* global resources (def=NULL) are considered aliasing with all other buffers and
+ * buffer images */
+ // TODO: only merge flags of resources which can really alias.
+ if (def)
+ binding = nir_chase_binding(nir_src_for_ssa(def));
+
+ if (binding.var) {
+ const glsl_type *type = binding.var->type->without_array();
+ assert(type->is_image());
+ if (type->sampler_dimensionality != GLSL_SAMPLER_DIM_BUF) {
*flags = NULL;
*count = 0;
return;
}
-
- nir_variable *var = nir_deref_instr_get_variable(deref);
- desc_set = var->data.descriptor_set;
- binding = var->data.binding;
}
- if (desc_set < 0) {
+ if (!binding.success) {
*flags = ctx->buffer_resource_flags.data();
*count = ctx->buffer_resource_flags.size();
return;
}
- unsigned set_offset = ctx->resource_flag_offsets[desc_set];
+ unsigned set_offset = ctx->resource_flag_offsets[binding.desc_set];
- if (!(ctx->buffer_resource_flags[set_offset + binding] & buffer_is_restrict)) {
+ if (!(ctx->buffer_resource_flags[set_offset + binding.binding] & buffer_is_restrict)) {
/* Non-restrict buffers alias only with other non-restrict buffers.
* We reserve flags[0] for these. */
*flags = ctx->buffer_resource_flags.data();
@@ -182,7 +168,7 @@ inline void get_buffer_resource_flags(isel_context *ctx, nir_ssa_def *def, unsig
return;
}
- *flags = ctx->buffer_resource_flags.data() + set_offset + binding;
+ *flags = ctx->buffer_resource_flags.data() + set_offset + binding.binding;
*count = 1;
}
More information about the mesa-commit
mailing list