diff options
author | Rob Clark <[email protected]> | 2015-08-10 12:11:13 -0400 |
---|---|---|
committer | Rob Clark <[email protected]> | 2016-01-21 17:20:11 -0500 |
commit | bc1a37378c194400c502939fc00e2e658f3db3b5 (patch) | |
tree | 65b42f5483920fe1fd20ae86c61cb5b15ab5f6d2 /src/gallium/drivers/freedreno | |
parent | d6408372eb359d972614838f838776f1695e3c99 (diff) |
freedreno: implement emit_string_marker
Writes string to cmdstream in payload of a no-op packet.
Signed-off-by: Rob Clark <[email protected]>
Diffstat (limited to 'src/gallium/drivers/freedreno')
-rw-r--r-- | src/gallium/drivers/freedreno/freedreno_context.c | 27 | ||||
-rw-r--r-- | src/gallium/drivers/freedreno/freedreno_screen.c | 2 |
2 files changed, 28 insertions, 1 deletions
diff --git a/src/gallium/drivers/freedreno/freedreno_context.c b/src/gallium/drivers/freedreno/freedreno_context.c index 0b6b9fbbe7a..c5ea86f9368 100644 --- a/src/gallium/drivers/freedreno/freedreno_context.c +++ b/src/gallium/drivers/freedreno/freedreno_context.c @@ -141,6 +141,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) { @@ -207,6 +233,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 e7b21de6136..4b5d9c8a19e 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.c +++ b/src/gallium/drivers/freedreno/freedreno_screen.c @@ -155,6 +155,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: @@ -164,7 +165,6 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_TEXTURE_BARRIER: case PIPE_CAP_TEXTURE_MIRROR_CLAMP: case PIPE_CAP_COMPUTE: - case PIPE_CAP_STRING_MARKER: return 0; case PIPE_CAP_SM3: |