[Mesa-dev] [PATCH] gallivm: some bits of seamless cube filtering implementation

Brian Paul brianp at vmware.com
Sat Sep 14 08:40:07 PDT 2013


On 09/13/2013 11:52 AM, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> Simply adjust wrap mode to clamp_to_edge. This is all that's needed for a
> correct implementation for nearest filtering, and it's way better than
> using repeat wrap for instance for linear filtering (though obviously this
> doesn't actually do seamless filtering).
>
> v2: fix s/t wrap not r/s...
> ---
>   src/gallium/auxiliary/gallivm/lp_bld_sample.c     |    1 +
>   src/gallium/auxiliary/gallivm/lp_bld_sample.h     |    1 +
>   src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c |   41 ++++++++++++++-------
>   3 files changed, 29 insertions(+), 14 deletions(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample.c b/src/gallium/auxiliary/gallivm/lp_bld_sample.c
> index 9b0a92c..c775382 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_sample.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample.c
> @@ -155,6 +155,7 @@ lp_sampler_static_sampler_state(struct lp_static_sampler_state *state,
>      state->wrap_r            = sampler->wrap_r;
>      state->min_img_filter    = sampler->min_img_filter;
>      state->mag_img_filter    = sampler->mag_img_filter;
> +   state->seamless_cube_map = sampler->seamless_cube_map;
>
>      if (sampler->max_lod > 0.0f) {
>         state->min_mip_filter = sampler->min_mip_filter;
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample.h b/src/gallium/auxiliary/gallivm/lp_bld_sample.h
> index e6b9f30..803a99e 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_sample.h
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample.h
> @@ -114,6 +114,7 @@ struct lp_static_sampler_state
>      unsigned lod_bias_non_zero:1;
>      unsigned apply_min_lod:1;  /**< min_lod > 0 ? */
>      unsigned apply_max_lod:1;  /**< max_lod < last_level ? */
> +   unsigned seamless_cube_map:1;
>
>      /* Hacks */
>      unsigned force_nearest_s:1;
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> index 7e98919..355e97d 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
> @@ -2123,8 +2123,21 @@ lp_build_sample_soa(struct gallivm_state *gallivm,
>         debug_printf("  .min_mip_filter = %u\n", derived_sampler_state.min_mip_filter);
>      }
>
> -   min_img_filter = static_sampler_state->min_img_filter;
> -   mag_img_filter = static_sampler_state->mag_img_filter;
> +   if ((static_texture_state->target == PIPE_TEXTURE_CUBE ||
> +        static_texture_state->target == PIPE_TEXTURE_CUBE_ARRAY) &&
> +       static_sampler_state->seamless_cube_map)
> +   {
> +      /*
> +       * Seamless filtering ignores wrap modes.
> +       * Setting to CLAMP_TO_EDGE is correct for nearest filtering, for
> +       * bilinear it's not correct but way better than using for instance repeat.
> +       */
> +      derived_sampler_state.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
> +      derived_sampler_state.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
> +   }
> +
> +   min_img_filter = derived_sampler_state.min_img_filter;
> +   mag_img_filter = derived_sampler_state.mag_img_filter;
>
>
>      /*
> @@ -2260,16 +2273,16 @@ lp_build_sample_soa(struct gallivm_state *gallivm,
>         LLVMValueRef ilevel0 = NULL, ilevel1 = NULL;
>         boolean use_aos = util_format_fits_8unorm(bld.format_desc) &&
>                           /* not sure this is strictly needed or simply impossible */
> -                        static_sampler_state->compare_mode == PIPE_TEX_COMPARE_NONE &&
> -                        lp_is_simple_wrap_mode(static_sampler_state->wrap_s);
> +                        derived_sampler_state.compare_mode == PIPE_TEX_COMPARE_NONE &&
> +                        lp_is_simple_wrap_mode(derived_sampler_state.wrap_s);
>
>         use_aos &= bld.num_lods <= num_quads ||
> -                 static_sampler_state->min_img_filter ==
> -                    static_sampler_state->mag_img_filter;
> +                 derived_sampler_state.min_img_filter ==
> +                    derived_sampler_state.mag_img_filter;
>         if (dims > 1) {
> -         use_aos &= lp_is_simple_wrap_mode(static_sampler_state->wrap_t);
> +         use_aos &= lp_is_simple_wrap_mode(derived_sampler_state.wrap_t);
>            if (dims > 2) {
> -            use_aos &= lp_is_simple_wrap_mode(static_sampler_state->wrap_r);
> +            use_aos &= lp_is_simple_wrap_mode(derived_sampler_state.wrap_r);
>            }
>         }
>
> @@ -2278,12 +2291,12 @@ lp_build_sample_soa(struct gallivm_state *gallivm,
>            debug_printf("%s: using floating point linear filtering for %s\n",
>                         __FUNCTION__, bld.format_desc->short_name);
>            debug_printf("  min_img %d  mag_img %d  mip %d  wraps %d  wrapt %d  wrapr %d\n",
> -                      static_sampler_state->min_img_filter,
> -                      static_sampler_state->mag_img_filter,
> -                      static_sampler_state->min_mip_filter,
> -                      static_sampler_state->wrap_s,
> -                      static_sampler_state->wrap_t,
> -                      static_sampler_state->wrap_r);
> +                      derived_sampler_state.min_img_filter,
> +                      derived_sampler_state.mag_img_filter,
> +                      derived_sampler_state.min_mip_filter,
> +                      derived_sampler_state.wrap_s,
> +                      derived_sampler_state.wrap_t,
> +                      derived_sampler_state.wrap_r);
>         }
>
>         lp_build_sample_common(&bld, texture_index, sampler_index,
>

Reviewed-by: Brian Paul <brianp at vmware.com>



More information about the mesa-dev mailing list