[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