agx: Implement nir_intrinsic_load_coefficients_agx
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Thu, 3 Aug 2023 18:04:24 +0000 (14:04 -0400)
committerMarge Bot <emma+marge@anholt.net>
Fri, 11 Aug 2023 09:50:11 +0000 (09:50 +0000)
Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24498>

src/asahi/compiler/agx_compile.c

index 83d830b..a33ece7 100644 (file)
@@ -345,6 +345,22 @@ agx_format_for_pipe(enum pipe_format format)
 }
 
 static void
+agx_emit_load_coefficients(agx_builder *b, agx_index dest,
+                           nir_intrinsic_instr *instr)
+{
+   enum glsl_interp_mode mode = nir_intrinsic_interp_mode(instr);
+   bool smooth = (mode != INTERP_MODE_FLAT);
+   bool perspective = smooth && (mode != INTERP_MODE_NOPERSPECTIVE);
+
+   agx_index cf = agx_get_cf(b->shader, smooth, perspective,
+                             nir_intrinsic_io_semantics(instr).location,
+                             nir_intrinsic_component(instr), 1);
+
+   agx_ldcf_to(b, dest, cf, 1);
+   agx_emit_cached_split(b, dest, 3);
+}
+
+static void
 agx_emit_load_vary_flat(agx_builder *b, agx_index dest,
                         nir_intrinsic_instr *instr)
 {
@@ -953,6 +969,11 @@ agx_emit_intrinsic(agx_builder *b, nir_intrinsic_instr *instr)
       agx_emit_load_vary_flat(b, dst, instr);
       return NULL;
 
+   case nir_intrinsic_load_coefficients_agx:
+      assert(stage == MESA_SHADER_FRAGMENT);
+      agx_emit_load_coefficients(b, dst, instr);
+      return NULL;
+
    case nir_intrinsic_load_agx:
    case nir_intrinsic_load_constant_agx:
       agx_emit_load(b, dst, instr);