radeonsi: Handle NULL sampler views getting passed in by the state tracker.
Don't dereference NULL pointers, and if all views are NULL, don't generate an invalid PM4 packet which locks up the GPU. Signed-off-by: Michel Dänzer <michel.daenzer@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com>
This commit is contained in:
parent
c1114c619a
commit
1a25ebe3ce
|
@ -109,6 +109,13 @@ void si_pm4_sh_data_add(struct si_pm4_state *state, uint32_t dw)
|
||||||
void si_pm4_sh_data_end(struct si_pm4_state *state, unsigned reg)
|
void si_pm4_sh_data_end(struct si_pm4_state *state, unsigned reg)
|
||||||
{
|
{
|
||||||
unsigned offs = state->last_pm4 + 1;
|
unsigned offs = state->last_pm4 + 1;
|
||||||
|
|
||||||
|
/* Bail if no data was added */
|
||||||
|
if (state->ndw == offs) {
|
||||||
|
state->ndw--;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
si_pm4_cmd_end(state, false);
|
si_pm4_cmd_end(state, false);
|
||||||
|
|
||||||
si_pm4_cmd_begin(state, PKT3_SET_SH_REG_OFFSET);
|
si_pm4_cmd_begin(state, PKT3_SET_SH_REG_OFFSET);
|
||||||
|
|
|
@ -1971,18 +1971,20 @@ static void si_set_ps_sampler_view(struct pipe_context *ctx, unsigned count,
|
||||||
|
|
||||||
si_pm4_sh_data_begin(pm4);
|
si_pm4_sh_data_begin(pm4);
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
struct r600_resource_texture *tex = (void *)resource[i]->base.texture;
|
|
||||||
|
|
||||||
pipe_sampler_view_reference(
|
pipe_sampler_view_reference(
|
||||||
(struct pipe_sampler_view **)&rctx->ps_samplers.views[i],
|
(struct pipe_sampler_view **)&rctx->ps_samplers.views[i],
|
||||||
views[i]);
|
views[i]);
|
||||||
|
|
||||||
|
if (views[i]) {
|
||||||
|
struct r600_resource_texture *tex = (void *)resource[i]->base.texture;
|
||||||
|
|
||||||
si_pm4_add_bo(pm4, &tex->resource, RADEON_USAGE_READ);
|
si_pm4_add_bo(pm4, &tex->resource, RADEON_USAGE_READ);
|
||||||
|
|
||||||
for (j = 0; j < Elements(resource[i]->state); ++j) {
|
for (j = 0; j < Elements(resource[i]->state); ++j) {
|
||||||
si_pm4_sh_data_add(pm4, resource[i]->state[j]);
|
si_pm4_sh_data_add(pm4, resource[i]->state[j]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (i = count; i < NUM_TEX_UNITS; i++) {
|
for (i = count; i < NUM_TEX_UNITS; i++) {
|
||||||
if (rctx->ps_samplers.views[i])
|
if (rctx->ps_samplers.views[i])
|
||||||
|
|
Loading…
Reference in New Issue