diff options
author | Chia-I Wu <[email protected]> | 2015-03-04 14:38:50 -0700 |
---|---|---|
committer | Chia-I Wu <[email protected]> | 2015-03-04 15:28:05 -0700 |
commit | b5eb6f769db71557c86c72c3352db149379fdade (patch) | |
tree | 18583d10f5ec230ee963e5936cc288a26a6b92bd /src | |
parent | 1424bdd61bce26f0853e974fc3b87c4c275e6ef0 (diff) |
ilo: improve WA handling in rectlist path
Add wrappers for 3DPRIMITIVE to make sure we clear current_pipe_control_dw1
and deferred_pipe_control_dw1 after it. Add missing
gen7_wa_post_ps_and_later().
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/ilo/ilo_render_gen.h | 5 | ||||
-rw-r--r-- | src/gallium/drivers/ilo/ilo_render_gen6.c | 33 | ||||
-rw-r--r-- | src/gallium/drivers/ilo/ilo_render_gen7.c | 40 | ||||
-rw-r--r-- | src/gallium/drivers/ilo/ilo_render_gen8.c | 20 |
4 files changed, 60 insertions, 38 deletions
diff --git a/src/gallium/drivers/ilo/ilo_render_gen.h b/src/gallium/drivers/ilo/ilo_render_gen.h index 012c3d7daeb..583265f4f60 100644 --- a/src/gallium/drivers/ilo/ilo_render_gen.h +++ b/src/gallium/drivers/ilo/ilo_render_gen.h @@ -439,9 +439,4 @@ gen7_draw_sol(struct ilo_render *r, const struct ilo_state_vector *vec, struct ilo_render_draw_session *session); -void -gen7_draw_vf_draw(struct ilo_render *r, - const struct ilo_state_vector *vec, - struct ilo_render_draw_session *session); - #endif /* ILO_RENDER_GEN_H */ diff --git a/src/gallium/drivers/ilo/ilo_render_gen6.c b/src/gallium/drivers/ilo/ilo_render_gen6.c index 0221acdc7e6..723288266be 100644 --- a/src/gallium/drivers/ilo/ilo_render_gen6.c +++ b/src/gallium/drivers/ilo/ilo_render_gen6.c @@ -41,7 +41,7 @@ /** * A wrapper for gen6_PIPE_CONTROL(). */ -static inline void +static void gen6_pipe_control(struct ilo_render *r, uint32_t dw1) { struct intel_bo *bo = (dw1 & GEN6_PIPE_CONTROL_WRITE__MASK) ? @@ -56,6 +56,20 @@ gen6_pipe_control(struct ilo_render *r, uint32_t dw1) assert(!r->state.deferred_pipe_control_dw1); } +static void +gen6_3dprimitive(struct ilo_render *r, + const struct pipe_draw_info *info, + const struct ilo_ib_state *ib) +{ + ILO_DEV_ASSERT(r->dev, 6, 6); + + /* 3DPRIMITIVE */ + gen6_3DPRIMITIVE(r->builder, info, ib); + + r->state.current_pipe_control_dw1 = 0; + assert(!r->state.deferred_pipe_control_dw1); +} + /** * This should be called before PIPE_CONTROL. */ @@ -482,18 +496,6 @@ gen6_draw_vf_statistics(struct ilo_render *r, gen6_3DSTATE_VF_STATISTICS(r->builder, false); } -static void -gen6_draw_vf_draw(struct ilo_render *r, - const struct ilo_state_vector *vec, - struct ilo_render_draw_session *session) -{ - /* 3DPRIMITIVE */ - gen6_3DPRIMITIVE(r->builder, vec->draw, &vec->ib); - - r->state.current_pipe_control_dw1 = 0; - assert(!r->state.deferred_pipe_control_dw1); -} - void gen6_draw_vs(struct ilo_render *r, const struct ilo_state_vector *vec, @@ -850,7 +852,8 @@ ilo_render_emit_draw_commands_gen6(struct ilo_render *render, gen6_draw_wm_raster(render, vec, session); gen6_draw_sf_rect(render, vec, session); gen6_draw_vf(render, vec, session); - gen6_draw_vf_draw(render, vec, session); + + gen6_3dprimitive(render, vec->draw, &vec->ib); } static void @@ -995,7 +998,7 @@ ilo_render_emit_rectlist_commands_gen6(struct ilo_render *r, gen6_3DSTATE_DRAWING_RECTANGLE(r->builder, 0, 0, blitter->fb.width, blitter->fb.height); - gen6_3DPRIMITIVE(r->builder, &blitter->draw, NULL); + gen6_3dprimitive(r, &blitter->draw, NULL); } int diff --git a/src/gallium/drivers/ilo/ilo_render_gen7.c b/src/gallium/drivers/ilo/ilo_render_gen7.c index cfb9e2e1a8b..2d3f6cfee56 100644 --- a/src/gallium/drivers/ilo/ilo_render_gen7.c +++ b/src/gallium/drivers/ilo/ilo_render_gen7.c @@ -64,6 +64,23 @@ gen7_pipe_control(struct ilo_render *r, uint32_t dw1) } static void +gen7_3dprimitive(struct ilo_render *r, + const struct pipe_draw_info *info, + const struct ilo_ib_state *ib) +{ + ILO_DEV_ASSERT(r->dev, 7, 7.5); + + if (r->state.deferred_pipe_control_dw1) + gen7_pipe_control(r, r->state.deferred_pipe_control_dw1); + + /* 3DPRIMITIVE */ + gen7_3DPRIMITIVE(r->builder, info, ib); + + r->state.current_pipe_control_dw1 = 0; + r->state.deferred_pipe_control_dw1 = 0; +} + +static void gen7_wa_post_3dstate_push_constant_alloc_ps(struct ilo_render *r) { /* @@ -649,21 +666,6 @@ gen7_draw_wm_multisample(struct ilo_render *r, } void -gen7_draw_vf_draw(struct ilo_render *r, - const struct ilo_state_vector *vec, - struct ilo_render_draw_session *session) -{ - if (r->state.deferred_pipe_control_dw1) - gen7_pipe_control(r, r->state.deferred_pipe_control_dw1); - - /* 3DPRIMITIVE */ - gen7_3DPRIMITIVE(r->builder, vec->draw, &vec->ib); - - r->state.current_pipe_control_dw1 = 0; - r->state.deferred_pipe_control_dw1 = 0; -} - -void ilo_render_emit_draw_commands_gen7(struct ilo_render *render, const struct ilo_state_vector *vec, struct ilo_render_draw_session *session) @@ -696,7 +698,8 @@ ilo_render_emit_draw_commands_gen7(struct ilo_render *render, gen6_draw_wm_raster(render, vec, session); gen6_draw_sf_rect(render, vec, session); gen6_draw_vf(render, vec, session); - gen7_draw_vf_draw(render, vec, session); + + gen7_3dprimitive(render, vec->draw, &vec->ib); } static void @@ -893,7 +896,10 @@ ilo_render_emit_rectlist_commands_gen7(struct ilo_render *r, gen6_3DSTATE_DRAWING_RECTANGLE(r->builder, 0, 0, blitter->fb.width, blitter->fb.height); - gen7_3DPRIMITIVE(r->builder, &blitter->draw, NULL); + if (ilo_dev_gen(r->dev) == ILO_GEN(7)) + gen7_wa_post_ps_and_later(r); + + gen7_3dprimitive(r, &blitter->draw, NULL); } int diff --git a/src/gallium/drivers/ilo/ilo_render_gen8.c b/src/gallium/drivers/ilo/ilo_render_gen8.c index b858041ee38..36fc1294753 100644 --- a/src/gallium/drivers/ilo/ilo_render_gen8.c +++ b/src/gallium/drivers/ilo/ilo_render_gen8.c @@ -65,6 +65,23 @@ gen8_pipe_control(struct ilo_render *r, uint32_t dw1) } static void +gen8_3dprimitive(struct ilo_render *r, + const struct pipe_draw_info *info, + const struct ilo_ib_state *ib) +{ + ILO_DEV_ASSERT(r->dev, 8, 8); + + if (r->state.deferred_pipe_control_dw1) + gen8_pipe_control(r, r->state.deferred_pipe_control_dw1); + + /* 3DPRIMITIVE */ + gen7_3DPRIMITIVE(r->builder, info, ib); + + r->state.current_pipe_control_dw1 = 0; + r->state.deferred_pipe_control_dw1 = 0; +} + +static void gen8_wa_pre_depth(struct ilo_render *r) { ILO_DEV_ASSERT(r->dev, 8, 8); @@ -309,7 +326,8 @@ ilo_render_emit_draw_commands_gen8(struct ilo_render *render, gen6_draw_wm_raster(render, vec, session); gen6_draw_sf_rect(render, vec, session); gen8_draw_vf(render, vec, session); - gen7_draw_vf_draw(render, vec, session); + + gen8_3dprimitive(render, vec->draw, &vec->ib); } int |