Mesa (master): freedreno: Drop fd_context_lock() and friends

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Nov 10 18:27:27 UTC 2020


Module: Mesa
Branch: master
Commit: 57a2a5db81c614ac84c300c200639c51f218fb8a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=57a2a5db81c614ac84c300c200639c51f218fb8a

Author: Rob Clark <robdclark at chromium.org>
Date:   Tue Oct 27 16:44:38 2020 -0700

freedreno: Drop fd_context_lock() and friends

These were actually just wrappers for the screen->lock, left over from
moving things around a long time ago.  Lets drop them to make things
more explicit (that we are locking the screen, not the context).

Involves a bit of shuffling things around to untangle header deps, but
no functional change.

Signed-off-by: Rob Clark <robdclark at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7342>

---

 src/gallium/drivers/freedreno/a3xx/fd3_emit.h      |  1 +
 src/gallium/drivers/freedreno/a3xx/fd3_query.c     |  1 +
 src/gallium/drivers/freedreno/a5xx/fd5_emit.h      |  1 +
 src/gallium/drivers/freedreno/freedreno_batch.c    |  6 +-
 src/gallium/drivers/freedreno/freedreno_batch.h    | 47 ++++-------
 .../drivers/freedreno/freedreno_batch_cache.c      |  8 +-
 src/gallium/drivers/freedreno/freedreno_context.c  | 43 ++++++++++
 src/gallium/drivers/freedreno/freedreno_context.h  | 98 ++++++----------------
 src/gallium/drivers/freedreno/freedreno_fence.c    |  1 +
 src/gallium/drivers/freedreno/freedreno_resource.c |  4 +-
 10 files changed, 96 insertions(+), 114 deletions(-)

diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_emit.h b/src/gallium/drivers/freedreno/a3xx/fd3_emit.h
index 7a905628dd6..95af61c6009 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_emit.h
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_emit.h
@@ -29,6 +29,7 @@
 
 #include "pipe/p_context.h"
 
+#include "freedreno_batch.h"
 #include "freedreno_context.h"
 #include "fd3_format.h"
 #include "fd3_program.h"
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_query.c b/src/gallium/drivers/freedreno/a3xx/fd3_query.c
index c41eebcc279..eeafa3a08b3 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_query.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_query.c
@@ -25,6 +25,7 @@
  */
 
 #include "freedreno_query_hw.h"
+#include "freedreno_batch.h"
 #include "freedreno_context.h"
 #include "freedreno_util.h"
 
diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_emit.h b/src/gallium/drivers/freedreno/a5xx/fd5_emit.h
index f50119f0d84..14e8aa0ce67 100644
--- a/src/gallium/drivers/freedreno/a5xx/fd5_emit.h
+++ b/src/gallium/drivers/freedreno/a5xx/fd5_emit.h
@@ -29,6 +29,7 @@
 
 #include "pipe/p_context.h"
 
+#include "freedreno_batch.h"
 #include "freedreno_context.h"
 #include "fd5_context.h"
 #include "fd5_format.h"
diff --git a/src/gallium/drivers/freedreno/freedreno_batch.c b/src/gallium/drivers/freedreno/freedreno_batch.c
index f6858bcd292..b6435ea8f19 100644
--- a/src/gallium/drivers/freedreno/freedreno_batch.c
+++ b/src/gallium/drivers/freedreno/freedreno_batch.c
@@ -276,7 +276,7 @@ __fd_batch_destroy(struct fd_batch *batch)
 
 	DBG("%p", batch);
 
-	fd_context_assert_locked(batch->ctx);
+	fd_screen_assert_locked(batch->ctx->screen);
 
 	if (BATCH_DEBUG) {
 		_mesa_set_remove_key(ctx->screen->live_batches, batch);
@@ -288,14 +288,14 @@ __fd_batch_destroy(struct fd_batch *batch)
 	debug_assert(batch->resources->entries == 0);
 	_mesa_set_destroy(batch->resources, NULL);
 
-	fd_context_unlock(ctx);
+	fd_screen_unlock(ctx->screen);
 	batch_flush_reset_dependencies(batch, false);
 	debug_assert(batch->dependents_mask == 0);
 
 	util_copy_framebuffer_state(&batch->framebuffer, NULL);
 	batch_fini(batch);
 	free(batch);
-	fd_context_lock(ctx);
+	fd_screen_lock(ctx->screen);
 }
 
 void
diff --git a/src/gallium/drivers/freedreno/freedreno_batch.h b/src/gallium/drivers/freedreno/freedreno_batch.h
index 1e33654b04d..aae3471d032 100644
--- a/src/gallium/drivers/freedreno/freedreno_batch.h
+++ b/src/gallium/drivers/freedreno/freedreno_batch.h
@@ -31,6 +31,7 @@
 #include "util/u_queue.h"
 #include "util/list.h"
 
