r300: move some more function to generic
[mesa.git] / src / mesa / shader / slang / slang_compile_variable.c
index e099ecb067e27957ab85dc905c573bbc3f8a729f..3428b49e1667a8204d5ae1fb51292be83d436a51 100644 (file)
  * \author Michal Krol
  */
 
-#include "imports.h"
+#include "main/imports.h"
 #include "slang_compile.h"
+#include "slang_mem.h"
 
-/* slang_type_specifier_type */
 
 typedef struct
 {
@@ -56,6 +56,12 @@ static const type_specifier_type_name type_specifier_type_names[] = {
    {"mat2", SLANG_SPEC_MAT2},
    {"mat3", SLANG_SPEC_MAT3},
    {"mat4", SLANG_SPEC_MAT4},
+   {"mat2x3", SLANG_SPEC_MAT23},
+   {"mat3x2", SLANG_SPEC_MAT32},
+   {"mat2x4", SLANG_SPEC_MAT24},
+   {"mat4x2", SLANG_SPEC_MAT42},
+   {"mat3x4", SLANG_SPEC_MAT34},
+   {"mat4x3", SLANG_SPEC_MAT43},
    {"sampler1D", SLANG_SPEC_SAMPLER1D},
    {"sampler2D", SLANG_SPEC_SAMPLER2D},
    {"sampler3D", SLANG_SPEC_SAMPLER3D},
@@ -129,10 +135,10 @@ slang_fully_specified_type_copy(slang_fully_specified_type * x,
 static slang_variable *
 slang_variable_new(void)
 {
-   slang_variable *v = (slang_variable *) malloc(sizeof(slang_variable));
+   slang_variable *v = (slang_variable *) _slang_alloc(sizeof(slang_variable));
    if (v) {
       if (!slang_variable_construct(v)) {
-         free(v);
+         _slang_free(v);
          v = NULL;
       }
    }
@@ -144,7 +150,7 @@ static void
 slang_variable_delete(slang_variable * var)
 {
    slang_variable_destruct(var);
-   free(var);
+   _slang_free(var);
 }
 
 
@@ -156,8 +162,9 @@ slang_variable_scope *
 _slang_variable_scope_new(slang_variable_scope *parent)
 {
    slang_variable_scope *s;
-   s = (slang_variable_scope *) _mesa_calloc(sizeof(slang_variable_scope));
-   s->outer_scope = parent;
+   s = (slang_variable_scope *) _slang_alloc(sizeof(slang_variable_scope));
+   if (s)
+      s->outer_scope = parent;
    return s;
 }
 
@@ -181,7 +188,7 @@ slang_variable_scope_destruct(slang_variable_scope * scope)
       if (scope->variables[i])
          slang_variable_delete(scope->variables[i]);
    }
-   slang_alloc_free(scope->variables);
+   _slang_free(scope->variables);
    /* do not free scope->outer_scope */
 }
 
@@ -194,7 +201,7 @@ slang_variable_scope_copy(slang_variable_scope * x,
 
    _slang_variable_scope_ctr(&z);
    z.variables = (slang_variable **)
-      _mesa_calloc(y->num_variables * sizeof(slang_variable *));
+      _slang_alloc(y->num_variables * sizeof(slang_variable *));
    if (z.variables == NULL) {
       slang_variable_scope_destruct(&z);
       return 0;
@@ -229,9 +236,9 @@ slang_variable_scope_grow(slang_variable_scope *scope)
 {
    const int n = scope->num_variables;
    scope->variables = (slang_variable **)
-         slang_alloc_realloc(scope->variables,
-                             n * sizeof(slang_variable *),
-                             (n + 1) * sizeof(slang_variable *));
+         _slang_realloc(scope->variables,
+                        n * sizeof(slang_variable *),
+                        (n + 1) * sizeof(slang_variable *));
    if (!scope->variables)
       return NULL;
 
@@ -260,6 +267,7 @@ slang_variable_construct(slang_variable * var)
    var->size = 0;
    var->isTemp = GL_FALSE;
    var->aux = NULL;
+   var->declared = 0;
    return 1;
 }
 
@@ -270,11 +278,13 @@ slang_variable_destruct(slang_variable * var)
    slang_fully_specified_type_destruct(&var->type);
    if (var->initializer != NULL) {
       slang_operation_destruct(var->initializer);
-      slang_alloc_free(var->initializer);
+      _slang_free(var->initializer);
    }
+#if 0
    if (var->aux) {
       _mesa_free(var->aux);
    }
+#endif
 }
 
 
@@ -293,13 +303,13 @@ slang_variable_copy(slang_variable * x, const slang_variable * y)
    z.array_len = y->array_len;
    if (y->initializer != NULL) {
       z.initializer
-         = (slang_operation *) slang_alloc_malloc(sizeof(slang_operation));
+         = (slang_operation *) _slang_alloc(sizeof(slang_operation));
       if (z.initializer == NULL) {
          slang_variable_destruct(&z);
          return 0;
       }
       if (!slang_operation_construct(z.initializer)) {
-         slang_alloc_free(z.initializer);
+         _slang_free(z.initializer);
          slang_variable_destruct(&z);
          return 0;
       }
@@ -316,72 +326,23 @@ slang_variable_copy(slang_variable * x, const slang_variable * y)
 }
 
 
+/**
+ * Search for named variable in given scope.
+ * \param all  if true, search parent scopes too.
+ */
 slang_variable *
 _slang_locate_variable(const slang_variable_scope * scope,
                        const slang_atom a_name, GLboolean all)
 {
-   GLuint i;
-
-   for (i = 0; i < scope->num_variables; i++)
-      if (a_name == scope->variables[i]->a_name)
-         return scope->variables[i];
-   if (all && scope->outer_scope != NULL)
-      return _slang_locate_variable(scope->outer_scope, a_name, 1);
-   return NULL;
-}
-
-#if 0
-static GLenum
-gl_type_from_specifier(const slang_type_specifier * type)
-{
-   switch (type->type) {
-   case SLANG_SPEC_BOOL:
-      return GL_BOOL_ARB;
-   case SLANG_SPEC_BVEC2:
-      return GL_BOOL_VEC2_ARB;
-   case SLANG_SPEC_BVEC3:
-      return GL_BOOL_VEC3_ARB;
-   case SLANG_SPEC_BVEC4:
-      return GL_BOOL_VEC4_ARB;
-   case SLANG_SPEC_INT:
-      return GL_INT;
-   case SLANG_SPEC_IVEC2:
-      return GL_INT_VEC2_ARB;
-   case SLANG_SPEC_IVEC3:
-      return GL_INT_VEC3_ARB;
-   case SLANG_SPEC_IVEC4:
-      return GL_INT_VEC4_ARB;
-   case SLANG_SPEC_FLOAT:
-      return GL_FLOAT;
-   case SLANG_SPEC_VEC2:
-      return GL_FLOAT_VEC2_ARB;
-   case SLANG_SPEC_VEC3:
-      return GL_FLOAT_VEC3_ARB;
-   case SLANG_SPEC_VEC4:
-      return GL_FLOAT_VEC4_ARB;
-   case SLANG_SPEC_MAT2:
-      return GL_FLOAT_MAT2_ARB;
-   case SLANG_SPEC_MAT3:
-      return GL_FLOAT_MAT3_ARB;
-   case SLANG_SPEC_MAT4:
-      return GL_FLOAT_MAT4_ARB;
-   case SLANG_SPEC_SAMPLER1D:
-      return GL_SAMPLER_1D_ARB;
-   case SLANG_SPEC_SAMPLER2D:
-      return GL_SAMPLER_2D_ARB;
-   case SLANG_SPEC_SAMPLER3D:
-      return GL_SAMPLER_3D_ARB;
-   case SLANG_SPEC_SAMPLERCUBE:
-      return GL_SAMPLER_CUBE_ARB;
-   case SLANG_SPEC_SAMPLER1DShadow:
-      return GL_SAMPLER_1D_SHADOW_ARB;
-   case SLANG_SPEC_SAMPLER2DShadow:
-      return GL_SAMPLER_2D_SHADOW_ARB;
-   case SLANG_SPEC_ARRAy:
-      return gl_type_from_specifier(type->_array);
-   default:
-      return GL_FLOAT;
+   while (scope) {
+      GLuint i;
+      for (i = 0; i < scope->num_variables; i++)
+         if (a_name == scope->variables[i]->a_name)
+            return scope->variables[i];
+      if (all)
+         scope = scope->outer_scope;
+      else
+         scope = NULL;
    }
+   return NULL;
 }
-#endif
-