[Mesa-dev] [PATCH 4/6] freedreno: per-context fd_pipe

Rob Clark robdclark at gmail.com
Wed Oct 4 15:44:35 UTC 2017


To enable per-context priorities, we need to have per-context pipe's.
Unfortunately we still need to keep the global screen pipe, mostly just
for screen->get_timestamp().

Signed-off-by: Rob Clark <robdclark at gmail.com>
---
 src/gallium/drivers/freedreno/a5xx/fd5_draw.c       | 2 +-
 src/gallium/drivers/freedreno/freedreno_batch.c     | 6 +++---
 src/gallium/drivers/freedreno/freedreno_context.c   | 2 ++
 src/gallium/drivers/freedreno/freedreno_context.h   | 1 +
 src/gallium/drivers/freedreno/freedreno_fence.c     | 2 +-
 src/gallium/drivers/freedreno/freedreno_query_acc.c | 6 +++---
 src/gallium/drivers/freedreno/freedreno_query_hw.c  | 4 ++--
 src/gallium/drivers/freedreno/freedreno_resource.c  | 4 ++--
 src/gallium/drivers/freedreno/freedreno_screen.h    | 5 +++++
 9 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_draw.c b/src/gallium/drivers/freedreno/a5xx/fd5_draw.c
index d1f1d039b69..1e9117a5b96 100644
--- a/src/gallium/drivers/freedreno/a5xx/fd5_draw.c
+++ b/src/gallium/drivers/freedreno/a5xx/fd5_draw.c
@@ -194,7 +194,7 @@ fd5_clear_lrz(struct fd_batch *batch, struct fd_resource *zsbuf, double depth)
 	// draw
 
 	if (!batch->lrz_clear) {
-		batch->lrz_clear = fd_ringbuffer_new(batch->ctx->screen->pipe, 0x1000);
+		batch->lrz_clear = fd_ringbuffer_new(batch->ctx->pipe, 0x1000);
 		fd_ringbuffer_set_parent(batch->lrz_clear, batch->gmem);
 	}
 
diff --git a/src/gallium/drivers/freedreno/freedreno_batch.c b/src/gallium/drivers/freedreno/freedreno_batch.c
index c2142b5a214..8f0f78861cf 100644
--- a/src/gallium/drivers/freedreno/freedreno_batch.c
+++ b/src/gallium/drivers/freedreno/freedreno_batch.c
@@ -53,9 +53,9 @@ batch_init(struct fd_batch *batch)
 		size = 0x100000;
 	}
 
-	batch->draw    = fd_ringbuffer_new(ctx->screen->pipe, size);
-	batch->binning = fd_ringbuffer_new(ctx->screen->pipe, size);
-	batch->gmem    = fd_ringbuffer_new(ctx->screen->pipe, size);
+	batch->draw    = fd_ringbuffer_new(ctx->pipe, size);
+	batch->binning = fd_ringbuffer_new(ctx->pipe, size);
+	batch->gmem    = fd_ringbuffer_new(ctx->pipe, size);
 
 	fd_ringbuffer_set_parent(batch->gmem, NULL);
 	fd_ringbuffer_set_parent(batch->draw, batch->gmem);
diff --git a/src/gallium/drivers/freedreno/freedreno_context.c b/src/gallium/drivers/freedreno/freedreno_context.c
index e17dcf7b684..20480f4f8c1 100644
--- a/src/gallium/drivers/freedreno/freedreno_context.c
+++ b/src/gallium/drivers/freedreno/freedreno_context.c
@@ -144,6 +144,7 @@ fd_context_destroy(struct pipe_context *pctx)
 	}
 
 	fd_device_del(ctx->dev);
