i965/fs: Calculate the (un)spill block size correctly.
authorFrancisco Jerez <currojerez@riseup.net>
Mon, 16 May 2016 08:03:43 +0000 (01:03 -0700)
committerFrancisco Jerez <currojerez@riseup.net>
Mon, 23 May 2016 21:05:21 +0000 (14:05 -0700)
commit6fc5dd5b6a3e4884b475bae7507ea59e59800e67
tree670961e42040d5dc46f1699434d85375c9923947
parent11260cc54f277cadd2abfd22ec313f3f0f504487
i965/fs: Calculate the (un)spill block size correctly.

Currently the spilling code attempts to guess the scratch message
block size from the dispatch width of the shader, which is plain wrong
for SIMD-lowered instructions (frequently but not exclusively
encountered in SIMD32 shaders) or for instructions with register
region data types of size other than 32 bit.

Instead try to use the SIMD component size of the instruction which in
some cases will allow the dataport to apply the correct channel mask
to the scratch data read or written.  In the spill case the block size
needs to be clamped to the number of MRF registers reserved for
spilling.  In the unspill case I didn't even bother because we
currently have no 100% accurate way to determine whether a source
region is per-channel or whether it contains things like headers that
don't respect channel boundaries -- That's fine, because the unspill
is marked force_writemask_all we can just use the largest allowable
scratch message size.

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp