|
|
@@ -310,13 +310,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; |
|
|
|
|
|
|
@@ -519,18 +515,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: |
|
|
@@ -548,18 +546,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. |
|
|
|
*/ |