r600g: fix up segfault with variation between views and count.
authorDave Airlie <airlied@redhat.com>
Wed, 28 Jul 2010 05:26:14 +0000 (15:26 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 28 Jul 2010 05:28:18 +0000 (15:28 +1000)
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.

src/gallium/drivers/r600/r600_state.c

index 367a1f9991afaca573f8e6e000b5cc1b5ddafc1e..2fdcdea14efedc0719e88c65f6aaf2447b458859 100644 (file)
@@ -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;