summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRoland Scheidegger <[email protected]>2013-08-30 16:40:21 +0200
committerRoland Scheidegger <[email protected]>2013-08-30 23:20:03 +0200
commitf37edb5e20bddf082c25e812ee6f144c4306b8e2 (patch)
tree94e0a5bd6d1122cda3d72db5f002c1ca446c8a19 /src
parentbb7dc1b2f68bd9b8dc267a6314cea336cb36e1b7 (diff)
gallivm: handle unbound textures in texture sampling / texture queries
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 <[email protected]> Reviewed-by: Zack Rusin <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
index 9719bb06c45..7e98919204d 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
@@ -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