freedreno: splitup emit_string_marker
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>
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
@@ -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,
|
||||
|
Reference in New Issue
Block a user