freedreno: Remove uniform variables after finalizing NIR.
authorEric Anholt <eric@anholt.net>
Thu, 18 Feb 2021 22:19:38 +0000 (14:19 -0800)
committerMarge Bot <eric+marge@anholt.net>
Wed, 24 Feb 2021 21:48:54 +0000 (21:48 +0000)
mesa/st optimizes the uniform storage if you have the finalize hook in
place, causing the uniforms declared to potentially not have storage in
the ParameterValues list any more.  If you leave your uniforms around in
the NIR, then a later finalization after variant creation will re-add the
uniforms to parameters, defeating the optimization and likely reallocating
the uniform storage (causing use-after-free).  So, we have to do this
before we can start using variants in mesa/st.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8997>

src/freedreno/ir3/ir3_nir.c

index 9ce2682..35bcad2 100644 (file)
@@ -332,6 +332,11 @@ ir3_finalize_nir(struct ir3_compiler *compiler, nir_shader *s)
                debug_printf("----------------------\n");
        }
 
+       nir_foreach_uniform_variable_safe(var, s) {
+               exec_node_remove(&var->node);
+       }
+       nir_validate_shader(s, "after uniform var removal");
+
        nir_sweep(s);
 }