[Mesa-dev] [PATCH v4 000/129] nir: Move to using instructions for derefs

Jason Ekstrand jason at jlekstrand.net
Fri Jun 1 05:01:43 UTC 2018


This is something that Connor and I have been talking about for some time
now.  The basic idea is to replace the current singly linked nir_deref list
with deref instructions.  This is similar to what LLVM does and it offers
quite a bit more freedom when we start getting more realistic pointers from
compute applications.

Right now, we still have a fully "logical" pointer model where pointer
chains eventually terminate at variable dereferences.  In future, we'd like
to be able to use nir_deref_instrs for things like UBOs and SSBOs where tha
tmay not be the case.  There are still a couple open questions around how
we want to handle "raw" pointers in SPIR-V for OpenCL drivers particularly
around casting.  However, the hard part is getting the deref instructions
and getting everything switched over to them.  Now that we've done that,
some of those other details can be sorted out later.

This series is, as far as Rob, Bas, and I can tell, a complete and correct
transition for all NIR-based drivers.  The final patch deletes the data
structures and helpers for the older deref chains.

A massive thank you goes out to Rob for putting the final patch set
together and trying to get things in an order that will hopefully not
regress anyone.  Thanks also to Bas for fixing up the radeon and radv
bits.

This series can be found as a branch on gitlab:

https://gitlab.freedesktop.org/jekstrand/mesa/commits/review/nir-deref-instr-v4

Ideally, I'd like the series to get some amount of real review before it
lands.  Honestly, it's been baking long enough and tested by enough people
on enough drivers that we can probably throw a bunch of Acked-by and
Tested-bys on it and call it a day but I'd rather not.  I plan to review
all of the patches I didn't write but that will have to wait until
tomorrow.

At the very least, I'd like some sort of an ACK from a variety of the
people that use NIR on the core concept and the sort of general shape of
things at the end of the series.  A lot of work has gone into this but it's
also a big change and the more positive feedback it gets, the more
comfortable I'll be pulling the trigger.

Thanks,

--Jason Ekstrand



Cc: Rob Clark <robdclark at gmail.com>
Cc: Timothy Arceri <tarceri at itsqueeze.com>
Cc: Eric Anholt <eric at anholt.net>
Cc: Connor Abbott <cwabbott0 at gmail.com>
Cc: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Cc: Karol Herbst <kherbst at redhat.com>
Cc: Matt Turner <mattst88 at gmail.com>
Cc: Kenneth Graunke <kenneth at whitecape.org>
Cc: Ian Romanick <ian.d.romanick at intel.com>

Bas Nieuwenhuizen (16):
  ac/nir: Implement the deref instr for shared memory.
  ac/nir: Support deref instructions in get_sampler_desc.
  ac/nir: Support deref instructions in tex instructions.
  ac/nir: Implement derefs for integer gather4 lowering.
  ac/nir: Add deref support to image intrinsics.
  radv: Add shader info support for image deref instructions.
  ac/nir: Add deref based var loads/stores.
  radv: Gather info for deref instr based load/store.
  ac/nir: Add shared atomic deref instr support.
  ac/nir: Add deref interp support.
  radv: Use deref instructions for tex derefs in meta shaders.
  radv: Remove image_var stores.
  radeonsi: Add deref support to the nir scan pass.
  ac/nir: Remove deref chain support.
  radv: Remove deref chain support in radv shader info pass.
  radeonsi: Remove deref chain support in nir scan pass.

Eric Anholt (1):
  broadcom/vc4: Remove deref chain support from nir_lower_txf_ms.

