mesa: Branch 'glsl-compiler-1' - 7 commits

Brian Paul brianp at kemper.freedesktop.org
Mon Mar 26 15:08:22 UTC 2007


 src/mesa/main/context.c                        |    1 +
 src/mesa/shader/program.c                      |    4 +++-
 src/mesa/shader/shader_api.c                   |   16 ++++++++++++++++
 src/mesa/shader/shader_api.h                   |    3 +++
 src/mesa/shader/slang/slang_codegen.c          |   10 +++-------
 src/mesa/shader/slang/slang_compile.c          |   15 +++++++++------
 src/mesa/shader/slang/slang_compile_variable.c |    5 +++++
 src/mesa/shader/slang/slang_ir.c               |    2 +-
 8 files changed, 41 insertions(+), 15 deletions(-)

New commits:
diff-tree bb0393a0cdcabcb29ab7924cd4b3c4622fc2d787 (from 9fe342d1e6d3fbd150a1369380a1a4ecf82d6773)
Author: Brian <brian at nostromo.localnet.net>
Date:   Sat Mar 24 16:44:20 2007 -0600

    fix mem leak

diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c
index 2210b95..fa57ef8 100644
--- a/src/mesa/shader/slang/slang_codegen.c
+++ b/src/mesa/shader/slang/slang_codegen.c
@@ -1055,13 +1055,9 @@ _slang_gen_function_call(slang_assemble_
    }
 
    /* Replace the function call with the inlined block */
-#if 0
-   slang_operation_construct(oper);
-   slang_operation_copy(oper, inlined);
-#else
-   *oper = *inlined;  /* XXX slang_operation_copy() */
-#endif
-
+   slang_operation_destruct(oper);
+   *oper = *inlined;
+   /* XXX slang_operation_destruct(inlined) ??? */
 
 #if 0
    assert(inlined->locals);
diff-tree 9fe342d1e6d3fbd150a1369380a1a4ecf82d6773 (from cfdd07d7d394a2a595a545c0ef81d00dd6156742)
Author: Brian <brian at nostromo.localnet.net>
Date:   Sat Mar 24 16:43:44 2007 -0600

    disable free(var->aux) -- can lead to segfault

diff --git a/src/mesa/shader/slang/slang_compile_variable.c b/src/mesa/shader/slang/slang_compile_variable.c
index e099ecb..9a0b985 100644
--- a/src/mesa/shader/slang/slang_compile_variable.c
+++ b/src/mesa/shader/slang/slang_compile_variable.c
@@ -272,9 +272,11 @@ slang_variable_destruct(slang_variable *
       slang_operation_destruct(var->initializer);
       slang_alloc_free(var->initializer);
    }
+#if 0
    if (var->aux) {
       _mesa_free(var->aux);
    }
+#endif
 }
 
 
diff-tree cfdd07d7d394a2a595a545c0ef81d00dd6156742 (from 1968444bed931eeafdbe948a30bb871bfcf11b42)
Author: Brian <brian at nostromo.localnet.net>
Date:   Sat Mar 24 16:26:51 2007 -0600

    fix mem leak

diff --git a/src/mesa/shader/slang/slang_compile_variable.c b/src/mesa/shader/slang/slang_compile_variable.c
index ae37aed..e099ecb 100644
--- a/src/mesa/shader/slang/slang_compile_variable.c
+++ b/src/mesa/shader/slang/slang_compile_variable.c
@@ -272,6 +272,9 @@ slang_variable_destruct(slang_variable *
       slang_operation_destruct(var->initializer);
       slang_alloc_free(var->initializer);
    }
+   if (var->aux) {
+      _mesa_free(var->aux);
+   }
 }
 
 
diff-tree 1968444bed931eeafdbe948a30bb871bfcf11b42 (from 935f93f966aa298c4d4115ac766cb2ff46ad6514)
Author: Brian <brian at nostromo.localnet.net>
Date:   Sat Mar 24 16:22:35 2007 -0600

    fix some mem leaks

