[Mesa-dev] [PATCH 6/8] i965/fs: Handle conditional discards.

Connor Abbott cwabbott0 at gmail.com
Tue Feb 24 10:25:18 PST 2015


On Tue, Feb 24, 2015 at 5:19 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> For conditional discards, we can call emit_bool_to_cond_code to generate
> the condition in f0.0.  However, we want it in f0.1.  The flag value is
> always produced by the last instruction emit_bool_to_cond_code
> generates, so we can simply get the last instruction and patch it up.

Is this left over from an earlier version? It seems to me like we're
just doing the dumb thing (rather than emit_bool_to_cond_code()) here
and letting the i965 optimizer clean it up for both GLSL IR and NIR.

>
> Nothing generates these today, but that will change shortly.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/mesa/drivers/dri/i965/brw_fs_nir.cpp     | 22 ++++++++++++++--------
>  src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 21 ++++++++++++---------
>  2 files changed, 26 insertions(+), 17 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> index 90eecae..6354bde 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> @@ -1149,16 +1149,22 @@ fs_visitor::nir_emit_intrinsic(nir_intrinsic_instr *instr)
>     bool has_indirect = false;
>
>     switch (instr->intrinsic) {
> -   case nir_intrinsic_discard: {
> +   case nir_intrinsic_discard:
> +   case nir_intrinsic_discard_if: {
>        /* We track our discarded pixels in f0.1.  By predicating on it, we can
> -       * update just the flag bits that aren't yet discarded.  By emitting a
> -       * CMP of g0 != g0, all our currently executing channels will get turned
> -       * off.
> +       * update just the flag bits that aren't yet discarded.  If there's no
> +       * condition, we emit a CMP of g0 != g0, so all currently executing
> +       * channels will get turned off.
>         */
> -      fs_reg some_reg = fs_reg(retype(brw_vec8_grf(0, 0),
> -                                    BRW_REGISTER_TYPE_UW));
> -      fs_inst *cmp = emit(CMP(reg_null_f, some_reg, some_reg,
> -                              BRW_CONDITIONAL_NZ));
> +      fs_inst *cmp;
> +      if (instr->intrinsic == nir_intrinsic_discard_if) {
> +         cmp = emit(CMP(reg_null_f, get_nir_src(instr->src[0]),
> +                        fs_reg(0), BRW_CONDITIONAL_Z));
> +      } else {
> +         fs_reg some_reg = fs_reg(retype(brw_vec8_grf(0, 0),
> +                                       BRW_REGISTER_TYPE_UW));
> +         cmp = emit(CMP(reg_null_f, some_reg, some_reg, BRW_CONDITIONAL_NZ));
> +      }
>        cmp->predicate = BRW_PREDICATE_NORMAL;
>        cmp->flag_subreg = 1;
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> index b1b75821..75254a1 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> @@ -2415,17 +2415,20 @@ fs_visitor::visit(ir_swizzle *ir)
>  void
>  fs_visitor::visit(ir_discard *ir)
>  {
> -   assert(ir->condition == NULL); /* FINISHME */
> -
>     /* We track our discarded pixels in f0.1.  By predicating on it, we can
> -    * update just the flag bits that aren't yet discarded.  By emitting a
> -    * CMP of g0 != g0, all our currently executing channels will get turned
> -    * off.
> +    * update just the flag bits that aren't yet discarded.  If there's no
> +    * condition, we emit a CMP of g0 != g0, so all currently executing
> +    * channels will get turned off.
>      */
> -   fs_reg some_reg = fs_reg(retype(brw_vec8_grf(0, 0),
> -                                   BRW_REGISTER_TYPE_UW));
> -   fs_inst *cmp = emit(CMP(reg_null_f, some_reg, some_reg,
> -                           BRW_CONDITIONAL_NZ));
> +   fs_inst *cmp;
> +   if (ir->condition) {
> +      ir->condition->accept(this);
> +      cmp = emit(CMP(reg_null_f, this->result, fs_reg(0), BRW_CONDITIONAL_Z));
> +   } else {
> +      fs_reg some_reg = fs_reg(retype(brw_vec8_grf(0, 0),
> +                                      BRW_REGISTER_TYPE_UW));
> +      cmp = emit(CMP(reg_null_f, some_reg, some_reg, BRW_CONDITIONAL_NZ));
> +   }
>     cmp->predicate = BRW_PREDICATE_NORMAL;
>     cmp->flag_subreg = 1;
>
> --
> 2.2.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