[Mesa-dev] [PATCH 09/20] nir: Add system values from ARB_shader_ballot

Connor Abbott cwabbott0 at gmail.com
Wed Jul 12 01:25:00 UTC 2017


On Tue, Jul 11, 2017 at 6:02 PM, Matt Turner <mattst88 at gmail.com> wrote:
> On Mon, Jul 10, 2017 at 4:05 PM, Connor Abbott <cwabbott0 at gmail.com> wrote:
>> On Mon, Jul 10, 2017 at 3:50 PM, Matt Turner <mattst88 at gmail.com> wrote:
>>> On Mon, Jul 10, 2017 at 1:10 PM, Connor Abbott <cwabbott0 at gmail.com> wrote:
>>>> On Thu, Jul 6, 2017 at 4:48 PM, Matt Turner <mattst88 at gmail.com> wrote:
>>>>> We already had a channel_num system value, which I'm renaming to
>>>>> subgroup_invocation to match the rest of the new system values.
>>>>>
>>>>> Note that while ballotARB(true) will return zeros in the high 32-bits on
>>>>> systems where gl_SubGroupSizeARB <= 32, the gl_SubGroup??MaskARB
>>>>> variables do not consider whether channels are enabled. See issue (1) of
>>>>> ARB_shader_ballot.
>>>>> ---
>>>>>  src/compiler/nir/nir.c                     |  4 ++++
>>>>>  src/compiler/nir/nir_intrinsics.h          |  8 +++++++-
>>>>>  src/compiler/nir/nir_lower_system_values.c | 28 ++++++++++++++++++++++++++++
>>>>>  src/intel/compiler/brw_fs_nir.cpp          |  2 +-
>>>>>  src/intel/compiler/brw_nir_intrinsics.c    |  4 ++--
>>>>>  5 files changed, 42 insertions(+), 4 deletions(-)
>>>>>
>>>>> diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c
>>>>> index 491b908396..9827e129ca 100644
>>>>> --- a/src/compiler/nir/nir.c
>>>>> +++ b/src/compiler/nir/nir.c
>>>>> @@ -1908,6 +1908,10 @@ nir_intrinsic_from_system_value(gl_system_value val)
>>>>>        return nir_intrinsic_load_helper_invocation;
>>>>>     case SYSTEM_VALUE_VIEW_INDEX:
>>>>>        return nir_intrinsic_load_view_index;
>>>>> +   case SYSTEM_VALUE_SUBGROUP_SIZE:
>>>>> +      return nir_intrinsic_load_subgroup_size;
>>>>> +   case SYSTEM_VALUE_SUBGROUP_INVOCATION:
>>>>> +      return nir_intrinsic_load_subgroup_invocation;
>>>>>     default:
>>>>>        unreachable("system value does not directly correspond to intrinsic");
>>>>>     }
>>>>> diff --git a/src/compiler/nir/nir_intrinsics.h b/src/compiler/nir/nir_intrinsics.h
>>>>> index 6c6ba4cf59..96ecfbc338 100644
>>>>> --- a/src/compiler/nir/nir_intrinsics.h
>>>>> +++ b/src/compiler/nir/nir_intrinsics.h
>>>>> @@ -344,10 +344,16 @@ SYSTEM_VALUE(work_group_id, 3, 0, xx, xx, xx)
>>>>>  SYSTEM_VALUE(user_clip_plane, 4, 1, UCP_ID, xx, xx)
>>>>>  SYSTEM_VALUE(num_work_groups, 3, 0, xx, xx, xx)
>>>>>  SYSTEM_VALUE(helper_invocation, 1, 0, xx, xx, xx)
>>>>> -SYSTEM_VALUE(channel_num, 1, 0, xx, xx, xx)
>>>>>  SYSTEM_VALUE(alpha_ref_float, 1, 0, xx, xx, xx)
>>>>>  SYSTEM_VALUE(layer_id, 1, 0, xx, xx, xx)
>>>>>  SYSTEM_VALUE(view_index, 1, 0, xx, xx, xx)
>>>>> +SYSTEM_VALUE(subgroup_size, 1, 0, xx, xx, xx)
>>>>> +SYSTEM_VALUE(subgroup_invocation, 1, 0, xx, xx, xx)
>>>>> +SYSTEM_VALUE(subgroup_eq_mask, 1, 0, xx, xx, xx)
>>>>> +SYSTEM_VALUE(subgroup_ge_mask, 1, 0, xx, xx, xx)
>>>>> +SYSTEM_VALUE(subgroup_gt_mask, 1, 0, xx, xx, xx)
>>>>> +SYSTEM_VALUE(subgroup_le_mask, 1, 0, xx, xx, xx)
>>>>> +SYSTEM_VALUE(subgroup_lt_mask, 1, 0, xx, xx, xx)
>>>>>
>>>>>  /* Blend constant color values.  Float values are clamped. */
>>>>>  SYSTEM_VALUE(blend_const_color_r_float, 1, 0, xx, xx, xx)
>>>>> diff --git a/src/compiler/nir/nir_lower_system_values.c b/src/compiler/nir/nir_lower_system_values.c
>>>>> index 810100a081..faf0c3c9da 100644
>>>>> --- a/src/compiler/nir/nir_lower_system_values.c
>>>>> +++ b/src/compiler/nir/nir_lower_system_values.c
>>>>> @@ -116,6 +116,34 @@ convert_block(nir_block *block, nir_builder *b)
>>>>>                             nir_load_base_instance(b));
>>>>>           break;
>>>>>
>>>>> +      case SYSTEM_VALUE_SUBGROUP_EQ_MASK:
>>>>> +      case SYSTEM_VALUE_SUBGROUP_GE_MASK:
>>>>> +      case SYSTEM_VALUE_SUBGROUP_GT_MASK:
>>>>> +      case SYSTEM_VALUE_SUBGROUP_LE_MASK:
>>>>> +      case SYSTEM_VALUE_SUBGROUP_LT_MASK: {
>>>>> +         nir_ssa_def *count = nir_load_subgroup_invocation(b);
>>>>> +
>>>>> +         switch (var->data.location) {
>>>>> +         case SYSTEM_VALUE_SUBGROUP_EQ_MASK:
>>>>> +            sysval = nir_ishl(b, nir_imm_int64(b, 1ull), count);
>>>>> +            break;
>>>>> +         case SYSTEM_VALUE_SUBGROUP_GE_MASK:
>>>>> +            sysval = nir_ishl(b, nir_imm_int64(b, ~0ull), count);
>>>>> +            break;
>>>>> +         case SYSTEM_VALUE_SUBGROUP_GT_MASK:
>>>>> +            sysval = nir_ishl(b, nir_imm_int64(b, ~1ull), count);
>>>>> +            break;
>>>>> +         case SYSTEM_VALUE_SUBGROUP_LE_MASK:
>>>>> +            sysval = nir_inot(b, nir_ishl(b, nir_imm_int64(b, ~1ull), count));
>>>>> +            break;
>>>>> +         case SYSTEM_VALUE_SUBGROUP_LT_MASK:
>>>>> +            sysval = nir_inot(b, nir_ishl(b, nir_imm_int64(b, ~0ull), count));
>>>>> +            break;
>>>>> +         default:
>>>>> +            unreachable("you seriously can't tell this is unreachable?");
>>>>> +         }
>>>>> +      }
>>>>> +
>>>>
>>>> While this fine to do for both Intel and AMD, Nvidia actually has
>>>> special system values for these, and AMD has special instructions for
>>>> bitCount(foo & gl_SubGroupLtMask), so I think we should have actual
>>>
>>> So, just add this to the above switch statement?
>>>
>>>    if (!b->shader->options->lower_subgroup_masks)
>>>       break;
>>>
>>> I'll also add the missing cases to nir_intrinsic_from_system_value()
>>> and nir_system_value_from_intrinsic().
>>
>> Well, it gets a little more complicated... with SPIR-V, you also have
>> variants of these system values that return 4 32-bit integers. My plan
>> was to lower them to the normal 64-bit intrinsics, and then have
>> another pass lower those if necessary. So it might be better if you
>> don't do any lowering here, and lower these to shifts in your
>> intrinsic opt pass instead -- that makes it a little easier to share
>> the lowering to shifts between GLSL and SPIR-V. I can adapt to
>> whatever you want to do though.
>
> Thanks, that makes sense. I'll squash the attached patch in.
>
> Should I expect to see any Reviewed-bys from you?

Sorry, I've been bouncing back and forth between this and something
else. With that squashed in, this patch gets my R-b. I'll try and
finish reviewing your updated patches and all the other core NIR stuff
this week. I think I'll leave the i965-specific stuff to someone
else... I'm pretty rusty with that stuff anyways.


More information about the mesa-dev mailing list