From: Rob Clark <robcl...@freedesktop.org>

Writes string to cmdstream in payload of a no-op packet.

Signed-off-by: Rob Clark <robcl...@freedesktop.org>
---
 src/gallium/drivers/freedreno/freedreno_context.c | 27 +++++++++++++++++++++++
 src/gallium/drivers/freedreno/freedreno_screen.c  |  2 +-
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/freedreno/freedreno_context.c 
b/src/gallium/drivers/freedreno/freedreno_context.c
index 8e6d431..9d8316e 100644
--- a/src/gallium/drivers/freedreno/freedreno_context.c
+++ b/src/gallium/drivers/freedreno/freedreno_context.c
@@ -139,6 +139,32 @@ fd_context_flush(struct pipe_context *pctx, struct 
pipe_fence_handle **fence,
        }
 }
 
+/**
+ * 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);
+       struct fd_ringbuffer *ring = ctx->ring;
+       const uint32_t *buf = (const void *)string;
+
+       OUT_PKT3(ring, CP_NOP, align(len, 4) / 4);
+       while (len >= 4) {
+               OUT_RING(ring, *buf);
+               buf++;
+               len -= 4;
+       }
+
+       /* copy remainder bytes without reading past end of input string: */
+       if (len > 0) {
+               uint32_t w = 0;
+               memcpy(&w, buf, len);
+               OUT_RING(ring, w);
+       }
+}
+
 void
 fd_context_destroy(struct pipe_context *pctx)
 {
@@ -205,6 +231,7 @@ fd_context_init(struct fd_context *ctx, struct pipe_screen 
*pscreen,
        pctx->screen = pscreen;
        pctx->priv = priv;
        pctx->flush = fd_context_flush;
+       pctx->emit_string_marker = fd_emit_string_marker;
 
        for (i = 0; i < ARRAY_SIZE(ctx->rings); i++) {
                ctx->rings[i] = fd_ringbuffer_new(screen->pipe, 0x100000);
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c 
b/src/gallium/drivers/freedreno/freedreno_screen.c
index fbbab2a..519dad4 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.c
+++ b/src/gallium/drivers/freedreno/freedreno_screen.c
@@ -154,6 +154,7 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum 
pipe_cap param)
        case PIPE_CAP_USER_CONSTANT_BUFFERS:
        case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
        case PIPE_CAP_VERTEXID_NOBASE:
+       case PIPE_CAP_STRING_MARKER:
                return 1;
 
        case PIPE_CAP_SHADER_STENCIL_EXPORT:
@@ -170,7 +171,6 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum 
pipe_cap param)
        case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
        case PIPE_CAP_START_INSTANCE:
        case PIPE_CAP_COMPUTE:
-       case PIPE_CAP_STRING_MARKER:
                return 0;
 
        case PIPE_CAP_SM3:
-- 
2.4.3

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to