freedreno: handle null sampler
authorRob Clark <robclark@freedesktop.org>
Thu, 27 Mar 2014 18:47:48 +0000 (14:47 -0400)
committerRob Clark <robclark@freedesktop.org>
Sun, 30 Mar 2014 13:38:16 +0000 (09:38 -0400)
This is something that XA triggers.  In some cases it will only use
SAMP[1] (composite mask) but not SAMP[0] (composite src).

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

index 35511ba2bd3567cc5b8909b2adf7fd0ea8c3c010..d1a586c8c9bd168d805aa3c5cfbe97d7426c164e 100644 (file)
@@ -124,13 +124,16 @@ emit_texture(struct fd_ringbuffer *ring, struct fd_context *ctx,
                struct fd_texture_stateobj *tex, unsigned samp_id, texmask emitted)
 {
        unsigned const_idx = fd2_get_const_idx(ctx, tex, samp_id);
+       static const struct fd2_sampler_stateobj dummy_sampler = {};
        struct fd2_sampler_stateobj *sampler;
        struct fd2_pipe_sampler_view *view;
 
        if (emitted & (1 << const_idx))
                return 0;
 
-       sampler = fd2_sampler_stateobj(tex->samplers[samp_id]);
+       sampler = tex->samplers[samp_id] ?
+                       fd2_sampler_stateobj(tex->samplers[samp_id]) :
+                       &dummy_sampler;
        view = fd2_pipe_sampler_view(tex->textures[samp_id]);
 
        OUT_PKT3(ring, CP_SET_CONSTANT, 7);
index 619ac1ee353b7cf58b86b4f1126d053215bd159b..365cb37fc592a41feb2caea28353d4931800e9a0 100644 (file)
@@ -176,8 +176,10 @@ emit_textures(struct fd_ringbuffer *ring,
                OUT_RING(ring, CP_LOAD_STATE_1_STATE_TYPE(ST_SHADER) |
                                CP_LOAD_STATE_1_EXT_SRC_ADDR(0));
                for (i = 0; i < tex->num_samplers; i++) {
-                       struct fd3_sampler_stateobj *sampler =
-                                       fd3_sampler_stateobj(tex->samplers[i]);
+                       static const struct fd3_sampler_stateobj dummy_sampler = {};
+                       struct fd3_sampler_stateobj *sampler = tex->samplers[i] ?
+                                       fd3_sampler_stateobj(tex->samplers[i]) :
+                                       &dummy_sampler;
                        OUT_RING(ring, sampler->texsamp0);
                        OUT_RING(ring, sampler->texsamp1);
                }