From 5fb5d4f0a6208e720998bbdbfe83df1035957f4a Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Wed, 26 Jun 2013 11:52:55 +0800 Subject: [PATCH] ilo: make pipe_draw_info a context state Rename ilo_finalize_states() to ilo_finalize_3d_states(), and bind pipe_draw_info to the context when it is called. This saves us from having to pass pipe_draw_info around in several places. --- src/gallium/drivers/ilo/ilo_3d.c | 25 ++++++++----------- src/gallium/drivers/ilo/ilo_3d_pipeline.c | 9 ++++--- src/gallium/drivers/ilo/ilo_3d_pipeline.h | 5 +--- .../drivers/ilo/ilo_3d_pipeline_gen6.c | 13 ++++------ .../drivers/ilo/ilo_3d_pipeline_gen6.h | 3 --- .../drivers/ilo/ilo_3d_pipeline_gen7.c | 5 ++-- src/gallium/drivers/ilo/ilo_context.h | 2 ++ src/gallium/drivers/ilo/ilo_state.c | 7 ++++-- src/gallium/drivers/ilo/ilo_state.h | 3 ++- 9 files changed, 33 insertions(+), 39 deletions(-) diff --git a/src/gallium/drivers/ilo/ilo_3d.c b/src/gallium/drivers/ilo/ilo_3d.c index 9ce6b75f978..69808d90751 100644 --- a/src/gallium/drivers/ilo/ilo_3d.c +++ b/src/gallium/drivers/ilo/ilo_3d.c @@ -372,7 +372,6 @@ ilo_3d_destroy(struct ilo_3d *hw3d) static bool draw_vbo(struct ilo_3d *hw3d, const struct ilo_context *ilo, - const struct pipe_draw_info *info, int *prim_generated, int *prim_emitted) { bool need_flush = false; @@ -410,7 +409,7 @@ draw_vbo(struct ilo_3d *hw3d, const struct ilo_context *ilo, if (need_flush) ilo_3d_pipeline_emit_flush(hw3d->pipeline); - return ilo_3d_pipeline_emit_draw(hw3d->pipeline, ilo, info, + return ilo_3d_pipeline_emit_draw(hw3d->pipeline, ilo, prim_generated, prim_emitted); } @@ -527,8 +526,7 @@ ilo_find_sub_primitives(const void *elements, unsigned element_size, } static inline bool -ilo_check_restart_index(struct ilo_context *ilo, - const struct pipe_draw_info *info) +ilo_check_restart_index(const struct ilo_context *ilo, unsigned restart_index) { /* * Haswell (GEN(7.5)) supports an arbitrary cut index, check everything @@ -540,23 +538,22 @@ ilo_check_restart_index(struct ilo_context *ilo, /* Note: indices must be unsigned byte, unsigned short or unsigned int */ switch (ilo->ib.state.index_size) { case 1: - return ((info->restart_index & 0xff) == 0xff); + return ((restart_index & 0xff) == 0xff); break; case 2: - return ((info->restart_index & 0xffff) == 0xffff); + return ((restart_index & 0xffff) == 0xffff); break; case 4: - return (info->restart_index == 0xffffffff); + return (restart_index == 0xffffffff); break; } return false; } static inline bool -ilo_check_restart_prim_type(struct ilo_context *ilo, - const struct pipe_draw_info *info) +ilo_check_restart_prim_type(const struct ilo_context *ilo, unsigned prim) { - switch (info->mode) { + switch (prim) { case PIPE_PRIM_POINTS: case PIPE_PRIM_LINES: case PIPE_PRIM_LINE_STRIP: @@ -705,20 +702,20 @@ ilo_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) * Want to draw an indexed primitive using primitive restart * Check that HW can handle the request and fall to SW if not. */ - if (!ilo_check_restart_index(ilo, info) || - !ilo_check_restart_prim_type(ilo, info)) { + if (!ilo_check_restart_index(ilo, info->restart_index) || + !ilo_check_restart_prim_type(ilo, info->mode)) { ilo_draw_vbo_with_sw_restart(pipe, info); return; } } - ilo_finalize_states(ilo); + ilo_finalize_3d_states(ilo, info); if (!upload_shaders(hw3d, ilo->shader_cache)) return; /* If draw_vbo ever fails, return immediately. */ - if (!draw_vbo(hw3d, ilo, info, &prim_generated, &prim_emitted)) + if (!draw_vbo(hw3d, ilo, &prim_generated, &prim_emitted)) return; /* clear dirty status */ diff --git a/src/gallium/drivers/ilo/ilo_3d_pipeline.c b/src/gallium/drivers/ilo/ilo_3d_pipeline.c index 5b4dae9ae3c..9d146d27c2d 100644 --- a/src/gallium/drivers/ilo/ilo_3d_pipeline.c +++ b/src/gallium/drivers/ilo/ilo_3d_pipeline.c @@ -149,7 +149,6 @@ handle_invalid_batch_bo(struct ilo_3d_pipeline *p, bool unset) bool ilo_3d_pipeline_emit_draw(struct ilo_3d_pipeline *p, const struct ilo_context *ilo, - const struct pipe_draw_info *info, int *prim_generated, int *prim_emitted) { bool success; @@ -181,7 +180,7 @@ ilo_3d_pipeline_emit_draw(struct ilo_3d_pipeline *p, /* draw! */ ilo_cp_assert_no_implicit_flush(p->cp, true); - p->emit_draw(p, ilo, info); + p->emit_draw(p, ilo); ilo_cp_assert_no_implicit_flush(p->cp, false); err = intel_winsys_check_aperture_space(ilo->winsys, &p->cp->bo, 1); @@ -204,10 +203,12 @@ ilo_3d_pipeline_emit_draw(struct ilo_3d_pipeline *p, } if (success) { - const int num_verts = u_vertices_per_prim(u_reduced_prim(info->mode)); + const int num_verts = + u_vertices_per_prim(u_reduced_prim(ilo->draw->mode)); const int max_emit = (p->state.so_max_vertices - p->state.so_num_vertices) / num_verts; - const int generated = u_reduced_prims_for_vertices(info->mode, info->count); + const int generated = + u_reduced_prims_for_vertices(ilo->draw->mode, ilo->draw->count); const int emitted = MIN2(generated, max_emit); p->state.so_num_vertices += emitted * num_verts; diff --git a/src/gallium/drivers/ilo/ilo_3d_pipeline.h b/src/gallium/drivers/ilo/ilo_3d_pipeline.h index 7aa17b8682c..7a867aaea27 100644 --- a/src/gallium/drivers/ilo/ilo_3d_pipeline.h +++ b/src/gallium/drivers/ilo/ilo_3d_pipeline.h @@ -33,7 +33,6 @@ #include "ilo_gpe_gen6.h" #include "ilo_gpe_gen7.h" -struct pipe_draw_info; struct intel_bo; struct ilo_cp; struct ilo_context; @@ -74,8 +73,7 @@ struct ilo_3d_pipeline { const void *arg); void (*emit_draw)(struct ilo_3d_pipeline *pipeline, - const struct ilo_context *ilo, - const struct pipe_draw_info *info); + const struct ilo_context *ilo); void (*emit_flush)(struct ilo_3d_pipeline *pipeline); @@ -257,7 +255,6 @@ ilo_3d_pipeline_estimate_size(struct ilo_3d_pipeline *pipeline, bool ilo_3d_pipeline_emit_draw(struct ilo_3d_pipeline *p, const struct ilo_context *ilo, - const struct pipe_draw_info *info, int *prim_generated, int *prim_emitted); void diff --git a/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c b/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c index 1a20599f5a1..00da47f3bb2 100644 --- a/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c +++ b/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c @@ -401,7 +401,7 @@ gen6_pipeline_vf(struct ilo_3d_pipeline *p, /* 3DSTATE_INDEX_BUFFER */ if (DIRTY(INDEX_BUFFER) || session->batch_bo_changed) { p->gen6_3DSTATE_INDEX_BUFFER(p->dev, - &ilo->ib.state, session->info->primitive_restart, p->cp); + &ilo->ib.state, ilo->draw->primitive_restart, p->cp); } /* 3DSTATE_VERTEX_BUFFERS */ @@ -455,7 +455,7 @@ gen6_pipeline_vf_draw(struct ilo_3d_pipeline *p, struct gen6_pipeline_session *session) { /* 3DPRIMITIVE */ - p->gen6_3DPRIMITIVE(p->dev, session->info, false, p->cp); + p->gen6_3DPRIMITIVE(p->dev, ilo->draw, false, p->cp); p->state.has_gen6_wa_pipe_control = false; } @@ -1288,13 +1288,11 @@ gen6_pipeline_states(struct ilo_3d_pipeline *p, void gen6_pipeline_prepare(const struct ilo_3d_pipeline *p, const struct ilo_context *ilo, - const struct pipe_draw_info *info, struct gen6_pipeline_session *session) { memset(session, 0, sizeof(*session)); - session->info = info; session->pipe_dirty = ilo->dirty; - session->reduced_prim = u_reduced_prim(info->mode); + session->reduced_prim = u_reduced_prim(ilo->draw->mode); /* available space before the session */ session->init_cp_space = ilo_cp_space(p->cp); @@ -1369,12 +1367,11 @@ gen6_pipeline_end(struct ilo_3d_pipeline *p, static void ilo_3d_pipeline_emit_draw_gen6(struct ilo_3d_pipeline *p, - const struct ilo_context *ilo, - const struct pipe_draw_info *info) + const struct ilo_context *ilo) { struct gen6_pipeline_session session; - gen6_pipeline_prepare(p, ilo, info, &session); + gen6_pipeline_prepare(p, ilo, &session); session.emit_draw_states = gen6_pipeline_states; session.emit_draw_commands = gen6_pipeline_commands; diff --git a/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.h b/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.h index 6ba1f2a87b9..11e3cb0b55f 100644 --- a/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.h +++ b/src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.h @@ -34,8 +34,6 @@ struct ilo_3d_pipeline; struct ilo_context; struct gen6_pipeline_session { - const struct pipe_draw_info *info; - uint32_t pipe_dirty; int reduced_prim; @@ -77,7 +75,6 @@ struct gen6_pipeline_session { void gen6_pipeline_prepare(const struct ilo_3d_pipeline *p, const struct ilo_context *ilo, - const struct pipe_draw_info *info, struct gen6_pipeline_session *session); void diff --git a/src/gallium/drivers/ilo/ilo_3d_pipeline_gen7.c b/src/gallium/drivers/ilo/ilo_3d_pipeline_gen7.c index a0d321cafe5..e8a825d5271 100644 --- a/src/gallium/drivers/ilo/ilo_3d_pipeline_gen7.c +++ b/src/gallium/drivers/ilo/ilo_3d_pipeline_gen7.c @@ -605,12 +605,11 @@ gen7_pipeline_commands(struct ilo_3d_pipeline *p, static void ilo_3d_pipeline_emit_draw_gen7(struct ilo_3d_pipeline *p, - const struct ilo_context *ilo, - const struct pipe_draw_info *info) + const struct ilo_context *ilo) { struct gen6_pipeline_session session; - gen6_pipeline_prepare(p, ilo, info, &session); + gen6_pipeline_prepare(p, ilo, &session); session.emit_draw_states = gen6_pipeline_states; session.emit_draw_commands = gen7_pipeline_commands; diff --git a/src/gallium/drivers/ilo/ilo_context.h b/src/gallium/drivers/ilo/ilo_context.h index ed9bba39ab5..a5c1ce0755a 100644 --- a/src/gallium/drivers/ilo/ilo_context.h +++ b/src/gallium/drivers/ilo/ilo_context.h @@ -34,6 +34,7 @@ #include "ilo_gpe.h" #include "ilo_common.h" +struct pipe_draw_info; struct u_upload_mgr; struct intel_winsys; struct intel_bo; @@ -60,6 +61,7 @@ struct ilo_context { struct u_upload_mgr *uploader; + const struct pipe_draw_info *draw; uint32_t dirty; struct ilo_vb_state vb; diff --git a/src/gallium/drivers/ilo/ilo_state.c b/src/gallium/drivers/ilo/ilo_state.c index 71783dfaca8..0e4e937879f 100644 --- a/src/gallium/drivers/ilo/ilo_state.c +++ b/src/gallium/drivers/ilo/ilo_state.c @@ -131,8 +131,11 @@ finalize_constant_buffers(struct ilo_context *ilo) * incomplete/invalid until finalized. */ void -ilo_finalize_states(struct ilo_context *ilo) +ilo_finalize_3d_states(struct ilo_context *ilo, + const struct pipe_draw_info *draw) { + ilo->draw = draw; + finalize_shader_states(ilo); finalize_constant_buffers(ilo); @@ -577,7 +580,7 @@ ilo_set_constant_buffer(struct pipe_context *pipe, cbuf->user_buffer_size = 0; } - /* the correct value will be set in ilo_finalize_states() */ + /* the correct value will be set in ilo_finalize_3d_states() */ ilo->cbuf[shader].count = 0; ilo->dirty |= ILO_DIRTY_CONSTANT_BUFFER; diff --git a/src/gallium/drivers/ilo/ilo_state.h b/src/gallium/drivers/ilo/ilo_state.h index 8a0d5e7f14d..69ef9025c4f 100644 --- a/src/gallium/drivers/ilo/ilo_state.h +++ b/src/gallium/drivers/ilo/ilo_state.h @@ -126,7 +126,8 @@ void ilo_cleanup_states(struct ilo_context *ilo); void -ilo_finalize_states(struct ilo_context *ilo); +ilo_finalize_3d_states(struct ilo_context *ilo, + const struct pipe_draw_info *draw); void ilo_mark_states_with_resource_dirty(struct ilo_context *ilo, -- 2.30.2