<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Tue, Jul 31, 2018 at 3:00 PM Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On July 31, 2018 14:54:54 Kenneth Graunke <<a href="mailto:kenneth@whitecape.org" target="_blank">kenneth@whitecape.org</a>> wrote:<br>
<br>
> On Tuesday, July 31, 2018 12:22:02 PM PDT Jason Ekstrand wrote:<br>
>> The NIR nir_lower_io_arrays_to_elements pass attempts to split I/O<br>
>> variables which are arrays or matrices into a sequence of separate<br>
>> variables.  This can help link-time optimization by allowing us to<br>
>> remove varyings at a more granular level.<br>
>><br>
>> Shader-db results on Kaby Lake:<br>
>><br>
>> total instructions in shared programs: 15177645 -> 15168494 (-0.06%)<br>
>> instructions in affected programs: 79857 -> 70706 (-11.46%)<br>
>> helped: 392<br>
>> HURT: 0<br>
>> ---<br>
>> src/intel/compiler/brw_nir.c | 4 ++++<br>
>> 1 file changed, 4 insertions(+)<br>
>><br>
>> diff --git a/src/intel/compiler/brw_nir.c b/src/intel/compiler/brw_nir.c<br>
>> index 17ccfa48af6..29ad68fdb2a 100644<br>
>> --- a/src/intel/compiler/brw_nir.c<br>
>> +++ b/src/intel/compiler/brw_nir.c<br>
>> @@ -709,6 +709,10 @@ void<br>
>> brw_nir_link_shaders(const struct brw_compiler *compiler,<br>
>>              nir_shader **producer, nir_shader **consumer)<br>
>> {<br>
>> +   nir_lower_io_arrays_to_elements(*producer, *consumer);<br>
>> +   nir_validate_shader(*producer);<br>
>> +   nir_validate_shader(*consumer);<br>
>> +<br>
>> NIR_PASS_V(*producer, nir_remove_dead_variables, nir_var_shader_out);<br>
>> NIR_PASS_V(*consumer, nir_remove_dead_variables, nir_var_shader_in);<br>
><br>
> This actually passes the test suite?  That's strange.  When I was<br>
> playing with this earlier, it was demoting gl_ClipDistance[1] from<br>
> a float[1] compact array to a single float variable...but leaving it<br>
> marked compact.  var->data.compact = true makes no sense for non-arrays.<br>
><br>
> I think our clip/cull distance handling assumes that it's an array,<br>
> though.  So...not sure whether the pass should unset compact, or skip<br>
> over compact arrays...<br>
<br>
Yes, it passes just fine. I'm not sure exactly how it interacts with clip <br>
distance lowering though.<br></blockquote><div><br></div><div>Back at my computer finally.  I did a bit of digging and the lower_io_arrays_to_elements pass ignores everything that isn't VARYING_SLOT_VARX.  Clip distances are ignored since they're VARYING_SLOT_CLIP_DIST0/1.  Hope that clears it up. :-)<br></div><div><br></div><div>--Jason<br></div><div><br></div><div>--Jason<br></div></div></div>