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