i965: Fix output register sizes when variable ranges are interleaved
authorNeil Roberts <nroberts@igalia.com>
Fri, 18 May 2018 11:39:13 +0000 (13:39 +0200)
committerNeil Roberts <nroberts@igalia.com>
Wed, 4 Jul 2018 08:57:51 +0000 (10:57 +0200)
commit2d5ddbe960f7c62a8f00d5e800925865f115970f
tree40d7d5fe0668afb1a4bee6ac90723078b60fafe4
parent8c51caab2404c5c9f5211936d27e9fe1c0af2e7d
i965: Fix output register sizes when variable ranges are interleaved

In 6f5abf31466aed this code was fixed to calculate the maximum size of
an attribute in a seperate pass and then allocate the registers to
that size. However this wasn’t taking into account ranges that overlap
but don’t have the same starting location. For example:

layout(location = 0, component = 0) out float a[4];
layout(location = 2, component = 1) out float b[4];

Previously, if ‘a’ was processed first then it would allocate a
register of size 4 for location 0 and it wouldn’t allocate another
register for location 2 because it would already be covered by the
range of 0. Then if something tries to write to b[2] it would try to
write past the end of the register allocated for ‘a’ and it would hit
an assert.

This patch changes it to scan for any overlapping ranges that start
within each range to calculate the maximum extent and allocate that
instead.

Fixed Piglit’s arb_enhanced_layouts/execution/component-layout/
vs-fs-array-interleave-range.shader_test

Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Fixes: 6f5abf31466 "i965: Fix output register sizes when multiple variables
       share a slot."
src/intel/compiler/brw_fs_nir.cpp