[Mesa-dev] [PATCH v2] nir: fix compacting varyings when XFB outputs are present
Samuel Pitoiset
samuel.pitoiset at gmail.com
Thu Oct 11 07:59:45 UTC 2018
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()?
> 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