[Mesa-dev] [PATCH v2 14/28] glsl: Add support doubles in optimization passes

Ian Romanick idr at freedesktop.org
Fri Feb 6 00:05:15 PST 2015


Does opt_algebraic also need updates?

On 02/06/2015 06:56 AM, Ilia Mirkin wrote:
> From: Dave Airlie <airlied at gmail.com>
> 
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> Reviewed-by: Matt Turner <mattst88 at gmail.com>
> ---
>  src/glsl/opt_constant_propagation.cpp |  3 +++
>  src/glsl/opt_minmax.cpp               | 13 +++++++++++++
>  2 files changed, 16 insertions(+)
> 
> diff --git a/src/glsl/opt_constant_propagation.cpp b/src/glsl/opt_constant_propagation.cpp
> index c334e12..90cc0c8 100644
> --- a/src/glsl/opt_constant_propagation.cpp
> +++ b/src/glsl/opt_constant_propagation.cpp
> @@ -194,6 +194,9 @@ ir_constant_propagation_visitor::handle_rvalue(ir_rvalue **rvalue)
>        case GLSL_TYPE_FLOAT:
>  	 data.f[i] = found->constant->value.f[rhs_channel];
>  	 break;
> +      case GLSL_TYPE_DOUBLE:
> +	 data.d[i] = found->constant->value.d[rhs_channel];
> +	 break;
>        case GLSL_TYPE_INT:
>  	 data.i[i] = found->constant->value.i[rhs_channel];
>  	 break;
> diff --git a/src/glsl/opt_minmax.cpp b/src/glsl/opt_minmax.cpp
> index 32fb2d7..23d0b10 100644
> --- a/src/glsl/opt_minmax.cpp
> +++ b/src/glsl/opt_minmax.cpp
> @@ -133,6 +133,14 @@ compare_components(ir_constant *a, ir_constant *b)
>           else
>              foundequal = true;
>           break;
> +      case GLSL_TYPE_DOUBLE:
> +         if (a->value.d[c0] < b->value.d[c1])
> +            foundless = true;
> +         else if (a->value.d[c0] > b->value.d[c1])
> +            foundgreater = true;
> +         else
> +            foundequal = true;
> +         break;
>        default:
>           unreachable("not reached");
>        }
> @@ -178,6 +186,11 @@ combine_constant(bool ismin, ir_constant *a, ir_constant *b)
>               (!ismin && b->value.f[i] > c->value.f[i]))
>              c->value.f[i] = b->value.f[i];
>           break;
> +      case GLSL_TYPE_DOUBLE:
> +         if ((ismin && b->value.d[i] < c->value.d[i]) ||
> +             (!ismin && b->value.d[i] > c->value.d[i]))
> +            c->value.d[i] = b->value.d[i];
> +         break;
>        default:
>           assert(!"not reached");
>        }
> 



More information about the mesa-dev mailing list