This patch series fixes a rather insidious bug in conversion from floats to uints on i965 (and possibly other platforms).
Previously, we implemented conversion from float to uint by a two step process: first convert to int, then convert to uint. This doesn't work if the float value is greater than 0x7fffffff, because it is undefined how float-to-int conversion handles out-of-range values. On i965, out-of-range values are clamped during float-to-int conversion, so if we convert a float greater than 0x7fffffff to an int first, and then to a uint, we get the wrong result. To fix this bug I had to add a new ir operation, ir_unop_f2u, so that i965 could be instructed to do the conversion directly, without going through an intermediate int type. That meant I had to add support for this operation to all the back-ends, including Gallium. I would especially appreciate some review of my Gallium patches (patches 5 and 6) to make sure I didn't make a stupid mistake, since I'm not terribly familiar with the Gallium part of the codebase. I've posted a patch to the Piglit mailing list (glsl-1.30: Verify proper conversion of large floats to uints) that demonstrates the bug this patch series is meant to fix. [PATCH 1/7] glsl: Add unary operation ir_unop_f2u. [PATCH 2/7] glsl: Add support for ir_unop_f2u to constant folding. [PATCH 3/7] i965: Add support for ir_unop_f2u to i965 backend. [PATCH 4/7] ir_to_mesa: Add support for ir_unop_f2u to ir_to_mesa backend. [PATCH 5/7] gallium: Add support for ir_unop_f2u to tgsi backend. [PATCH 6/7] gallium: Add TGSI_OPCODE_F2U to gallivm backend. [PATCH 7/7] glsl: Use ir_unop_f2u to convert floats to uints. _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev