[Mesa-dev] [PATCH v2] nir: fix compacting varyings when XFB outputs are present

Timothy Arceri tarceri at itsqueeze.com
Thu Oct 11 10:41:08 UTC 2018


On 11/10/18 6:59 pm, Samuel Pitoiset wrote:
> 
> 
> On 10/10/18 11:46 PM, Timothy Arceri wrote:
>>
>>
>> On 11/10/18 1:46 am, Samuel Pitoiset wrote:
>>> We shouldn't try to compact any varyings known as always
>>> active IO, especially XFB outputs. For example, if one
>>> component of an xfb output is also used as input varying
>>> in the next stage, it shouldn't be compacted.
>>>
>>> This small helper just marks all XFB varyings as always_active_io
>>> in the consumer to not compact them.
>>>
>>> v2: add a little helper
>>>
>>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>>> ---
>>>   src/compiler/nir/nir_linking_helpers.c | 33 ++++++++++++++++++++++++++
>>>   1 file changed, 33 insertions(+)
>>>
>>> diff --git a/src/compiler/nir/nir_linking_helpers.c 
>>> b/src/compiler/nir/nir_linking_helpers.c
>>> index 88014e9a1d..433729bd79 100644
>>> --- a/src/compiler/nir/nir_linking_helpers.c
>>> +++ b/src/compiler/nir/nir_linking_helpers.c
>>> @@ -480,6 +480,36 @@ compact_components(nir_shader *producer, 
>>> nir_shader *consumer, uint8_t *comps,
>>>                                 &producer->info.outputs_read);
>>>   }
>>> +/* Mark XFB varyings as always_active_io in the consumer to not 
>>> compact them. */
>>> +static void
>>> +link_xfb_varyings(nir_shader *producer, nir_shader *consumer)
>>> +{
>>> +   nir_variable *input_vars[32] = {};
>>
>>        nir_variable *input_vars[MAX_VARYING] = {};
>>
>>> +
>>> +   nir_foreach_variable(var, &consumer->inputs) {
>>> +      if (var->data.location >= VARYING_SLOT_VAR0 &&
>>> +          var->data.location - VARYING_SLOT_VAR0 < 32) {
>>
>>            var->data.location - VARYING_SLOT_VAR0 < MAX_VARYING) {
>>
>>
>>> +
>>> +         unsigned location = var->data.location - VARYING_SLOT_VAR0;
>>> +         input_vars[location] = var;
>>> +      }
>>> +   }
>>> +
>>> +   nir_foreach_variable(var, &producer->outputs) {
>>> +      if (var->data.location >= VARYING_SLOT_VAR0 &&
>>> +          var->data.location - VARYING_SLOT_VAR0 < 32) {
>>
>>            var->data.location - VARYING_SLOT_VAR0 < MAX_VARYING) {
>>
>>> +
>>> +         if (!var->data.explicit_xfb_buffer)
>>> +            continue;
>>> +
>>> +         unsigned location = var->data.location - VARYING_SLOT_VAR0;
>>> +         if (input_vars[location]) {
>>> +            input_vars[location]->data.always_active_io = true;
>>> +         }
>>> +      }
>>> +   }
>>> +}
>>> +
>>>   /* We assume that this has been called more-or-less directly after
>>>    * remove_unused_varyings.  At this point, all of the varyings that we
>>>    * aren't going to be using have been completely removed and the
>>> @@ -501,6 +531,9 @@ nir_compact_varyings(nir_shader *producer, 
>>> nir_shader *consumer,
>>>      uint8_t interp_type[32] = {0};
>>>      uint8_t interp_loc[32] = {0};
>>
>> Hmm, looks like I should fix up these magic numbers also. I was 
>> planning on changing this code when adding patch support (which I 
>> still haven't got round to).
>>
>>> +   if (producer->info.has_transform_feedback_varyings)
>>> +      link_xfb_varyings(producer, consumer);
>>
>> I think you need to expose link_xfb_varyings() externally and call it 
>> in radv_link_shaders() before nir_lower_io_arrays_to_elements()
>>
>> e.g
>>
>>     if (ordered_shaders[i]->info.has_transform_feedback_varyings)
>>        nir_link_xfb_varyings(ordered_shaders[i], ordered_shaders[i - 1]);
>>
> 
> nir_lower_io_arrays_to_elements() shouldn't lower anything because it 
> checks for always_active_io. Why don't call it just before 
> nir_compact_varyings() and after nir_remove_unused_varyings()?

nir_lower_io_arrays_to_elements() will lower the inputs unless we set 
always_active_io there also (currently it will only be set on the 
matching output).

> 
>> With these changes this patch is:
>>
>> Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>
>>
>>
>>> +
>>>      get_slot_component_masks_and_interp_types(&producer->outputs, 
>>> comps,
>>>                                                interp_type, interp_loc,
>>>                                                producer->info.stage,
>>>


More information about the mesa-dev mailing list