Mesa (main): aco: Add load_sbt_amd intrinsic implementation.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue May 18 18:53:16 UTC 2021


Module: Mesa
Branch: main
Commit: bfe28021888f639f38e6dc8066b532347681fd7b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=bfe28021888f639f38e6dc8066b532347681fd7b

Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date:   Tue Mar 23 02:21:38 2021 +0100

aco: Add load_sbt_amd intrinsic implementation.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Rhys Perry <pendingchaos02 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9767>

---

 src/amd/compiler/aco_instruction_selection.cpp     | 26 ++++++++++++++++++++++
 .../compiler/aco_instruction_selection_setup.cpp   |  1 +
 2 files changed, 27 insertions(+)

diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp
index bb60ca99536..0794ca3596a 100644
--- a/src/amd/compiler/aco_instruction_selection.cpp
+++ b/src/amd/compiler/aco_instruction_selection.cpp
@@ -5067,6 +5067,29 @@ void visit_load_ubo(isel_context *ctx, nir_intrinsic_instr *instr)
                nir_intrinsic_align_mul(instr), nir_intrinsic_align_offset(instr));
 }
 
+void
+visit_load_sbt_amd(isel_context *ctx, nir_intrinsic_instr *instr)
+{
+   Temp dst = get_ssa_temp(ctx, &instr->dest.ssa);
+   Temp index = get_ssa_temp(ctx, instr->src[0].ssa);
+   unsigned binding = nir_intrinsic_binding(instr);
+   unsigned base = nir_intrinsic_base(instr);
+
+   index = as_vgpr(ctx, index);
+
+   Builder bld(ctx->program, ctx->block);
+   Temp desc_base = convert_pointer_to_64_bit(ctx, get_arg(ctx, ctx->args->ac.sbt_descriptors));
+   Operand desc_off = bld.copy(bld.def(s1), Operand(binding * 16u));
+   Temp rsrc = bld.smem(aco_opcode::s_load_dwordx4, bld.def(s4), desc_base, desc_off);
+
+   /* If we want more we need to implement */
+   assert(instr->dest.ssa.bit_size == 32);
+   assert(instr->num_components == 1);
+
+   bld.mubuf(aco_opcode::buffer_load_dword, Definition(dst), rsrc, index, Operand(0u), base, false,
+             false, true);
+}
+
 void visit_load_push_constant(isel_context *ctx, nir_intrinsic_instr *instr)
 {
    Builder bld(ctx->program, ctx->block);
@@ -8489,6 +8512,9 @@ void visit_intrinsic(isel_context *ctx, nir_intrinsic_instr *instr)
       bld.copy(Definition(get_ssa_temp(ctx, &instr->dest.ssa)), bool_to_vector_condition(ctx, shader_query_enabled));
       break;
    }
+   case nir_intrinsic_load_sbt_amd:
+      visit_load_sbt_amd(ctx, instr);
+      break;
    default:
       isel_err(&instr->instr, "Unimplemented intrinsic instr");
       abort();
diff --git a/src/amd/compiler/aco_instruction_selection_setup.cpp b/src/amd/compiler/aco_instruction_selection_setup.cpp
index a90f7c4e060..1e544a98787 100644
--- a/src/amd/compiler/aco_instruction_selection_setup.cpp
+++ b/src/amd/compiler/aco_instruction_selection_setup.cpp
@@ -804,6 +804,7 @@ void init_context(isel_context *ctx, nir_shader *shader)
                   case nir_intrinsic_load_initial_edgeflag_amd:
                   case nir_intrinsic_load_packed_passthrough_primitive_amd:
                   case nir_intrinsic_gds_atomic_add_amd:
+                  case nir_intrinsic_load_sbt_amd:
                      type = RegType::vgpr;
                      break;
                   case nir_intrinsic_shuffle:



More information about the mesa-commit mailing list