mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 20:28:04 +02:00
i965: Free dead GLSL IR one last time.
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. 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@whitecape.org> Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
This commit is contained in:
parent
797d606127
commit
a09c5b8527
1 changed files with 12 additions and 0 deletions
|
|
@ -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
|
||||
|
|
@ -250,6 +255,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",
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue