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