On 09/27/2011 03:08 PM, Eric Anholt wrote:
> They're both implemented the same in GLSL IR (since round() has
> undefined behavior for N.5).
> 
> Fixes glsl-1.30/compiler/built-in-functions/round*
> ---
>  src/glsl/ir_constant_expression.cpp |   10 ++++++++++
>  1 files changed, 10 insertions(+), 0 deletions(-)
> 
> diff --git a/src/glsl/ir_constant_expression.cpp 
> b/src/glsl/ir_constant_expression.cpp
> index b3fe6cf..59a7e67 100644
> --- a/src/glsl/ir_constant_expression.cpp
> +++ b/src/glsl/ir_constant_expression.cpp
> @@ -196,6 +196,13 @@ ir_expression::constant_expression_value()
>        }
>        break;
>  
> +   case ir_unop_round_even:
> +      assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
> +      for (unsigned c = 0; c < op[0]->type->components(); c++) {
> +      data.f[c] = rint(op[0]->value.f[c]);

It's not obvious to me that rint() rounds correctly.

>From the GLSL 1.30 spec:
"Returns a value equal to the nearest integer to x.  A fractional part
of 0.5 will round toward the nearest even integer. (Both 3.5 and 4.5 for
x will return 4.0.)"

rint() does nearest integer, but probably not the mandated behavior for
0.5.  At least, not unless we configure the rounding mode.  Which I
don't think we have...

> +      }
> +      break;
> +
>     case ir_unop_ceil:
>        assert(op[0]->type->base_type == GLSL_TYPE_FLOAT);
>        for (unsigned c = 0; c < op[0]->type->components(); c++) {
> @@ -1324,6 +1331,9 @@ ir_call::constant_expression_value()
>                           * op[1]->value.f[c];
>        }
>        }
> +   } else if (strcmp(callee, "round") == 0 ||
> +           strcmp(callee, "roundEven") == 0) {
> +      expr = new(mem_ctx) ir_expression(ir_unop_round_even, op[0]);
>     } else if (strcmp(callee, "sign") == 0) {
>        expr = new(mem_ctx) ir_expression(ir_unop_sign, type, op[0], NULL);
>     } else if (strcmp(callee, "sin") == 0) {

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to