+#include "freedreno_context.h"
 #include "freedreno_util.h"
 
 #ifdef DEBUG
@@ -39,31 +40,7 @@
 #  define BATCH_DEBUG 0
 #endif
 
-struct fd_context;
 struct fd_resource;
-enum fd_resource_status;
-
-/* Bitmask of stages in rendering that a particular query query is
- * active.  Queries will be automatically started/stopped (generating
- * additional fd_hw_sample_period's) on entrance/exit from stages that
- * are applicable to the query.
- *
- * NOTE: set the stage to NULL at end of IB to ensure no query is still
- * active.  Things aren't going to work out the way you want if a query
- * is active across IB's (or between tile IB and draw IB)
- */
-enum fd_render_stage {
-	FD_STAGE_NULL     = 0x00,
-	FD_STAGE_DRAW     = 0x01,
-	FD_STAGE_CLEAR    = 0x02,
-	/* used for driver internal draws (ie. util_blitter_blit()): */
-	FD_STAGE_BLIT     = 0x04,
-	FD_STAGE_ALL      = 0xff,
-};
-
-#define MAX_HW_SAMPLE_PROVIDERS 7
-struct fd_hw_sample_provider;
-struct fd_hw_sample;
 
 /* A batch tracks everything about a cmdstream batch/submit, including the
  * ringbuffers used for binning, draw, and gmem cmds, list of associated
@@ -289,11 +266,6 @@ void __fd_batch_destroy(struct fd_batch *batch);
  * you.
  */
 
-/* fwd-decl prototypes to untangle header dependency :-/ */
-static inline void fd_context_assert_locked(struct fd_context *ctx);
-static inline void fd_context_lock(struct fd_context *ctx);
-static inline void fd_context_unlock(struct fd_context *ctx);
-
 static inline void
 fd_batch_reference_locked(struct fd_batch **ptr, struct fd_batch *batch)
 {
@@ -301,7 +273,7 @@ fd_batch_reference_locked(struct fd_batch **ptr, struct fd_batch *batch)
 
 	/* only need lock if a reference is dropped: */
 	if (old_batch)
-		fd_context_assert_locked(old_batch->ctx);
+		fd_screen_assert_locked(old_batch->ctx->screen);
 
 	if (pipe_reference_described(&(*ptr)->reference, &batch->reference,
 			(debug_reference_descriptor)__fd_batch_describe))
@@ -317,15 +289,24 @@ fd_batch_reference(struct fd_batch **ptr, struct fd_batch *batch)
 	struct fd_context *ctx = old_batch ? old_batch->ctx : NULL;
 
 	if (ctx)
-		fd_context_lock(ctx);
+		fd_screen_lock(ctx->screen);
 
 	fd_batch_reference_locked(ptr, batch);
 
 	if (ctx)
-		fd_context_unlock(ctx);
+		fd_screen_unlock(ctx->screen);
 }
 
-#include "freedreno_context.h"
+static inline void
+fd_batch_set_stage(struct fd_batch *batch, enum fd_render_stage stage)
+{
+	struct fd_context *ctx = batch->ctx;
+
+	if (ctx->query_set_stage)
+		ctx->query_set_stage(batch, stage);
+
+	batch->stage = stage;
+}
 
 static inline void
 fd_reset_wfi(struct fd_batch *batch)
diff --git a/src/gallium/drivers/freedreno/freedreno_batch_cache.c b/src/gallium/drivers/freedreno/freedreno_batch_cache.c
index c407cc5e33d..584d180f673 100644
--- a/src/gallium/drivers/freedreno/freedreno_batch_cache.c
+++ b/src/gallium/drivers/freedreno/freedreno_batch_cache.c
@@ -138,7 +138,7 @@ bc_flush(struct fd_batch_cache *cache, struct fd_context *ctx, bool deferred)
 	struct fd_batch *batch;
 	unsigned n = 0;
 
-	fd_context_lock(ctx);
+	fd_screen_lock(ctx->screen);
 
 	foreach_batch(batch, cache, cache->batch_mask) {
 		if (batch->ctx == ctx) {
@@ -156,9 +156,9 @@ bc_flush(struct fd_batch_cache *cache, struct fd_context *ctx, bool deferred)
 			}
 		}
 
