summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChia-I Wu <[email protected]>2015-03-04 14:38:50 -0700
committerChia-I Wu <[email protected]>2015-03-04 15:28:05 -0700
commitb5eb6f769db71557c86c72c3352db149379fdade (patch)
tree18583d10f5ec230ee963e5936cc288a26a6b92bd
parent1424bdd61bce26f0853e974fc3b87c4c275e6ef0 (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().
-rw-r--r--src/gallium/drivers/ilo/ilo_render_gen.h5
-rw-r--r--src/gallium/drivers/ilo/ilo_render_gen6.c33
-rw-r--r--src/gallium/drivers/ilo/ilo_render_gen7.c40
-rw-r--r--src/gallium/drivers/ilo/ilo_render_gen8.c20
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