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

Brian Paul brianp at kemper.freedesktop.org
Tue Feb 27 01:08:29 UTC 2007


 src/mesa/main/shaders.c                         |    2 +
 src/mesa/shader/slang/slang_codegen.c           |   28 ++++++------------
 src/mesa/shader/slang/slang_compile.c           |   37 ++++++++++++++----------
 src/mesa/shader/slang/slang_compile_operation.c |    4 --
 src/mesa/shader/slang/slang_log.c               |    7 +++-
 src/mesa/shader/slang/slang_log.h               |    3 +
 src/mesa/shader/slang/slang_typeinfo.c          |    2 -
 src/mesa/shader/slang/slang_utility.c           |   14 +++++----
 8 files changed, 49 insertions(+), 48 deletions(-)

New commits:
diff-tree 4f26a52908d14b753199a529fd4c24da608ead29 (from 553fe132d4dec3283afd59f81357ebb3c2b94c06)
Author: Brian <brian at yutani.localnet.net>
Date:   Mon Feb 26 18:08:09 2007 -0700

    re-enable var scope destruct in slang_operation_destruct()

diff --git a/src/mesa/shader/slang/slang_compile_operation.c b/src/mesa/shader/slang/slang_compile_operation.c
index 288de2d..aa66be8 100644
--- a/src/mesa/shader/slang/slang_compile_operation.c
+++ b/src/mesa/shader/slang/slang_compile_operation.c
@@ -60,12 +60,8 @@ slang_operation_destruct(slang_operation
    for (i = 0; i < oper->num_children; i++)
       slang_operation_destruct(oper->children + i);
    slang_alloc_free(oper->children);
-   /*#define FREE_MEMORY*/
-#ifdef FREE_MEMORY
-   /* XXX revisit and fix memory coruption here ! */
    slang_variable_scope_destruct(oper->locals);
    slang_alloc_free(oper->locals);
-#endif
    oper->children = NULL;
    oper->num_children = 0;
    oper->locals = NULL;
diff-tree 553fe132d4dec3283afd59f81357ebb3c2b94c06 (from aa6f4241f8d9e301e056968a1eb85bb27b7fa55a)
Author: Brian <brian at yutani.localnet.net>
Date:   Mon Feb 26 18:07:26 2007 -0700

    Fix a few bugs in slang_operation variable scoping.  Seems to fix a double-free.

diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c
index efd3301..26be14a 100644
--- a/src/mesa/shader/slang/slang_codegen.c
+++ b/src/mesa/shader/slang/slang_codegen.c
@@ -457,7 +457,6 @@ new_float_literal(const float v[4])
  * Conditional jump.
  * \param zeroOrOne indicates if the jump is to be taken on zero, or non-zero
  *                  condition code state.
- * XXX maybe pass an IR node as second param to indicate the jump target???
  */
 static slang_ir_node *
 new_cjump(slang_label *dest, GLuint zeroOrOne)
@@ -470,7 +469,6 @@ new_cjump(slang_label *dest, GLuint zero
 
 /**
  * Unconditional jump.
- * XXX maybe pass an IR node as second param to indicate the jump target???
  */
 static slang_ir_node *
 new_jump(slang_label *dest)
@@ -641,12 +639,7 @@ slang_inline_asm_function(slang_assemble
    inlined->a_id = fun->body->children[0].a_id;
    inlined->num_children = numArgs;
    inlined->children = slang_operation_new(numArgs);
-#if 0
-   inlined->locals = slang_variable_scope_copy(oper->locals);
-#else
-   assert(inlined->locals);
    inlined->locals->outer_scope = oper->locals->outer_scope;
-#endif
 
    for (i = 0; i < numArgs; i++) {
       slang_operation_copy(inlined->children + i, args + i);
@@ -747,17 +740,19 @@ slang_substitute(slang_assemble_ctx *A, 
          blockOper = slang_operation_new(1);
          blockOper->type = SLANG_OPER_BLOCK_NO_NEW_SCOPE;
          blockOper->num_children = 2;
+         blockOper->locals->outer_scope = oper->locals->outer_scope;
          blockOper->children = slang_operation_new(2);
          assignOper = blockOper->children + 0;
          returnOper = blockOper->children + 1;
 
          assignOper->type = SLANG_OPER_ASSIGN;
          assignOper->num_children = 2;
+         assignOper->locals->outer_scope = blockOper->locals;
          assignOper->children = slang_operation_new(2);
          assignOper->children[0].type = SLANG_OPER_IDENTIFIER;
          assignOper->children[0].a_id = slang_atom_pool_atom(A->atoms, "__retVal");
-         assignOper->children[0].locals->outer_scope = oper->locals;
-         assignOper->locals = oper->locals;
+         assignOper->children[0].locals->outer_scope = assignOper->locals;
+
          slang_operation_copy(&assignOper->children[1],
                               &oper->children[0]);
 
@@ -872,11 +867,10 @@ slang_inline_function_call(slang_assembl
       declOper = &commaSeq->children[0];
       declOper->type = SLANG_OPER_VARIABLE_DECL;
       declOper->a_id = resultVar->a_name;
-      declOper->locals->outer_scope = commaSeq->locals; /*** ??? **/
+      declOper->locals->outer_scope = commaSeq->locals;
 
       /* child[1] = function body */
       inlined = &commaSeq->children[1];
-      /* XXXX this may be inappropriate!!!!: */
       inlined->locals->outer_scope = commaSeq->locals;
 
       /* child[2] = __resultTmp reference */
@@ -884,7 +878,6 @@ slang_inline_function_call(slang_assembl
       returnOper->type = SLANG_OPER_IDENTIFIER;
       returnOper->a_id = resultVar->a_name;
       returnOper->locals->outer_scope = commaSeq->locals;
-      declOper->locals->outer_scope = commaSeq->locals;
 
       top = commaSeq;
    }
@@ -993,7 +986,7 @@ slang_inline_function_call(slang_assembl
          */
 	 decl->type = SLANG_OPER_VARIABLE_DECL;
          assert(decl->locals);
-	 decl->locals = fun->parameters;
+         decl->locals->outer_scope = inlined->locals;
 	 decl->a_id = p->a_name;
 	 decl->num_children = 1;
 	 decl->children = slang_operation_new(1);
@@ -1027,13 +1020,12 @@ slang_inline_function_call(slang_assembl
 						       inlined->num_children);
 	 ass->type = SLANG_OPER_ASSIGN;
 	 ass->num_children = 2;
-	 ass->locals = _slang_variable_scope_new(inlined->locals);
-	 assert(ass->locals);
+         ass->locals->outer_scope = inlined->locals;
 	 ass->children = slang_operation_new(2);
 	 ass->children[0] = args[i]; /*XXX copy */
 	 ass->children[1].type = SLANG_OPER_IDENTIFIER;
 	 ass->children[1].a_id = p->a_name;
-	 ass->children[1].locals = _slang_variable_scope_new(ass->locals);
+         ass->children[1].locals->outer_scope = ass->locals;
       }
    }
 
@@ -1753,10 +1745,10 @@ _slang_gen_return(slang_assemble_ctx * A
 
       block = slang_operation_new(1);
       block->type = SLANG_OPER_BLOCK_NO_NEW_SCOPE;
-      block->num_children = 2;
-      block->children = slang_operation_new(2);
       assert(block->locals);
       block->locals->outer_scope = oper->locals->outer_scope;
+      block->num_children = 2;
+      block->children = slang_operation_new(2);
 
       /* child[0]: __retVal = expr; */
       assign = &block->children[0];
diff-tree aa6f4241f8d9e301e056968a1eb85bb27b7fa55a (from b58ea057feb7a00329fe92fe41e1d408e7c76065)
Author: Brian <brian at yutani.localnet.net>
Date:   Mon Feb 26 17:32:45 2007 -0700

    formatting fixes

diff --git a/src/mesa/shader/slang/slang_utility.c b/src/mesa/shader/slang/slang_utility.c
index 9b98a2c..0fbfcc5 100644
--- a/src/mesa/shader/slang/slang_utility.c
+++ b/src/mesa/shader/slang/slang_utility.c
@@ -31,11 +31,13 @@
 #include "imports.h"
 #include "slang_utility.h"
 
-char *slang_string_concat (char *dst, const char *src)
+char *
+slang_string_concat (char *dst, const char *src)
 {
-	return _mesa_strcpy (dst + _mesa_strlen (dst), src);
+   return _mesa_strcpy (dst + _mesa_strlen (dst), src);
 }
 
+
 /* slang_string */
 
 GLvoid
@@ -156,8 +158,8 @@ slang_atom_pool_destruct (slang_atom_poo
          slang_alloc_free(entry->id);
          slang_alloc_free(entry);
          entry = next;
-		}
-	}
+      }
+   }
 }
 
 /*
@@ -211,11 +213,11 @@ slang_atom_pool_atom(slang_atom_pool * p
    return (slang_atom) (**entry).id;
 }
 
-/*
+/**
  * Return the name of a given atom.
  */
 const char *
 slang_atom_pool_id(slang_atom_pool * pool, slang_atom atom)
 {
-	return (const char *) (atom);
+   return (const char *) (atom);
 }
diff-tree b58ea057feb7a00329fe92fe41e1d408e7c76065 (from 4b8d75e2e6ba72bbf772a75d7167c537c6e630f7)
Author: Brian <brian at yutani.localnet.net>
Date:   Mon Feb 26 17:00:06 2007 -0700

    fix mem leak in _mesa_ShaderSourceARB()

diff --git a/src/mesa/main/shaders.c b/src/mesa/main/shaders.c
index 73f27ed..5bd4a3f 100644
--- a/src/mesa/main/shaders.c
+++ b/src/mesa/main/shaders.c
@@ -422,6 +422,8 @@ _mesa_ShaderSourceARB(GLhandleARB shader
    source[offsets[count - 1]] = '\0';
 
    ctx->Driver.ShaderSource(ctx, shaderObj, source);
+
+   _mesa_free(offsets);
 }
 
 
diff-tree 4b8d75e2e6ba72bbf772a75d7167c537c6e630f7 (from f446e58e45d7317173497eddbd8b26ea6c28fcb4)
Author: Brian <brian at yutani.localnet.net>
Date:   Mon Feb 26 16:32:00 2007 -0700

    fix logic for reporting errors

diff --git a/src/mesa/shader/slang/slang_compile.c b/src/mesa/shader/slang/slang_compile.c
index dc2e680..4609de6 100644
--- a/src/mesa/shader/slang/slang_compile.c
+++ b/src/mesa/shader/slang/slang_compile.c
@@ -1898,6 +1898,17 @@ compile_with_grammar(grammar id, const c
       grammar_get_last_error((byte *) (buf), sizeof(buf), &pos);
       slang_info_log_error(infolog, buf);
       /* syntax error (possibly in library code) */
+#if 0
+      {
+         int line, col;
+         char *s;
+         s = (char *) _mesa_find_line_column((const GLubyte *) source,
+                                             (const GLubyte *) source + pos,
+                                             &line, &col);
+         printf("Error on line %d, col %d: %s\n", line, col, s);
+      }
+#endif
+      return GL_FALSE;
    }
    slang_string_free(&preprocessed);
 
@@ -2070,16 +2081,19 @@ _slang_compile(GLcontext *ctx, struct gl
 
    success = compile_shader(ctx, &obj, type, &info_log, shader);
 
-   if (!success || info_log.error_flag) {
-      success = GL_FALSE;
+   /* free shader's prev info log */
+   if (shader->InfoLog) {
+      _mesa_free(shader->InfoLog);
+      shader->InfoLog = NULL;
+   }
+
+   if (info_log.text) {
       /* copy info-log string to shader object */
-      if (info_log.text) {
-         if (shader->InfoLog) {
-            free(shader->InfoLog);
-            shader->InfoLog = NULL;
-         }
-         shader->InfoLog = strdup(info_log.text);
-      }
+      shader->InfoLog = _mesa_strdup(info_log.text);
+   }
+
+   if (info_log.error_flag) {
+      success = GL_FALSE;
    }
 
    slang_info_log_destruct(&info_log);
diff-tree f446e58e45d7317173497eddbd8b26ea6c28fcb4 (from 6817407d498ff0c5074321b965673f6efdaaeb21)
Author: Brian <brian at yutani.localnet.net>
Date:   Mon Feb 26 15:13:34 2007 -0700

    disable execute bit

diff --git a/src/mesa/shader/grammar/grammar_crt.c b/src/mesa/shader/grammar/grammar_crt.c
old mode 100755
new mode 100644
diff --git a/src/mesa/shader/grammar/grammar_crt.h b/src/mesa/shader/grammar/grammar_crt.h
old mode 100755
new mode 100644
diff-tree 6817407d498ff0c5074321b965673f6efdaaeb21 (from 365f8fb0dd19a8fa43b1de8e89793059095981db)
Author: Brian <brian at yutani.localnet.net>
Date:   Mon Feb 26 15:06:56 2007 -0700

    fix error flagging

diff --git a/src/mesa/shader/slang/slang_compile.c b/src/mesa/shader/slang/slang_compile.c
index 1a4c7d3..dc2e680 100644
--- a/src/mesa/shader/slang/slang_compile.c
+++ b/src/mesa/shader/slang/slang_compile.c
@@ -2070,16 +2070,9 @@ _slang_compile(GLcontext *ctx, struct gl
 
    success = compile_shader(ctx, &obj, type, &info_log, shader);
 
-   if (success && !info_log.text) {
-#if 0
-      slang_create_uniforms(&object->expdata, shader);
-      _mesa_print_program(program);
-      _mesa_print_program_parameters(ctx, program);
-#endif
-   }
-   else {
+   if (!success || info_log.error_flag) {
       success = GL_FALSE;
-      /* XXX more work on info log needed here */
+      /* copy info-log string to shader object */
       if (info_log.text) {
          if (shader->InfoLog) {
             free(shader->InfoLog);
diff --git a/src/mesa/shader/slang/slang_log.c b/src/mesa/shader/slang/slang_log.c
index b6545b2..e838744 100644
--- a/src/mesa/shader/slang/slang_log.c
+++ b/src/mesa/shader/slang/slang_log.c
@@ -34,7 +34,8 @@ void
 slang_info_log_construct(slang_info_log * log)
 {
    log->text = NULL;
-   log->dont_free_text = 0;
+   log->dont_free_text = GL_FALSE;
+   log->error_flag = GL_FALSE;
 }
 
 void
@@ -97,6 +98,7 @@ slang_info_log_error(slang_info_log * lo
    va_start(va, msg);
    _mesa_vsprintf(buf, msg, va);
    va_end(va);
+   log->error_flag = GL_TRUE;
    if (slang_info_log_message(log, "Error", buf))
       return 1;
    slang_info_log_memory(log);
@@ -122,7 +124,8 @@ void
 slang_info_log_memory(slang_info_log * log)
 {
    if (!slang_info_log_message(log, "Error", "Out of memory.")) {
-      log->dont_free_text = 1;
+      log->dont_free_text = GL_TRUE;
+      log->error_flag = GL_TRUE;
       log->text = out_of_memory;
    }
 }
diff --git a/src/mesa/shader/slang/slang_log.h b/src/mesa/shader/slang/slang_log.h
index e4ca3a2..dcaba02 100644
--- a/src/mesa/shader/slang/slang_log.h
+++ b/src/mesa/shader/slang/slang_log.h
@@ -30,7 +30,8 @@
 typedef struct slang_info_log_
 {
    char *text;
-   int dont_free_text;
+   GLboolean dont_free_text;
+   GLboolean error_flag;
 } slang_info_log;
 
 
diff-tree 365f8fb0dd19a8fa43b1de8e89793059095981db (from ed0ae62ad746d10fe546c900a42e55af5d05c227)
Author: Brian <brian at yutani.localnet.net>
Date:   Mon Feb 26 15:02:36 2007 -0700

    re-enable some code

diff --git a/src/mesa/shader/slang/slang_typeinfo.c b/src/mesa/shader/slang/slang_typeinfo.c
index fe38349..07ec514 100644
--- a/src/mesa/shader/slang/slang_typeinfo.c
+++ b/src/mesa/shader/slang/slang_typeinfo.c
@@ -605,13 +605,11 @@ _slang_typeof_operation_(const slang_ope
             slang_type_specifier_type base;
 
             /* determine the swizzle of the field expression */
-#if 000 /*XXX re-enable? */
             if (!_slang_type_is_vector(_ti.spec.type)) {
                slang_typeinfo_destruct(&_ti);
                slang_info_log_error(log, "Can't swizzle scalar expression");
                return GL_FALSE;
             }
-#endif
             rows = _slang_type_dim(_ti.spec.type);
             swizzle = slang_atom_pool_id(atoms, op->a_id);
             if (!_slang_is_swizzle(swizzle, rows, &ti->swz)) {



More information about the mesa-commit mailing list