freedreno/a6xx: move VBO state to stateobj
authorRob Clark <robdclark@gmail.com>
Sat, 13 Oct 2018 17:24:24 +0000 (13:24 -0400)
committerRob Clark <robdclark@gmail.com>
Wed, 17 Oct 2018 16:44:49 +0000 (12:44 -0400)
Signed-off-by: Rob Clark <robdclark@gmail.com>
src/gallium/drivers/freedreno/a6xx/fd6_draw.c
src/gallium/drivers/freedreno/a6xx/fd6_emit.c
src/gallium/drivers/freedreno/a6xx/fd6_emit.h

index adb1e4ea1bb96b2d087ce7a1fe4eedfb3a4fb966..a8701b44f3dcb80f6c76f114a37c492a87052129 100644 (file)
@@ -123,10 +123,15 @@ draw_impl(struct fd_context *ctx, struct fd_ringbuffer *ring,
        const struct pipe_draw_info *info = emit->info;
        enum pc_di_primtype primtype = ctx->primtypes[info->mode];
 
-       fd6_emit_state(ring, emit);
+       if (emit->dirty & (FD_DIRTY_VTXBUF | FD_DIRTY_VTXSTATE)) {
+               struct fd_ringbuffer *state;
+
+               state = fd6_build_vbo_state(emit, emit->vs);
+               fd6_emit_add_group(emit, state, FD6_GROUP_VBO, 0x7);
+               fd_ringbuffer_del(state);
+       }
 
-       if (emit->dirty & (FD_DIRTY_VTXBUF | FD_DIRTY_VTXSTATE))
-               fd6_emit_vertex_bufs(ring, emit);
+       fd6_emit_state(ring, emit);
 
        OUT_PKT4(ring, REG_A6XX_VFD_INDEX_OFFSET, 2);
        OUT_RING(ring, info->index_size ? info->index_bias : info->start); /* VFD_INDEX_OFFSET */
index 353fa5c9f66c932eb79ffecbf0b2c39d486790ad..b164d8bc2da085535c665b527662625c27d6b7cc 100644 (file)
@@ -528,12 +528,15 @@ emit_ssbos(struct fd_context *ctx, struct fd_ringbuffer *ring,
        }
 }
 
-void
-fd6_emit_vertex_bufs(struct fd_ringbuffer *ring, struct fd6_emit *emit)
+struct fd_ringbuffer *
+fd6_build_vbo_state(struct fd6_emit *emit, const struct ir3_shader_variant *vp)
 {
-       int32_t i, j;
        const struct fd_vertex_state *vtx = emit->vtx;
-       const struct ir3_shader_variant *vp = emit->vs;
+       int32_t i, j;
+
+       struct fd_ringbuffer *ring =
+               fd_ringbuffer_new_flags(emit->ctx->pipe, 4 * (10 * vp->inputs_count + 2),
+                               FD_RINGBUFFER_OBJECT | FD_RINGBUFFER_STREAMING);
 
        for (i = 0, j = 0; i <= vp->inputs_count; i++) {
                if (vp->inputs[i].sysval)
@@ -581,6 +584,8 @@ fd6_emit_vertex_bufs(struct fd_ringbuffer *ring, struct fd6_emit *emit)
 
        OUT_PKT4(ring, REG_A6XX_VFD_CONTROL_0, 1);
        OUT_RING(ring, A6XX_VFD_CONTROL_0_VTXCNT(j) | (j << 8));
+
+       return ring;
 }
 
 static struct fd_ringbuffer *
index 450cb5e87344bb8d91c46de0cc24c03c89e883d5..83d0ede82fffe98fbd97ceb89f0e1cd9358d3543 100644 (file)
@@ -46,6 +46,7 @@ enum fd6_state_id {
        FD6_GROUP_PROG,
        FD6_GROUP_ZSA,
        FD6_GROUP_ZSA_BINNING,
+       FD6_GROUP_VBO,
        FD6_GROUP_VS_CONST,
        FD6_GROUP_FS_CONST,
        FD6_GROUP_VS_TEX,
@@ -171,7 +172,7 @@ bool fd6_emit_textures(struct fd_pipe *pipe, struct fd_ringbuffer *ring,
                enum a6xx_state_block sb, struct fd_texture_stateobj *tex,
                unsigned bcolor_offset);
 
-void fd6_emit_vertex_bufs(struct fd_ringbuffer *ring, struct fd6_emit *emit);
+struct fd_ringbuffer * fd6_build_vbo_state(struct fd6_emit *emit, const struct ir3_shader_variant *vp);
 
 void fd6_emit_state(struct fd_ringbuffer *ring, struct fd6_emit *emit);