mesa: glsl: check that attribute vars are of float/vec/mat type
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 6 Aug 2008 17:22:36 +0000 (11:22 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 6 Aug 2008 17:22:36 +0000 (11:22 -0600)
src/mesa/shader/slang/slang_codegen.c
src/mesa/shader/slang/slang_typeinfo.c
src/mesa/shader/slang/slang_typeinfo.h

index edb060a23f5986c56e66a862aad8b8944f172590..f717a22ac93321484279354b4ea35b6c079f6ecb 100644 (file)
@@ -3726,6 +3726,14 @@ _slang_codegen_global_variable(slang_assemble_ctx *A, slang_variable *var,
       if (dbg) printf("VARYING ");
    }
    else if (var->type.qualifier == SLANG_QUAL_ATTRIBUTE) {
+      /* attributes must be float, vec or mat */
+      if (!_slang_type_is_float_vec_mat(var->type.specifier.type)) {
+         slang_info_log_error(A->log,
+                              "attribute '%s' must be float/vector/matrix",
+                              varName);
+         return GL_FALSE;
+      }
+
       if (prog) {
          /* user-defined vertex attribute */
          const GLint attr = -1; /* unknown */
index 8572118f3f30e48dca25f2fc09d45485256e405c..b3255512ba09d70d295741431d9d259db56012df 100644 (file)
@@ -874,6 +874,34 @@ _slang_type_is_vector(slang_type_specifier_type ty)
 }
 
 
+/**
+ * Determine if a type is a float, float vector or float matrix.
+ * \return GL_TRUE if so, GL_FALSE otherwise
+ */
+GLboolean
+_slang_type_is_float_vec_mat(slang_type_specifier_type ty)
+{
+   switch (ty) {
+   case SLANG_SPEC_FLOAT:
+   case SLANG_SPEC_VEC2:
+   case SLANG_SPEC_VEC3:
+   case SLANG_SPEC_VEC4:
+   case SLANG_SPEC_MAT2:
+   case SLANG_SPEC_MAT3:
+   case SLANG_SPEC_MAT4:
+   case SLANG_SPEC_MAT23:
+   case SLANG_SPEC_MAT32:
+   case SLANG_SPEC_MAT24:
+   case SLANG_SPEC_MAT42:
+   case SLANG_SPEC_MAT34:
+   case SLANG_SPEC_MAT43:
+      return GL_TRUE;
+   default:
+      return GL_FALSE;
+   }
+}
+
+
 /**
  * Given a vector type, return the type of the vector's elements.
  * For a matrix, return the type of the columns.
index 960e99bda232f9e53229c3b536d53e690fefae92..b3ad06b65c24e8dfd1decba5bfcb475a3c82938a 100644 (file)
@@ -191,6 +191,9 @@ _slang_type_is_matrix(slang_type_specifier_type);
 extern GLboolean
 _slang_type_is_vector(slang_type_specifier_type);
 
+extern GLboolean
+_slang_type_is_float_vec_mat(slang_type_specifier_type);
+
 extern slang_type_specifier_type
 _slang_type_base(slang_type_specifier_type);