Mesa (7.9): glsl/linker: Free any IR discarded by optimization passes.
Ian Romanick
idr at kemper.freedesktop.org
Thu Dec 16 23:08:33 UTC 2010
Module: Mesa
Branch: 7.9
Commit: 0ab2bb8270fb3744fd067afbe5e056f454518e96
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0ab2bb8270fb3744fd067afbe5e056f454518e96
Author: Ian Romanick <ian.d.romanick at intel.com>
Date: Wed Dec 15 15:25:16 2010 -0800
glsl/linker: Free any IR discarded by optimization passes.
Previously, IR for a linked shader was allocated directly out of the
gl_shader object - meaning all of it lived as long as the shader.
Now, IR is allocated out of a temporary context, and any -live- IR is
reparented/stolen to (effectively) the gl_shader. Any remaining IR can
be freed.
NOTE: This is a candidate for the 7.9 branch.
(cherry picked from commit 2da02e75b17dcfb2efc3ce053c48339109bc0f26)
---
src/glsl/linker.cpp | 23 +++++++++++++++++++----
1 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 7f0695f..fab5344 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -713,7 +713,8 @@ get_main_function_signature(gl_shader *sh)
* shader is returned.
*/
static struct gl_shader *
-link_intrastage_shaders(GLcontext *ctx,
+link_intrastage_shaders(void *mem_ctx,
+ GLcontext *ctx,
struct gl_shader_program *prog,
struct gl_shader **shader_list,
unsigned num_shaders)
@@ -789,7 +790,7 @@ link_intrastage_shaders(GLcontext *ctx,
gl_shader *linked = ctx->Driver.NewShader(NULL, 0, main->Type);
linked->ir = new(linked) exec_list;
- clone_ir_list(linked, linked->ir, main->ir);
+ clone_ir_list(mem_ctx, linked->ir, main->ir);
populate_symbol_table(linked);
@@ -1376,6 +1377,8 @@ assign_varying_locations(struct gl_shader_program *prog,
void
link_shaders(GLcontext *ctx, struct gl_shader_program *prog)
{
+ void *mem_ctx = talloc_init("temporary linker context");
+
prog->LinkStatus = false;
prog->Validated = false;
prog->_Used = false;
@@ -1444,7 +1447,8 @@ link_shaders(GLcontext *ctx, struct gl_shader_program *prog)
*/
if (num_vert_shaders > 0) {
gl_shader *const sh =
- link_intrastage_shaders(ctx, prog, vert_shader_list, num_vert_shaders);
+ link_intrastage_shaders(mem_ctx, ctx, prog, vert_shader_list,
+ num_vert_shaders);
if (sh == NULL)
goto done;
@@ -1458,7 +1462,8 @@ link_shaders(GLcontext *ctx, struct gl_shader_program *prog)
if (num_frag_shaders > 0) {
gl_shader *const sh =
- link_intrastage_shaders(ctx, prog, frag_shader_list, num_frag_shaders);
+ link_intrastage_shaders(mem_ctx, ctx, prog, frag_shader_list,
+ num_frag_shaders);
if (sh == NULL)
goto done;
@@ -1565,4 +1570,14 @@ link_shaders(GLcontext *ctx, struct gl_shader_program *prog)
done:
free(vert_shader_list);
+
+ for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) {
+ if (prog->_LinkedShaders[i] == NULL)
+ continue;
+
+ /* Retain any live IR, but trash the rest. */
+ reparent_ir(prog->_LinkedShaders[i]->ir, prog->_LinkedShaders[i]->ir);
+ }
+
+ talloc_free(mem_ctx);
}
More information about the mesa-commit
mailing list