Jason Ekstrand (98):
  nir/validate: Rework intrinsic type validation
  nir: Add a deref instruction type
  nir/builder: Add deref building helpers
  nir: Add _deref versions of all of the _var intrinsics
  nir: Add deref sources to texture instructions
  nir: Add helpers for working with deref instructions
  nir/deref: Add some deref cleanup functions
  anv,i965,radv,st,ir3: Call nir_lower_deref_instrs
  glsl/nir: Only claim to handle intrinsic functions
  glsl/nir: Use deref instructions instead of dref chains
  prog/nir: Use deref instructions for params
  nir: Support deref instructions in remove_dead_variables
  nir: Add a pass for fixing deref modes
  nir: Support deref instructions in lower_global_vars_to_local
  nir: Support deref instructions in lower_io_to_temporaries
  nir: Add a deref path helper struct
  nir: Support deref instructions in lower_var_copies
  nir: Support deref instructions in split_var_copies
  nir: Support deref instructions in lower_vars_to_ssa
  nir: Support deref instructions in lower_indirect_derefs
  nir: Support deref instructions in lower_system_values
  nir: Support deref instructions in lower_clip_cull
  nir: Support deref instructions in propagate_invariant
  nir: Support deref instructions in gather_info
  nir: Support deref instructions in lower_io
  nir: Support deref instructions in lower_atomics
  nir: Support deref instructions in lower_wpos_ytransform
  nir: Support deref instructions in lower_pos_center
  nir: Support deref instructions in remove_unused_varyings
  nir: Support deref instructions in loop_analyze
  nir: Support deref instructions in lower_alpha_test
  nir: Support deref instructions in lower_clamp_color_outputs
  nir: Support deref instructions in lower_drawpixels
  nir: Consider deref instructions in lower_phis_to_scalar
  nir: Consider deref instructions in opt_peephole_select
  nir: Support deref instructions in opt_undef
  intel,ir3: Disable nir_opt_copy_prop_vars
  intel/nir: Fixup deref modes after lowering patch vertices
  nir/lower_tex: Always copy deref and offset sources
  i965: Move nir_lower_deref_instrs to right before locals_to_regs
  st/nir: Move lower_deref_instrs later
  spirv: Use deref instructions for most variables
  nir: Add a concept of per-member structs and a lowering pass
  nir/spirv: Pass nir_variable_data into apply_var_decoration
  spirv: Use NIR per-member splitting
  spirv: Make push constants an offset-based pointer
  spirv: Clean up vtn_pointer_to_offset
  spirv: Allow pointers to have a deref at the base
  spirv: Update vtn_pointer_to/from_ssa to handle deref pointers
  spirv: Record the type of functions
  spirv/cfg: Make the builder fully capable for both walks
  nir,spirv: Rework function calls
  anv/pipeline: Do less deref instruction lowering
  anv/pipeline: Convert lower_input_attachments to deref instructions
  anv/pipeline: Convert YCbCr lowering to deref instructiosn
  anv/pipeline: Convert lower_multiview to deref instructions
  anv/apply_pipeline_layout: Simplify extract_tex_src_plane
  anv/pipeline: Convert apply_pipeline_layout to deref instructions
  intel/fs: Use image_deref intrinsics instead of image_var
  intel/nir: Only lower load/store derefs
  intel/blorp: Stop setting tex->texture/sampler
  nir/lower_samplers: Clean up function arguments
  nir: Use derefs in nir_lower_samplers
  nir/builder: Use deref instructions for load/store/copy_var
  nir: Use deref instructions in lower_constant_initializers
  nir/vars_to_ssa: Add an is_direct field to deref_node
  nir/vars_to_ssa: Rework to entirely use deref instructions
  nir: Rework gather_info to entirely use deref instructions
  nir: Remove deref chain support from lower_indirect_derefs
  nir: Remove deref chain support from lower_clip_cull_distance_arrays
  nir: Remove deref chain support from lower_atomics
  nir: Remove deref chain support from lower_alpha_test
  nir: Remove deref chain support from lower_clamp_color_outputs
  nir: Remove deref chain support from lower_global_vars_to_local
  nir/lower_io: Convert atomic lowering to deref instructions
  nir: Convert lower_io to deref instructions
  nir: Remove deref chain support from lower_phis_to_scalar
  nir: Delete lower_io_types
  nir: Remove deref chain support from remove_unused_varyings
  nir: Remove deref chain support from lower_system_values
  nir: Remove deref chain support from lower_wpos_center
  nir: Remove deref chain support from lower_wpos_ytransform
  nir: Remove deref chain support from lower_tex
  nir: Remove deref chain support from opt_peephole_select
  nir: Remove deref chain support from lower_drawpixels
  nir: Remove deref chain support from lower_var_copies
  nir: Remove deref chain support from propagate_invariant
  nir: Remove deref chain support from dead_variables
  nir: Remove deref chain support from split_var_copies
  nir: Remove deref chain support from opt_undef
  nir: Remove deref chain support from split_per_member_structs
  nir/copy_prop_vars: Re-order some logic in compare_derefs
  nir: Rework opt_copy_prop_vars to use deref instructions
  intel,ir3: Re-enable nir_opt_copy_prop_vars
  nir: Rework lower_locals_to_regs to use deref instructions
  nir: Remove deref chain support from analyze_loops
  nir: Remove old-school deref chain support
  nir/lower_system_values: Assert/assume direct var derefs

