[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