freedreno: splitup emit_string_marker
authorRob Clark <robdclark@chromium.org>
Wed, 13 May 2020 16:53:43 +0000 (09:53 -0700)
committerMarge Bot <eric+marge@anholt.net>
Tue, 16 Jun 2020 20:56:15 +0000 (20:56 +0000)
So that we can use it internally to emit string markers into a specified
rb.

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

src/gallium/drivers/freedreno/freedreno_context.c
src/gallium/drivers/freedreno/freedreno_context.h

index 4572147c4e72e4471f596436f5044471f8fb2dd1..a69a194379bbcd810804d68829baf92f4c69d29f 100644 (file)
@@ -138,31 +138,11 @@ fd_memory_barrier(struct pipe_context *pctx, unsigned flags)
        /* TODO do we need to check for persistently mapped buffers and fd_bo_cpu_prep()?? */
 }
 
-/**
- * emit marker string as payload of a no-op packet, which can be
- * decoded by cffdump.
- */
 static void
-fd_emit_string_marker(struct pipe_context *pctx, const char *string, int len)
+emit_string_tail(struct fd_ringbuffer *ring, const char *string, int len)
 {
-       struct fd_context *ctx = fd_context(pctx);
-       struct fd_ringbuffer *ring;
        const uint32_t *buf = (const void *)string;
 
-       if (!ctx->batch)
-               return;
-
-       ctx->batch->needs_flush = true;
-
-       ring = ctx->batch->draw;
-
-       /* max packet size is 0x3fff dwords: */
-       len = MIN2(len, 0x3fff * 4);
-
-       if (ctx->screen->gpu_id >= 500)
-               OUT_PKT7(ring, CP_NOP, align(len, 4) / 4);
-       else
-               OUT_PKT3(ring, CP_NOP, align(len, 4) / 4);
        while (len >= 4) {
                OUT_RING(ring, *buf);
                buf++;
@@ -177,6 +157,51 @@ fd_emit_string_marker(struct pipe_context *pctx, const char *string, int len)
        }
 }
 
+/* for prior to a5xx: */
+void
+fd_emit_string(struct fd_ringbuffer *ring,
+               const char *string, int len)
+{
+       /* max packet size is 0x3fff+1 dwords: */
+       len = MIN2(len, 0x4000 * 4);
+
+       OUT_PKT3(ring, CP_NOP, align(len, 4) / 4);
+       emit_string_tail(ring, string, len);
+}
+
+/* for a5xx+ */
+void
+fd_emit_string5(struct fd_ringbuffer *ring,
+               const char *string, int len)
+{
+       /* max packet size is 0x3fff dwords: */
+       len = MIN2(len, 0x3fff * 4);
+
+       OUT_PKT7(ring, CP_NOP, align(len, 4) / 4);
+       emit_string_tail(ring, string, len);
+}
+
+/**
+ * emit marker string as payload of a no-op packet, which can be
+ * decoded by cffdump.
+ */
+static void
+fd_emit_string_marker(struct pipe_context *pctx, const char *string, int len)
+{
+       struct fd_context *ctx = fd_context(pctx);
+
+       if (!ctx->batch)
+               return;
+
+       ctx->batch->needs_flush = true;
+
+       if (ctx->screen->gpu_id >= 500) {
+               fd_emit_string5(ctx->batch->draw, string, len);
+       } else {
+               fd_emit_string(ctx->batch->draw, string, len);
+       }
+}
+
 void
 fd_context_destroy(struct pipe_context *pctx)
 {
index faafad5c6721cfa1134a65434f68933065d26940..620768306abee536a083f521d00e5c57b39ab694 100644 (file)
@@ -503,6 +503,8 @@ fd_batch_set_stage(struct fd_batch *batch, enum fd_render_stage stage)
 
 void fd_context_setup_common_vbos(struct fd_context *ctx);
 void fd_context_cleanup_common_vbos(struct fd_context *ctx);
+void fd_emit_string(struct fd_ringbuffer *ring, const char *string, int len);
+void fd_emit_string5(struct fd_ringbuffer *ring, const char *string, int len);
 
 struct pipe_context * fd_context_init(struct fd_context *ctx,
                struct pipe_screen *pscreen, const uint8_t *primtypes,