Rob Clark (14):
  nir: add deref lowering sanity checking
  ttn: convert to deref instructions
  nir/lower_samplers: split out _legacy version for deref chains
  move lower_deref_instrs
  nir: convert lower_io_to_scalar to deref instructions
  mesa/st: temporarily disable lower_io_to_elements()
  mesa/st/nir: convert lower_builtins to deref instructions
  nir: convert lower_io_arrays_to_elements to deref instructions
  mesa/st: re-enable lower_io_to_elements()
  nir: convert lower_samplers_as_deref to deref instructions
  nir/lower_samplers: remove legacy version
  st,ir3,radeonsi: push lower_deref_instrs back into driver
  nir: promote intrinsic_get_var() to helper
  freedreno/ir3: convert to deref instructions

 src/amd/common/ac_nir_to_llvm.c                    | 547 ++++++++++----------
 src/amd/vulkan/radv_meta.c                         |  20 +-
 src/amd/vulkan/radv_meta_blit.c                    |  30 +-
 src/amd/vulkan/radv_meta_blit2d.c                  |  21 +-
 src/amd/vulkan/radv_meta_bufimage.c                |  62 +--
 src/amd/vulkan/radv_meta_fast_clear.c              |  17 +-
 src/amd/vulkan/radv_meta_resolve_cs.c              |  10 +-
 src/amd/vulkan/radv_shader.c                       |   8 +
 src/amd/vulkan/radv_shader_info.c                  | 139 ++---
 src/compiler/Makefile.sources                      |   4 +-
 src/compiler/glsl/gl_nir_lower_atomics.c           | 137 ++---
 src/compiler/glsl/gl_nir_lower_samplers.c          | 162 +++---
 src/compiler/glsl/gl_nir_lower_samplers_as_deref.c | 180 ++++---
 src/compiler/glsl/glsl_to_nir.cpp                  | 267 ++++------
 src/compiler/nir/meson.build                       |   4 +-
 src/compiler/nir/nir.c                             | 423 +++-------------
 src/compiler/nir/nir.h                             | 207 ++++----
 src/compiler/nir/nir_builder.h                     | 254 ++++++++--
 src/compiler/nir/nir_clone.c                       | 143 ++----
 src/compiler/nir/nir_deref.c                       | 165 ++++++
 src/compiler/nir/nir_deref.h                       |  55 ++
 src/compiler/nir/nir_gather_info.c                 |  51 +-
 src/compiler/nir/nir_inline_functions.c            | 193 ++-----
 src/compiler/nir/nir_instr_set.c                   | 101 +++-
 src/compiler/nir/nir_intrinsics.py                 |  99 ++--
 src/compiler/nir/nir_intrinsics_c.py               |   1 -
 src/compiler/nir/nir_linking_helpers.c             |  47 +-
 src/compiler/nir/nir_loop_analyze.c                |  70 ++-
 src/compiler/nir/nir_lower_alpha_test.c            |   7 +-
 src/compiler/nir/nir_lower_clamp_color_outputs.c   |   9 +-
 .../nir/nir_lower_clip_cull_distance_arrays.c      |  85 ++--
 src/compiler/nir/nir_lower_constant_initializers.c |  57 ++-
 src/compiler/nir/nir_lower_drawpixels.c            |  10 +-
 src/compiler/nir/nir_lower_global_vars_to_local.c  |  45 +-
 src/compiler/nir/nir_lower_indirect_derefs.c       | 174 +++----
 src/compiler/nir/nir_lower_io.c                    | 185 ++++---
 src/compiler/nir/nir_lower_io_arrays_to_elements.c | 154 +++---
 src/compiler/nir/nir_lower_io_to_scalar.c          |  90 ++--
 src/compiler/nir/nir_lower_io_to_temporaries.c     |   2 +
 src/compiler/nir/nir_lower_io_types.c              | 176 -------
 src/compiler/nir/nir_lower_locals_to_regs.c        | 186 ++++---
 src/compiler/nir/nir_lower_phis_to_scalar.c        |  14 +-
 src/compiler/nir/nir_lower_system_values.c         |  31 +-
 src/compiler/nir/nir_lower_tex.c                   |  47 +-
 src/compiler/nir/nir_lower_var_copies.c            | 165 +++---
 src/compiler/nir/nir_lower_vars_to_ssa.c           | 330 ++++++------
 src/compiler/nir/nir_lower_wpos_center.c           |   8 +-
 src/compiler/nir/nir_lower_wpos_ytransform.c       |  33 +-
 src/compiler/nir/nir_opt_constant_folding.c        |  53 --
 src/compiler/nir/nir_opt_copy_prop_vars.c          | 316 ++++++------
 src/compiler/nir/nir_opt_copy_propagate.c          |  95 ++--
 src/compiler/nir/nir_opt_dce.c                     |   7 +
 src/compiler/nir/nir_opt_peephole_select.c         |   4 +-
 src/compiler/nir/nir_opt_undef.c                   |   2 +-
 src/compiler/nir/nir_print.c                       | 252 +++++----
 src/compiler/nir/nir_propagate_invariant.c         |  17 +-
 src/compiler/nir/nir_remove_dead_variables.c       | 152 +++---
 src/compiler/nir/nir_serialize.c                   | 234 ++++-----
 src/compiler/nir/nir_split_per_member_structs.c    | 208 ++++++++
 src/compiler/nir/nir_split_var_copies.c            | 234 ++-------
 src/compiler/nir/nir_sweep.c                       |   4 -
 src/compiler/nir/nir_validate.c                    | 247 ++++-----
 src/compiler/spirv/spirv_to_nir.c                  | 184 ++++---
 src/compiler/spirv/vtn_cfg.c                       | 231 ++++-----
 src/compiler/spirv/vtn_glsl450.c                   |  19 +-
 src/compiler/spirv/vtn_private.h                   |  26 +-
 src/compiler/spirv/vtn_variables.c                 | 563 +++++++--------------
 src/gallium/auxiliary/nir/tgsi_to_nir.c            |  52 +-
 src/gallium/drivers/freedreno/ir3/ir3_cmdline.c    |   1 -
 .../drivers/freedreno/ir3/ir3_compiler_nir.c       |  49 +-
 src/gallium/drivers/freedreno/ir3/ir3_nir.c        |   4 +-
 .../freedreno/ir3/ir3_nir_lower_tg4_to_tex.c       |   4 +-
 src/gallium/drivers/radeonsi/si_shader_nir.c       |  72 ++-
 src/gallium/drivers/vc4/vc4_nir_lower_txf_ms.c     |   1 -
 src/intel/blorp/blorp_blit.c                       |   2 -
 src/intel/compiler/brw_fs.h                        |   2 +-
 src/intel/compiler/brw_fs_nir.cpp                  | 157 +++---
 src/intel/vulkan/anv_nir_apply_pipeline_layout.c   | 187 ++++---
 src/intel/vulkan/anv_nir_lower_input_attachments.c |  31 +-
 src/intel/vulkan/anv_nir_lower_multiview.c         |  17 +-
 src/intel/vulkan/anv_nir_lower_ycbcr_textures.c    |  34 +-
 src/intel/vulkan/anv_pipeline.c                    |   7 +
 src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp     |   2 +
 src/mesa/drivers/dri/i965/brw_program.c            |   5 +-
 src/mesa/program/prog_to_nir.c                     |  41 +-
 src/mesa/state_tracker/st_nir_lower_builtin.c      |  62 ++-
 86 files changed, 4183 insertions(+), 4620 deletions(-)
 create mode 100644 src/compiler/nir/nir_deref.c
 create mode 100644 src/compiler/nir/nir_deref.h
 delete mode 100644 src/compiler/nir/nir_lower_io_types.c
 create mode 100644 src/compiler/nir/nir_split_per_member_structs.c

-- 
2.5.0.400.gff86faf



More information about the mesa-dev mailing list