radeonsi: Handle NULL sampler views getting passed in by the state tracker.
authorMichel Dänzer <michel.daenzer@amd.com>
Tue, 21 Aug 2012 11:48:18 +0000 (13:48 +0200)
committerMichel Dänzer <michel@daenzer.net>
Tue, 21 Aug 2012 13:42:25 +0000 (15:42 +0200)
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>
src/gallium/drivers/radeonsi/radeonsi_pm4.c
src/gallium/drivers/radeonsi/si_state.c

index 3c53ce2e172d4a24c8d5f8f685bfffbdcba95d88..8268f9148088ceb54c8bd27365840fa4b0a7d741 100644 (file)
@@ -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);
index 11acb7310af18ee34f2ac57c12b43094c557df99..9a9a2506088de93ed6723cbec858800193a815ad 100644 (file)
@@ -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]);
+                       }
                }
        }