panfrost: Move the fence creation in panfrost_flush()
authorBoris Brezillon <boris.brezillon@collabora.com>
Thu, 5 Sep 2019 17:14:25 +0000 (19:14 +0200)
committerBoris Brezillon <boris.brezillon@collabora.com>
Fri, 13 Sep 2019 14:25:06 +0000 (16:25 +0200)
panfrost_flush() is about to be reworked to flush all pending batches,
but we want the fence to block on the last one. Let's move the fence
creation logic in panfrost_flush() to prepare for this situation.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
src/gallium/drivers/panfrost/pan_context.c
src/gallium/drivers/panfrost/pan_context.h
src/gallium/drivers/panfrost/pan_drm.c
src/gallium/drivers/panfrost/pan_screen.h

index de11dae0fc2113cc10190bd566a1736f043c151e..ed4bf6dca82b6880ef9fa9d2f0708515361e376f 100644 (file)
@@ -1316,7 +1316,6 @@ panfrost_queue_draw(struct panfrost_context *ctx)
 
 static void
 panfrost_submit_frame(struct panfrost_context *ctx, bool flush_immediate,
-                      struct pipe_fence_handle **fence,
                       struct panfrost_batch *batch)
 {
         panfrost_batch_submit(batch);
@@ -1324,14 +1323,14 @@ panfrost_submit_frame(struct panfrost_context *ctx, bool flush_immediate,
         /* If visual, we can stall a frame */
 
         if (!flush_immediate)
-                panfrost_drm_force_flush_fragment(ctx, fence);
+                panfrost_drm_force_flush_fragment(ctx);
 
         ctx->last_fragment_flushed = false;
         ctx->last_batch = batch;
 
         /* If readback, flush now (hurts the pipelined performance) */
         if (flush_immediate)
-                panfrost_drm_force_flush_fragment(ctx, fence);
+                panfrost_drm_force_flush_fragment(ctx);
 }
 
 static void
@@ -1460,7 +1459,13 @@ panfrost_flush(
         bool flush_immediate = /*flags & PIPE_FLUSH_END_OF_FRAME*/true;
 
         /* Submit the frame itself */
-        panfrost_submit_frame(ctx, flush_immediate, fence, batch);
+        panfrost_submit_frame(ctx, flush_immediate, batch);
+
+        if (fence) {
+                struct panfrost_fence *f = panfrost_fence_create(ctx);
+                pipe->screen->fence_reference(pipe->screen, fence, NULL);
+                *fence = (struct pipe_fence_handle *)f;
+        }
 
         /* Prepare for the next frame */
         panfrost_invalidate_frame(ctx);
index 8400b7541e9ed5701429f892346a42ba9d9d4c1c..e60f737360de06745de2e35b9822de821ca83b92 100644 (file)
@@ -297,6 +297,9 @@ pan_context(struct pipe_context *pcontext)
         return (struct panfrost_context *) pcontext;
 }
 
+struct panfrost_fence *
+panfrost_fence_create(struct panfrost_context *ctx);
+
 struct pipe_context *
 panfrost_create_context(struct pipe_screen *screen, void *priv, unsigned flags);
 
index 81f922abd1cfa4926a42ce87f7edcdba6dc9c216..f6ab933905766cbca1828fa3d19b562efff1ca44 100644 (file)
@@ -294,7 +294,7 @@ panfrost_drm_submit_vs_fs_batch(struct panfrost_batch *batch, bool has_draws)
         return ret;
 }
 
-static struct panfrost_fence *
+struct panfrost_fence *
 panfrost_fence_create(struct panfrost_context *ctx)
 {
         struct pipe_context *gallium = (struct pipe_context *) ctx;
@@ -321,8 +321,7 @@ panfrost_fence_create(struct panfrost_context *ctx)
 }
 
 void
-panfrost_drm_force_flush_fragment(struct panfrost_context *ctx,
-                                  struct pipe_fence_handle **fence)
+panfrost_drm_force_flush_fragment(struct panfrost_context *ctx)
 {
         struct pipe_context *gallium = (struct pipe_context *) ctx;
         struct panfrost_screen *screen = pan_screen(gallium->screen);
@@ -334,12 +333,6 @@ panfrost_drm_force_flush_fragment(struct panfrost_context *ctx,
                 /* The job finished up, so we're safe to clean it up now */
                 panfrost_free_batch(ctx->last_batch);
         }
-
-        if (fence) {
-                struct panfrost_fence *f = panfrost_fence_create(ctx);
-                gallium->screen->fence_reference(gallium->screen, fence, NULL);
-                *fence = (struct pipe_fence_handle *)f;
-        }
 }
 
 unsigned
index 96044b8c8b90a90683043476caf27b2f8991fdbf..d20f150e3be071ea4e0ea5514d0f82a2ca907e6f 100644 (file)
@@ -134,8 +134,7 @@ panfrost_drm_export_bo(struct panfrost_screen *screen, const struct panfrost_bo
 int
 panfrost_drm_submit_vs_fs_batch(struct panfrost_batch *batch, bool has_draws);
 void
-panfrost_drm_force_flush_fragment(struct panfrost_context *ctx,
-                                  struct pipe_fence_handle **fence);
+panfrost_drm_force_flush_fragment(struct panfrost_context *ctx);
 unsigned
 panfrost_drm_query_gpu_version(struct panfrost_screen *screen);
 int