i965: Improve same-buffer restriction for imports
[mesa.git] / src / mesa / program / ir_to_mesa.cpp
index a2476ddbf585727abd92d54be879a16998f96dde..4c30bea2f2347b1478f6edfa018b480929304a21 100644 (file)
@@ -1069,8 +1069,10 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
       emit_scalar(ir, OPCODE_EX2, result_dst, op[0]);
       break;
    case ir_unop_exp:
+      assert(!"not reached: should be handled by exp_to_exp2");
+      break;
    case ir_unop_log:
-      assert(!"not reached: should be handled by ir_explog_to_explog2");
+      assert(!"not reached: should be handled by log_to_log2");
       break;
    case ir_unop_log2:
       emit_scalar(ir, OPCODE_LG2, result_dst, op[0]);
@@ -1387,9 +1389,6 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
    case ir_unop_dFdy_fine:
    case ir_unop_subroutine_to_int:
    case ir_unop_get_buffer_size:
-   case ir_unop_vote_any:
-   case ir_unop_vote_all:
-   case ir_unop_vote_eq:
    case ir_unop_bitcast_u642d:
    case ir_unop_bitcast_i642d:
    case ir_unop_bitcast_d2u64:
@@ -1418,6 +1417,10 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
    case ir_unop_unpack_int_2x32:
    case ir_unop_pack_uint_2x32:
    case ir_unop_unpack_uint_2x32:
+   case ir_unop_pack_sampler_2x32:
+   case ir_unop_unpack_sampler_2x32:
+   case ir_unop_pack_image_2x32:
+   case ir_unop_unpack_image_2x32:
       assert(!"not supported");
       break;
 
@@ -1898,7 +1901,7 @@ ir_to_mesa_visitor::visit(ir_constant *ir)
     * get lucky, copy propagation will eliminate the extra moves.
     */
 
