diff options
author | Roland Scheidegger <[email protected]> | 2013-08-30 16:40:21 +0200 |
---|---|---|
committer | Roland Scheidegger <[email protected]> | 2013-08-30 23:20:03 +0200 |
commit | f37edb5e20bddf082c25e812ee6f144c4306b8e2 (patch) | |
tree | 94e0a5bd6d1122cda3d72db5f002c1ca446c8a19 /src/gallium | |
parent | bb7dc1b2f68bd9b8dc267a6314cea336cb36e1b7 (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/gallium')
-rw-r--r-- | 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 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 |