From: Dave Airlie Date: Wed, 28 Jul 2010 05:26:14 +0000 (+1000) Subject: r600g: fix up segfault with variation between views and count. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2ab24a6faedb0f9b93055cbf3d52be1120353ee1;p=mesa.git r600g: fix up segfault with variation between views and count. For some reason gallium hands us something with lots of empty views, and we are expected to deal with it, just do what r300g does for this bit. --- diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c index 367a1f9991a..2fdcdea14ef 100644 --- a/src/gallium/drivers/r600/r600_state.c +++ b/src/gallium/drivers/r600/r600_state.c @@ -481,18 +481,26 @@ static void r600_set_fragment_sampler_views(struct pipe_context *ctx, struct r600_texture_resource *rtexture; struct r600_context *rctx = r600_context(ctx); struct pipe_sampler_view *tmp; - unsigned i; + unsigned i, real_num_views = 0; if (views == NULL) return; + for (i = 0; i < count; i++) { + if (views[i]) + real_num_views++; + } + for (i = 0; i < rctx->nps_view; i++) { tmp = &rctx->ps_view[i]->view; pipe_sampler_view_reference(&tmp, NULL); rctx->ps_view[i] = NULL; } - rctx->nps_view = count; + rctx->nps_view = real_num_views; for (i = 0; i < count; i++) { + + if (!views[i]) + continue; rtexture = LIST_ENTRY(struct r600_texture_resource, views[i], view); rctx->ps_view[i] = rtexture; tmp = NULL; @@ -508,18 +516,24 @@ static void r600_set_vertex_sampler_views(struct pipe_context *ctx, struct r600_texture_resource *rtexture; struct r600_context *rctx = r600_context(ctx); struct pipe_sampler_view *tmp; - unsigned i; + unsigned i, real_num_views = 0; if (views == NULL) return; + for (i = 0; i < count; i++) { + if (views[i]) + real_num_views++; + } for (i = 0; i < rctx->nvs_view; i++) { tmp = &rctx->vs_view[i]->view; pipe_sampler_view_reference(&tmp, NULL); rctx->vs_view[i] = NULL; } - rctx->nps_view = count; + rctx->nvs_view = real_num_views; for (i = 0; i < count; i++) { + if (!views[i]) + continue; rtexture = LIST_ENTRY(struct r600_texture_resource, views[i], view); rctx->vs_view[i] = rtexture; tmp = NULL;