-   if (ir->type->base_type == GLSL_TYPE_STRUCT) {
+   if (ir->type->is_record()) {
       src_reg temp_base = get_temp(ir->type);
       dst_reg temp = dst_reg(temp_base);
 
@@ -1947,7 +1950,7 @@ ir_to_mesa_visitor::visit(ir_constant *ir)
       dst_reg mat_column = dst_reg(mat);
 
       for (i = 0; i < ir->type->matrix_columns; i++) {
-        assert(ir->type->base_type == GLSL_TYPE_FLOAT);
+        assert(ir->type->is_float());
         values = &ir->value.f[i * ir->type->vector_elements];
 
         src = src_reg(PROGRAM_CONSTANT, -1, NULL);
@@ -2442,20 +2445,10 @@ add_uniform_to_shader::visit_field(const glsl_type *type, const char *name,
                                    const enum glsl_interface_packing,
                                    bool /* last_field */)
 {
-   unsigned int size;
-
    /* atomics don't get real storage */
    if (type->contains_atomic())
       return;
 
-   if (type->is_vector() || type->is_scalar()) {
-      size = type->vector_elements;
-      if (type->is_64bit())
-         size *= 2;
-   } else {
-      size = type_size(type) * 4;
-   }
-
    gl_register_file file;
    if (type->without_array()->is_sampler()) {
       file = PROGRAM_SAMPLER;
@@ -2465,6 +2458,8 @@ add_uniform_to_shader::visit_field(const glsl_type *type, const char *name,
 
    int index = _mesa_lookup_parameter_index(params, name);
    if (index < 0) {
+      unsigned size = type_size(type) * 4;
+
       index = _mesa_add_parameter(params, file, name, size, type->gl_type,
                                  NULL, NULL);
 
@@ -2531,7 +2526,7 @@ _mesa_generate_parameters_list_for_uniforms(struct gl_shader_program
 
 void
 _mesa_associate_uniform_storage(struct gl_context *ctx,
-                               struct gl_shader_program *shader_program,
+                                struct gl_shader_program *shader_program,
                                 struct gl_program_parameter_list *params,
                                 bool propagate_to_storage)
 {
@@ -2542,15 +2537,15 @@ _mesa_associate_uniform_storage(struct gl_context *ctx,
    unsigned last_location = unsigned(~0);
    for (unsigned i = 0; i < params->NumParameters; i++) {
       if (params->Parameters[i].Type != PROGRAM_UNIFORM)
-        continue;
+         continue;
 
       unsigned location;
       const bool found =
-        shader_program->UniformHash->get(location, params->Parameters[i].Name);
+         shader_program->UniformHash->get(location, params->Parameters[i].Name);
       assert(found);
 
       if (!found)
-        continue;
+         continue;
 
       struct gl_uniform_storage *storage =
          &shader_program->data->UniformStorage[location];
@@ -2560,48 +2555,47 @@ _mesa_associate_uniform_storage(struct gl_context *ctx,
          continue;
 
       if (location != last_location) {
-        enum gl_uniform_driver_format format = uniform_native;
+         enum gl_uniform_driver_format format = uniform_native;
+         unsigned columns = 0;
+         int dmul = 4 * sizeof(float);
 
-        unsigned columns = 0;
-        int dmul = 4 * sizeof(float);
-        switch (storage->type->base_type) {
+         switch (storage->type->base_type) {
          case GLSL_TYPE_UINT64:
-           if (storage->type->vector_elements > 2)
+            if (storage->type->vector_elements > 2)
                dmul *= 2;
-           /* fallthrough */
-        case GLSL_TYPE_UINT:
-           assert(ctx->Const.NativeIntegers);
-           format = uniform_native;
-           columns = 1;
-           break;
+            /* fallthrough */
+         case GLSL_TYPE_UINT:
+            assert(ctx->Const.NativeIntegers);
+            format = uniform_native;
+            columns = 1;
+            break;
          case GLSL_TYPE_INT64:
-           if (storage->type->vector_elements > 2)
+            if (storage->type->vector_elements > 2)
                dmul *= 2;
-           /* fallthrough */
-        case GLSL_TYPE_INT:
-           format =
-              (ctx->Const.NativeIntegers) ? uniform_native : uniform_int_float;
-           columns = 1;
-           break;
-
-        case GLSL_TYPE_DOUBLE:
-           if (storage->type->vector_elements > 2)
+            /* fallthrough */
+         case GLSL_TYPE_INT:
+            format =
+               (ctx->Const.NativeIntegers) ? uniform_native : uniform_int_float;
+            columns = 1;
+            break;
+         case GLSL_TYPE_DOUBLE:
+            if (storage->type->vector_elements > 2)
                dmul *= 2;
-           /* fallthrough */
-        case GLSL_TYPE_FLOAT:
-           format = uniform_native;
-           columns = storage->type->matrix_columns;
-           break;
-        case GLSL_TYPE_BOOL:
-           format = uniform_native;
-           columns = 1;
-           break;
-        case GLSL_TYPE_SAMPLER:
-        case GLSL_TYPE_IMAGE:
+            /* fallthrough */
+         case GLSL_TYPE_FLOAT:
+            format = uniform_native;
+            columns = storage->type->matrix_columns;
+            break;
+         case GLSL_TYPE_BOOL:
+            format = uniform_native;
+            columns = 1;
+            break;
+         case GLSL_TYPE_SAMPLER:
+         case GLSL_TYPE_IMAGE:
          case GLSL_TYPE_SUBROUTINE:
-           format = uniform_native;
-           columns = 1;
-           break;
+            format = uniform_native;
+            columns = 1;
+            break;
          case GLSL_TYPE_ATOMIC_UINT:
          case GLSL_TYPE_ARRAY:
          case GLSL_TYPE_VOID:
@@ -2609,27 +2603,25 @@ _mesa_associate_uniform_storage(struct gl_context *ctx,
          case GLSL_TYPE_ERROR:
          case GLSL_TYPE_INTERFACE:
          case GLSL_TYPE_FUNCTION:
-           assert(!"Should not get here.");
-           break;
-        }
+            assert(!"Should not get here.");
+            break;
+         }
 
-        _mesa_uniform_attach_driver_storage(storage,
-                                            dmul * columns,
-                                            dmul,
-                                            format,
-                                            &params->ParameterValues[i]);
+         _mesa_uniform_attach_driver_storage(storage, dmul * columns, dmul,
+                                             format,
+                                             &params->ParameterValues[i]);
 
-        /* After attaching the driver's storage to the uniform, propagate any
-         * data from the linker's backing store.  This will cause values from
-         * initializers in the source code to be copied over.
-         */
+         /* After attaching the driver's storage to the uniform, propagate any
+          * data from the linker's backing store.  This will cause values from
+          * initializers in the source code to be copied over.
+          */
          if (propagate_to_storage) {
             unsigned array_elements = MAX2(1, storage->array_elements);
             _mesa_propagate_uniforms_to_driver_storage(storage, 0,
                                                        array_elements);
          }
 
-        last_location = location;
+             last_location = location;
       }
    }
 }
@@ -3112,6 +3104,11 @@ _mesa_glsl_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
    }
 
    if (prog->data->LinkStatus) {
+      /* Reset sampler validated to true, validation happens via the
+       * LinkShader call below.
+       */
+      prog->SamplersValidated = GL_TRUE;
+
       if (!ctx->Driver.LinkShader(ctx, prog)) {
          prog->data->LinkStatus = linking_failure;
       }