mesa: set up gl_vert_result and gl_frag_attrib values for gl_ClipDistance.
[mesa.git] / src / glsl / ir_constant_expression.cpp
index 2841fb350a36903104eb46c2af76e4098f18fe0e..f0299a2c4a0bfe5c11a095811c17935cbe5d10b0 100644 (file)
@@ -166,7 +166,18 @@ ir_expression::constant_expression_value()
         data.b[c] = op[0]->value.u[c] ? true : false;
       }
       break;
-
+   case ir_unop_u2i:
+      assert(op[0]->type->base_type == GLSL_TYPE_UINT);
+      for (unsigned c = 0; c < op[0]->type->components(); c++) {
+        data.i[c] = op[0]->value.u[c];
+      }
+      break;
+   case ir_unop_i2u:
+      assert(op[0]->type->base_type == GLSL_TYPE_INT);
+      for (unsigned c = 0; c < op[0]->type->components(); c++) {
+        data.u[c] = op[0]->value.i[c];
+      }
+      break;
    case ir_unop_any:
       assert(op[0]->type->is_boolean());
       data.b[0] = false;
@@ -288,24 +299,20 @@ ir_expression::constant_expression_value()
       break;
 
    case ir_unop_rcp:
-      /* FINISHME: Emit warning when division-by-zero is detected. */
       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
       for (unsigned c = 0; c < op[0]->type->components(); c++) {
         switch (this->type->base_type) {
         case GLSL_TYPE_UINT:
-           if (op[0]->value.u[c] == 0.0)
-              return NULL;
-           data.u[c] = 1 / op[0]->value.u[c];
+           if (op[0]->value.u[c] != 0.0)
+              data.u[c] = 1 / op[0]->value.u[c];
            break;
         case GLSL_TYPE_INT:
-           if (op[0]->value.i[c] == 0.0)
-              return NULL;
-           data.i[c] = 1 / op[0]->value.i[c];
+           if (op[0]->value.i[c] != 0.0)
+              data.i[c] = 1 / op[0]->value.i[c];
            break;
         case GLSL_TYPE_FLOAT:
-           if (op[0]->value.f[c] == 0.0)
-              return NULL;
-           data.f[c] = 1.0F / op[0]->value.f[c];
+           if (op[0]->value.f[c] != 0.0)
+              data.f[c] = 1.0F / op[0]->value.f[c];
            break;
         default:
            assert(0);
@@ -314,13 +321,9 @@ ir_expression::constant_expression_value()
       break;
 
    case ir_unop_rsq:
-      /* FINISHME: Emit warning when division-by-zero is detected. */
       assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
       for (unsigned c = 0; c < op[0]->type->components(); c++) {
-        float s = sqrtf(op[0]->value.f[c]);
-        if (s == 0)
-           return NULL;
-        data.f[c] = 1.0F / s;
+        data.f[c] = 1.0F / sqrtf(op[0]->value.f[c]);
       }
       break;
 
@@ -523,18 +526,20 @@ ir_expression::constant_expression_value()
 
         switch (op[0]->type->base_type) {
         case GLSL_TYPE_UINT:
-           if (op[1]->value.u[c1] == 0)
-              return NULL;
-           data.u[c] = op[0]->value.u[c0] / op[1]->value.u[c1];
+           if (op[1]->value.u[c1] == 0) {
+              data.u[c] = 0;
+           } else {
+              data.u[c] = op[0]->value.u[c0] / op[1]->value.u[c1];
+           }
            break;
         case GLSL_TYPE_INT:
-           if (op[1]->value.i[c1] == 0)
-              return NULL;
-           data.i[c] = op[0]->value.i[c0] / op[1]->value.i[c1];
+           if (op[1]->value.i[c1] == 0) {
+              data.i[c] = 0;
+           } else {
+              data.i[c] = op[0]->value.i[c0] / op[1]->value.i[c1];
+           }
            break;
         case GLSL_TYPE_FLOAT:
-           if (op[1]->value.f[c1] == 0)
-              return NULL;
            data.f[c] = op[0]->value.f[c0] / op[1]->value.f[c1];
            break;
         default:
@@ -552,18 +557,20 @@ ir_expression::constant_expression_value()
 
         switch (op[0]->type->base_type) {
         case GLSL_TYPE_UINT:
-           if (op[1]->value.u[c1] == 0)
-              return NULL;
-           data.u[c] = op[0]->value.u[c0] % op[1]->value.u[c1];
+           if (op[1]->value.u[c1] == 0) {
+              data.u[c] = 0;
+           } else {
+              data.u[c] = op[0]->value.u[c0] % op[1]->value.u[c1];
+           }
            break;
         case GLSL_TYPE_INT:
-           if (op[1]->value.i[c1] == 0)
-              return NULL;
-           data.i[c] = op[0]->value.i[c0] % op[1]->value.i[c1];
+           if (op[1]->value.i[c1] == 0) {
+              data.i[c] = 0;
+           } else {
+              data.i[c] = op[0]->value.i[c0] % op[1]->value.i[c1];
+           }
            break;
         case GLSL_TYPE_FLOAT:
-           if (op[1]->value.f[c1] == 0)
-              return NULL;
            /* We don't use fmod because it rounds toward zero; GLSL specifies
             * the use of floor.
             */