[Mesa-dev] [PATCH] st/mesa: fix default interpolation for colors. (v2)

Brian Paul brianp at vmware.com
Fri Jan 6 07:13:57 PST 2012


On 01/06/2012 06:57 AM, Dave Airlie wrote:
> From: Dave Airlie<airlied at redhat.com>
>
> Brian mentioned that mesa-demos/reflect was broken on softpipe,
> by my previous commit. The problem was were blindly translating none
> to perspective, when color/pntc at least need it linear.
>
> v2: no regressions version.
> use shademodel to pick what none means.
>
> Signed-off-by: Dave Airlie<airlied at redhat.com>
> ---
>   src/mesa/state_tracker/st_program.c |   19 ++++++++++++-------
>   1 files changed, 12 insertions(+), 7 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
> index 146a9f3..1f6094e 100644
> --- a/src/mesa/state_tracker/st_program.c
> +++ b/src/mesa/state_tracker/st_program.c
> @@ -436,10 +436,14 @@ st_get_vp_variant(struct st_context *st,
>
>
>   static unsigned
> -st_translate_interp(enum glsl_interp_qualifier glsl_qual)
> +st_translate_interp(enum glsl_interp_qualifier glsl_qual, bool is_color, GLenum shade_model)
>   {
>      switch (glsl_qual) {
>      case INTERP_QUALIFIER_NONE:
> +      if (is_color)
> +         if (shade_model == GL_FLAT)
> +            return TGSI_INTERPOLATE_LINEAR;
> +      return TGSI_INTERPOLATE_PERSPECTIVE;

This doesn't look right.  If shade_mode == GL_FLAT, shouldn't we 
return TGSI_INTERPOLATE_CONSTANT?


>      case INTERP_QUALIFIER_SMOOTH:
>         return TGSI_INTERPOLATE_PERSPECTIVE;
>      case INTERP_QUALIFIER_FLAT:
> @@ -542,12 +546,14 @@ st_translate_fragment_program(struct st_context *st,
>               case FRAG_ATTRIB_COL0:
>                  input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
>                  input_semantic_index[slot] = 0;
> -               interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr]);
> +               interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr],
> +                                                      TRUE, st->ctx->Light.ShadeModel);
>                  break;
>               case FRAG_ATTRIB_COL1:
>                  input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
>                  input_semantic_index[slot] = 1;
> -               interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr]);
> +               interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr],
> +                                                      TRUE, st->ctx->Light.ShadeModel);
>                  break;
>               case FRAG_ATTRIB_FOGC:
>                  input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
> @@ -601,10 +607,9 @@ st_translate_fragment_program(struct st_context *st,
>                  assert(attr>= FRAG_ATTRIB_TEX0);
>                  input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0);
>                  input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
> -               if (attr == FRAG_ATTRIB_PNTC)
> -                  interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
> -               else
> -                  interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr]);
> +               interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr],
> +                                                      (attr == FRAG_ATTRIB_PNTC),
> +                                                      st->ctx->Light.ShadeModel);

The ShadeModel value should only apply to color attibutes so it 
shouldn't appear here in the texcoords/generic/point-coord case.

I think the code should read:

    if (attr == FRAG_ATTRIB_PNTC)
       interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
    else
       interpMode[slot] = 
st_translate_interp((stfp->Base.InterpQualifier[attr], false, 0);


>                  break;
>               }
>            }


-Brian


More information about the mesa-dev mailing list