mesa/st: Make sure that prog_to_nir NIR gets freed.
authorEric Anholt <eric@anholt.net>
Wed, 13 Mar 2019 00:07:16 +0000 (17:07 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 14 Mar 2019 23:18:38 +0000 (16:18 -0700)
GLSL NIR gets freed on relink by _mesa_delete_program(), but for ARB
programs we need to free the old NIR when PSN is used to set up new NIR in
the same gl_program.  Additionally, set the base .nir field so that it
will get freed by _mesa_delete_program().

Fixes: 3d7611e9a6c6 ("st/nir: use NIR for asm programs")
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/state_tracker/st_program.c

index 7015e503d12839530a765fcebb7567783059694b..ebedf4daa21f43c33fbf62cd3f5eac3650233cdd 100644 (file)
@@ -579,8 +579,11 @@ st_translate_vertex_program(struct st_context *st,
       nir_shader *nir =
          st_translate_prog_to_nir(st, &stvp->Base, MESA_SHADER_VERTEX);
 
+      if (stvp->tgsi.ir.nir)
+         ralloc_free(stvp->tgsi.ir.nir);
       stvp->tgsi.type = PIPE_SHADER_IR_NIR;
       stvp->tgsi.ir.nir = nir;
+      stvp->Base.nir = nir;
       return true;
    }
 
@@ -763,8 +766,11 @@ st_translate_fragment_program(struct st_context *st,
       nir_shader *nir =
          st_translate_prog_to_nir(st, &stfp->Base, MESA_SHADER_FRAGMENT);
 
+      if (stfp->tgsi.ir.nir)
+         ralloc_free(stfp->tgsi.ir.nir);
       stfp->tgsi.type = PIPE_SHADER_IR_NIR;
       stfp->tgsi.ir.nir = nir;
+      stfp->Base.nir = nir;
       return true;
    }