nir: rework nir_link_opt_varyings()
authorTimothy Arceri <tarceri@itsqueeze.com>
Wed, 19 Dec 2018 09:09:42 +0000 (20:09 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Wed, 2 Jan 2019 01:19:17 +0000 (12:19 +1100)
This just cleans things up a little and make things more safe for
derefs.

Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/compiler/nir/nir_linking_helpers.c

index b6eaebcb6a470f37e5a9ea538c7bead0c9df194f..c52e926ecbbddebe49c646b1348c1b45cd877650 100644 (file)
@@ -561,14 +561,8 @@ nir_link_xfb_varyings(nir_shader *producer, nir_shader *consumer)
 }
 
 static bool
-can_replace_varying(nir_intrinsic_instr *store_intr)
+can_replace_varying(nir_variable *out_var)
 {
-   nir_deref_instr *out_deref = nir_src_as_deref(store_intr->src[0]);
-   if (out_deref->mode != nir_var_shader_out)
-      return false;
-
-   nir_variable *out_var = nir_deref_instr_get_variable(out_deref);
-
    /* Skip types that require more complex handling.
     * TODO: add support for these types.
     */
@@ -581,7 +575,7 @@ can_replace_varying(nir_intrinsic_instr *store_intr)
    /* Limit this pass to scalars for now to keep things simple. Most varyings
     * should have been lowered to scalars at this point anyway.
     */
-   if (store_intr->num_components != 1)
+   if (!glsl_type_is_scalar(out_var->type))
       return false;
 
    if (out_var->data.location < VARYING_SLOT_VAR0 ||
@@ -592,12 +586,8 @@ can_replace_varying(nir_intrinsic_instr *store_intr)
 }
 
 static bool
-try_replace_constant_input(nir_shader *shader,
-                           nir_intrinsic_instr *store_intr)
+replace_constant_input(nir_shader *shader, nir_intrinsic_instr *store_intr)
 {
-   if (!can_replace_varying(store_intr))
-      return false;
-
    nir_function_impl *impl = nir_shader_get_entrypoint(shader);
 
    nir_builder b;
@@ -671,11 +661,17 @@ nir_link_opt_varyings(nir_shader *producer, nir_shader *consumer)
       if (intr->intrinsic != nir_intrinsic_store_deref)
          continue;
 
-      if (intr->src[1].ssa->parent_instr->type != nir_instr_type_load_const) {
+      nir_deref_instr *out_deref = nir_src_as_deref(intr->src[0]);
+      if (out_deref->mode != nir_var_shader_out)
+         continue;
+
+      nir_variable *out_var = nir_deref_instr_get_variable(out_deref);
+      if (!can_replace_varying(out_var))
          continue;
-      }
 
-      progress |= try_replace_constant_input(consumer, intr);
+      if (intr->src[1].ssa->parent_instr->type == nir_instr_type_load_const) {
+         progress |= replace_constant_input(consumer, intr);
+      }
    }
 
    return progress;