freedreno: a2xx: Prevent crash in emit_texture if view is not set
authorWladimir J. van der Laan <laanwj@gmail.com>
Wed, 23 Aug 2017 12:43:14 +0000 (12:43 +0000)
committerWladimir J. van der Laan <laanwj@gmail.com>
Sat, 31 Mar 2018 06:17:59 +0000 (06:17 +0000)
Textures will sometimes be updated if texture view state was
un-set, without this change that causes an assertion crash or
segfault.

Signed-off-by: Wladimir J. van der Laan <laanwj@gmail.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Rob Clark <robdclark@gmail.com>
src/gallium/drivers/freedreno/a2xx/fd2_emit.c

index 5a1db1335e342c119830f56f19201a40618d150f..a787b71e379ae8af99faf663918efaaa650a32fb 100644 (file)
@@ -125,8 +125,9 @@ emit_texture(struct fd_ringbuffer *ring, struct fd_context *ctx,
 {
        unsigned const_idx = fd2_get_const_idx(ctx, tex, samp_id);
        static const struct fd2_sampler_stateobj dummy_sampler = {};
+       static const struct fd2_pipe_sampler_view dummy_view = {};
        const struct fd2_sampler_stateobj *sampler;
-       struct fd2_pipe_sampler_view *view;
+       const struct fd2_pipe_sampler_view *view;
 
        if (emitted & (1 << const_idx))
                return 0;
@@ -134,13 +135,19 @@ emit_texture(struct fd_ringbuffer *ring, struct fd_context *ctx,
        sampler = tex->samplers[samp_id] ?
                        fd2_sampler_stateobj(tex->samplers[samp_id]) :
                        &dummy_sampler;
-       view = fd2_pipe_sampler_view(tex->textures[samp_id]);
+       view = tex->textures[samp_id] ?
+                       fd2_pipe_sampler_view(tex->textures[samp_id]) :
+                       &dummy_view;
 
        OUT_PKT3(ring, CP_SET_CONSTANT, 7);
        OUT_RING(ring, 0x00010000 + (0x6 * const_idx));
 
        OUT_RING(ring, sampler->tex0 | view->tex0);
-       OUT_RELOC(ring, fd_resource(view->base.texture)->bo, 0, view->fmt, 0);
+       if (view->base.texture)
+               OUT_RELOC(ring, fd_resource(view->base.texture)->bo, 0, view->fmt, 0);
+       else
+               OUT_RING(ring, 0);
+
        OUT_RING(ring, view->tex2);
        OUT_RING(ring, sampler->tex3 | view->tex3);
        OUT_RING(ring, sampler->tex4);