From f37edb5e20bddf082c25e812ee6f144c4306b8e2 Mon Sep 17 00:00:00 2001 From: Roland Scheidegger Date: Fri, 30 Aug 2013 16:40:21 +0200 Subject: 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 Reviewed-by: Zack Rusin --- src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c | 26 +++++++++++++++++++++++ 1 file changed, 26 insertions(+) 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 -- cgit v1.2.3