mesa/src/compiler
Alyssa Rosenzweig 586da7b329 nir: Add nir_lower_helper_writes pass
This NIR pass lowers stores in fragment shaders to:

   if (!gl_HelperInvocaton) {
      store();
   }

This implements the API requirement that helper invocations do not have visible
side effects, and the lowering is required on any hardware that cannot directly
mask helper invocation's side effects. The pass was originally written for
Midgard (which has this issue) but is also needed for Asahi. Let's share the
code, and fix it while we're at it.

Changes from the Midgard pass:

1. Add an option to only lower atomics.

   AGX hardware can mask helper invocations for "plain" stores but not for
   atomics.  Accordingly, the AGX compiler wants this lowering for atomics but
   not store_global. By contrast, Midgard cannot mask any stores and needs the
   lowering for all store intrinsics. Add an option to the common pass to
   accommodate both cases.

   This is an optimization for AGX. It is not required for correctness, this
   lowering is always legal.

2. Fix dominance issues.

   It's invalid to have NIR like

      if ... {
         ssa_1 = ...
      }

      foo ssa_1

   Instead we need to rewrite as

      if ... {
         ssa_1 = ...
      } else {
         ssa_2 = undef
      }
      ssa_3 = phi ssa_1, ssa_2

      foo ssa_3

   By default, neither nir_validate nor the backends check this, so this doesn't
   currently fix a (known) real bug. But it's still invalid and fails validation
   with NIR_DEBUG=validate_ssa_dominance.

   Fix this in lower_helper_writes for intrinsics that return data (atomics).

3. Assert that the pass is run only for fragment shaders. This encourages
   backends to be judicious about which passes they call instead of just
   throwing everything in a giant lower everything spaghetti.

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Reviewed-by: Italo Nicola <italonicola@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21413>
2023-03-04 13:31:05 -05:00
..
clc clc: Include opencl-c-base.h with LLVM 15 (using builtins) 2023-02-11 05:24:08 +00:00
glsl glsl: remove do_copy_propagation_elements() optimisation pass 2023-03-01 16:09:25 +00:00
isaspec ir3, isaspec: add raw instruction to assembler/disassembler. 2023-01-26 14:26:11 +00:00
nir nir: Add nir_lower_helper_writes pass 2023-03-04 13:31:05 -05:00
spirv spirv: Add skip_os_break_in_debug_build option to use in unit tests 2023-03-01 13:47:57 +00:00
builtin_type_macros.h glsl: add texture subpass variants 2022-11-10 10:21:34 +00:00
glsl_types.cpp compiler: Handle nested arrays correctly for computing CL size/alignment 2022-12-02 09:52:44 -08:00
glsl_types.h glsl: Remove the need of _MTX_INITIALIZER_NP by using simple_mtx_t/SIMPLE_MTX_INITIALIZER 2022-11-09 04:38:28 +00:00
meson.build spirv/tests: Add some basic control flow tests 2023-03-01 13:47:57 +00:00
nir_gl_types.h mesa: #include "util/glheader.h" instead GL/gl.h in shared code 2022-11-03 16:07:31 +00:00
nir_types.cpp nir/types: Add some asserts to glsl_get_struct_field() 2022-11-01 14:48:41 +00:00
nir_types.h nir: Add a pass to lower mediump temps and shared mem. 2022-09-01 22:39:39 +00:00
shader_enums.c nir+ir3: Rename load_size_ir3 to load_center_rhw_ir3. 2022-07-11 16:56:05 +00:00
shader_enums.h nir: lower image add lower_to_fragment_mask_load_amd option 2022-12-19 09:22:16 +08:00
shader_info.h spirv: Implement SPV_KHR_subgroup_rotate 2023-02-24 06:33:51 +00:00