[Mesa-dev] [PATCH] glsl: Fix type error when lowering integer divisions

Ian Romanick idr at freedesktop.org
Mon Aug 15 13:33:03 PDT 2011


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 08/12/2011 10:38 AM, Paul Berry wrote:
> This patch fixes a bug when lowering an integer division:
> 
>   x/y
> 
> to a multiplication by a reciprocal:
> 
>   int(float(x)*reciprocal(float(y)))
> 
> If x was a a plain int and y was an ivecN, the lowering pass
           ^^^  One "a" should suffice.

> incorrectly assigned the type of the product to be float, when in fact
> it should be vecN.  This caused mesa to abort with an IR validation
> error.
> 
> Fixes piglit tests {fs,vs}-op-div-int-ivec{2,3,4}.
> ---
>  src/glsl/lower_instructions.cpp |    4 ++++
>  1 files changed, 4 insertions(+), 0 deletions(-)
> 
> diff --git a/src/glsl/lower_instructions.cpp b/src/glsl/lower_instructions.cpp
> index 806f863..23aa19b 100644
> --- a/src/glsl/lower_instructions.cpp
> +++ b/src/glsl/lower_instructions.cpp
> @@ -166,6 +166,10 @@ lower_instructions_visitor::div_to_mul_rcp(ir_expression *ir)
>        else
>  	 op0 = new(ir) ir_expression(ir_unop_u2f, vec_type, ir->operands[0], NULL);
>  
> +      vec_type = glsl_type::get_instance(GLSL_TYPE_FLOAT,
> +					 ir->type->vector_elements,
> +					 ir->type->matrix_columns);
> +
>        op0 = new(ir) ir_expression(ir_binop_mul, vec_type, op0, op1);
>  
>        if (ir->operands[1]->type->base_type == GLSL_TYPE_INT) {

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/

iEYEARECAAYFAk5Jgn8ACgkQX1gOwKyEAw/L+QCgoPj3qiC4QYapE34OkSIoyTvQ
LzMAnA33vY8QGj6QZ/1H7voXWx9oL7u/
=a64F
-----END PGP SIGNATURE-----


More information about the mesa-dev mailing list