-		fd_context_unlock(ctx);
+		fd_screen_unlock(ctx->screen);
 	} else {
-		fd_context_unlock(ctx);
+		fd_screen_unlock(ctx->screen);
 
 		for (unsigned i = 0; i < n; i++) {
 			fd_batch_flush(batches[i]);
@@ -261,7 +261,7 @@ fd_bc_invalidate_batch(struct fd_batch *batch, bool remove)
 	struct fd_batch_cache *cache = &batch->ctx->screen->batch_cache;
 	struct key *key = (struct key *)batch->key;
 
-	fd_context_assert_locked(batch->ctx);
+	fd_screen_assert_locked(batch->ctx->screen);
 
 	if (remove) {
 		cache->batches[batch->idx] = NULL;
diff --git a/src/gallium/drivers/freedreno/freedreno_context.c b/src/gallium/drivers/freedreno/freedreno_context.c
index c488f29854d..456800d58fc 100644
--- a/src/gallium/drivers/freedreno/freedreno_context.c
+++ b/src/gallium/drivers/freedreno/freedreno_context.c
@@ -203,6 +203,49 @@ fd_emit_string_marker(struct pipe_context *pctx, const char *string, int len)
 	}
 }
 
+/**
+ * If we have a pending fence_server_sync() (GPU side sync), flush now.
+ * The alternative to try to track this with batch dependencies gets
+ * hairy quickly.
+ *
+ * Call this before switching to a different batch, to handle this case.
+ */
+void
+fd_context_switch_from(struct fd_context *ctx)
+{
+	if (ctx->batch && (ctx->batch->in_fence_fd != -1))
+		fd_batch_flush(ctx->batch);
+}
+
+/**
+ * If there is a pending fence-fd that we need to sync on, this will
+ * transfer the reference to the next batch we are going to render
+ * to.
+ */
+void
+fd_context_switch_to(struct fd_context *ctx, struct fd_batch *batch)
+{
+	if (ctx->in_fence_fd != -1) {
+		sync_accumulate("freedreno", &batch->in_fence_fd, ctx->in_fence_fd);
+		close(ctx->in_fence_fd);
+		ctx->in_fence_fd = -1;
+	}
+}
+
+struct fd_batch *
+fd_context_batch(struct fd_context *ctx)
+{
+	if (unlikely(!ctx->batch)) {
+		struct fd_batch *batch =
+			fd_batch_from_fb(&ctx->screen->batch_cache, ctx, &ctx->framebuffer);
+		util_copy_framebuffer_state(&batch->framebuffer, &ctx->framebuffer);
+		ctx->batch = batch;
+		fd_context_all_dirty(ctx);
+	}
+	fd_context_switch_to(ctx, ctx->batch);
+	return ctx->batch;
+}
+
 void
 fd_context_destroy(struct pipe_context *pctx)
 {
diff --git a/src/gallium/drivers/freedreno/freedreno_context.h b/src/gallium/drivers/freedreno/freedreno_context.h
index 59908063fb4..e73a4694962 100644
--- a/src/gallium/drivers/freedreno/freedreno_context.h
+++ b/src/gallium/drivers/freedreno/freedreno_context.h
@@ -35,7 +35,6 @@
 #include "util/slab.h"
 #include "util/u_string.h"
 
-#include "freedreno_batch.h"
 #include "freedreno_screen.h"
 #include "freedreno_gmem.h"
 #include "freedreno_util.h"
@@ -43,6 +42,7 @@
 #define BORDER_COLOR_UPLOAD_SIZE (2 * PIPE_MAX_SAMPLERS * BORDERCOLOR_SIZE)
 
 struct fd_vertex_stateobj;
+struct fd_batch;
 
 struct fd_texture_stateobj {
 	struct pipe_sampler_view *textures[PIPE_MAX_SAMPLERS];
@@ -164,6 +164,28 @@ enum fd_dirty_shader_state {
 	FD_DIRTY_SHADER_IMAGE = BIT(4),
 };
 
+/* Bitmask of stages in rendering that a particular query is active.
+ * Queries will be automatically started/stopped (generating additional
+ * fd_hw_sample_period's) on entrance/exit from stages that are
+ * applicable to the query.
+ *
+ * NOTE: set the stage to NULL at end of IB to ensure no query is still
+ * active.  Things aren't going to work out the way you want if a query
+ * is active across IB's (or between tile IB and draw IB)
+ */
+enum fd_render_stage {
+	FD_STAGE_NULL     = 0x00,
+	FD_STAGE_DRAW     = 0x01,
+	FD_STAGE_CLEAR    = 0x02,
+	/* used for driver internal draws (ie. util_blitter_blit()): */
+	FD_STAGE_BLIT     = 0x04,
+	FD_STAGE_ALL      = 0xff,
+};
+
+#define MAX_HW_SAMPLE_PROVIDERS 7
+struct fd_hw_sample_provider;
+struct fd_hw_sample;
+
 struct fd_context {
 	struct pipe_context base;
 
@@ -437,24 +459,6 @@ fd_context(struct pipe_context *pctx)
 	return (struct fd_context *)pctx;
 }
 
-static inline void
-fd_context_assert_locked(struct fd_context *ctx)
-{
-	fd_screen_assert_locked(ctx->screen);
-}
-
-static inline void
-fd_context_lock(struct fd_context *ctx)
-{
-	fd_screen_lock(ctx->screen);
-}
-
-static inline void
-fd_context_unlock(struct fd_context *ctx)
-{
-	fd_screen_unlock(ctx->screen);
-}
-
 /* mark all state dirty: */
 static inline void
 fd_context_all_dirty(struct fd_context *ctx)
@@ -494,59 +498,9 @@ fd_supported_prim(struct fd_context *ctx, unsigned prim)
 	return (1 << prim) & ctx->primtype_mask;
 }
 
-/**
- * If we have a pending fence_server_sync() (GPU side sync), flush now.
- * The alternative to try to track this with batch dependencies gets
- * hairy quickly.
- *
- * Call this before switching to a different batch, to handle this case.
- */
-static inline void
-fd_context_switch_from(struct fd_context *ctx)
-{
-	if (ctx->batch && (ctx->batch->in_fence_fd != -1))
-		fd_batch_flush(ctx->batch);
-}
-
-/**
- * If there is a pending fence-fd that we need to sync on, this will
- * transfer the reference to the next batch we are going to render
- * to.
- */
-static inline void
-fd_context_switch_to(struct fd_context *ctx, struct fd_batch *batch)
-{
-	if (ctx->in_fence_fd != -1) {
-		sync_accumulate("freedreno", &batch->in_fence_fd, ctx->in_fence_fd);
-		close(ctx->in_fence_fd);
-		ctx->in_fence_fd = -1;
-	}
-}
-
-static inline struct fd_batch *
-fd_context_batch(struct fd_context *ctx)
-{
-	if (unlikely(!ctx->batch)) {
-		struct fd_batch *batch =
-			fd_batch_from_fb(&ctx->screen->batch_cache, ctx, &ctx->framebuffer);
-		util_copy_framebuffer_state(&batch->framebuffer, &ctx->framebuffer);
-		ctx->batch = batch;
-		fd_context_all_dirty(ctx);
-	}
-	fd_context_switch_to(ctx, ctx->batch);
-	return ctx->batch;
-}
-
-static inline void
-fd_batch_set_stage(struct fd_batch *batch, enum fd_render_stage stage)
-{
-	struct fd_context *ctx = batch->ctx;
-
-	if (ctx->query_set_stage)
-		ctx->query_set_stage(batch, stage);
-
-	batch->stage = stage;
-}
+void fd_context_switch_from(struct fd_context *ctx);
+void fd_context_switch_to(struct fd_context *ctx, struct fd_batch *batch);
+struct fd_batch * fd_context_batch(struct fd_context *ctx);
 
 void fd_context_setup_common_vbos(struct fd_context *ctx);
 void fd_context_cleanup_common_vbos(struct fd_context *ctx);
diff --git a/src/gallium/drivers/freedreno/freedreno_fence.c b/src/gallium/drivers/freedreno/freedreno_fence.c
index 770ee369b43..04e68eefa2c 100644
--- a/src/gallium/drivers/freedreno/freedreno_fence.c
+++ b/src/gallium/drivers/freedreno/freedreno_fence.c
@@ -28,6 +28,7 @@
 #include "util/u_inlines.h"
 
 #include "freedreno_fence.h"
+#include "freedreno_batch.h"
 #include "freedreno_context.h"
 #include "freedreno_util.h"
 /* TODO: Use the interface drm/freedreno_drmif.h instead of calling directly */
diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c
index 12cc2ee0ac2..ae0877229f4 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.c
+++ b/src/gallium/drivers/freedreno/freedreno_resource.c
@@ -692,9 +692,9 @@ fd_resource_transfer_map(struct pipe_context *pctx,
 		struct fd_batch *write_batch = NULL;
 
 		/* hold a reference, so it doesn't disappear under us: */
-		fd_context_lock(ctx);
+		fd_screen_lock(ctx->screen);
 		fd_batch_reference_locked(&write_batch, rsc->write_batch);
-		fd_context_unlock(ctx);
+		fd_screen_unlock(ctx->screen);
 
 		if ((usage & PIPE_MAP_WRITE) && write_batch &&
 				write_batch->back_blit) {



More information about the mesa-commit mailing list