nir: Allow outputs reads and add the relevant intrinsics.
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 19 Oct 2015 18:44:28 +0000 (11:44 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Fri, 13 Nov 2015 23:15:41 +0000 (15:15 -0800)
commit134728fdaef9d2a5d072d25b31437ac0fecd9076
treee7f64a77d46e769a4872082ddf1a8eba687ed38e
parentc51d7d5fe3425b0b1cb551f47979a1e41f1f73d8
nir: Allow outputs reads and add the relevant intrinsics.

Normally, we rely on nir_lower_outputs_to_temporaries to create shadow
variables for outputs, buffering the results and writing them all out
at the end of the program.  However, this is infeasible for tessellation
control shader outputs.

Tessellation control shaders can generate multiple output vertices, and
write per-vertex outputs.  These are arrays indexed by the vertex
number; each thread only writes one element, but can read any other
element - including those being concurrently written by other threads.
The barrier() intrinsic synchronizes between threads.

Even if we tried to shadow every output element (which is of dubious
value), we'd have to read updated values in at barrier() time, which
means we need to allow output reads.

Most stages should continue using nir_lower_outputs_to_temporaries(),
but in theory drivers could choose not to if they really wanted.

v2: Rebase to accomodate Jason's review feedback.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
src/glsl/nir/nir_intrinsics.h
src/glsl/nir/nir_lower_io.c
src/glsl/nir/nir_print.c
src/glsl/nir/nir_validate.c