[Mesa-dev] [PATCH] i965: Fix hangs on HSW since the gen6 blorp fix.

Chad Versace chad.versace at linux.intel.com
Tue May 7 13:43:33 PDT 2013


On 05/06/2013 09:02 PM, Eric Anholt wrote:
> The constant packets for gen6 are too small for gen7, and while IVB seems
> happy with them HSW blows up.  Just restore the HSW path to what it was
> before the gen6 change, by making gen7-specific functions to set up these
> stages.
> ---
>
> The alternative here would be to emit the correct lengths of packets
> in these new functions.  But we're not emitting constants for other
> disabled stages on gen7+, so I'm leaning toward this variant.

I'm in favor of emitting zero-filled constant packets on gen7 just as
1dfea559c3f1 does. Neglecting to do so on gen6 caused no problems for
us for several years; then, boom!, the neglect began causing hangs.
Let's proactively apply the same fix here to gen7 so a similar bug
doesn't haunt in the future.

>
>   src/mesa/drivers/dri/i965/gen7_blorp.cpp | 57 ++++++++++++++++++++++++++++++--
>   1 file changed, 55 insertions(+), 2 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/gen7_blorp.cpp b/src/mesa/drivers/dri/i965/gen7_blorp.cpp
> index 1c23866..330e3d5 100644
> --- a/src/mesa/drivers/dri/i965/gen7_blorp.cpp
> +++ b/src/mesa/drivers/dri/i965/gen7_blorp.cpp
> @@ -276,6 +276,39 @@ gen7_blorp_emit_sampler_state(struct brw_context *brw,
>   }
>
>
> +/* 3DSTATE_VS
> + *
> + * Disable vertex shader.
> + */
> +static void
> +gen7_blorp_emit_vs_disable(struct brw_context *brw,
> +                           const brw_blorp_params *params)
> +{
> +   struct intel_context *intel = &brw->intel;
> +
> +   if (intel->gen == 6) {

This if-branch is dead code. The function is prefixed "gen7".

> +      /* From the BSpec, Volume 2a, Part 3 "Vertex Shader", Section
> +       * 3DSTATE_VS, Dword 5.0 "VS Function Enable":
> +       *
> +       *   [DevSNB] A pipeline flush must be programmed prior to a
> +       *   3DSTATE_VS command that causes the VS Function Enable to
> +       *   toggle. Pipeline flush can be executed by sending a PIPE_CONTROL
> +       *   command with CS stall bit set and a post sync operation.
> +       */
> +      intel_emit_post_sync_nonzero_flush(intel);
> +   }
> +
> +   BEGIN_BATCH(6);
> +   OUT_BATCH(_3DSTATE_VS << 16 | (6 - 2));
> +   OUT_BATCH(0);
> +   OUT_BATCH(0);
> +   OUT_BATCH(0);
> +   OUT_BATCH(0);
> +   OUT_BATCH(0);
> +   ADVANCE_BATCH();
> +}
> +
> +
>   /* 3DSTATE_HS
>    *
>    * Disable the hull shader.
> @@ -337,6 +370,26 @@ gen7_blorp_emit_ds_disable(struct brw_context *brw,
>      ADVANCE_BATCH();
>   }
>
> +/* 3DSTATE_GS
> + *
> + * Disable the geometry shader.
> + */
> +static void
> +gen7_blorp_emit_gs_disable(struct brw_context *brw,
> +                           const brw_blorp_params *params)
> +{
> +   struct intel_context *intel = &brw->intel;
> +
> +   BEGIN_BATCH(7);
> +   OUT_BATCH(_3DSTATE_GS << 16 | (7 - 2));
> +   OUT_BATCH(0);
> +   OUT_BATCH(0);
> +   OUT_BATCH(0);
> +   OUT_BATCH(0);
> +   OUT_BATCH(0);
> +   OUT_BATCH(0);
> +   ADVANCE_BATCH();
> +}
>
>   /* 3DSTATE_STREAMOUT
>    *
> @@ -784,11 +837,11 @@ gen7_blorp_exec(struct intel_context *intel,
>                                          wm_surf_offset_texture);
>         sampler_offset = gen7_blorp_emit_sampler_state(brw, params);
>      }
> -   gen6_blorp_emit_vs_disable(brw, params);
> +   gen7_blorp_emit_vs_disable(brw, params);
>      gen7_blorp_emit_hs_disable(brw, params);
>      gen7_blorp_emit_te_disable(brw, params);
>      gen7_blorp_emit_ds_disable(brw, params);
> -   gen6_blorp_emit_gs_disable(brw, params);
> +   gen7_blorp_emit_gs_disable(brw, params);
>      gen7_blorp_emit_streamout_disable(brw, params);
>      gen6_blorp_emit_clip_disable(brw, params);
>      gen7_blorp_emit_sf_config(brw, params);
>



More information about the mesa-dev mailing list