ir_constant_expression: Support scalar * vector and scalar * matrix.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 6 Jul 2010 10:01:15 +0000 (03:01 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Tue, 6 Jul 2010 23:03:33 +0000 (16:03 -0700)
The test here is slightly different since we need to keep matrix
multiplication separate.

Fixes piglit tests const-vec-scalar-03.frag and const-mat-scalar-03.frag.

src/glsl/ir_constant_expression.cpp

index 2fab03bb60efd37708cf3f3a08f8ea5a24f63cf4..e039504d4e42d431c94d9e0f4229c73035efb25a 100644 (file)
@@ -362,25 +362,28 @@ ir_constant_visitor::visit(ir_expression *ir)
 
       break;
    case ir_binop_mul:
-      if (ir->operands[0]->type == ir->operands[1]->type &&
-         !ir->operands[0]->type->is_matrix()) {
-        for (c = 0; c < ir->operands[0]->type->components(); c++) {
+      if ((op[0]->type == op[1]->type && !op[0]->type->is_matrix())
+         || op0_scalar || op1_scalar) {
+        for (unsigned c = 0, c0 = 0, c1 = 0;
+             c < components;
+             c0 += c0_inc, c1 += c1_inc, c++) {
+
            switch (ir->operands[0]->type->base_type) {
            case GLSL_TYPE_UINT:
-              data.u[c] = op[0]->value.u[c] * op[1]->value.u[c];
+              data.u[c] = op[0]->value.u[c0] * op[1]->value.u[c1];
               break;
            case GLSL_TYPE_INT:
-              data.i[c] = op[0]->value.i[c] * op[1]->value.i[c];
+              data.i[c] = op[0]->value.i[c0] * op[1]->value.i[c1];
               break;
            case GLSL_TYPE_FLOAT:
-              data.f[c] = op[0]->value.f[c] * op[1]->value.f[c];
+              data.f[c] = op[0]->value.f[c0] * op[1]->value.f[c1];
               break;
            default:
               assert(0);
            }
         }
       } else
-        /* FINISHME: Support operations with non-equal types. */
+        /* FINISHME: Support vector/matrix and matrix multiplication. */
         return;
 
       break;