i965/vec4: Fix TCS output reads with non-zero component qualifiers.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 14 Dec 2016 07:47:05 +0000 (23:47 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 15 Dec 2016 05:15:39 +0000 (21:15 -0800)
commit84e19322d3a24f7d90bdea09298f1ad55c5e0f04
treea49610bcf4a6f80b8ade22b9a99ba01ef4c32cad
parentfd3120d85c295eeeb3b6c9a60372506ae48f5fdb
i965/vec4: Fix TCS output reads with non-zero component qualifiers.

We want to perform the URB read to a vec4 temporary, with no writemask,
then issue a MOV to swizzle the data and store it to the actual
destination, using the final writemask.

We were doing this wrong.  For example, let's say we wanted to read
a vec2 stored in components 2-3 of a vec4.  We would generate a URB
read message of:

   SEND <actual destination>.XY <header with mask set to XY>
   MOV <actual destination>.XY <actual destination>.ZW

This doesn't work, because the URB message reads the .XY components
of the vec4, rather than the ZW.  It writes to the right place, but
with the wrong data.  Then the MOV comes along and overwrites it
with data that didn't even come from the URB at all.

Instead we want to do:

   SEND <temporary> <header with mask set to ZW>
   MOV <actual destination>.XY <temporary>.ZW

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/mesa/drivers/dri/i965/brw_vec4_tcs.cpp