[Mesa-dev] [PATCH] i965/fs: Don't try to use bogus interpolation modes pre-Gen6.

Kenneth Graunke kenneth at whitecape.org
Fri Apr 26 23:06:55 PDT 2013


On 04/26/2013 04:52 PM, Chris Forbes wrote:
> Interpolation modes other than perspective-barycentric-pixel-center (and
> their associated coefficients in the WM payload) only exist in Gen6 and
> later.
>
> Unfortunately, if a varying was declared as `centroid`, we would blindly
> read the nonexistant values, and so produce all manner of bad behavior
> -- texture swimming, snow, etc.
>
> Fixes rendering in Counter-Strike Source and Team Fortress 2 on
> Ironlake.
>
> Signed-off-by: Chris Forbes <chrisf at ijw.co.nz>
> ---
>   src/mesa/drivers/dri/i965/brw_fs.cpp | 26 +++++++++++++++++---------
>   1 file changed, 17 insertions(+), 9 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index 66e78d0..1d810d8 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -984,16 +984,24 @@ fs_visitor::emit_linterp(const fs_reg &attr, const fs_reg &interp,
>                            bool is_centroid)
>   {
>      brw_wm_barycentric_interp_mode barycoord_mode;
> -   if (is_centroid) {
> -      if (interpolation_mode == INTERP_QUALIFIER_SMOOTH)
> -         barycoord_mode = BRW_WM_PERSPECTIVE_CENTROID_BARYCENTRIC;
> -      else
> -         barycoord_mode = BRW_WM_NONPERSPECTIVE_CENTROID_BARYCENTRIC;
> +   if (intel->gen >= 6) {
> +      if (is_centroid) {
> +         if (interpolation_mode == INTERP_QUALIFIER_SMOOTH)
> +            barycoord_mode = BRW_WM_PERSPECTIVE_CENTROID_BARYCENTRIC;
> +         else
> +            barycoord_mode = BRW_WM_NONPERSPECTIVE_CENTROID_BARYCENTRIC;
> +      } else {
> +         if (interpolation_mode == INTERP_QUALIFIER_SMOOTH)
> +            barycoord_mode = BRW_WM_PERSPECTIVE_PIXEL_BARYCENTRIC;
> +         else
> +            barycoord_mode = BRW_WM_NONPERSPECTIVE_PIXEL_BARYCENTRIC;
> +      }
>      } else {
> -      if (interpolation_mode == INTERP_QUALIFIER_SMOOTH)
> -         barycoord_mode = BRW_WM_PERSPECTIVE_PIXEL_BARYCENTRIC;
> -      else
> -         barycoord_mode = BRW_WM_NONPERSPECTIVE_PIXEL_BARYCENTRIC;
> +      /* On Ironlake and below, there is only one interpolation mode.
> +       * Centroid interpolation doesn't mean anything on this hardware --
> +       * there is no multisampling.
> +       */
> +      barycoord_mode = BRW_WM_PERSPECTIVE_PIXEL_BARYCENTRIC;
>      }
>      return emit(FS_OPCODE_LINTERP, attr,
>                  this->delta_x[barycoord_mode],
>

Awesome.  Thanks so much for finding this!

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>


More information about the mesa-dev mailing list