diff --git a/src/mesa/shader/slang/slang_compile.c b/src/mesa/shader/slang/slang_compile.c
index 619b0de..85dd158 100644
--- a/src/mesa/shader/slang/slang_compile.c
+++ b/src/mesa/shader/slang/slang_compile.c
@@ -691,7 +691,7 @@ parse_fully_specified_type(slang_parse_c
 /**
  * When parsing a compound production, this function is used to parse the
  * children.
- * For example, a a while-loop compound will have two children, the
+ * For example, a while-loop compound will have two children, the
  * while condition expression and the loop body.  So, this function will
  * be called twice to parse those two sub-expressions.
  * \param C  the parsing context
@@ -758,7 +758,7 @@ parse_statement(slang_parse_ctx * C, sla
          if (first_var < O->vars->num_variables) {
             const unsigned int num_vars = O->vars->num_variables - first_var;
             unsigned int i;
-
+            assert(oper->num_children == 0);
             oper->num_children = num_vars;
             oper->children = slang_operation_new(num_vars);
             if (oper->children == NULL) {
@@ -864,16 +864,18 @@ handle_nary_expression(slang_parse_ctx *
 {
    unsigned int i;
 
-   op->children =
-      (slang_operation *) slang_alloc_malloc(n * sizeof(slang_operation));
+   op->children = slang_operation_new(n);
    if (op->children == NULL) {
       slang_info_log_memory(C->L);
       return 0;
    }
    op->num_children = n;
 
-   for (i = 0; i < n; i++)
+   for (i = 0; i < n; i++) {
+      slang_operation_destruct(&op->children[i]);
       op->children[i] = (*ops)[*total_ops - (n + 1 - i)];
+   }
+
    (*ops)[*total_ops - (n + 1)] = (*ops)[*total_ops - 1];
    *total_ops -= n;
 
@@ -1153,7 +1155,8 @@ parse_expression(slang_parse_ctx * C, sl
    }
    C->I++;
 
-   *oper = *ops;
+   slang_operation_destruct(oper);
+   *oper = *ops; /* struct copy */
    slang_alloc_free(ops);
 
    return 1;
diff-tree 935f93f966aa298c4d4115ac766cb2ff46ad6514 (from 3493e867e9f2421425627a15eb5d2a2c554fbe8a)
Author: Brian <brian at nostromo.localnet.net>
Date:   Sat Mar 24 16:20:02 2007 -0600

    Free shader-related context state: _mesa_free_shader_state()

diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
index 0cff90c..72c85de 100644
--- a/src/mesa/main/context.c
+++ b/src/mesa/main/context.c
@@ -1439,6 +1439,7 @@ _mesa_free_context_data( GLcontext *ctx 
    _mesa_free_viewport_data( ctx );
    _mesa_free_colortables_data( ctx );
    _mesa_free_program_data(ctx);
+   _mesa_free_shader_state(ctx);
    _mesa_free_query_data(ctx);
 
 #if FEATURE_ARB_vertex_buffer_object
diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c
index 88aa8c5..002b427 100644
--- a/src/mesa/shader/shader_api.c
+++ b/src/mesa/shader/shader_api.c
@@ -212,6 +212,22 @@ _mesa_init_shader_state(GLcontext * ctx)
 
 
 /**
+ * Free the per-context shader-related state.
+ */
+void
+_mesa_free_shader_state(GLcontext *ctx)
+{
+   if (ctx->Shader.CurrentProgram) {
+      ctx->Shader.CurrentProgram->RefCount--;
+      if (ctx->Shader.CurrentProgram->RefCount <= 0) {
+         _mesa_free_shader_program(ctx, ctx->Shader.CurrentProgram);
+         ctx->Shader.CurrentProgram = NULL;
+      }
+   }
+}
+
+
+/**
  * Copy string from <src> to <dst>, up to maxLength characters, returning
  * length of <dst> in <length>.
  * \param src  the strings source
diff --git a/src/mesa/shader/shader_api.h b/src/mesa/shader/shader_api.h
index 315f60a..16ed1a0 100644
--- a/src/mesa/shader/shader_api.h
+++ b/src/mesa/shader/shader_api.h
@@ -38,6 +38,9 @@
 extern void
 _mesa_init_shader_state(GLcontext * ctx);
 
+extern void
+_mesa_free_shader_state(GLcontext *ctx);
+
 extern struct gl_shader_program *
 _mesa_new_shader_program(GLcontext *ctx, GLuint name);
 
diff-tree 3493e867e9f2421425627a15eb5d2a2c554fbe8a (from 49134e8e53d4ae114044ff90174a6777ffbecc60)
Author: Brian <brian at nostromo.localnet.net>
Date:   Sat Mar 24 16:18:13 2007 -0600

    free prog->Attributes in _mesa_delete_program()

diff --git a/src/mesa/shader/program.c b/src/mesa/shader/program.c
index c1606ac..e872d78 100644
--- a/src/mesa/shader/program.c
+++ b/src/mesa/shader/program.c
@@ -288,10 +288,12 @@ _mesa_delete_program(GLcontext *ctx, str
    if (prog->Parameters) {
       _mesa_free_parameter_list(prog->Parameters);
    }
-
    if (prog->Varying) {
       _mesa_free_parameter_list(prog->Varying);
    }
+   if (prog->Attributes) {
+      _mesa_free_parameter_list(prog->Attributes);
+   }
 
    /* XXX this is a little ugly */
    if (prog->Target == GL_VERTEX_PROGRAM_ARB) {
diff-tree 49134e8e53d4ae114044ff90174a6777ffbecc60 (from 0e71d08e8df7f59da74e78212fe8433ceb7c7315)
Author: Brian <brian at nostromo.localnet.net>
Date:   Sat Mar 24 15:29:10 2007 -0600

    fix mistake in _slang_free_ir()

diff --git a/src/mesa/shader/slang/slang_ir.c b/src/mesa/shader/slang/slang_ir.c
index 11c09d3..59aac73 100644
--- a/src/mesa/shader/slang/slang_ir.c
+++ b/src/mesa/shader/slang/slang_ir.c
@@ -150,7 +150,7 @@ _slang_free_ir(slang_ir_node *n)
    }
 
    for (i = 0; i < 3; i++)
-      _slang_free_ir_tree(n->Children[i]);
+      _slang_free_ir(n->Children[i]);
    /* Do not free n->List since it's a child elsewhere */
    free(n);
 }



More information about the mesa-commit mailing list