softpipe: handle NULL sampler views for texture sampling / queries

Instead of crashing just return all zero.

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
Reviewed-by: Zack Rusin <zackr@vmware.com>
This commit is contained in:
Roland Scheidegger 2013-08-30 16:35:40 +02:00
parent 81ab3e57bc
commit bb7dc1b2f6
2 changed files with 26 additions and 5 deletions

View file

@ -2076,6 +2076,7 @@ exec_txq(struct tgsi_exec_machine *mach,
fetch_source(mach, &src, &inst->Src[0], TGSI_CHAN_X, TGSI_EXEC_DATA_INT);
/* XXX: This interface can't return per-pixel values */
mach->Sampler->get_dims(mach->Sampler, unit, src.i[0], result);
for (i = 0; i < TGSI_QUAD_SIZE; i++) {

View file

@ -3112,7 +3112,11 @@ sp_tgsi_get_dims(struct tgsi_sampler *tgsi_sampler,
struct sp_tgsi_sampler *sp_samp = (struct sp_tgsi_sampler *)tgsi_sampler;
assert(sview_index < PIPE_MAX_SHADER_SAMPLER_VIEWS);
/* TODO should have defined behavior if no texture is bound. */
/* always have a view here but texture is NULL if no sampler view was set. */
if (!sp_samp->sp_sview[sview_index].base.texture) {
dims[0] = dims[1] = dims[2] = dims[3] = 0;
return;
}
sp_get_dims(&sp_samp->sp_sview[sview_index], level, dims);
}
@ -3136,8 +3140,16 @@ sp_tgsi_get_samples(struct tgsi_sampler *tgsi_sampler,
assert(sview_index < PIPE_MAX_SHADER_SAMPLER_VIEWS);
assert(sampler_index < PIPE_MAX_SAMPLERS);
assert(sp_samp->sp_sampler[sampler_index]);
/* FIXME should have defined behavior if no texture is bound. */
assert(sp_samp->sp_sview[sview_index].get_samples);
/* always have a view here but texture is NULL if no sampler view was set. */
if (!sp_samp->sp_sview[sview_index].base.texture) {
int i, j;
for (j = 0; j < TGSI_NUM_CHANNELS; j++) {
for (i = 0; i < TGSI_QUAD_SIZE; i++) {
rgba[j][i] = 0.0f;
}
}
return;
}
sp_samp->sp_sview[sview_index].get_samples(&sp_samp->sp_sview[sview_index],
sp_samp->sp_sampler[sampler_index],
s, t, p, c0, lod, control, rgba);
@ -3155,8 +3167,16 @@ sp_tgsi_get_texel(struct tgsi_sampler *tgsi_sampler,
struct sp_tgsi_sampler *sp_samp = (struct sp_tgsi_sampler *)tgsi_sampler;
assert(sview_index < PIPE_MAX_SHADER_SAMPLER_VIEWS);
/* FIXME should have defined behavior if no texture is bound. */
assert(sp_samp->sp_sview[sview_index].base.texture);
/* always have a view here but texture is NULL if no sampler view was set. */
if (!sp_samp->sp_sview[sview_index].base.texture) {
int i, j;
for (j = 0; j < TGSI_NUM_CHANNELS; j++) {
for (i = 0; i < TGSI_QUAD_SIZE; i++) {
rgba[j][i] = 0.0f;
}
}
return;
}
sp_get_texels(&sp_samp->sp_sview[sview_index], i, j, k, lod, offset, rgba);
}