glsl: Don't allow vertex shader input arrays until GLSL 1.50.
[mesa.git] / src / glsl / link_uniform_initializers.cpp
index 849e080970adffb5f2972a58d8089c7095b7f714..54d9bf1f528ddd63a95e39f7b29bf4ef0d681c1f 100644 (file)
@@ -67,7 +67,11 @@ copy_constant_to_storage(union gl_constant_value *storage,
       case GLSL_TYPE_BOOL:
         storage[i].b = int(val->value.b[i]);
         break;
-      default:
+      case GLSL_TYPE_ARRAY:
+      case GLSL_TYPE_STRUCT:
+      case GLSL_TYPE_INTERFACE:
+      case GLSL_TYPE_VOID:
+      case GLSL_TYPE_ERROR:
         /* All other types should have already been filtered by other
          * paths in the caller.
          */
@@ -134,8 +138,16 @@ set_uniform_initializer(void *mem_ctx, gl_shader_program *prog,
       }
 
       if (base_type == GLSL_TYPE_SAMPLER) {
-        for (unsigned int i = 0; i < storage->array_elements; i++) {
-           prog->SamplerUnits[storage->sampler + i] = storage->storage[i].i;
+         for (int sh = 0; sh < MESA_SHADER_TYPES; sh++) {
+            gl_shader *shader = prog->_LinkedShaders[sh];
+
+            if (shader && storage->sampler[sh].active) {
+               for (unsigned i = 0; i < storage->array_elements; i++) {
+                  unsigned index = storage->sampler[sh].index + i;
+
+                  shader->SamplerUnits[index] = storage->storage[i].i;
+               }
+            }
         }
       }
    } else {
@@ -144,8 +156,17 @@ set_uniform_initializer(void *mem_ctx, gl_shader_program *prog,
                               val->type->base_type,
                               val->type->components());
 
-      if (storage->type->is_sampler())
-        prog->SamplerUnits[storage->sampler] = storage->storage[0].i;
+      if (storage->type->is_sampler()) {
+         for (int sh = 0; sh < MESA_SHADER_TYPES; sh++) {
+            gl_shader *shader = prog->_LinkedShaders[sh];
+
+            if (shader && storage->sampler[sh].active) {
+               unsigned index = storage->sampler[sh].index;
+
+               shader->SamplerUnits[index] = storage->storage[0].i;
+            }
+         }
+      }
    }
 
    storage->initialized = true;