From ba2874563ecc914db8bd71f3329188cb90cc0e88 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Wed, 2 Jun 2021 10:07:40 +0200 Subject: [PATCH] pan/blit: Extend pan_preload_fb() to return emitted jobs The vulkan driver needs to patch job headers when re-issuing batches. Extend pan_preload_fb() so it can return the emitted tiler jobs. Signed-off-by: Boris Brezillon Acked-by: Alyssa Rosenzweig Reviewed-by: Tomeu Vizoso Part-of: --- src/gallium/drivers/panfrost/pan_cmdstream.c | 2 +- src/panfrost/lib/pan_blitter.c | 41 +++++++++++++++++++--------- src/panfrost/lib/pan_blitter.h | 5 ++-- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index dea50a8..0b76f52 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -3534,7 +3534,7 @@ static void preload(struct panfrost_batch *batch, struct pan_fb_info *fb) { GENX(pan_preload_fb)(&batch->pool.base, &batch->scoreboard, fb, batch->tls.gpu, - PAN_ARCH >= 6 ? batch->tiler_ctx.bifrost : 0); + PAN_ARCH >= 6 ? batch->tiler_ctx.bifrost : 0, NULL); } static void diff --git a/src/panfrost/lib/pan_blitter.c b/src/panfrost/lib/pan_blitter.c index 23ba411..8909042 100644 --- a/src/panfrost/lib/pan_blitter.c +++ b/src/panfrost/lib/pan_blitter.c @@ -1166,7 +1166,7 @@ pan_preload_emit_pre_frame_dcd(struct pan_pool *desc_pool, } } #else -static void +static struct panfrost_ptr pan_preload_emit_tiler_job(struct pan_pool *desc_pool, struct pan_scoreboard *scoreboard, struct pan_fb_info *fb, bool zs, @@ -1197,10 +1197,11 @@ pan_preload_emit_tiler_job(struct pan_pool *desc_pool, panfrost_add_job(desc_pool, scoreboard, MALI_JOB_TYPE_TILER, false, false, 0, 0, &job, true); + return job; } #endif -static void +static struct panfrost_ptr pan_preload_fb_part(struct pan_pool *pool, struct pan_scoreboard *scoreboard, struct pan_fb_info *fb, bool zs, @@ -1208,28 +1209,31 @@ pan_preload_fb_part(struct pan_pool *pool, { struct panfrost_device *dev = pool->dev; mali_ptr rsd = pan_preload_get_rsd(dev, fb, zs); + struct panfrost_ptr job = { 0 }; #if PAN_ARCH >= 6 pan_preload_emit_pre_frame_dcd(pool, fb, zs, coords, rsd, tsd); #else - pan_preload_emit_tiler_job(pool, scoreboard, - fb, zs, coords, rsd, tsd); + job = pan_preload_emit_tiler_job(pool, scoreboard, + fb, zs, coords, rsd, tsd); #endif + return job; } -void +unsigned GENX(pan_preload_fb)(struct pan_pool *pool, struct pan_scoreboard *scoreboard, struct pan_fb_info *fb, - mali_ptr tsd, mali_ptr tiler) + mali_ptr tsd, mali_ptr tiler, + struct panfrost_ptr *jobs) { bool preload_zs = pan_preload_needed(fb, true); bool preload_rts = pan_preload_needed(fb, false); mali_ptr coords; if (!preload_zs && !preload_rts) - return; + return 0; float rect[] = { 0.0, 0.0, 0.0, 1.0, @@ -1241,13 +1245,24 @@ GENX(pan_preload_fb)(struct pan_pool *pool, coords = pan_pool_upload_aligned(pool, rect, sizeof(rect), 64); - if (preload_zs) - pan_preload_fb_part(pool, scoreboard, fb, true, coords, - tsd, tiler); + unsigned njobs = 0; + if (preload_zs) { + struct panfrost_ptr job = + pan_preload_fb_part(pool, scoreboard, fb, true, + coords, tsd, tiler); + if (jobs && job.cpu) + jobs[njobs++] = job; + } + + if (preload_rts) { + struct panfrost_ptr job = + pan_preload_fb_part(pool, scoreboard, fb, false, + coords, tsd, tiler); + if (jobs && job.cpu) + jobs[njobs++] = job; + } - if (preload_rts) - pan_preload_fb_part(pool, scoreboard, fb, false, coords, - tsd, tiler); + return njobs; } void diff --git a/src/panfrost/lib/pan_blitter.h b/src/panfrost/lib/pan_blitter.h index 26f77c7..17a8865 100644 --- a/src/panfrost/lib/pan_blitter.h +++ b/src/panfrost/lib/pan_blitter.h @@ -89,11 +89,12 @@ GENX(pan_blitter_init)(struct panfrost_device *dev, void GENX(pan_blitter_cleanup)(struct panfrost_device *dev); -void +unsigned GENX(pan_preload_fb)(struct pan_pool *desc_pool, struct pan_scoreboard *scoreboard, struct pan_fb_info *fb, - mali_ptr tsd, mali_ptr tiler); + mali_ptr tsd, mali_ptr tiler, + struct panfrost_ptr *jobs); void GENX(pan_blit_ctx_init)(struct panfrost_device *dev, -- 2.7.4