Module: Mesa Branch: master Commit: f37edb5e20bddf082c25e812ee6f144c4306b8e2 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=f37edb5e20bddf082c25e812ee6f144c4306b8e2
Author: Roland Scheidegger <[email protected]> Date: Fri Aug 30 16:40:21 2013 +0200 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]> --- src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c | 26 +++++++++++++++++++++ 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 9719bb0..7e98919 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 _______________________________________________ mesa-commit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-commit
