[Mesa-dev] [PATCH 06/20] i965/fs: Implement ARB_shader_group_vote operations

Matt Turner mattst88 at gmail.com
Tue Jul 18 01:04:25 UTC 2017


On Mon, Jul 17, 2017 at 4:44 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> On Thursday, July 6, 2017 4:48:16 PM PDT Matt Turner wrote:
>> ---
>>  src/intel/compiler/brw_fs_nir.cpp | 36 ++++++++++++++++++++++++++++++++++++
>>  1 file changed, 36 insertions(+)
>>
>> diff --git a/src/intel/compiler/brw_fs_nir.cpp b/src/intel/compiler/brw_fs_nir.cpp
>> index a9dce42c38..264398f38e 100644
>> --- a/src/intel/compiler/brw_fs_nir.cpp
>> +++ b/src/intel/compiler/brw_fs_nir.cpp
>> @@ -4090,6 +4090,42 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
>>        break;
>>     }
>>
>> +   case nir_intrinsic_vote_any: {
>> +      const fs_builder ubld = bld.exec_all();
>> +      ubld.MOV(brw_flag_reg(0, 0), brw_imm_uw(0));
>> +      bld.CMP(bld.null_reg_d(), get_nir_src(instr->src[0]), brw_imm_d(0), BRW_CONDITIONAL_NZ);
>> +      bld.MOV(dest, brw_imm_d(-1));
>
> This might be easier to read as
>
>       bld.MOV(dest, brw_imm_ud(~0));
>
> at least, I normally think of true as ~0, not -1...though they're
> obviously the same.  Totally up to you, though.
>
>> +      set_predicate(dispatch_width == 8 ?
>> +                    BRW_PREDICATE_ALIGN1_ANY8H :
>> +                    BRW_PREDICATE_ALIGN1_ANY16H,
>> +                    bld.SEL(dest, dest, brw_imm_d(0)));
>> +      break;
>> +   }
>> +   case nir_intrinsic_vote_all: {
>> +      const fs_builder ubld = bld.exec_all();
>> +      ubld.MOV(brw_flag_reg(0, 0), brw_imm_uw(0xffff));
>> +      bld.CMP(bld.null_reg_d(), get_nir_src(instr->src[0]), brw_imm_d(0), BRW_CONDITIONAL_NZ);
>
> At a glance, it's not obvious why you're explicitly initializing the flag
> register value with a MOV, rather than just doing the CMP.  I believe this
> is because inactive channels still affect the ANY/ALL predicates, and you
> want to ignore those here.  Maybe add a comment to that effect?

Definitely a good thing to document. I've added the following comment
immediately above the flag-initializing MOV in all three cases:

      /* The any/all predicates do not consider channel enables. To prevent
       * dead channels from affecting the result, we initialize the flag with
       * with the identity value for the logical operation.
       */


More information about the mesa-dev mailing list