nir: Add a writemask to store intrinsics.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 17 Nov 2015 08:26:37 +0000 (00:26 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 22 Dec 2015 23:57:59 +0000 (15:57 -0800)
commit7d539080c1a491aff9fb3e90c25df89884477aa8
tree066f321f1cef0a6a1578a4490c63ef9e7d5e1259
parent50fc4a925644378c50282004304bc8fd64b95e3c
nir: Add a writemask to store intrinsics.

Tessellation control shaders need to be careful when writing outputs.
Because multiple threads can concurrently write the same output
variables, we need to only write the exact components we were told.

Traditionally, for sub-vector writes, we've read the whole vector,
updated the temporary, and written the whole vector back.  This breaks
down with concurrent access.

This patch prepares the way for a solution by adding a writemask field
to store_var intrinsics, as well as the other store intrinsics.  It then
updates all produces to emit a writemask of "all channels enabled".  It
updates nir_lower_io to copy the writemask to output store intrinsics.

Finally, it updates nir_lower_vars_to_ssa to handle partial writemasks
by doing a read-modify-write cycle (which is safe, because local
variables are specific to a single thread).

This should have no functional change, since no one actually emits
partial writemasks yet.

v2: Make nir_validate momentarily assert that writemasks cover the
    complete value - we shouldn't have partial writemasks yet
    (requested by Jason Ekstrand).

v3: Fix accidental SSBO change that arose from merge conflicts.

v4: Don't try to handle writemasks in ir3_compiler_nir - my code
    for indirects was likely wrong, and TTN doesn't generate partial
    writemasks today anyway.  Change them to asserts as requested by
    Rob Clark.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com> [v3]
12 files changed:
src/gallium/auxiliary/nir/tgsi_to_nir.c
src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c
src/glsl/nir/glsl_to_nir.cpp
src/glsl/nir/nir_builder.h
src/glsl/nir/nir_intrinsics.h
src/glsl/nir/nir_lower_gs_intrinsics.c
src/glsl/nir/nir_lower_io.c
src/glsl/nir/nir_lower_locals_to_regs.c
src/glsl/nir/nir_lower_var_copies.c
src/glsl/nir/nir_lower_vars_to_ssa.c
src/glsl/nir/nir_validate.c
src/mesa/program/prog_to_nir.c