[Mesa-dev] [PATCH v2 4/8] panfrost: Pass the fence down when flushing

Tomeu Vizoso tomeu.vizoso at collabora.com
Fri Mar 8 09:27:09 UTC 2019


Signed-off-by: Tomeu Vizoso <tomeu.vizoso at collabora.com>
---
 src/gallium/drivers/panfrost/pan_context.c | 11 +++++++----
 src/gallium/drivers/panfrost/pan_context.h |  7 +++++++
 src/gallium/drivers/panfrost/pan_screen.c  | 11 ++++++-----
 src/gallium/drivers/panfrost/pan_screen.h  | 11 ++++++++++-
 4 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
index 2287dc6e3b54..51c2ded48fe4 100644
--- a/src/gallium/drivers/panfrost/pan_context.c
+++ b/src/gallium/drivers/panfrost/pan_context.c
@@ -1521,7 +1521,8 @@ panfrost_link_jobs(struct panfrost_context *ctx)
 /* The entire frame is in memory -- send it off to the kernel! */
 
 static void
-panfrost_submit_frame(struct panfrost_context *ctx, bool flush_immediate)
+panfrost_submit_frame(struct panfrost_context *ctx, bool flush_immediate,
+		      struct pipe_fence_handle **fence)
 {
         struct pipe_context *gallium = (struct pipe_context *) ctx;
         struct panfrost_screen *screen = pan_screen(gallium->screen);
@@ -1548,14 +1549,14 @@ panfrost_submit_frame(struct panfrost_context *ctx, bool flush_immediate)
         /* If visual, we can stall a frame */
 
         if (!flush_immediate)
-                screen->driver->force_flush_fragment(ctx);
+                screen->driver->force_flush_fragment(ctx, fence);
 
         screen->last_fragment_id = fragment_id;
         screen->last_fragment_flushed = false;
 
         /* If readback, flush now (hurts the pipelined performance) */
         if (flush_immediate)
-                screen->driver->force_flush_fragment(ctx);
+                screen->driver->force_flush_fragment(ctx, fence);
 
         if (screen->driver->dump_counters && pan_counters_base) {
                 screen->driver->dump_counters(screen);
@@ -1586,7 +1587,7 @@ panfrost_flush(
         bool flush_immediate = flags & PIPE_FLUSH_END_OF_FRAME;
 
         /* Submit the frame itself */
-        panfrost_submit_frame(ctx, flush_immediate);
+        panfrost_submit_frame(ctx, flush_immediate, fence);
 
         /* Prepare for the next frame */
         panfrost_invalidate_frame(ctx);
@@ -2786,6 +2787,8 @@ panfrost_create_context(struct pipe_screen *screen, void *priv, unsigned flags)
 
         panfrost_resource_context_init(gallium);
 
+        pscreen->driver->init_context(ctx);
+
         panfrost_setup_hardware(ctx);
 
         /* XXX: leaks */
diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h
index e3de1b1e792c..091d9988698a 100644
--- a/src/gallium/drivers/panfrost/pan_context.h
+++ b/src/gallium/drivers/panfrost/pan_context.h
@@ -74,6 +74,11 @@ struct panfrost_query {
         struct panfrost_transfer transfer;
 };
 
+struct panfrost_fence {
+        struct pipe_reference reference;
+        int fd;
+};
+
 #define PANFROST_MAX_TRANSIENT_ENTRIES 64
 
 struct panfrost_transient_pool {
@@ -218,6 +223,8 @@ struct panfrost_context {
          * for SFBD, and in theory we could flip between them on a per-RT basis, but
          * there's no real advantage to doing so */
         bool require_sfbd;
+
+	uint32_t out_sync;
 };
 
 /* Corresponds to the CSO */
diff --git a/src/gallium/drivers/panfrost/pan_screen.c b/src/gallium/drivers/panfrost/pan_screen.c
index f77bb11ffda4..3d13c3e924d2 100644
--- a/src/gallium/drivers/panfrost/pan_screen.c
+++ b/src/gallium/drivers/panfrost/pan_screen.c
@@ -503,21 +503,22 @@ panfrost_get_timestamp(struct pipe_screen *_screen)
 }
 
 static void
-panfrost_fence_reference(struct pipe_screen *screen,
+panfrost_fence_reference(struct pipe_screen *pscreen,
                          struct pipe_fence_handle **ptr,
                          struct pipe_fence_handle *fence)
 {
-        *ptr = fence;
+        struct panfrost_screen *screen = pan_screen(pscreen);
+        screen->driver->fence_reference(pscreen, ptr, fence);
 }
 
 static boolean
-panfrost_fence_finish(struct pipe_screen *screen,
+panfrost_fence_finish(struct pipe_screen *pscreen,
                       struct pipe_context *ctx,
                       struct pipe_fence_handle *fence,
                       uint64_t timeout)
 {
-        assert(fence);
-        return TRUE;
+        struct panfrost_screen *screen = pan_screen(pscreen);
+        return screen->driver->fence_finish(pscreen, ctx, fence, timeout);
 }
 
 static const void *
diff --git a/src/gallium/drivers/panfrost/pan_screen.h b/src/gallium/drivers/panfrost/pan_screen.h
index 576dca11dc7b..f109df857c7b 100644
--- a/src/gallium/drivers/panfrost/pan_screen.h
+++ b/src/gallium/drivers/panfrost/pan_screen.h
@@ -51,7 +51,8 @@ struct panfrost_driver {
 	struct panfrost_bo * (*import_bo) (struct panfrost_screen *screen, struct winsys_handle *whandle);
 
 	int (*submit_vs_fs_job) (struct panfrost_context *ctx, bool has_draws, bool is_scanout);
-	void (*force_flush_fragment) (struct panfrost_context *ctx);
+	void (*force_flush_fragment) (struct panfrost_context *ctx,
+				      struct pipe_fence_handle **fence);
 	void (*allocate_slab) (struct panfrost_screen *screen,
 		               struct panfrost_memory *mem,
 		               size_t pages,
@@ -66,6 +67,14 @@ struct panfrost_driver {
         void (*enable_counters) (struct panfrost_screen *screen);
         void (*dump_counters) (struct panfrost_screen *screen);
 	unsigned (*query_gpu_version) (struct panfrost_screen *screen);
+	int (*init_context) (struct panfrost_context *ctx);
+	void (*fence_reference) (struct pipe_screen *screen,
+                         struct pipe_fence_handle **ptr,
+                         struct pipe_fence_handle *fence);
+	boolean (*fence_finish) (struct pipe_screen *screen,
+                      struct pipe_context *ctx,
+                      struct pipe_fence_handle *fence,
+                      uint64_t timeout);
 };
 
 struct panfrost_screen {
-- 
2.20.1



More information about the mesa-dev mailing list