[Mesa-dev] [PATCH 7/7] glsl: Add support for constant expression evaluation on round(), roundEven().

Chad Versace chad at chad-versace.us
Tue Sep 27 17:02:30 PDT 2011


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]);
> +      }
> +      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) {

A minor performance nitpick:
I think it is better to use nearbyint() here rather than rint(). When
`rint(n) != n`, rint() takes the extra trouble to set FE_INEXACT, but
nearbyint() just does the rounding and nothing else.

Either way, the code is correct.
Reviewed-by: Chad Versace <chad at chad-versace.us>
-- 
Chad Versace
chad at chad-versace.us


More information about the mesa-dev mailing list