gallivm: don't use AoS path if min/mag filter are different with multiple lods
authorRoland Scheidegger <sroland@vmware.com>
Thu, 29 Aug 2013 18:52:18 +0000 (20:52 +0200)
committerRoland Scheidegger <sroland@vmware.com>
Fri, 30 Aug 2013 21:20:03 +0000 (23:20 +0200)
Instead of enhancing the AoS path so it can deal with it, just use SoA. Fixing
AoS path wouldn't be all that difficult (use all the same logic as SoA) but
considered not worth it for now.

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c

index 7f919517cc9473552ac7e8072c5bd37062fce520..26a65d08f8a21db29085d4301081f8dfbced53fc 100644 (file)
@@ -2264,6 +2264,10 @@ lp_build_sample_soa(struct gallivm_state *gallivm,
                         /* 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);
+
+      use_aos &= bld.num_lods <= num_quads ||
+                 static_sampler_state->min_img_filter ==
+                    static_sampler_state->mag_img_filter;
       if (dims > 1) {
          use_aos &= lp_is_simple_wrap_mode(static_sampler_state->wrap_t);
          if (dims > 2) {
@@ -2292,7 +2296,8 @@ lp_build_sample_soa(struct gallivm_state *gallivm,
 
       /*
        * we only try 8-wide sampling with soa as it appears to
-       * be a loss with aos with AVX (but it should work).
+       * be a loss with aos with AVX (but it should work, except
+       * for conformance if min_filter != mag_filter if num_lods > 1).
        * (It should be faster if we'd support avx2)
        */
       if (num_quads == 1 || !use_aos) {