From 31835ac3b8e30abe2677454bbc1468b4cd04b394 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Wed, 18 Aug 2021 15:28:00 -0700 Subject: [PATCH] freedreno/a6xx: Fix streamout with tess_use_shared Signed-off-by: Rob Clark Part-of: --- src/gallium/drivers/freedreno/a6xx/fd6_emit.c | 16 +++++++++++++--- .../drivers/freedreno/a6xx/fd6_program.c | 17 ++++++++++++++--- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_emit.c b/src/gallium/drivers/freedreno/a6xx/fd6_emit.c index bd9b39a71eb..950d7e9968f 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_emit.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_emit.c @@ -914,15 +914,25 @@ fd6_emit_streamout(struct fd_ringbuffer *ring, struct fd6_emit *emit) assert_dt * off streamout. */ if (ctx->last.streamout_mask != 0) { - struct fd_ringbuffer *obj = fd_submit_new_ringbuffer( - emit->ctx->batch->submit, 5 * 4, FD_RINGBUFFER_STREAMING); + unsigned sizedw = 4; - OUT_PKT7(obj, CP_CONTEXT_REG_BUNCH, 4); + if (ctx->screen->info->a6xx.tess_use_shared) + sizedw += 2; + + struct fd_ringbuffer *obj = fd_submit_new_ringbuffer( + emit->ctx->batch->submit, (1 + sizedw) * 4, FD_RINGBUFFER_STREAMING); + + OUT_PKT7(obj, CP_CONTEXT_REG_BUNCH, sizedw); OUT_RING(obj, REG_A6XX_VPC_SO_CNTL); OUT_RING(obj, 0); OUT_RING(obj, REG_A6XX_VPC_SO_STREAM_CNTL); OUT_RING(obj, 0); + if (ctx->screen->info->a6xx.tess_use_shared) { + OUT_RING(ring, REG_A6XX_PC_SO_STREAM_CNTL); + OUT_RING(ring, 0); + } + fd6_emit_take_group(emit, obj, FD6_GROUP_SO, ENABLE_ALL); } } diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_program.c b/src/gallium/drivers/freedreno/a6xx/fd6_program.c index cfcd72f8de3..5ad33eaf387 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_program.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_program.c @@ -203,10 +203,14 @@ setup_stream_out(struct fd_context *ctx, struct fd6_program_state *state, } } - struct fd_ringbuffer *ring = - fd_ringbuffer_new_object(ctx->pipe, (13 + (2 * prog_count)) * 4); + unsigned sizedw = 12 + (2 * prog_count); + if (ctx->screen->info->a6xx.tess_use_shared) + sizedw += 2; - OUT_PKT7(ring, CP_CONTEXT_REG_BUNCH, 12 + (2 * prog_count)); + struct fd_ringbuffer *ring = + fd_ringbuffer_new_object(ctx->pipe, (1 + sizedw) * 4); + + OUT_PKT7(ring, CP_CONTEXT_REG_BUNCH, sizedw); OUT_RING(ring, REG_A6XX_VPC_SO_STREAM_CNTL); OUT_RING(ring, A6XX_VPC_SO_STREAM_CNTL_STREAM_ENABLE(0x1) | @@ -228,6 +232,13 @@ setup_stream_out(struct fd_context *ctx, struct fd6_program_state *state, OUT_RING(ring, REG_A6XX_VPC_SO_PROG); OUT_RING(ring, prog[i]); } + if (ctx->screen->info->a6xx.tess_use_shared) { + /* Possibly not tess_use_shared related, but the combination of + * tess + xfb fails some tests if we don't emit this. + */ + OUT_RING(ring, REG_A6XX_PC_SO_STREAM_CNTL); + OUT_RING(ring, A6XX_PC_SO_STREAM_CNTL_STREAM_ENABLE); + } state->streamout_stateobj = ring; }