[Mesa-dev] i965: Uniform loading via samplers with discard

Ian Romanick idr at freedesktop.org
Tue Jun 24 08:17:23 PDT 2014


Send patches with git-send-email and no other method.  Save this message
and apply it to origin/master using git-am to see why.

Hopefully Matt or Ken can review this...

On 06/12/2014 12:35 PM, Cody Northrop wrote:
> Commit 17c7ead7 exposed a bug in how uniform loading happens in the
> presence of discard.  It manifested itself in an application as randomly
> incorrect pixels on the borders of conditional areas.
> 
> We believe it is due to how discards jump to the end of the shader
> incorrectly for some channels.  The current implementation checks each
> 2x2 subspan to preserve derivatives.  When uniform loading via samplers
> was turned on, it uses a full execution mask, as stated in
> lower_uniform_pull_constant_loads(), and only populates four channels of
> the destination (see generate_uniform_pull_constant_load_gen7()).  We
> think that is happening incorrectly when the first subspan has been
> jumped over.
> 
> A possible fix is to only jump to the end of the shader if all relevant
> channels are disabled, i.e. all 8 or 16, depending on dispatch.  This
> preserves the original speedup noted in commit beafced2.  There are
> other more heavyweight fixes (i.e. don't use sampler for uniforms if
> discard in use), but this seems like a good fix.  I've appended it below
> as a patch.  It changes the shader accordingly:
> 
> before    : 0x000000d0: (-f0.1.any4h) halt(8) 17 2     
> null                            { align1 WE_all 1Q };
> after(8)  : 0x000000d0: (-f0.1.any8h) halt(8) 17 2     
> null                            { align1 WE_all 1Q };
> after(16) : 0x00000250: (-f0.1.any16h) halt(16) 17 2   
> null                            { align1 WE_all 1H };

All of this information should go in the commit message.

> I attached a test case to the bugzilla entry below.

Was the test also sent to the piglit mailing list for inclusion in the
the test suite?

> Thanks for any review or feedback.  Curious if anyone sees a better fix.
> 
> -C
> 
> 
> From 871671c4ab8ff00e85b434865e8855fc356efa8f Mon Sep 17 00:00:00 2001
> From: Cody Northrop <cody at lunarg.com <mailto:cody at lunarg.com>>
> Date: Thu, 12 Jun 2014 09:07:18 -0600
> Subject: [PATCH] i965/fs: Update discard jump to preserve uniform loads via
>  sampler.
> 
> The series that implemented this optimization was done before
> the changes to use samplers for uniform loads.  Uniform sampler
> loads use special execution masks and only populate four
> channels, so we can't jump over those or corruption ensues.
> Use a more conservative jump mask which only jumps to the end
> if all relevant channels are disabled.
> 
> No change was observed in GLbenchmark 2.7, so the optimization
> is preserved.
> 
> Signed-off-by: Cody Northrop <cody at lunarg.com <mailto:cody at lunarg.com>>
> Reviewed-by: Mike Stroyan <mike at lunarg.com <mailto:mike at lunarg.com>>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=79948
> ---
>  src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 10 +++++++++-
>  1 file changed, 9 insertions(+), 1 deletion(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> index 8858852..fe05715 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> @@ -1907,7 +1907,15 @@ fs_visitor::visit(ir_discard *ir)
>         */
>        fs_inst *discard_jump = emit(FS_OPCODE_DISCARD_JUMP);
>        discard_jump->flag_subreg = 1;
> -      discard_jump->predicate = BRW_PREDICATE_ALIGN1_ANY4H;
> +
> +      /* Uniforms are now loaded using samplers with a routine that has
> +       * its own execution mask, so we can only jump if all relevant
> +       * channels are dead.  This is more conservative than the previous
> +       * four channel checking, but still preserves speedups.
> +       */
> +      discard_jump->predicate = (8 == dispatch_width)
> +                                ? BRW_PREDICATE_ALIGN1_ANY8H
> +                                : BRW_PREDICATE_ALIGN1_ANY16H;
>        discard_jump->predicate_inverse = true;
>     }
>  }
> -- 
> 1.8.3.2
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev



More information about the mesa-dev mailing list