[Mesa-dev] [PATCH] softpipe: fix anisotropic filtering crash

Eduardo Lima Mitev elima at igalia.com
Sun Mar 13 06:21:14 UTC 2016


On 03/13/2016 06:53 AM, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> The filt_args->offset wasn't assigned but was always used later leading
> to a crash (as far as I can tell, texel offsets don't actually make much
> sense with anisotropic filtering, but because there's no explicit setting
> if offsets are enabled there the array is always accessed).
>
> This fixes https://bugs.freedesktop.org/show_bug.cgi?id=94481
>
> CC: <mesa-stable at lists.freedesktop.org>
> ---
>   src/gallium/drivers/softpipe/sp_tex_sample.c | 14 ++++++++++++--
>   1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.c b/src/gallium/drivers/softpipe/sp_tex_sample.c
> index e3e28a3..5e3d47b 100644
> --- a/src/gallium/drivers/softpipe/sp_tex_sample.c
> +++ b/src/gallium/drivers/softpipe/sp_tex_sample.c
> @@ -2209,6 +2209,7 @@ img_filter_2d_ewa(const struct sp_sampler_view *sp_sview,
>                     const float t[TGSI_QUAD_SIZE],
>                     const float p[TGSI_QUAD_SIZE],
>                     const uint faces[TGSI_QUAD_SIZE],
> +                  const int8_t *offset,
>                     unsigned level,
>                     const float dudx, const float dvdx,
>                     const float dudy, const float dvdy,
> @@ -2268,6 +2269,8 @@ img_filter_2d_ewa(const struct sp_sampler_view *sp_sview,
>      /* F *= formScale; */ /* no need to scale F as we don't use it below here */
>
>      args.level = level;
> +   args.offset = offset;
> +
>      for (j = 0; j < TGSI_QUAD_SIZE; j++) {
>         /* Heckbert MS thesis, p. 59; scan over the bounding box of the ellipse
>          * and incrementally update the value of Ax^2+Bxy*Cy^2; when this
> @@ -2431,6 +2434,8 @@ mip_filter_linear_aniso(const struct sp_sampler_view *sp_sview,
>      const float dvdy = (t[QUAD_TOP_LEFT]     - t[QUAD_BOTTOM_LEFT]) * t_to_v;
>      struct img_filter_args args;
>
> +   args.offset = filt_args->offset;
> +
>      if (filt_args->control == TGSI_SAMPLER_LOD_BIAS ||
>          filt_args->control == TGSI_SAMPLER_LOD_NONE ||
>          /* XXX FIXME */
> @@ -2495,6 +2500,11 @@ mip_filter_linear_aniso(const struct sp_sampler_view *sp_sview,
>            args.p = p[j];
>            args.level = psview->u.tex.last_level;
>            args.face_id = filt_args->faces[j];
> +         /*
> +          * XXX: we overwrote any linear filter with nearest, so this
> +          * isn't right (albeit if last level is 1x1 and no border it
> +          * will work just the same).
> +          */
>            min_filter(sp_sview, sp_samp, &args, &rgba[0][j]);
>         }

Patch looks right but this comment seems unrelated with it. If that's 
the case then perhaps it should be moved out to a patch of its own. 
Other than that:

Reviewed-by: Eduardo Lima Mitev <elima at igalia.com>

Thanks.

Eduardo

>      }
> @@ -2503,8 +2513,8 @@ mip_filter_linear_aniso(const struct sp_sampler_view *sp_sview,
>          * seem to be worth the extra running time.
>          */
>         img_filter_2d_ewa(sp_sview, sp_samp, min_filter, mag_filter,
> -                        s, t, p, filt_args->faces, level0,
> -                        dudx, dvdx, dudy, dvdy, rgba);
> +                        s, t, p, filt_args->faces, filt_args->offset,
> +                        level0, dudx, dvdx, dudy, dvdy, rgba);
>      }
>
>      if (DEBUG_TEX) {
>



More information about the mesa-dev mailing list