<p dir="ltr"></p>
<p dir="ltr">On Sep 20, 2016 12:49 AM, "Francisco Jerez" <<a href="mailto:currojerez@riseup.net">currojerez@riseup.net</a>> wrote:<br>
><br>
> Not intended for upstream.</p>
<p dir="ltr">If we're going to upstream this, we should remove the content saying we won't.</p>
<p dir="ltr">Otherwise r-b</p>
<p dir="ltr">> Should cause a GPU hang if some thread is<br>
> executed with a non-contiguous dispatch mask breaking assumptions of<br>
> brw_stage_has_packed_dispatch().  Doesn't cause any CTS, DEQP or<br>
> Piglit regressions, while replacing brw_stage_has_packed_dispatch()<br>
> with a dummy implementation that unconditionally returns true on top<br>
> of this patch causes multiple GPU hangs.<br>
><br>
> v2: Drop VEC4 test and clean up slightly for upstream (Jason).<br>
> ---<br>
>  src/mesa/drivers/dri/i965/brw_fs.cpp | 30 ++++++++++++++++++++++++++++++<br>
>  1 file changed, 30 insertions(+)<br>
><br>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
> index 03d4f5f..c5fa3f7 100644<br>
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
> @@ -6832,3 +6832,33 @@ brw_compile_cs(const struct brw_compiler *compiler, void *log_data,<br>
><br>
>     return g.get_assembly(final_assembly_size);<br>
>  }<br>
> +<br>
> +/**<br>
> + * Test the dispatch mask packing assumptions of<br>
> + * brw_stage_has_packed_dispatch().  Call this from e.g. the top of<br>
> + * fs_visitor::emit_nir_code() to cause a GPU hang if any shader invocation is<br>
> + * executed with an unexpected dispatch mask.<br>
> + */<br>
> +static UNUSED void<br>
> +brw_fs_test_dispatch_packing(const fs_builder &bld)<br>
> +{<br>
> +   const gl_shader_stage stage = bld.shader->stage;<br>
> +<br>
> +   if (brw_stage_has_packed_dispatch(bld.shader->devinfo, stage,<br>
> +                                     bld.shader->stage_prog_data)) {<br>
> +      const fs_builder ubld = bld.exec_all().group(1, 0);<br>
> +      const fs_reg tmp = component(bld.vgrf(BRW_REGISTER_TYPE_UD), 0);<br>
> +      const fs_reg mask = (stage == MESA_SHADER_FRAGMENT ? brw_vmask_reg() :<br>
> +                           brw_dmask_reg());<br>
> +<br>
> +      ubld.ADD(tmp, mask, brw_imm_ud(1));<br>
> +      ubld.AND(tmp, mask, tmp);<br>
> +<br>
> +      /* This will loop forever if the dispatch mask doesn't have the expected<br>
> +       * form '2^n-1', in which case tmp will be non-zero.<br>
> +       */<br>
> +      bld.emit(BRW_OPCODE_DO);<br>
> +      bld.CMP(bld.null_reg_ud(), tmp, brw_imm_ud(0), BRW_CONDITIONAL_NZ);<br>
> +      set_predicate(BRW_PREDICATE_NORMAL, bld.emit(BRW_OPCODE_WHILE));<br>
> +   }<br>
> +}<br>
> --<br>
> 2.9.0<br>
></p>