i965/fs: Don't mutate multi-component arguments in sampler payload set-up.
authorFrancisco Jerez <currojerez@riseup.net>
Sun, 1 May 2016 04:54:47 +0000 (21:54 -0700)
committerFrancisco Jerez <currojerez@riseup.net>
Sat, 28 May 2016 06:29:06 +0000 (23:29 -0700)
commit1d5bf46ad1533ffdb30b5dc0f9244f60b0539285
tree7c44c3e603f773057c0b575ed211203d5c4ee09f
parentad8f66ed33172ab40d4679063780a501b6f80740
i965/fs: Don't mutate multi-component arguments in sampler payload set-up.

The Gen5+ sampler message payload construction code steps through the
coordinate and derivative components by induction like 'coordinate =
offset(coordinate, bld, 1)', the problem is that while doing that it
may step one past the end of the coordinate vector causing an
assertion failure in offset() if it happens to be a (single component)
immediate.  Right now coordinates and derivatives are typically passed
as actual registers but that will no longer be the case when we start
propagating constants into logical messages.

Instead express coordinate components in closed form like
'offset(coordinate, bld, i)' -- The end result seems slightly more
readable that way and it allows passing the coordinate and derivative
registers by const reference instead of by value, so it seems like a
clean-up in its own right.

v2: Fold a few post-increment operators into the last MOV
    statement. (Jason)

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