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 <jfonseca@vmware.com> Reviewed-by: Zack Rusin <zackr@vmware.com>
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user