nir: Add a find_variable_with_[driver_]location helper
[mesa.git] / src / gallium / drivers / vc4 / vc4_nir_lower_io.c
index c82d99812259bf18d69038f88c2d2321350ed4e3..119ccf276d5f440d6945a6f416da9a0af46cee89 100644 (file)
@@ -24,6 +24,7 @@
 #include "vc4_qir.h"
 #include "compiler/nir/nir_builder.h"
 #include "util/format/u_format.h"
+#include "util/u_helpers.h"
 
 /**
  * Walks the NIR generated by TGSI-to-NIR or GLSL-to-NIR to lower its io
@@ -225,17 +226,6 @@ vc4_nir_lower_vertex_attr(struct vc4_compile *c, nir_builder *b,
         replace_intrinsic_with_vec(b, intr, dests);
 }
 
-static bool
-is_point_sprite(struct vc4_compile *c, nir_variable *var)
-{
-        if (var->data.location < VARYING_SLOT_VAR0 ||
-            var->data.location > VARYING_SLOT_VAR31)
-                return false;
-
-        return (c->fs_key->point_sprite_mask &
-                (1 << (var->data.location - VARYING_SLOT_VAR0)));
-}
-
 static void
 vc4_nir_lower_fs_input(struct vc4_compile *c, nir_builder *b,
                        nir_intrinsic_instr *intr)
@@ -249,20 +239,16 @@ vc4_nir_lower_fs_input(struct vc4_compile *c, nir_builder *b,
                 return;
         }
 
-        nir_variable *input_var = NULL;
-        nir_foreach_variable(var, &c->s->inputs) {
-                if (var->data.driver_location == nir_intrinsic_base(intr)) {
-                        input_var = var;
-                        break;
-                }
-        }
+        nir_variable *input_var =
+                nir_find_variable_with_driver_location(c->s, nir_var_shader_in,
+                                                       nir_intrinsic_base(intr));
         assert(input_var);
 
         int comp = nir_intrinsic_component(intr);
 
         /* Lower away point coordinates, and fix up PNTC. */
-        if (is_point_sprite(c, input_var) ||
-            input_var->data.location == VARYING_SLOT_PNTC) {
+        if (util_varying_is_point_coord(input_var->data.location,
+                                        c->fs_key->point_sprite_mask)) {
                 assert(intr->num_components == 1);
 
                 nir_ssa_def *result = &intr->dest.ssa;
@@ -300,13 +286,9 @@ static void
 vc4_nir_lower_output(struct vc4_compile *c, nir_builder *b,
                      nir_intrinsic_instr *intr)
 {
-        nir_variable *output_var = NULL;
-        nir_foreach_variable(var, &c->s->outputs) {
-                if (var->data.driver_location == nir_intrinsic_base(intr)) {
-                        output_var = var;
-                        break;
-                }
-        }
+        nir_variable *output_var =
+                nir_find_variable_with_driver_location(c->s, nir_var_shader_out,
+                                                       nir_intrinsic_base(intr));
         assert(output_var);
 
         if (c->stage == QSTAGE_COORD &&