[Mesa-dev] [PATCH 02/11] i965/blorp: round to nearest when converting float to integer

Matt Turner mattst88 at gmail.com
Tue Feb 10 10:52:30 PST 2015


On Tue, Feb 10, 2015 at 7:40 AM, Eduardo Lima Mitev <elima at igalia.com> wrote:
> From: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
>
> Round floating point values to nearest integer to avoid "off by one texel"
> kind of errors when blitting.
>
> Fixes:
>
> dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_nearest
> dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_linear
> dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_reverse_src_y_nearest
> dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_reverse_src_y_linear
> dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_reverse_dst_y_nearest
> dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_reverse_dst_y_linear
> dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_reverse_src_dst_x_nearest
> dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_reverse_src_dst_x_linear
> dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_reverse_src_dst_y_nearest
> dEQP-GLES3.functional.fbo.blit.rect.out_of_bounds_reverse_src_dst_y_linear
>
> No piglit regressions.
>
> Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> ---
>  src/mesa/drivers/dri/i965/brw_blorp_blit.cpp | 11 +++++++----
>  1 file changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> index 10a53dc..469baf7 100644
> --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> @@ -1994,10 +1994,13 @@ brw_blorp_blit_params::brw_blorp_blit_params(struct brw_context *brw,
>
>     wm_prog_key.src_tiled_w = src.map_stencil_as_y_tiled;
>     wm_prog_key.dst_tiled_w = dst.map_stencil_as_y_tiled;
> -   x0 = wm_push_consts.dst_x0 = dst_x0;
> -   y0 = wm_push_consts.dst_y0 = dst_y0;
> -   x1 = wm_push_consts.dst_x1 = dst_x1;
> -   y1 = wm_push_consts.dst_y1 = dst_y1;
> +   /* Round floating point values to nearest integer to avoid "off by one texel"
> +    * kind of errors when blitting.
> +    */
> +   x0 = wm_push_consts.dst_x0 = dst_x0 + 0.5;
> +   y0 = wm_push_consts.dst_y0 = dst_y0 + 0.5;
> +   x1 = wm_push_consts.dst_x1 = dst_x1 + 0.5;
> +   y1 = wm_push_consts.dst_y1 = dst_y1 + 0.5;

Can we use round(dst_??) here instead?

x + 0.5 has the surprising property that nextafter(0.5, 0.0) (i.e.,
the largest value less than 0.5) + 0.5 is exactly half way between the
largest value less than 1.0 and 1.0, so it gets rounded to 1.0 instead
of down to 0.0. It's an uncommon case, but round() should better
describe what we want to do anyway.


More information about the mesa-dev mailing list