freedreno/a6xx: Fix streamout with tess_use_shared
authorRob Clark <robdclark@chromium.org>
Wed, 18 Aug 2021 22:28:00 +0000 (15:28 -0700)
committerMarge Bot <eric+marge@anholt.net>
Wed, 25 Aug 2021 15:24:19 +0000 (15:24 +0000)
Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12497>

src/gallium/drivers/freedreno/a6xx/fd6_emit.c
src/gallium/drivers/freedreno/a6xx/fd6_program.c

index bd9b39a71eb1b873cee2defc08c9886cafaed96a..950d7e9968fea87382ba2ef789c4bb228814a1db 100644 (file)
@@ -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) {
+         unsigned sizedw = 4;
+
+         if (ctx->screen->info->a6xx.tess_use_shared)
+            sizedw += 2;
+
          struct fd_ringbuffer *obj = fd_submit_new_ringbuffer(
-            emit->ctx->batch->submit, 5 * 4, FD_RINGBUFFER_STREAMING);
+            emit->ctx->batch->submit, (1 + sizedw) * 4, FD_RINGBUFFER_STREAMING);
 
-         OUT_PKT7(obj, CP_CONTEXT_REG_BUNCH, 4);
+         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);
       }
    }
index cfcd72f8de35bed141baace0248ed508a87539c2..5ad33eaf387671db0bd2d926a76186fade34085a 100644 (file)
@@ -203,10 +203,14 @@ setup_stream_out(struct fd_context *ctx, struct fd6_program_state *state,
       }
    }
 
+   unsigned sizedw = 12 + (2 * prog_count);
+   if (ctx->screen->info->a6xx.tess_use_shared)
+      sizedw += 2;
+
    struct fd_ringbuffer *ring =
-      fd_ringbuffer_new_object(ctx->pipe, (13 + (2 * prog_count)) * 4);
+      fd_ringbuffer_new_object(ctx->pipe, (1 + sizedw) * 4);
 
-   OUT_PKT7(ring, CP_CONTEXT_REG_BUNCH, 12 + (2 * prog_count));
+   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;
 }