From 9069a3b065b4e7f488139c445b2108722797aa82 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Wed, 1 May 2013 16:58:10 +0800 Subject: ilo: add gen6_pipeline_update_max_svbi() Move max_svbi calculation to a helper function and make it available for other GENs. --- src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c | 43 ++++++++++++++++++-------- src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.h | 5 +++ 2 files changed, 35 insertions(+), 13 deletions(-) (limited to 'src/gallium/drivers') diff --git a/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c b/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c index ae99e3e56e1..78aeadd5b34 100644 --- a/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c +++ b/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c @@ -511,12 +511,11 @@ gen6_pipeline_gs(struct ilo_3d_pipeline *p, } } -static void -gen6_pipeline_gs_svbi(struct ilo_3d_pipeline *p, - const struct ilo_context *ilo, - struct gen6_pipeline_session *session) +bool +gen6_pipeline_update_max_svbi(struct ilo_3d_pipeline *p, + const struct ilo_context *ilo, + struct gen6_pipeline_session *session) { - /* 3DSTATE_GS_SVB_INDEX */ if (DIRTY(VS) || DIRTY(GS) || DIRTY(STREAM_OUTPUT_TARGETS)) { const struct pipe_stream_output_info *so_info = (ilo->gs) ? &ilo->gs->info.stream_output : @@ -524,8 +523,7 @@ gen6_pipeline_gs_svbi(struct ilo_3d_pipeline *p, unsigned max_svbi = 0xffffffff; int i; - /* get max_svbi */ - for (i = 0; so_info && i < so_info->num_outputs; i++) { + for (i = 0; i < so_info->num_outputs; i++) { const int output_buffer = so_info->output[i].output_buffer; const struct pipe_stream_output_target *so = ilo->stream_output_targets.targets[output_buffer]; @@ -533,8 +531,10 @@ gen6_pipeline_gs_svbi(struct ilo_3d_pipeline *p, const int elem_size = so_info->output[i].num_components * 4; int buf_size, count; - if (!so) - continue; + if (!so) { + max_svbi = 0; + break; + } buf_size = so->buffer_size - so_info->output[i].dst_offset * 4; @@ -546,14 +546,34 @@ gen6_pipeline_gs_svbi(struct ilo_3d_pipeline *p, max_svbi = count; } + if (p->state.so_max_vertices != max_svbi) { + p->state.so_max_vertices = max_svbi; + return true; + } + } + + return false; +} + +static void +gen6_pipeline_gs_svbi(struct ilo_3d_pipeline *p, + const struct ilo_context *ilo, + struct gen6_pipeline_session *session) +{ + const bool emit = gen6_pipeline_update_max_svbi(p, ilo, session); + + /* 3DSTATE_GS_SVB_INDEX */ + if (emit) { if (p->dev->gen == ILO_GEN(6)) gen6_wa_pipe_control_post_sync(p, false); p->gen6_3DSTATE_GS_SVB_INDEX(p->dev, - 0, p->state.so_num_vertices, max_svbi, + 0, p->state.so_num_vertices, p->state.so_max_vertices, false, p->cp); if (session->hw_ctx_changed) { + int i; + /* * From the Sandy Bridge PRM, volume 2 part 1, page 148: * @@ -568,9 +588,6 @@ gen6_pipeline_gs_svbi(struct ilo_3d_pipeline *p, i, 0, 0xffffffff, false, p->cp); } } - - /* remember the state for calculating primtive emitted in software */ - p->state.so_max_vertices = max_svbi; } } diff --git a/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.h b/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.h index 8cc6ab20030..34d43206231 100644 --- a/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.h +++ b/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.h @@ -144,6 +144,11 @@ gen6_pipeline_states(struct ilo_3d_pipeline *p, const struct ilo_context *ilo, struct gen6_pipeline_session *session); +bool +gen6_pipeline_update_max_svbi(struct ilo_3d_pipeline *p, + const struct ilo_context *ilo, + struct gen6_pipeline_session *session); + void ilo_3d_pipeline_emit_flush_gen6(struct ilo_3d_pipeline *p); -- cgit v1.2.3