gallivm: handle unbound textures in texture sampling / texture queries
authorRoland Scheidegger <sroland@vmware.com>
Fri, 30 Aug 2013 14:40:21 +0000 (16:40 +0200)
committerRoland Scheidegger <sroland@vmware.com>
Fri, 30 Aug 2013 21:20:03 +0000 (23:20 +0200)
Turns out we don't need to do much extra work for detecting this case,
since we are guaranteed to get a empty static texture state in this case,
hence just rely on format being 0 and return all zero then.
Previously needed dummy textures (would just have crashed on format being 0
otherwise) which cannot return the correct result for size queries and when
sampling textures with wrap modes using border.
As a bonus should hugely increase performance when sampling unbound textures -
too bad it isn't a useful feature :-).

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

index 9719bb06c450f2137dcc411a06ce8f51e7b83e82..7e98919204d840dc8f0b11814dac5fee31d16068 100644 (file)
@@ -2059,6 +2059,19 @@ lp_build_sample_soa(struct gallivm_state *gallivm,
       debug_printf("Sample from %s\n", util_format_name(fmt));
    }
 
+   if (static_texture_state->format == PIPE_FORMAT_NONE) {
+      /*
+       * If there's nothing bound, format is NONE, and we must return
+       * all zero as mandated by d3d10 in this case.
+       */
+      unsigned chan;
+      LLVMValueRef zero = lp_build_const_vec(gallivm, type, 0.0F);
+      for (chan = 0; chan < 4; chan++) {
+         texel_out[chan] = zero;
+      }
+      return;
+   }
+
    assert(type.floating);
 
    /* Setup our build context */
@@ -2488,6 +2501,19 @@ lp_build_size_query_soa(struct gallivm_state *gallivm,
    unsigned num_lods = 1;
    struct lp_build_context bld_int_vec4;
 
+   if (static_state->format == PIPE_FORMAT_NONE) {
+      /*
+       * If there's nothing bound, format is NONE, and we must return
+       * all zero as mandated by d3d10 in this case.
+       */
+      unsigned chan;
+      LLVMValueRef zero = lp_build_const_vec(gallivm, int_type, 0.0F);
+      for (chan = 0; chan < 4; chan++) {
+         sizes_out[chan] = zero;
+      }
+      return;
+   }
+
    /*
     * Do some sanity verification about bound texture and shader dcl target.
     * Not entirely sure what's possible but assume array/non-array