[Mesa-dev] [PATCH] i965: Free dead GLSL IR one last time.

Jason Ekstrand jason at jlekstrand.net
Thu Apr 2 10:36:44 PDT 2015


On Thu, Apr 2, 2015 at 2:04 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> While working on NIR's memory allocation model, I realized the GLSL IR
> memory model was broken.
>
> During glCompileShader, we allocate everything out of the
> _mesa_glsl_parse_state context, and reparent it to gl_shader at the end.
>
> During glLinkProgram, we allocate everything out of a temporary context,
> then reparent it to the exec_list containing the linked IR.
>
> But during brw_link_shader - the driver's final opportunity to do
> lowering and optimization - we just allocated everything out of the
> permanent context given to us by the linker.  That memory stayed
> forever.

So the optimization passes just keep everything in whatever memory
context the IR currently lives in?

Assuming that's correct,
Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>

Good find, Ken!
--Jason

> Notably, passes like brw_fs_channel_expressions cause us to churn the
> majority of the code, so we really want to free dead IR here.
>
> Saves 125MB of memory when replaying a Dota 2 trace on Broadwell.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/mesa/drivers/dri/i965/brw_shader.cpp | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
>
> This depends on my new ralloc_adopt() API, proposed here:
> http://lists.freedesktop.org/archives/mesa-dev/2015-March/080763.html
>
> XXX: need to confirm piglit results (I kicked off tests, but am waiting for results)
> XXX: should probably Cc stable.
>
> diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp
> index 0dda9bb..b923e54 100644
> --- a/src/mesa/drivers/dri/i965/brw_shader.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp
> @@ -144,6 +144,11 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)
>
>        _mesa_copy_linked_program_data((gl_shader_stage) stage, shProg, prog);
>
> +      /* Temporary memory context for any new IR. */
> +      void *mem_ctx = ralloc_context(NULL);
> +
> +      ralloc_adopt(mem_ctx, shader->base.ir);
> +
>        bool progress;
>
>        /* lower_packing_builtins() inserts arithmetic instructions, so it
> @@ -249,6 +254,13 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)
>
>        _mesa_reference_program(ctx, &prog, NULL);
>
> +      /* Now that we've finished altering the linked IR, reparent any live IR back
> +       * to the permanent memory context, and free the temporary one (discarding any
> +       * junk we optimized away).
> +       */
> +      reparent_ir(shader->base.ir, shader->base.ir);
> +      ralloc_free(mem_ctx);
> +
>        if (ctx->_Shader->Flags & GLSL_DUMP) {
>           fprintf(stderr, "\n");
>           fprintf(stderr, "GLSL IR for linked %s program %d:\n",
> --
> 2.3.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list