nir: Record non-vector/scalar varyings as unmovable when compacting
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 20 Mar 2019 04:40:51 +0000 (21:40 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Mar 2019 16:03:58 +0000 (16:03 +0000)
commite426c3a6cb020d1b156415e20c6f53a7195f96cd
tree7371d2992c448b8ce82748f742a7e467ecfec402
parent6e781a01b97639057d44ca13c5d4276220745b3d
nir: Record non-vector/scalar varyings as unmovable when compacting

In some cases, we can end up with varying structs that aren't split to
their member variables.  nir_compact_varyings attempted to record these
as unmovable, so it would leave them be.  Unfortunately, it didn't do
it right for non-vector/scalar types.  It set the mask to:

   ((1 << (elements * dmul)) - 1) << var->data.location_frac

where elements is the number of vector elements.  For structures and
other non-vector/scalars, elements is 0...so the whole mask became 0.

This caused nir_compact_varyings to assign other varyings on top of
the structure varying's location (as it appeared to take up no space).

To combat this, we just set elements to 4 for non-vector/scalar types,
so that the entire slot gets marked as unmovable.

Fixes KHR-GL45.tessellation_shader.tessellation_control_to_tessellation_evaluation.gl_in on iris.

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/nir/nir_linking_helpers.c