mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 15:20:10 +01:00
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:
parent
81ab3e57bc
commit
bb7dc1b2f6
2 changed files with 26 additions and 5 deletions
|
|
@ -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++) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue