radeonsi: integrate shared streamout state
authorMarek Olšák <marek.olsak@amd.com>
Tue, 13 Aug 2013 23:52:38 +0000 (01:52 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 12 Sep 2013 23:04:44 +0000 (01:04 +0200)
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
src/gallium/drivers/radeonsi/r600_blit.c
src/gallium/drivers/radeonsi/r600_hw_context.c
src/gallium/drivers/radeonsi/radeonsi_pipe.c
src/gallium/drivers/radeonsi/radeonsi_pipe.h
src/gallium/drivers/radeonsi/radeonsi_shader.h
src/gallium/drivers/radeonsi/si_state.c
src/gallium/drivers/radeonsi/si_state_draw.c

index 20c1767fff0448d94b3a683edf83e02ff577329d..9d7c73805554958e57a750f6c0862b462f2055c8 100644 (file)
@@ -64,8 +64,8 @@ static void r600_blitter_begin(struct pipe_context *ctx, enum r600_blitter_op op
                util_blitter_save_viewport(rctx->blitter, &rctx->queued.named.viewport->viewport);
        }
        util_blitter_save_vertex_buffer_slot(rctx->blitter, rctx->vertex_buffer);
-       util_blitter_save_so_targets(rctx->blitter, rctx->num_so_targets,
-                                    (struct pipe_stream_output_target**)rctx->so_targets);
+       util_blitter_save_so_targets(rctx->blitter, rctx->b.streamout.num_targets,
+                                    (struct pipe_stream_output_target**)rctx->b.streamout.targets);
 
        if (op & R600_SAVE_FRAMEBUFFER)
                util_blitter_save_framebuffer(rctx->blitter, &rctx->framebuffer);
index db622ba9c39605d1dfec035eaedd394ba9135100..1a2128e89a6a54ac93e1f5e0e49bc7288dfef271 100644 (file)
@@ -149,7 +149,9 @@ void si_need_cs_space(struct r600_context *ctx, unsigned num_dw,
        num_dw += ctx->num_cs_dw_nontimer_queries_suspend;
 
        /* Count in streamout_end at the end of CS. */
-       num_dw += ctx->num_cs_dw_streamout_end;
+       if (ctx->b.streamout.begin_emitted) {
+               num_dw += ctx->b.streamout.num_dw_for_end;
+       }
 
        /* Count in render_condition(NULL) at the end of CS. */
        if (ctx->predicate_drawing) {
@@ -179,10 +181,6 @@ void si_context_flush(struct r600_context *ctx, unsigned flags)
        struct radeon_winsys_cs *cs = ctx->b.rings.gfx.cs;
        bool queries_suspended = false;
 
-#if 0
-       bool streamout_suspended = false;
-#endif
-
        if (!cs->cdw)
                return;
 
@@ -192,12 +190,12 @@ void si_context_flush(struct r600_context *ctx, unsigned flags)
                queries_suspended = true;
        }
 
-#if 0
-       if (ctx->num_cs_dw_streamout_end) {
-               r600_context_streamout_end(ctx);
-               streamout_suspended = true;
+       ctx->b.streamout.suspended = false;
+
+       if (ctx->b.streamout.begin_emitted) {
+               r600_emit_streamout_end(&ctx->b);
+               ctx->b.streamout.suspended = true;
        }
-#endif
 
        ctx->b.flags |= R600_CONTEXT_FLUSH_AND_INV_CB |
                        R600_CONTEXT_FLUSH_AND_INV_CB_META |
@@ -263,12 +261,10 @@ void si_context_flush(struct r600_context *ctx, unsigned flags)
        si_pm4_emit(ctx, ctx->queued.named.init);
        ctx->emitted.named.init = ctx->queued.named.init;
 
-#if 0
-       if (streamout_suspended) {
-               ctx->streamout_start = TRUE;
-               ctx->streamout_append_bitmask = ~0;
+       if (ctx->b.streamout.suspended) {
+               ctx->b.streamout.append_bitmask = ctx->b.streamout.enabled_mask;
+               r600_streamout_buffers_dirty(&ctx->b);
        }
-#endif
 
        /* resume queries */
        if (queries_suspended) {
index 6ca138ff3aef1f8556dc99cea53984313618316b..993f30ab8184ffc904116d8a0e269ac33082e92d 100644 (file)
@@ -248,6 +248,8 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen, void
        rctx->cache_flush = si_atom_cache_flush;
        rctx->atoms.cache_flush = &rctx->cache_flush;
 
+       rctx->atoms.streamout_begin = &rctx->b.streamout.begin_atom;
+
        switch (rctx->b.chip_class) {
        case SI:
        case CIK:
index 61fdfe2a3dd0663c0cd44fa7d52659fa15369c4a..ed17f2c6fbc4ddcc0b148221ba2405ffe70f09b8 100644 (file)
@@ -137,6 +137,7 @@ struct r600_context {
                        /* Caches must be flushed after resource descriptors are
                         * updated in memory. */
                        struct r600_atom *cache_flush;
+                       struct r600_atom *streamout_begin;
                };
                struct r600_atom *array[0];
        } atoms;
@@ -179,19 +180,11 @@ struct r600_context {
        /* The list of active queries. Only one query of each type can be active. */
        struct list_head        active_nontimer_query_list;
        unsigned                num_cs_dw_nontimer_queries_suspend;
-       unsigned                num_cs_dw_streamout_end;
 
        unsigned                backend_mask;
        unsigned                max_db; /* for OQ */
        boolean                 predicate_drawing;
 
-       unsigned                num_so_targets;
-       struct r600_so_target   *so_targets[PIPE_MAX_SO_BUFFERS];
-       boolean                 streamout_start;
-       unsigned                streamout_append_bitmask;
-       unsigned                *vs_so_stride_in_dw;
-       unsigned                *vs_shader_so_strides;
-
        /* Vertex and index buffers. */
        bool                    vertex_buffers_dirty;
        struct pipe_index_buffer index_buffer;
index 1e8d0e94e628ac34aa27d8f90da9e07d3768e6c2..ede8bde3dee7946d741a2e1d02bf57e0dfa25d3b 100644 (file)
@@ -147,7 +147,6 @@ struct si_pipe_shader {
        unsigned                        cb_shader_mask;
        bool                            cb0_is_integer;
        unsigned                        sprite_coord_enable;
-       unsigned                        so_strides[4];
        union si_shader_key             key;
 };
 
index 6426033fcf96ee3eeb56a58cab60b73b1bd03964..f409af41947516e014db380144a4f4878baac129 100644 (file)
@@ -2471,10 +2471,12 @@ static void si_bind_vs_shader(struct pipe_context *ctx, void *state)
 
        rctx->vs_shader = sel;
 
-       if (sel && sel->current)
+       if (sel && sel->current) {
                si_pm4_bind_state(rctx, vs, sel->current->pm4);
-       else
+               rctx->b.streamout.stride_in_dw = sel->so.stride;
+       } else {
                si_pm4_bind_state(rctx, vs, rctx->dummy_pixel_shader->pm4);
+       }
 
        rctx->b.flags |= R600_CONTEXT_INV_SHADER_CACHE;
 }
index 38d8497e0622224f5985a5ac349e2cb87e2b1016..581d2892b0eb9b68d435f49acf7fe5b6e9692a0b 100644 (file)
@@ -658,8 +658,6 @@ void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
                }
        }
 
-       rctx->vs_shader_so_strides = rctx->vs_shader->current->so_strides;
-
        if (!si_update_draw_info_state(rctx, info))
                return;
 
@@ -690,14 +688,6 @@ void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
        }
 #endif
 
-#if 0
-       /* Enable stream out if needed. */
-       if (rctx->streamout_start) {
-               r600_context_streamout_begin(rctx);
-               rctx->streamout_start = FALSE;
-       }
-#endif
-
        /* Set the depth buffer as dirty. */
        if (rctx->framebuffer.zsbuf) {
                struct pipe_surface *surf = rctx->framebuffer.zsbuf;