+	fd_pipe_del(ctx->pipe);
 
 	if (fd_mesa_debug & (FD_DBG_BSTAT | FD_DBG_MSGS)) {
 		printf("batch_total=%u, batch_sysmem=%u, batch_gmem=%u, batch_restore=%u\n",
@@ -251,6 +252,7 @@ fd_context_init(struct fd_context *ctx, struct pipe_screen *pscreen,
 	int i;
 
 	ctx->screen = screen;
+	ctx->pipe = fd_pipe_new(screen->dev, FD_PIPE_3D);
 
 	ctx->primtypes = primtypes;
 	ctx->primtype_mask = 0;
diff --git a/src/gallium/drivers/freedreno/freedreno_context.h b/src/gallium/drivers/freedreno/freedreno_context.h
index 393b485a096..f10f7ef4ea5 100644
--- a/src/gallium/drivers/freedreno/freedreno_context.h
+++ b/src/gallium/drivers/freedreno/freedreno_context.h
@@ -156,6 +156,7 @@ struct fd_context {
 
 	struct fd_device *dev;
 	struct fd_screen *screen;
+	struct fd_pipe *pipe;
 
 	struct util_queue flush_queue;
 
diff --git a/src/gallium/drivers/freedreno/freedreno_fence.c b/src/gallium/drivers/freedreno/freedreno_fence.c
index f20c6ac120e..e3d200aa3a1 100644
--- a/src/gallium/drivers/freedreno/freedreno_fence.c
+++ b/src/gallium/drivers/freedreno/freedreno_fence.c
@@ -69,7 +69,7 @@ boolean fd_fence_finish(struct pipe_screen *pscreen,
 		return ret == 0;
 	}
 
-	if (fd_pipe_wait_timeout(fence->screen->pipe, fence->timestamp, timeout))
+	if (fd_pipe_wait_timeout(fence->ctx->pipe, fence->timestamp, timeout))
 		return false;
 
 	return true;
diff --git a/src/gallium/drivers/freedreno/freedreno_query_acc.c b/src/gallium/drivers/freedreno/freedreno_query_acc.c
index 96cee1aee84..724ef69dc24 100644
--- a/src/gallium/drivers/freedreno/freedreno_query_acc.c
+++ b/src/gallium/drivers/freedreno/freedreno_query_acc.c
@@ -66,7 +66,7 @@ realloc_query_bo(struct fd_context *ctx, struct fd_acc_query *aq)
 	/* don't assume the buffer is zero-initialized: */
 	rsc = fd_resource(aq->prsc);
 
-	fd_bo_cpu_prep(rsc->bo, ctx->screen->pipe, DRM_FREEDRENO_PREP_WRITE);
+	fd_bo_cpu_prep(rsc->bo, ctx->pipe, DRM_FREEDRENO_PREP_WRITE);
 
 	map = fd_bo_map(rsc->bo);
 	memset(map, 0, aq->provider->size);
@@ -142,7 +142,7 @@ fd_acc_get_query_result(struct fd_context *ctx, struct fd_query *q,
 			return false;
 		}
 
-		ret = fd_bo_cpu_prep(rsc->bo, ctx->screen->pipe,
+		ret = fd_bo_cpu_prep(rsc->bo, ctx->pipe,
 				DRM_FREEDRENO_PREP_READ | DRM_FREEDRENO_PREP_NOSYNC);
 		if (ret)
 			return false;
@@ -154,7 +154,7 @@ fd_acc_get_query_result(struct fd_context *ctx, struct fd_query *q,
 		fd_batch_flush(rsc->write_batch, true);
 
 	/* get the result: */
-	fd_bo_cpu_prep(rsc->bo, ctx->screen->pipe, DRM_FREEDRENO_PREP_READ);
+	fd_bo_cpu_prep(rsc->bo, ctx->pipe, DRM_FREEDRENO_PREP_READ);
 
 	void *ptr = fd_bo_map(rsc->bo);
 	p->result(ctx, ptr, result);
diff --git a/src/gallium/drivers/freedreno/freedreno_query_hw.c b/src/gallium/drivers/freedreno/freedreno_query_hw.c
index 73c36911471..c92573ec936 100644
--- a/src/gallium/drivers/freedreno/freedreno_query_hw.c
+++ b/src/gallium/drivers/freedreno/freedreno_query_hw.c
@@ -218,7 +218,7 @@ fd_hw_get_query_result(struct fd_context *ctx, struct fd_query *q,
 		if (!rsc->bo)
 			return false;
 
-		ret = fd_bo_cpu_prep(rsc->bo, ctx->screen->pipe,
+		ret = fd_bo_cpu_prep(rsc->bo, ctx->pipe,
 				DRM_FREEDRENO_PREP_READ | DRM_FREEDRENO_PREP_NOSYNC);
 		if (ret)
 			return false;
@@ -245,7 +245,7 @@ fd_hw_get_query_result(struct fd_context *ctx, struct fd_query *q,
 		if (!rsc->bo)
 			continue;
 
-		fd_bo_cpu_prep(rsc->bo, ctx->screen->pipe, DRM_FREEDRENO_PREP_READ);
+		fd_bo_cpu_prep(rsc->bo, ctx->pipe, DRM_FREEDRENO_PREP_READ);
 
 		void *ptr = fd_bo_map(rsc->bo);
 
diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c
index 5aa90ced69c..266908c0bc4 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.c
+++ b/src/gallium/drivers/freedreno/freedreno_resource.c
@@ -512,7 +512,7 @@ fd_resource_transfer_map(struct pipe_context *pctx,
 		 */
 		bool needs_flush = pending(rsc, !!(usage & PIPE_TRANSFER_WRITE));
 		bool busy = needs_flush || (0 != fd_bo_cpu_prep(rsc->bo,
-				ctx->screen->pipe, op | DRM_FREEDRENO_PREP_NOSYNC));
+				ctx->pipe, op | DRM_FREEDRENO_PREP_NOSYNC));
 
 		/* if we need to flush/stall, see if we can make a shadow buffer
 		 * to avoid this:
@@ -553,7 +553,7 @@ fd_resource_transfer_map(struct pipe_context *pctx,
 		 * completed.
 		 */
 		if (busy) {
-			ret = fd_bo_cpu_prep(rsc->bo, ctx->screen->pipe, op);
+			ret = fd_bo_cpu_prep(rsc->bo, ctx->pipe, op);
 			if (ret)
 				goto fail;
 		}
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.h b/src/gallium/drivers/freedreno/freedreno_screen.h
index c5018da4bc5..68518ef721b 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.h
+++ b/src/gallium/drivers/freedreno/freedreno_screen.h
@@ -72,6 +72,11 @@ struct fd_screen {
 	void *compiler;          /* currently unused for a2xx */
 
 	struct fd_device *dev;
+
+	/* NOTE: we still need a pipe associated with the screen in a few
+	 * places, like screen->get_timestamp().  For anything context
+	 * related, use ctx->pipe instead.
+	 */
 	struct fd_pipe *pipe;
 
 	int64_t cpu_gpu_time_delta;
-- 
2.13.5



More information about the mesa-dev mailing list