[Mesa-dev] [PATCH 2/2] nir: add lowering for gl_HelperInvocation

Jason Ekstrand jason at jlekstrand.net
Mon Jun 11 22:34:50 UTC 2018


On Mon, Jun 11, 2018 at 3:32 PM, Jason Ekstrand <jason at jlekstrand.net>
wrote:

> On Wed, Jun 6, 2018 at 7:43 AM, Rob Clark <robdclark at gmail.com> wrote:
>
>> Signed-off-by: Rob Clark <robdclark at gmail.com>
>> ---
>> I can't say for sure that this will work on all drivers, but it is
>> what the blob driver does, and it seems to make deqp happy.  I could
>> move this to it's own pass inside ir3, but that seemed like overkill
>>
>>  src/compiler/nir/nir.h                      | 10 ++++++++++
>>  src/compiler/nir/nir_lower_system_values.c  | 17 +++++++++++++++++
>>  src/gallium/drivers/freedreno/ir3/ir3_nir.c |  1 +
>>  3 files changed, 28 insertions(+)
>>
>> diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
>> index 073ab4e82ea..de3d55d83af 100644
>> --- a/src/compiler/nir/nir.h
>> +++ b/src/compiler/nir/nir.h
>> @@ -1963,6 +1963,16 @@ typedef struct nir_shader_compiler_options {
>>      */
>>     bool lower_base_vertex;
>>
>> +   /**
>> +    * If enabled, gl_HelperInvocation will be lowered as:
>> +    *
>> +    *   !((1 << gl_SampleID) & gl_SampleMaskIN[0]))
>>
>
> This only works for multi-sampling.  What about the single-sampled case?
>

Actually, I'm not even sure that it would work for multisampling for us.
What about 2x MSAA?  There you are probably going to have two pixels
involved in order to get derivatives.

--Jason



> +    *
>> +    * TODO any hw w/ more than 32 samples?  For them (if they
>> +    * used this option), a bit more math would be involved.
>> +    */
>> +   bool lower_helper_invocation;
>> +
>>     bool lower_cs_local_index_from_id;
>>
>>     bool lower_device_index_to_zero;
>> diff --git a/src/compiler/nir/nir_lower_system_values.c
>> b/src/compiler/nir/nir_lower_system_values.c
>> index 487da042620..6668cbb5dcd 100644
>> --- a/src/compiler/nir/nir_lower_system_values.c
>> +++ b/src/compiler/nir/nir_lower_system_values.c
>> @@ -136,6 +136,23 @@ convert_block(nir_block *block, nir_builder *b)
>>                                nir_load_first_vertex(b));
>>           break;
>>
>> +      case SYSTEM_VALUE_HELPER_INVOCATION:
>> +         if (b->shader->options->lower_helper_invocation) {
>> +            nir_ssa_def *tmp;
>> +
>> +            tmp = nir_ushr(b,
>> +                           nir_imm_int(b, 1),
>> +                           nir_load_sample_id(b));
>> +
>> +            tmp = nir_iand(b,
>> +                           nir_load_sample_mask_in(b),
>> +                           tmp);
>> +
>> +            sysval = nir_inot(b, nir_i2b(b, tmp));
>> +         }
>> +
>> +         break;
>> +
>>        case SYSTEM_VALUE_INSTANCE_INDEX:
>>           sysval = nir_iadd(b,
>>                             nir_load_instance_id(b),
>> diff --git a/src/gallium/drivers/freedreno/ir3/ir3_nir.c
>> b/src/gallium/drivers/freedreno/ir3/ir3_nir.c
>> index cd1f9c526f2..341d990b269 100644
>> --- a/src/gallium/drivers/freedreno/ir3/ir3_nir.c
>> +++ b/src/gallium/drivers/freedreno/ir3/ir3_nir.c
>> @@ -51,6 +51,7 @@ static const nir_shader_compiler_options options = {
>>                 .lower_extract_byte = true,
>>                 .lower_extract_word = true,
>>                 .lower_all_io_to_temps = true,
>> +               .lower_helper_invocation = true,
>>  };
>>
>>  struct nir_shader *
>> --
>> 2.17.0
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180611/0ffe808f/attachment-0001.html>


More information about the mesa-dev mailing list