summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichel Dänzer <[email protected]>2012-08-21 13:48:18 +0200
committerMichel Dänzer <[email protected]>2012-08-21 15:42:25 +0200
commit1a25ebe3ce95a6a4aef7c844dbe95909976b68da (patch)
tree9054e15756548d5b02755a285f218704a2d9a60d /src
parentc1114c619acf347917565cd1d0467240a89a76c0 (diff)
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 <[email protected]> Reviewed-by: Christian König <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/radeonsi/radeonsi_pm4.c7
-rw-r--r--src/gallium/drivers/radeonsi/si_state.c12
2 files changed, 14 insertions, 5 deletions
diff --git a/src/gallium/drivers/radeonsi/radeonsi_pm4.c b/src/gallium/drivers/radeonsi/radeonsi_pm4.c
index 3c53ce2e172..8268f914808 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_pm4.c
+++ b/src/gallium/drivers/radeonsi/radeonsi_pm4.c
@@ -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)
{
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_begin(state, PKT3_SET_SH_REG_OFFSET);
diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
index 11acb7310af..9a9a2506088 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -1971,16 +1971,18 @@ static void si_set_ps_sampler_view(struct pipe_context *ctx, unsigned count,
si_pm4_sh_data_begin(pm4);
for (i = 0; i < count; i++) {
- struct r600_resource_texture *tex = (void *)resource[i]->base.texture;
-
pipe_sampler_view_reference(
(struct pipe_sampler_view **)&rctx->ps_samplers.views[i],
views[i]);
- si_pm4_add_bo(pm4, &tex->resource, RADEON_USAGE_READ);
+ if (views[i]) {
+ struct r600_resource_texture *tex = (void *)resource[i]->base.texture;
+
+ si_pm4_add_bo(pm4, &tex->resource, RADEON_USAGE_READ);
- for (j = 0; j < Elements(resource[i]->state); ++j) {
- si_pm4_sh_data_add(pm4, resource[i]->state[j]);
+ for (j = 0; j < Elements(resource[i]->state); ++j) {
+ si_pm4_sh_data_add(pm4, resource[i]->state[j]);
+ }
}
}