From 3ed9152fd17d33820956653cebb4483e5270c14b Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Mon, 19 Apr 2021 09:43:48 +0200 Subject: [PATCH] panfrost: Reserve thread storage descriptor in panfrost_launch_grid() If we don't do that the compute batch is left with an empty thread storage descriptor, and panfrost_batch_submit() tries to emit an FB descriptors using invalid FB information. Reported-by: Italo Nicola Fixes: ff3eada7eb4e ("panfrost: Use the generic preload and FB helpers in the gallium driver") Signed-off-by: Boris Brezillon Reviewed-by: Alyssa Rosenzweig Tested-by: Italo Nicola Reviewed-by: Italo Nicola Part-of: (cherry picked from commit 8d9b52f45a6b3fa39feddd16cc4d63b499c12640) --- .pick_status.json | 2 +- src/gallium/drivers/panfrost/pan_cmdstream.c | 2 +- src/gallium/drivers/panfrost/pan_compute.c | 5 +++++ src/gallium/drivers/panfrost/pan_context.c | 2 +- src/gallium/drivers/panfrost/pan_job.c | 6 +++--- src/gallium/drivers/panfrost/pan_job.h | 2 +- 6 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index baa695f96c7..56c6fe69c70 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -103,7 +103,7 @@ "description": "panfrost: Reserve thread storage descriptor in panfrost_launch_grid()", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "ff3eada7eb4e4df0abe93ee76b77101f9d24e72c" }, diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index 86624e894fd..757f6612c0b 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -2258,7 +2258,7 @@ panfrost_emit_tls(struct panfrost_batch *batch) struct panfrost_device *dev = pan_device(batch->ctx->base.screen); /* Emitted with the FB descriptor on Midgard. */ - if (!pan_is_bifrost(dev)) + if (!pan_is_bifrost(dev) && batch->framebuffer.gpu) return; struct panfrost_bo *tls_bo = diff --git a/src/gallium/drivers/panfrost/pan_compute.c b/src/gallium/drivers/panfrost/pan_compute.c index b25e1919ace..9624b7dec79 100644 --- a/src/gallium/drivers/panfrost/pan_compute.c +++ b/src/gallium/drivers/panfrost/pan_compute.c @@ -101,6 +101,11 @@ panfrost_launch_grid(struct pipe_context *pipe, struct panfrost_device *dev = pan_device(pipe->screen); struct panfrost_batch *batch = panfrost_get_batch_for_fbo(ctx); + /* Reserve a thread storage descriptor now (will be emitted at submit + * time). + */ + panfrost_batch_reserve_tls(batch, true); + /* TODO: Indirect compute dispatch */ assert(!info->indirect); diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index c158cb482ea..47f15511718 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -460,7 +460,7 @@ panfrost_direct_draw(struct panfrost_context *ctx, unsigned vertex_count = ctx->vertex_count; - mali_ptr shared_mem = panfrost_batch_reserve_tls(batch); + mali_ptr shared_mem = panfrost_batch_reserve_tls(batch, false); unsigned min_index = 0, max_index = 0; mali_ptr indices = 0; diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c index 0b47f87a437..72dffad6051 100644 --- a/src/gallium/drivers/panfrost/pan_job.c +++ b/src/gallium/drivers/panfrost/pan_job.c @@ -910,7 +910,7 @@ panfrost_batch_reserve_framebuffer(struct panfrost_batch *batch) } mali_ptr -panfrost_batch_reserve_tls(struct panfrost_batch *batch) +panfrost_batch_reserve_tls(struct panfrost_batch *batch, bool compute) { struct panfrost_device *dev = pan_device(batch->ctx->base.screen); @@ -919,7 +919,7 @@ panfrost_batch_reserve_tls(struct panfrost_batch *batch) if (batch->tls.gpu) return batch->tls.gpu; - if (pan_is_bifrost(dev)) { + if (pan_is_bifrost(dev) || compute) { batch->tls = panfrost_pool_alloc_desc(&batch->pool, LOCAL_STORAGE); } else { /* On Midgard, the FB descriptor contains a thread storage @@ -1122,7 +1122,7 @@ panfrost_batch_submit(struct panfrost_batch *batch, panfrost_batch_to_fb_info(batch, &fb, rts, &zs, &s, false); - panfrost_batch_reserve_tls(batch); + panfrost_batch_reserve_tls(batch, false); panfrost_batch_draw_wallpaper(batch, &fb); diff --git a/src/gallium/drivers/panfrost/pan_job.h b/src/gallium/drivers/panfrost/pan_job.h index 080c7b9a60e..ed15ed0998a 100644 --- a/src/gallium/drivers/panfrost/pan_job.h +++ b/src/gallium/drivers/panfrost/pan_job.h @@ -200,6 +200,6 @@ mali_ptr panfrost_batch_reserve_framebuffer(struct panfrost_batch *batch); mali_ptr -panfrost_batch_reserve_tls(struct panfrost_batch *batch); +panfrost_batch_reserve_tls(struct panfrost_batch *batch, bool compute); #endif