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

Brian Paul brianp at kemper.freedesktop.org
Wed Mar 14 19:34:40 UTC 2007


 src/mesa/shader/slang/slang_builtin.c  |    8 -
 src/mesa/shader/slang/slang_emit.c     |    1 
 src/mesa/shader/slang/slang_typeinfo.c |  150 ++++++++++++++++++---------------
 src/mesa/shader/slang/slang_typeinfo.h |   18 ---
 4 files changed, 93 insertions(+), 84 deletions(-)

New commits:
diff-tree 62b4601e53438096f362657bec2c4c238279509f (from 565d097d8feb201a0be2ee41f0413cac2593990f)
Author: Brian <brian at yutani.localnet.net>
Date:   Wed Mar 14 13:34:30 2007 -0600

    s/Tranpose/Transpose/

diff --git a/src/mesa/shader/slang/slang_builtin.c b/src/mesa/shader/slang/slang_builtin.c
index cba11b4..6ee0fd3 100644
--- a/src/mesa/shader/slang/slang_builtin.c
+++ b/src/mesa/shader/slang/slang_builtin.c
@@ -66,17 +66,17 @@ lookup_statevar(const char *var, GLint i
 
       { "gl_ProjectionMatrix", STATE_PROJECTION_MATRIX, STATE_MATRIX_TRANSPOSE },
       { "gl_ProjectionMatrixInverse", STATE_PROJECTION_MATRIX, STATE_MATRIX_INVTRANS },
-      { "gl_ProjectionMatrixTranpose", STATE_PROJECTION_MATRIX, 0 },
-      { "gl_ProjectionMatrixInverseTranpose", STATE_PROJECTION_MATRIX, STATE_MATRIX_INVERSE },
+      { "gl_ProjectionMatrixTranspose", STATE_PROJECTION_MATRIX, 0 },
+      { "gl_ProjectionMatrixInverseTranspose", STATE_PROJECTION_MATRIX, STATE_MATRIX_INVERSE },
 
       { "gl_ModelViewProjectionMatrix", STATE_MVP_MATRIX, STATE_MATRIX_TRANSPOSE },
       { "gl_ModelViewProjectionMatrixInverse", STATE_MVP_MATRIX, STATE_MATRIX_INVTRANS },
       { "gl_ModelViewProjectionMatrixTranspose", STATE_MVP_MATRIX, 0 },
-      { "gl_ModelViewProjectionMatrixInverseTranpose", STATE_MVP_MATRIX, STATE_MATRIX_INVERSE },
+      { "gl_ModelViewProjectionMatrixInverseTranspose", STATE_MVP_MATRIX, STATE_MATRIX_INVERSE },
 
       { "gl_TextureMatrix", STATE_TEXTURE_MATRIX, STATE_MATRIX_TRANSPOSE },
       { "gl_TextureMatrixInverse", STATE_TEXTURE_MATRIX, STATE_MATRIX_INVTRANS },
-      { "gl_TextureMatrixTranpose", STATE_TEXTURE_MATRIX, 0 },
+      { "gl_TextureMatrixTranspose", STATE_TEXTURE_MATRIX, 0 },
       { "gl_TextureMatrixInverseTranspose", STATE_TEXTURE_MATRIX, STATE_MATRIX_INVERSE },
 
       /* XXX verify these!!! */
diff-tree 565d097d8feb201a0be2ee41f0413cac2593990f (from 2dc3e944704dd90eb4324babac070b7e2fff70fc)
Author: Brian <brian at yutani.localnet.net>
Date:   Wed Mar 14 11:07:32 2007 -0600

    continue prev check-in: save ptr to slang_function for SLANG_OPER_CALL

diff --git a/src/mesa/shader/slang/slang_typeinfo.c b/src/mesa/shader/slang/slang_typeinfo.c
index a9e1261..fef5575 100644
--- a/src/mesa/shader/slang/slang_typeinfo.c
+++ b/src/mesa/shader/slang/slang_typeinfo.c
@@ -576,17 +576,24 @@ _slang_typeof_operation_(slang_operation
       }
       break;
    case SLANG_OPER_CALL:
-      {
+      if (op->fun) {
+         /* we've resolved this call before */
+         slang_type_specifier_copy(&ti->spec, &op->fun->header.type.specifier);
+      }
+      else {
          slang_function *fun;
-
          if (!_slang_typeof_function(op->a_id, op->children, op->num_children,
                                      space, &ti->spec, &fun, atoms, log))
             return GL_FALSE;
-         if (!fun) {
-            /* Look for struct initializer? */
+         if (fun) {
+            /* save result for future use */
+            op->fun = fun;
+         }
+         else {
             slang_struct *s =
                slang_struct_scope_find(space->structs, op->a_id, GL_TRUE);
-            if (s != NULL) {
+            if (s) {
+               /* struct initializer */
                ti->spec.type = SLANG_SPEC_STRUCT;
                ti->spec._struct =
                   (slang_struct *) slang_alloc_malloc(sizeof(slang_struct));
@@ -601,6 +608,7 @@ _slang_typeof_operation_(slang_operation
                   return GL_FALSE;
             }
             else {
+               /* float, int, vec4, mat3, etc. constructor? */
                const char *name;
                slang_type_specifier_type type;
 
diff-tree 2dc3e944704dd90eb4324babac070b7e2fff70fc (from b1a955b5186d9d455416534bcdc170373c7393d9)
Author: Brian <brian at yutani.localnet.net>
Date:   Wed Mar 14 10:49:35 2007 -0600

    After we've found the slang_function ptr for a SLANG_OPER_CALL node, save the ptr in the node for reuse.
    
    This can save a tremendous amount of time when resolving types in complex
    expressions.  One particular shader was taking several minutes to compile
    but now compiles almost instantaneoulsy.

diff --git a/src/mesa/shader/slang/slang_typeinfo.c b/src/mesa/shader/slang/slang_typeinfo.c
index a3a37ce..a9e1261 100644
--- a/src/mesa/shader/slang/slang_typeinfo.c
+++ b/src/mesa/shader/slang/slang_typeinfo.c
@@ -36,33 +36,6 @@
 
 
 /**
- * Determine the return type of a function.
- * \param a_name  the function name
- * \param param  function parameters (overloading)
- * \param num_params  number of parameters to function
- * \param space  namespace to search
- * \param spec  returns the type
- * \param exists  returns GL_TRUE or GL_FALSE to indicate existance of function
- * \return GL_TRUE for success, GL_FALSE if failure (bad function name)
- */
-static GLboolean
-_slang_typeof_function(slang_atom a_name, const slang_operation * params,
-                       GLuint num_params,
-                       const slang_name_space * space,
-                       slang_type_specifier * spec, GLboolean * exists,
-                       slang_atom_pool *atoms, slang_info_log *log)
-{
-   slang_function *fun;
-   fun = _slang_locate_function(space->funcs, a_name, params,
-                                num_params, space, atoms, log);
-   *exists = fun != NULL;
-   if (!fun)
-      return GL_TRUE;  /* yes, not false */
-   return slang_type_specifier_copy(spec, &fun->header.type.specifier);
-}
-
-
-/**
  * Checks if a field selector is a general swizzle (an r-value swizzle
  * with replicated components or an l-value swizzle mask) for a
  * vector.  Returns GL_TRUE if this is the case, <swz> is filled with
@@ -312,10 +285,36 @@ slang_typeinfo_destruct(slang_typeinfo *
 }
 
 
+
+/**
+ * Determine the return type of a function.
+ * \param a_name  the function name
+ * \param param  function parameters (overloading)
+ * \param num_params  number of parameters to function
+ * \param space  namespace to search
+ * \param spec  returns the type
+ * \param funFound  returns pointer to the function, or NULL if not found.
+ * \return GL_TRUE for success, GL_FALSE if failure (bad function name)
+ */
+static GLboolean
+_slang_typeof_function(slang_atom a_name,
+                       slang_operation * params, GLuint num_params,
+                       const slang_name_space * space,
+                       slang_type_specifier * spec,
+                       slang_function **funFound,
+                       slang_atom_pool *atoms, slang_info_log *log)
+{
+   *funFound = _slang_locate_function(space->funcs, a_name, params,
+                                      num_params, space, atoms, log);
+   if (!*funFound)
+      return GL_TRUE;  /* yes, not false */
+   return slang_type_specifier_copy(spec, &(*funFound)->header.type.specifier);
+}
+
+
 /**
- * Determine the return type of a function.  This involves searching for
- * the function by name and matching parameter types.
- * \param name  name of the function
+ * Determine the type of a math function.
+ * \param name  name of the operator, one of +,-,*,/ or unary -
  * \param params  array of function parameters
  * \param num_params  number of parameters
  * \param space  namespace to use
@@ -324,26 +323,41 @@ slang_typeinfo_destruct(slang_typeinfo *
  * \return GL_TRUE for success, GL_FALSE if failure
  */
 static GLboolean
-typeof_existing_function(const char *name, const slang_operation * params,
-                         GLuint num_params,
-                         const slang_name_space * space,
-                         slang_type_specifier * spec,
-                         slang_atom_pool * atoms,
-                         slang_info_log *log)
-{
-   slang_atom atom;
-   GLboolean exists;
-
-   atom = slang_atom_pool_atom(atoms, name);
-   if (!_slang_typeof_function(atom, params, num_params, space, spec,
-                               &exists, atoms, log))
+typeof_math_call(const char *name, slang_operation *call,
+                 const slang_name_space * space,
+                 slang_type_specifier * spec,
+                 slang_atom_pool * atoms,
+                 slang_info_log *log)
+{
+   if (call->fun) {
+      /* we've previously resolved this function call */
+      slang_type_specifier_copy(spec, &call->fun->header.type.specifier);
+      return GL_TRUE;
+   }
+   else {
+      slang_atom atom;
+      slang_function *fun;
+
+      /* number of params: */
+      assert(call->num_children == 1 || call->num_children == 2);
+
+      atom = slang_atom_pool_atom(atoms, name);
+      if (!_slang_typeof_function(atom, call->children, call->num_children,
+                                  space, spec, &fun, atoms, log))
+         return GL_FALSE;
+
+      if (fun) {
+         /* Save pointer to save time in future */
+         call->fun = fun;
+         return GL_TRUE;
+      }
       return GL_FALSE;
-   return exists;
+   }
 }
 
 GLboolean
 _slang_typeof_operation(const slang_assemble_ctx * A,
-                        const slang_operation * op,
+                        slang_operation * op,
                         slang_typeinfo * ti)
 {
    return _slang_typeof_operation_(op, &A->space, ti, A->atoms, A->log);
@@ -359,7 +373,7 @@ _slang_typeof_operation(const slang_asse
  * \return GL_TRUE for success, GL_FALSE if failure
  */
 GLboolean
-_slang_typeof_operation_(const slang_operation * op,
+_slang_typeof_operation_(slang_operation * op,
                          const slang_name_space * space,
                          slang_typeinfo * ti,
                          slang_atom_pool * atoms,
@@ -500,26 +514,26 @@ _slang_typeof_operation_(const slang_ope
       /*case SLANG_OPER_LSHIFT: */
       /*case SLANG_OPER_RSHIFT: */
    case SLANG_OPER_ADD:
-      if (!typeof_existing_function("+", op->children, 2, space,
-                                    &ti->spec, atoms, log))
+      assert(op->num_children == 2);
+      if (!typeof_math_call("+", op, space, &ti->spec, atoms, log))
          return GL_FALSE;
       break;
    case SLANG_OPER_SUBTRACT:
-      if (!typeof_existing_function("-", op->children, 2, space,
-                                    &ti->spec, atoms, log))
+      assert(op->num_children == 2);
+      if (!typeof_math_call("-", op, space, &ti->spec, atoms, log))
          return GL_FALSE;
       break;
    case SLANG_OPER_MULTIPLY:
-      if (!typeof_existing_function("*", op->children, 2, space,
-                                    &ti->spec, atoms, log))
+      assert(op->num_children == 2);
+      if (!typeof_math_call("*", op, space, &ti->spec, atoms, log))
          return GL_FALSE;
       break;
    case SLANG_OPER_DIVIDE:
-      if (!typeof_existing_function("/", op->children, 2, space,
-                                    &ti->spec, atoms, log))
+      assert(op->num_children == 2);
+      if (!typeof_math_call("/", op, space, &ti->spec, atoms, log))
          return GL_FALSE;
       break;
-      /*case SLANG_OPER_MODULUS: */
+   /*case SLANG_OPER_MODULUS: */
    case SLANG_OPER_PLUS:
       if (!_slang_typeof_operation_(op->children, space, ti, atoms, log))
          return GL_FALSE;
@@ -527,8 +541,8 @@ _slang_typeof_operation_(const slang_ope
       ti->is_swizzled = GL_FALSE;
       break;
    case SLANG_OPER_MINUS:
-      if (!typeof_existing_function("-", op->children, 1, space,
-                                    &ti->spec, atoms, log))
+      assert(op->num_children == 1);
+      if (!typeof_math_call("-", op, space, &ti->spec, atoms, log))
          return GL_FALSE;
       break;
       /*case SLANG_OPER_COMPLEMENT: */
@@ -563,12 +577,12 @@ _slang_typeof_operation_(const slang_ope
       break;
    case SLANG_OPER_CALL:
       {
-         GLboolean exists;
+         slang_function *fun;
 
          if (!_slang_typeof_function(op->a_id, op->children, op->num_children,
-                                     space, &ti->spec, &exists, atoms, log))
+                                     space, &ti->spec, &fun, atoms, log))
             return GL_FALSE;
-         if (!exists) {
+         if (!fun) {
             /* Look for struct initializer? */
             slang_struct *s =
                slang_struct_scope_find(space->structs, op->a_id, GL_TRUE);
@@ -731,7 +745,7 @@ _slang_typeof_operation_(const slang_ope
  */
 slang_function *
 _slang_locate_function(const slang_function_scope * funcs, slang_atom a_name,
-                       const slang_operation * args, GLuint num_args,
+                       slang_operation * args, GLuint num_args,
                        const slang_name_space * space, slang_atom_pool * atoms,
                        slang_info_log *log)
 {
diff --git a/src/mesa/shader/slang/slang_typeinfo.h b/src/mesa/shader/slang/slang_typeinfo.h
index 12a773d..be2e229 100644
--- a/src/mesa/shader/slang/slang_typeinfo.h
+++ b/src/mesa/shader/slang/slang_typeinfo.h
@@ -69,7 +69,7 @@ typedef struct slang_assemble_ctx_
 
 extern struct slang_function_ *
 _slang_locate_function(const struct slang_function_scope_ *funcs,
-                       slang_atom name, const struct slang_operation_ *params,
+                       slang_atom name, struct slang_operation_ *params,
                        GLuint num_params,
                        const slang_name_space *space,
                        slang_atom_pool *atoms, slang_info_log *log);
@@ -168,11 +168,11 @@ slang_typeinfo_destruct(slang_typeinfo *
  */
 extern GLboolean
 _slang_typeof_operation(const slang_assemble_ctx *,
-                        const struct slang_operation_ *,
+                        struct slang_operation_ *,
                         slang_typeinfo *);
 
 extern GLboolean
-_slang_typeof_operation_(const struct slang_operation_ *,
+_slang_typeof_operation_(struct slang_operation_ *,
                          const slang_name_space *,
                          slang_typeinfo *, slang_atom_pool *,
                          slang_info_log *log);
diff-tree b1a955b5186d9d455416534bcdc170373c7393d9 (from b01f146fd066518f93ccbfda1441a9e6ff530260)
Author: Brian <brian at yutani.localnet.net>
Date:   Wed Mar 14 10:16:18 2007 -0600

    make _slang_typeof_function() static

diff --git a/src/mesa/shader/slang/slang_typeinfo.c b/src/mesa/shader/slang/slang_typeinfo.c
index 6a358d6..a3a37ce 100644
--- a/src/mesa/shader/slang/slang_typeinfo.c
+++ b/src/mesa/shader/slang/slang_typeinfo.c
@@ -35,6 +35,31 @@
 #include "prog_instruction.h"
 
 
+/**
+ * Determine the return type of a function.
+ * \param a_name  the function name
+ * \param param  function parameters (overloading)
+ * \param num_params  number of parameters to function
+ * \param space  namespace to search
+ * \param spec  returns the type
+ * \param exists  returns GL_TRUE or GL_FALSE to indicate existance of function
+ * \return GL_TRUE for success, GL_FALSE if failure (bad function name)
+ */
+static GLboolean
+_slang_typeof_function(slang_atom a_name, const slang_operation * params,
+                       GLuint num_params,
+                       const slang_name_space * space,
+                       slang_type_specifier * spec, GLboolean * exists,
+                       slang_atom_pool *atoms, slang_info_log *log)
+{
+   slang_function *fun;
+   fun = _slang_locate_function(space->funcs, a_name, params,
+                                num_params, space, atoms, log);
+   *exists = fun != NULL;
+   if (!fun)
+      return GL_TRUE;  /* yes, not false */
+   return slang_type_specifier_copy(spec, &fun->header.type.specifier);
+}
 
 
 /**
@@ -288,7 +313,8 @@ slang_typeinfo_destruct(slang_typeinfo *
 
 
 /**
- * Determine the return type of a function.
+ * Determine the return type of a function.  This involves searching for
+ * the function by name and matching parameter types.
  * \param name  name of the function
  * \param params  array of function parameters
  * \param num_params  number of parameters
@@ -543,6 +569,7 @@ _slang_typeof_operation_(const slang_ope
                                      space, &ti->spec, &exists, atoms, log))
             return GL_FALSE;
          if (!exists) {
+            /* Look for struct initializer? */
             slang_struct *s =
                slang_struct_scope_find(space->structs, op->a_id, GL_TRUE);
             if (s != NULL) {
@@ -755,33 +782,6 @@ _slang_locate_function(const slang_funct
 }
 
 
-
-/**
- * Determine the return type of a function.
- * \param a_name  the function name
- * \param param  function parameters (overloading)
- * \param num_params  number of parameters to function
- * \param space  namespace to search
- * \param exists  returns GL_TRUE or GL_FALSE to indicate existance of function
- * \return GL_TRUE for success, GL_FALSE if failure (bad function name)
- */
-GLboolean
-_slang_typeof_function(slang_atom a_name, const slang_operation * params,
-                       GLuint num_params,
-                       const slang_name_space * space,
-                       slang_type_specifier * spec, GLboolean * exists,
-                       slang_atom_pool *atoms, slang_info_log *log)
-{
-   slang_function *fun = _slang_locate_function(space->funcs, a_name, params,
-                                                num_params, space, atoms, log);
-   *exists = fun != NULL;
-   if (!fun)
-      return GL_TRUE;  /* yes, not false */
-   return slang_type_specifier_copy(spec, &fun->header.type.specifier);
-}
-
-
-
 /**
  * Determine if a type is a matrix.
  * \return GL_TRUE if is a matrix, GL_FALSE otherwise.
diff --git a/src/mesa/shader/slang/slang_typeinfo.h b/src/mesa/shader/slang/slang_typeinfo.h
index f1c9a63..12a773d 100644
--- a/src/mesa/shader/slang/slang_typeinfo.h
+++ b/src/mesa/shader/slang/slang_typeinfo.h
@@ -177,18 +177,6 @@ _slang_typeof_operation_(const struct sl
                          slang_typeinfo *, slang_atom_pool *,
                          slang_info_log *log);
 
-/**
- * Retrieves type of a function prototype, if one exists.
- * Returns GL_TRUE on success, even if the function was not found.
- * Returns GL_FALSE otherwise.
- */
-extern GLboolean
-_slang_typeof_function(slang_atom a_name,
-                       const struct slang_operation_ *params,
-                       GLuint num_params, const slang_name_space *,
-                       slang_type_specifier *spec, GLboolean *exists,
-                       slang_atom_pool *, slang_info_log *log);
-
 extern GLboolean
 _slang_type_is_matrix(slang_type_specifier_type);
 
diff-tree b01f146fd066518f93ccbfda1441a9e6ff530260 (from 52363954bfe1f9f5aec6da504e191099f80578ee)
Author: Brian <brian at yutani.localnet.net>
Date:   Wed Mar 14 08:56:01 2007 -0600

    remove old assertion

diff --git a/src/mesa/shader/slang/slang_emit.c b/src/mesa/shader/slang/slang_emit.c
index 7353b98..25c107d 100644
--- a/src/mesa/shader/slang/slang_emit.c
+++ b/src/mesa/shader/slang/slang_emit.c
@@ -970,7 +970,6 @@ emit_move(slang_emit_info *emitInfo, sla
       *n->Children[1]->Store = *n->Children[0]->Store;
       /* fixup the prev (RHS) instruction */
       assert(n->Children[0]->Store->Index >= 0);
-      assert(n->Children[0]->Store->Index < 16);
       storage_to_dst_reg(&inst->DstReg, n->Children[0]->Store, n->Writemask);
       return inst;
    }



More information about the mesa-commit mailing list