nir/lower_wpos_center: Look at derefs for modes
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 13 Dec 2018 21:03:28 +0000 (15:03 -0600)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 18 Dec 2018 19:13:28 +0000 (13:13 -0600)
This is instead of looking all the way back to the variable which may
not exist for all derefs.  This makes this code properly ignore casts
with modes other than the mode[s] we care about (where casts aren't
allowed).

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/nir/nir_lower_wpos_center.c

index 74f4d2a970153848be8d55051eed06ce015660a3..3c114936f7e8aba5ca2d2022b15cb482064e50a7 100644 (file)
@@ -82,10 +82,12 @@ lower_wpos_center_block(nir_builder *b, nir_block *block,
          nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
          if (intr->intrinsic == nir_intrinsic_load_deref) {
             nir_deref_instr *deref = nir_src_as_deref(intr->src[0]);
+            if (deref->mode != nir_var_shader_in)
+               continue;
+
             nir_variable *var = nir_deref_instr_get_variable(deref);
 
-            if (var->data.mode == nir_var_shader_in &&
-                var->data.location == VARYING_SLOT_POS) {
+            if (var->data.location == VARYING_SLOT_POS) {
                /* gl_FragCoord should not have array/struct derefs: */
                assert(deref->deref_type == nir_deref_type_var);
                update_fragcoord(b, intr, for_sample_shading);