freedreno/a2xx: move setup/restore cmds into binning pass
authorRob Clark <robclark@freedesktop.org>
Fri, 20 May 2016 20:00:26 +0000 (16:00 -0400)
committerRob Clark <robdclark@gmail.com>
Sat, 2 Jul 2016 12:58:50 +0000 (08:58 -0400)
Rather than doing a separate submit at context create, move these cmds
to before first tile, as is done on a3xx/a4xx.  Otherwise state can
be overwritten by other contexts.

Signed-off-by: Rob Clark <robdclark@gmail.com>
src/gallium/drivers/freedreno/a2xx/fd2_context.c
src/gallium/drivers/freedreno/a2xx/fd2_emit.c
src/gallium/drivers/freedreno/a2xx/fd2_emit.h
src/gallium/drivers/freedreno/a2xx/fd2_gmem.c

index 058f8219ed57c93f15f6e2910caba82fa9015a37..ec76a227999177e7db609d8e53ab14f12771753e 100644 (file)
@@ -120,7 +120,5 @@ fd2_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
        /* construct vertex state used for solid ops (clear, and gmem<->mem) */
        fd2_ctx->solid_vertexbuf = create_solid_vertexbuf(pctx);
 
-       fd2_emit_setup(&fd2_ctx->base);
-
        return pctx;
 }
index 4f667ab7d5706a6e612f274a79e10659e7f801d4..f8d03ca5eb0249a566efd7cf5cacef4d2b1ef687 100644 (file)
@@ -316,10 +316,8 @@ fd2_emit_state(struct fd_context *ctx, uint32_t dirty)
 /* emit per-context initialization:
  */
 void
-fd2_emit_setup(struct fd_context *ctx)
+fd2_emit_restore(struct fd_context *ctx, struct fd_ringbuffer *ring)
 {
-       struct fd_ringbuffer *ring = ctx->ring;
-
        OUT_PKT0(ring, REG_A2XX_TP0_CHICKEN, 1);
        OUT_RING(ring, 0x00000002);
 
@@ -442,9 +440,6 @@ fd2_emit_setup(struct fd_context *ctx)
        OUT_RING(ring, 0x00000000);        /* RB_BLEND_GREEN */
        OUT_RING(ring, 0x00000000);        /* RB_BLEND_BLUE */
        OUT_RING(ring, 0x000000ff);        /* RB_BLEND_ALPHA */
-
-       fd_ringbuffer_flush(ring);
-       fd_ringmarker_mark(ctx->draw_start);
 }
 
 static void
index 3c146c1715157c5627a05b63291630f35ee05629..6a26c85c142b725423ae350af04581923555905a 100644 (file)
@@ -43,7 +43,7 @@ struct fd2_vertex_buf {
 void fd2_emit_vertex_bufs(struct fd_ringbuffer *ring, uint32_t val,
                struct fd2_vertex_buf *vbufs, uint32_t n);
 void fd2_emit_state(struct fd_context *ctx, uint32_t dirty);
-void fd2_emit_setup(struct fd_context *ctx);
+void fd2_emit_restore(struct fd_context *ctx, struct fd_ringbuffer *ring);
 
 void fd2_emit_init(struct pipe_context *pctx);
 
index aa47267444f8e65f7d7c1f1f58014b9811697721..eba2cec82f4cac4f2b57160d73268841bfdb90c1 100644 (file)
@@ -336,6 +336,8 @@ fd2_emit_tile_init(struct fd_context *ctx)
        enum pipe_format format = pipe_surface_format(pfb->cbufs[0]);
        uint32_t reg;
 
+       fd2_emit_restore(ctx, ctx->ring);
+
        OUT_PKT3(ring, CP_SET_CONSTANT, 4);
        OUT_RING(ring, CP_REG(REG_A2XX_RB_SURFACE_INFO));
        OUT_RING(ring, gmem->bin_w);                 /* RB_SURFACE_INFO */