On 09/13/2013 11:52 AM, srol...@vmware.com wrote:
From: Roland Scheidegger <srol...@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 <bri...@vmware.com>

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to