summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Brezillon <boris.brezillon@collabora.com>2019-09-05 19:14:25 +0200
committerBoris Brezillon <boris.brezillon@collabora.com>2019-09-13 16:25:06 +0200
commit2fc91a16abe0e517dfb46517dc4795857f0a9343 (patch)
tree881eb9ea39390473971ec16813617a6a488da918
parent835439b84fc0830447bc4c8c672c0acd237b2801 (diff)
panfrost: Move the fence creation in panfrost_flush()
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>
-rw-r--r--src/gallium/drivers/panfrost/pan_context.c13
-rw-r--r--src/gallium/drivers/panfrost/pan_context.h3
-rw-r--r--src/gallium/drivers/panfrost/pan_drm.c11
-rw-r--r--src/gallium/drivers/panfrost/pan_screen.h3
4 files changed, 15 insertions, 15 deletions
diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
index de11dae0fc2..ed4bf6dca82 100644
--- a/src/gallium/drivers/panfrost/pan_context.c
+++ b/src/gallium/drivers/panfrost/pan_context.c
@@ -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);
diff --git a/src/gallium/drivers/panfrost/pan_context.h b/src/gallium/drivers/panfrost/pan_context.h
index 8400b7541e9..e60f737360d 100644
--- a/src/gallium/drivers/panfrost/pan_context.h
+++ b/src/gallium/drivers/panfrost/pan_context.h
@@ -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);
diff --git a/src/gallium/drivers/panfrost/pan_drm.c b/src/gallium/drivers/panfrost/pan_drm.c
index 81f922abd1c..f6ab9339057 100644
--- a/src/gallium/drivers/panfrost/pan_drm.c
+++ b/src/gallium/drivers/panfrost/pan_drm.c
@@ -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
diff --git a/src/gallium/drivers/panfrost/pan_screen.h b/src/gallium/drivers/panfrost/pan_screen.h
index 96044b8c8b9..d20f150e3be 100644
--- a/src/gallium/drivers/panfrost/pan_screen.h
+++ b/src/gallium/drivers/panfrost/pan_screen.h
@@ -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