Mesa (main): panfrost: Use vtable for fragment descriptor functions

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jul 7 13:34:29 UTC 2021


Module: Mesa
Branch: main
Commit: 035434658eef0e08052ca64fda6fb79f9fcb6f42
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=035434658eef0e08052ca64fda6fb79f9fcb6f42

Author: Alyssa Rosenzweig <alyssa at collabora.com>
Date:   Tue Jul  6 18:09:43 2021 -0400

panfrost: Use vtable for fragment descriptor functions

Arch dependent and not directly from Gallium.

Signed-off-by: Alyssa Rosenzweig <alyssa at collabora.com>
Acked-by: Boris Brezillon <boris.brezillon at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11745>

---

 src/gallium/drivers/panfrost/pan_cmdstream.c | 17 +++++++++--------
 src/gallium/drivers/panfrost/pan_job.c       | 14 +++++++++-----
 src/gallium/drivers/panfrost/pan_screen.h    | 10 ++++++++++
 3 files changed, 28 insertions(+), 13 deletions(-)

diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c
index ae2bbd21af4..fef1fd2e9e1 100644
--- a/src/gallium/drivers/panfrost/pan_cmdstream.c
+++ b/src/gallium/drivers/panfrost/pan_cmdstream.c
@@ -2349,8 +2349,8 @@ panfrost_emit_vertex_tiler_jobs(struct panfrost_batch *batch,
                          vertex, 0, tiler_job, false);
 }
 
-void
-panfrost_emit_tls(struct panfrost_batch *batch)
+static void
+emit_tls(struct panfrost_batch *batch)
 {
         struct panfrost_device *dev = pan_device(batch->ctx->base.screen);
 
@@ -2376,9 +2376,8 @@ panfrost_emit_tls(struct panfrost_batch *batch)
         pan_emit_tls(dev, &tls, batch->tls.cpu);
 }
 
-void
-panfrost_emit_fbd(struct panfrost_batch *batch,
-                  const struct pan_fb_info *fb)
+static void
+emit_fbd(struct panfrost_batch *batch, const struct pan_fb_info *fb)
 {
         struct panfrost_device *dev = pan_device(batch->ctx->base.screen);
         struct panfrost_bo *tls_bo =
@@ -2415,9 +2414,8 @@ panfrost_initialize_surface(struct panfrost_batch *batch,
 /* Generate a fragment job. This should be called once per frame. (According to
  * presentations, this is supposed to correspond to eglSwapBuffers) */
 
-mali_ptr
-panfrost_emit_fragment_job(struct panfrost_batch *batch,
-                           const struct pan_fb_info *pfb)
+static mali_ptr
+emit_fragment_job(struct panfrost_batch *batch, const struct pan_fb_info *pfb)
 {
         struct panfrost_device *dev = pan_device(batch->ctx->base.screen);
 
@@ -3652,6 +3650,9 @@ void
 panfrost_cmdstream_screen_init(struct panfrost_screen *screen)
 {
         screen->vtbl.prepare_rsd = prepare_rsd;
+        screen->vtbl.emit_tls    = emit_tls;
+        screen->vtbl.emit_fbd    = emit_fbd;
+        screen->vtbl.emit_fragment_job = emit_fragment_job;
 }
 
 void
diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c
index d0b507a8b8e..231c0b07868 100644
--- a/src/gallium/drivers/panfrost/pan_job.c
+++ b/src/gallium/drivers/panfrost/pan_job.c
@@ -782,7 +782,9 @@ panfrost_batch_submit_jobs(struct panfrost_batch *batch,
                            const struct pan_fb_info *fb,
                            uint32_t in_sync, uint32_t out_sync)
 {
-        struct panfrost_device *dev = pan_device(batch->ctx->base.screen);
+        struct pipe_screen *pscreen = batch->ctx->base.screen;
+        struct panfrost_screen *screen = pan_screen(pscreen);
+        struct panfrost_device *dev = pan_device(pscreen);
         bool has_draws = batch->scoreboard.first_job;
         bool has_tiler = batch->scoreboard.first_tiler;
         bool has_frag = has_tiler || batch->clear;
@@ -811,7 +813,7 @@ panfrost_batch_submit_jobs(struct panfrost_batch *batch,
                  * *only* clears, since otherwise the tiler structures will be
                  * uninitialized leading to faults (or state leaks) */
 
-                mali_ptr fragjob = panfrost_emit_fragment_job(batch, fb);
+                mali_ptr fragjob = screen->vtbl.emit_fragment_job(batch, fb);
                 ret = panfrost_batch_submit_ioctl(batch, fragjob,
                                                   PANFROST_JD_REQ_FS, 0,
                                                   out_sync);
@@ -849,7 +851,9 @@ static void
 panfrost_batch_submit(struct panfrost_batch *batch,
                       uint32_t in_sync, uint32_t out_sync)
 {
-        struct panfrost_device *dev = pan_device(batch->ctx->base.screen);
+        struct pipe_screen *pscreen = batch->ctx->base.screen;
+        struct panfrost_screen *screen = pan_screen(pscreen);
+        struct panfrost_device *dev = pan_device(pscreen);
         int ret;
 
         /* Nothing to do! */
@@ -875,11 +879,11 @@ panfrost_batch_submit(struct panfrost_batch *batch,
         /* Now that all draws are in, we can finally prepare the
          * FBD for the batch (if there is one). */
 
-        panfrost_emit_tls(batch);
+        screen->vtbl.emit_tls(batch);
         panfrost_emit_tile_map(batch, &fb);
 
         if (batch->scoreboard.first_tiler || batch->clear)
-                panfrost_emit_fbd(batch, &fb);
+                screen->vtbl.emit_fbd(batch, &fb);
 
         ret = panfrost_batch_submit_jobs(batch, &fb, in_sync, out_sync);
 
diff --git a/src/gallium/drivers/panfrost/pan_screen.h b/src/gallium/drivers/panfrost/pan_screen.h
index cb70de0c541..5781a0e6c72 100644
--- a/src/gallium/drivers/panfrost/pan_screen.h
+++ b/src/gallium/drivers/panfrost/pan_screen.h
@@ -44,6 +44,7 @@ struct panfrost_batch;
 struct panfrost_context;
 struct panfrost_resource;
 struct panfrost_shader_state;
+struct pan_fb_info;
 
 /* Virtual table of per-generation (GenXML) functions */
 
@@ -53,6 +54,15 @@ struct panfrost_vtable {
         void (*prepare_rsd)(struct panfrost_device *,
                             struct panfrost_shader_state *,
                             struct panfrost_pool *, bool);
+
+        /* Emits a thread local storage descriptor */
+        void (*emit_tls)(struct panfrost_batch *);
+
+        /* Emits a framebuffer descriptor */
+        void (*emit_fbd)(struct panfrost_batch *, const struct pan_fb_info *);
+
+        /* Emits a fragment job */
+        mali_ptr (*emit_fragment_job)(struct panfrost_batch *, const struct pan_fb_info *);
 };
 
 struct panfrost_screen {



More information about the mesa-commit mailing list