freedreno: fix for null textures
authorRob Clark <robclark@freedesktop.org>
Mon, 9 Jun 2014 17:34:07 +0000 (13:34 -0400)
committerRob Clark <robclark@freedesktop.org>
Fri, 13 Jun 2014 19:20:34 +0000 (15:20 -0400)
Some apps seem to give us a null sampler/view for texture slots which
come before the last used texture slot.  In particular 0ad triggers
this.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
src/gallium/drivers/freedreno/a3xx/fd3_emit.c
src/gallium/drivers/freedreno/freedreno_texture.c

index c78d5e8..4c6b5c1 100644 (file)
@@ -195,8 +195,10 @@ emit_textures(struct fd_ringbuffer *ring,
                OUT_RING(ring, CP_LOAD_STATE_1_STATE_TYPE(ST_CONSTANTS) |
                                CP_LOAD_STATE_1_EXT_SRC_ADDR(0));
                for (i = 0; i < tex->num_textures; i++) {
-                       struct fd3_pipe_sampler_view *view =
-                                       fd3_pipe_sampler_view(tex->textures[i]);
+                       static const struct fd3_pipe_sampler_view dummy_view = {};
+                       const struct fd3_pipe_sampler_view *view = tex->textures[i] ?
+                                       fd3_pipe_sampler_view(tex->textures[i]) :
+                                       &dummy_view;
                        OUT_RING(ring, view->texconst0);
                        OUT_RING(ring, view->texconst1);
                        OUT_RING(ring, view->texconst2 |
@@ -213,8 +215,10 @@ emit_textures(struct fd_ringbuffer *ring,
                OUT_RING(ring, CP_LOAD_STATE_1_STATE_TYPE(ST_CONSTANTS) |
                                CP_LOAD_STATE_1_EXT_SRC_ADDR(0));
                for (i = 0; i < tex->num_textures; i++) {
-                       struct fd3_pipe_sampler_view *view =
-                                       fd3_pipe_sampler_view(tex->textures[i]);
+                       static const struct fd3_pipe_sampler_view dummy_view = {};
+                       const struct fd3_pipe_sampler_view *view = tex->textures[i] ?
+                                       fd3_pipe_sampler_view(tex->textures[i]) :
+                                       &dummy_view;
                        struct fd_resource *rsc = view->tex_resource;
 
                        for (j = 0; j < view->mipaddrs; j++) {
index 8fb9419..212e506 100644 (file)
@@ -57,7 +57,7 @@ static void bind_sampler_states(struct fd_texture_stateobj *prog,
 
        for (i = 0; i < nr; i++) {
                if (hwcso[i])
-                       new_nr++;
+                       new_nr = i + 1;
                prog->samplers[i] = hwcso[i];
                prog->dirty_samplers |= (1 << i);
        }
@@ -78,7 +78,7 @@ static void set_sampler_views(struct fd_texture_stateobj *prog,
 
        for (i = 0; i < nr; i++) {
                if (views[i])
-                       new_nr++;
+                       new_nr = i + 1;
                pipe_sampler_view_reference(&prog->textures[i], views[i]);
                prog->dirty_samplers |= (1 << i);
        }