freedreno/a6xx: single cmdstream for draw+binning
authorRob Clark <robdclark@gmail.com>
Sat, 13 Oct 2018 17:56:05 +0000 (13:56 -0400)
committerRob Clark <robdclark@gmail.com>
Wed, 17 Oct 2018 16:44:49 +0000 (12:44 -0400)
Now that state which is different for draw vs binning pass is split out
into different state-groups with appropriate enable_mask (so the
appropriate one is chosen for draw vs binning), switch over to using a
single cmdstream for both passes.

This should significantly lower draw overhead for CPU bound benchmarks.

Signed-off-by: Rob Clark <robdclark@gmail.com>
src/gallium/drivers/freedreno/a6xx/fd6_draw.c
src/gallium/drivers/freedreno/a6xx/fd6_emit.h
src/gallium/drivers/freedreno/a6xx/fd6_gmem.c

index 518168e51bc69fa187ff69fbf13e8c816ba65dec..c0670d3a11c1b9e4cd1dc73ae7155de6f8c9576d 100644 (file)
@@ -229,14 +229,13 @@ fd6_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
 
        fixup_shader_state(ctx, &emit.key.key);
 
-       unsigned dirty = ctx->dirty;
-
-       if (!(dirty & FD_DIRTY_PROG)) {
+       if (!(ctx->dirty & FD_DIRTY_PROG)) {
                emit.prog = fd6_ctx->prog;
        } else {
                fd6_ctx->prog = fd6_emit_get_prog(&emit);
        }
 
+       emit.dirty = ctx->dirty;      /* *after* fixup_shader_state() */
        emit.bs = fd6_emit_get_prog(&emit)->bs;
        emit.vs = fd6_emit_get_prog(&emit)->vs;
        emit.fs = fd6_emit_get_prog(&emit)->fs;
@@ -257,18 +256,8 @@ fd6_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info,
         */
        emit.no_lrz_write = fp->writes_pos || fp->has_kill;
 
-       emit.binning_pass = false;
-       emit.dirty = dirty;
-
        draw_impl(ctx, ctx->batch->draw, &emit, index_offset);
 
-       /* and now binning pass: */
-       emit.binning_pass = true;
-       emit.dirty = dirty & ~(FD_DIRTY_BLEND);
-       emit.vs = fd6_emit_get_prog(&emit)->bs;
-
-       draw_impl(ctx, ctx->batch->binning, &emit, index_offset);
-
        if (emit.streamout_mask) {
                struct fd_ringbuffer *ring = ctx->batch->draw;
 
index 0b5aa56de51d0797bdebccd19e36f62c8602438e..d7ab80ae7a46ccf3234518fb56486aa792b9f966 100644 (file)
@@ -66,7 +66,6 @@ struct fd6_emit {
        struct fd_context *ctx;
        const struct fd_vertex_state *vtx;
        const struct pipe_draw_info *info;
-       bool binning_pass;
        struct ir3_cache_key key;
        enum fd_dirty_3d_state dirty;
 
index 279f02ba54912df02809badafff3231f29a3e376..c2f2a03d18aabf95ac1b0a6dc4ce53b242a10348 100644 (file)
@@ -408,7 +408,7 @@ emit_binning_pass(struct fd_batch *batch)
                        A6XX_SP_TP_WINDOW_OFFSET_Y(0));
 
        /* emit IB to binning drawcmds: */
-       ctx->emit_ib(ring, batch->binning);
+       ctx->emit_ib(ring, batch->draw);
 
        fd_reset_wfi(batch);