radeonsi: remove in/out/uniform variables from NIR after lowering IO
authorMarek Olšák <marek.olsak@amd.com>
Fri, 14 Aug 2020 23:11:37 +0000 (19:11 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 3 Sep 2020 02:45:38 +0000 (22:45 -0400)
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6445>

src/gallium/drivers/radeonsi/si_shader_nir.c

index 00371224368dc60b66ae8b577494594245df9236..d9e3ac41868d6f276a0f3cdd3b02faf371f203c8 100644 (file)
@@ -752,6 +752,23 @@ static void si_lower_io(struct nir_shader *nir)
    NIR_PASS_V(nir, nir_opt_constant_folding);
    NIR_PASS_V(nir, nir_io_add_const_offset_to_base, nir_var_shader_in);
    NIR_PASS_V(nir, nir_io_add_const_offset_to_base, nir_var_shader_out);
+
+   /* Remove dead derefs, so that nir_validate doesn't fail. */
+   NIR_PASS_V(nir, nir_opt_dce);
+
+   /* Remove input and output nir_variables, because we don't need them
+    * anymore. Also remove uniforms, because those should have been lowered
+    * to UBOs already.
+    */
+   unsigned modes = nir_var_shader_in | nir_var_shader_out | nir_var_uniform;
+   nir_foreach_variable_with_modes_safe(var, nir, modes) {
+      if (var->data.mode == nir_var_uniform &&
+          (glsl_type_get_image_count(var->type) ||
+           glsl_type_get_sampler_count(var->type)))
+         continue;
+
+      exec_node_remove(&var->node);
+   }
 }
 
 /**