pan/blit: Extend pan_preload_fb() to return emitted jobs
authorBoris Brezillon <boris.brezillon@collabora.com>
Wed, 2 Jun 2021 08:07:40 +0000 (10:07 +0200)
committerBoris Brezillon <boris.brezillon@collabora.com>
Tue, 21 Sep 2021 12:59:50 +0000 (14:59 +0200)
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 <boris.brezillon@collabora.com>
Acked-by: Alyssa Rosenzweig <alyssa@collabora.com>
Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12095>

src/gallium/drivers/panfrost/pan_cmdstream.c
src/panfrost/lib/pan_blitter.c
src/panfrost/lib/pan_blitter.h

index dea50a8..0b76f52 100644 (file)
@@ -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
index 23ba411..8909042 100644 (file)
@@ -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
index 26f77c7..17a8865 100644 (file)
@@ -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,