glsl: add capability to lower mediump array types
[mesa.git] / src / compiler / glsl / gl_nir_link_uniform_initializers.c
index 546da68927f8ffd665ae05daec28630376827024..fe01b5cb26853e6bcc03a8cad019c9893a130c04 100644 (file)
@@ -87,7 +87,7 @@ set_opaque_binding(struct set_opaque_binding_closure *data,
                   storage->storage[i].i;
             }
          }
-      } else if (glsl_type_is_image(type)) {
+      } else if (glsl_type_is_image(storage->type)) {
          for (unsigned i = 0; i < elements; i++) {
             const unsigned index = storage->opaque[sh].index + i;
 
@@ -121,7 +121,7 @@ copy_constant_to_storage(union gl_constant_value *storage,
    unsigned dmul = glsl_base_type_is_64bit(base_type) ? 2 : 1;
    int i = 0;
 
-   if (n_columns > 0) {
+   if (n_columns > 1) {
       const struct glsl_type *column_type = glsl_get_column_type(type);
       for (unsigned int column = 0; column < n_columns; column++) {
          copy_constant_to_storage(&storage[i], val->elements[column],
@@ -145,7 +145,7 @@ copy_constant_to_storage(union gl_constant_value *storage,
          case GLSL_TYPE_UINT64:
          case GLSL_TYPE_INT64:
             /* XXX need to check on big-endian */
-            memcpy(&storage[i * 2].u, &val->values[row].f64, sizeof(double));
+            memcpy(&storage[i].u, &val->values[row].f64, sizeof(double));
             break;
          case GLSL_TYPE_BOOL:
             storage[i].b = val->values[row].u32 ? boolean_true : 0;
@@ -278,6 +278,12 @@ gl_nir_set_uniform_initializers(struct gl_context *ctx,
                                     var->type,
                                     var->constant_initializer);
          } else if (var->data.explicit_binding) {
+
+            if (nir_variable_is_in_block(var)) {
+               /* This case is handled by link_uniform_blocks */
+               continue;
+            }
+
             const struct glsl_type *without_array =
                glsl_without_array(var->type);
 
@@ -295,4 +301,7 @@ gl_nir_set_uniform_initializers(struct gl_context *ctx,
          }
       }
    }
+   memcpy(prog->data->UniformDataDefaults, prog->data->UniformDataSlots,
+          sizeof(union gl_constant_value) * prog->data->NumUniformDataSlots);
+
 }