Skip to content

nir: Record non-vector/scalar varyings as unmovable when compacting

Kenneth Graunke requested to merge kwg/mesa:compact-varying-fix into master

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>

Edited by Kenneth Graunke

Merge request reports